Mercurial > dive4elements > river
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); }