diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java @ 2120:f021080cb409

Use improved caching for cross section lines data. flys-artifacts/trunk@3690 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 16 Jan 2012 17:38:39 +0000
parents cd9bcdcf6597
children d626ae185305
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java	Mon Jan 16 15:51:46 2012 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/CrossSectionArtifact.java	Mon Jan 16 17:38:39 2012 +0000
@@ -2,6 +2,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.NavigableMap;
 
 import org.apache.log4j.Logger;
 
@@ -12,6 +13,8 @@
 import de.intevation.artifacts.CallMeta;
 
 import de.intevation.flys.artifacts.model.CrossSectionFacet;
+import de.intevation.flys.artifacts.model.FastCrossSectionLine;
+import de.intevation.flys.artifacts.model.FastCrossSectionLineFactory;
 
 import de.intevation.flys.model.CrossSection;
 import de.intevation.flys.model.CrossSectionLine;
@@ -26,6 +29,8 @@
 
 import de.intevation.flys.utils.FLYSUtils;
 
+import de.intevation.flys.artifacts.services.CrossSectionKMService;
+
 
 /**
  * Artifact describing a cross-section.
@@ -90,10 +95,14 @@
         }
 
         List<Facet> fs = new ArrayList<Facet>();
-        CrossSection cs = CrossSectionFactory.getCrossSection(Integer.valueOf(ids));
-        CrossSectionLine csl = cs.getLines().get(0);
-        // Find min-km of cross sections, than set DATA_KM to min(DATA_KM, minCross).
-        if (csl != null) {
+        CrossSection cs = CrossSectionFactory.getCrossSection(
+            Integer.valueOf(ids));
+
+        List<CrossSectionLine> csls = cs.getLines();
+        if (!csls.isEmpty()) {
+            CrossSectionLine csl = csls.get(0);
+            // Find min-km of cross sections,
+            // then set DATA_KM to min(DATA_KM, minCross).
             double masterKm = Double.valueOf(getDataAsString(DATA_KM));
             if (masterKm < csl.getKm().doubleValue()) {
                 addStringData(DATA_KM, csl.getKm().toString());
@@ -222,7 +231,7 @@
     public double [][] getCrossSectionData() {
         logger.info("getCrossSectionData() for cross_section.km "
             + getDataAsString(DATA_KM));
-        CrossSectionLine line = searchCrossSectionLine();
+        FastCrossSectionLine line = searchCrossSectionLine();
 
         return line != null
                ? line.fetchCrossSectionProfile()
@@ -236,27 +245,35 @@
      *
      * @return CrossSectionLine closest to "cross_section.km".
      */
-    public CrossSectionLine searchCrossSectionLine() {
-        double wishKM = getKm();
+    public FastCrossSectionLine searchCrossSectionLine() {
 
-        CrossSection crossSection = CrossSectionFactory.getCrossSection(getDBID());
-        logger.debug("dbid " + getDBID() + " : " + crossSection);
-        List<CrossSectionLine> crossSectionLines =
-            crossSection.getLines();
-            
-        // Get the cross section closest to requested km.
-        // Naive, linear approach.
-        CrossSectionLine oldLine = crossSectionLines.get(0);
-        double oldDiff = Math.abs(wishKM - oldLine.getKm().doubleValue());
-        for (CrossSectionLine line: crossSectionLines) {
-            double diff = Math.abs(wishKM - line.getKm().doubleValue());
-            if (diff > oldDiff) {
-                break;
-            }
-            oldDiff = diff;
-            oldLine = line;
+        CrossSection crossSection = CrossSectionFactory
+            .getCrossSection(getDBID());
+
+        if (logger.isDebugEnabled()) {
+            logger.debug("dbid " + getDBID() + " : " + crossSection);
         }
-        return oldLine;
+
+        NavigableMap<Double, Integer> kms = CrossSectionKMService
+            .getKms(crossSection.getId());
+
+        Double wishKM = getKm();
+
+        Double floor = kms.floorKey(wishKM);
+        Double ceil  = kms.ceilingKey(wishKM);
+
+        double floorD = floor != null
+            ? Math.abs(floor - wishKM)
+            : Double.MAX_VALUE;
+
+        double ceilD = ceil != null
+            ? Math.abs(ceil - wishKM)
+            : Double.MAX_VALUE;
+
+        double km = floorD < ceilD ? floor : ceil;
+
+        return FastCrossSectionLineFactory
+            .getCrossSectionLine(crossSection, km);
     }
 
 

http://dive4elements.wald.intevation.org