Omaha #3549 improve performance of DataStoreResource processing of

requests

Change-Id: Ica72cded45aff23737c4b2aab8bbe94e0fc99755

Former-commit-id: bab091169dff1383a3b78ea4b94ec67d446e5f80
This commit is contained in:
Nate Jensen 2014-11-18 14:14:12 -06:00
parent e1106f77eb
commit 95d510849a
2 changed files with 122 additions and 116 deletions

View file

@ -124,9 +124,9 @@ import com.vividsolutions.jts.geom.Point;
* Mar 25, 2014 #2664 randerso Added support for non-WGS84 shape files * Mar 25, 2014 #2664 randerso Added support for non-WGS84 shape files
* Apr 14, 2014 #2664 randerso Fix NullPointerException when no .prj file present * Apr 14, 2014 #2664 randerso Fix NullPointerException when no .prj file present
* Apr 21, 2014 #2998 randerso Stored types of attributes to be used in the AttributeViewer * Apr 21, 2014 #2998 randerso Stored types of attributes to be used in the AttributeViewer
* Aug 14, 2014 #3523 mapeters Updated deprecated {@link DrawableString#textStyle} * Aug 14, 2014 #3523 mapeters Updated deprecated DrawableString.textStyle assignments.
* assignments.
* Aug 21, 2014 #3459 randerso Restructured Map resource class hierarchy * Aug 21, 2014 #3459 randerso Restructured Map resource class hierarchy
* Nov 18, 2014 #3549 njensen Improved performance of processRequest()
* *
* </pre> * </pre>
* *
@ -137,6 +137,7 @@ import com.vividsolutions.jts.geom.Point;
public class DataStoreResource extends public class DataStoreResource extends
AbstractMapResource<DataStoreResourceData, MapDescriptor> implements AbstractMapResource<DataStoreResourceData, MapDescriptor> implements
IPropertyChangeListener { IPropertyChangeListener {
private static final IPerformanceStatusHandler perfLog = PerformanceStatus private static final IPerformanceStatusHandler perfLog = PerformanceStatus
.getHandler("GIS:"); .getHandler("GIS:");
@ -256,7 +257,7 @@ public class DataStoreResource extends
return; return;
} }
List<String> fields = new ArrayList<String>(); List<String> fields = new ArrayList<>();
fields.add(req.geomField); fields.add(req.geomField);
if ((req.labelField != null) if ((req.labelField != null)
&& !fields.contains(req.labelField) && !fields.contains(req.labelField)
@ -279,7 +280,7 @@ public class DataStoreResource extends
.createWireframeShape(false, .createWireframeShape(false,
req.getResource().getDescriptor()); req.getResource().getDescriptor());
List<LabelNode> newLabels = new ArrayList<LabelNode>(); List<LabelNode> newLabels = new ArrayList<>();
IShadedShape newShadedShape = null; IShadedShape newShadedShape = null;
if (req.isProduct || (req.shadingField != null)) { if (req.isProduct || (req.shadingField != null)) {
@ -311,10 +312,10 @@ public class DataStoreResource extends
FilterFactory2 ff = CommonFactoryFinder FilterFactory2 ff = CommonFactoryFinder
.getFilterFactory2(GeoTools.getDefaultHints()); .getFilterFactory2(GeoTools.getDefaultHints());
List<Geometry> geomList = new ArrayList<Geometry>(); List<Geometry> geomList = new ArrayList<>();
flattenGeometry(req.getBoundingGeom(), geomList); flattenGeometry(req.getBoundingGeom(), geomList);
List<Filter> filterList = new ArrayList<Filter>(geomList.size()); List<Filter> filterList = new ArrayList<>(geomList.size());
for (Geometry g : geomList) { for (Geometry g : geomList) {
Filter filter = ff.intersects(ff.property(shapeField), Filter filter = ff.intersects(ff.property(shapeField),
ff.literal(g)); ff.literal(g));
@ -325,24 +326,25 @@ public class DataStoreResource extends
SimpleFeatureSource featureSource = req.getResource() SimpleFeatureSource featureSource = req.getResource()
.getDataStore().getFeatureSource(typeName); .getDataStore().getFeatureSource(typeName);
SimpleFeatureCollection featureCollection = featureSource SimpleFeatureCollection featureCollection = featureSource
.getFeatures(query); .getFeatures(query);
SimpleFeatureIterator featureIterator = featureCollection
.features();
if (req.getResource().displayAttributes == null) { if (req.getResource().displayAttributes == null) {
req.getResource().displayAttributes = new HashMap<String, DataStoreResource.DisplayAttributes>( /*
(int) Math.ceil(featureCollection.size() / 0.75f), * just default the map size as featureCollection.size() is slow
0.75f); * since it iterates over the entire collection
*/
req.getResource().displayAttributes = new HashMap<>();
} }
// TODO: do we need to implement the GeometryCache/gidMap // TODO: do we need to implement the GeometryCache/gidMap
// stuff like in DbMapResource? // stuff like in DbMapResource?
List<Geometry> resultingGeoms = new ArrayList<Geometry>(); List<Geometry> resultingGeoms = new ArrayList<>();
List<Geometry> highlightGeoms = new ArrayList<Geometry>(); List<Geometry> highlightGeoms = new ArrayList<>();
int numPoints = 0; int numPoints = 0;
try (SimpleFeatureIterator featureIterator = featureCollection
.features()) {
while (featureIterator.hasNext()) { while (featureIterator.hasNext()) {
if (checkCanceled(result)) { if (checkCanceled(result)) {
return; return;
@ -350,8 +352,8 @@ public class DataStoreResource extends
SimpleFeature f = featureIterator.next(); SimpleFeature f = featureIterator.next();
String id = f.getID(); String id = f.getID();
DisplayAttributes da = req.getResource().getDisplayAttributes( DisplayAttributes da = req.getResource()
id); .getDisplayAttributes(id);
if (!da.isVisible()) { if (!da.isVisible()) {
continue; continue;
} }
@ -378,7 +380,8 @@ public class DataStoreResource extends
} }
} }
if (DataStoreResource.ID_ATTRIBUTE_NAME.equals(req.labelField)) { if (DataStoreResource.ID_ATTRIBUTE_NAME
.equals(req.labelField)) {
labelAttr = id; labelAttr = id;
} }
@ -396,8 +399,7 @@ public class DataStoreResource extends
label = labelAttr.toString(); label = labelAttr.toString();
} }
int numGeometries = g.getNumGeometries(); int numGeometries = g.getNumGeometries();
List<Geometry> gList = new ArrayList<Geometry>( List<Geometry> gList = new ArrayList<>(numGeometries);
numGeometries);
for (int polyNum = 0; polyNum < numGeometries; polyNum++) { for (int polyNum = 0; polyNum < numGeometries; polyNum++) {
Geometry poly = g.getGeometryN(polyNum); Geometry poly = g.getGeometryN(polyNum);
gList.add(poly); gList.add(poly);
@ -406,7 +408,8 @@ public class DataStoreResource extends
Collections.sort(gList, new Comparator<Geometry>() { Collections.sort(gList, new Comparator<Geometry>() {
@Override @Override
public int compare(Geometry g1, Geometry g2) { public int compare(Geometry g1, Geometry g2) {
return (int) Math.signum(g2.getEnvelope().getArea() return (int) Math
.signum(g2.getEnvelope().getArea()
- g1.getEnvelope().getArea()); - g1.getEnvelope().getArea());
} }
}); });
@ -422,7 +425,8 @@ public class DataStoreResource extends
point.getCoordinate().x, point.getCoordinate().x,
point.getCoordinate().y }); point.getCoordinate().y });
DrawableString ds = new DrawableString(label, null); DrawableString ds = new DrawableString(label,
null);
ds.font = req.getResource().font; ds.font = req.getResource().font;
Rectangle2D rect = req.getTarget() Rectangle2D rect = req.getTarget()
.getStringsBounds(ds); .getStringsBounds(ds);
@ -442,6 +446,7 @@ public class DataStoreResource extends
} }
} }
} }
}
newOutlineShape.allocate(numPoints); newOutlineShape.allocate(numPoints);
RGB outlineColor = req.getResource() RGB outlineColor = req.getResource()
@ -533,7 +538,7 @@ public class DataStoreResource extends
RGB getColor(Object key) { RGB getColor(Object key) {
if (colorMap == null) { if (colorMap == null) {
colorMap = new HashMap<Object, RGB>(); colorMap = new HashMap<>();
} }
RGB color = colorMap.get(key); RGB color = colorMap.get(key);
if (color == null) { if (color == null) {
@ -757,8 +762,7 @@ public class DataStoreResource extends
try { try {
List<SimpleFeature> features = findFeatures(new ReferencedCoordinate( List<SimpleFeature> features = findFeatures(new ReferencedCoordinate(
c)); c));
List<String> featureIds = new ArrayList<String>( List<String> featureIds = new ArrayList<>(features.size());
features.size());
for (SimpleFeature feature : features) { for (SimpleFeature feature : features) {
featureIds.add(feature.getID()); featureIds.add(feature.getID());
} }
@ -1032,14 +1036,14 @@ public class DataStoreResource extends
int displayWidth = (descriptor.getMapWidth()); int displayWidth = (descriptor.getMapWidth());
double kmPerPixel = (displayWidth / screenWidth) / 1000.0; double kmPerPixel = (displayWidth / screenWidth) / 1000.0;
List<Geometry> geomList = new ArrayList<Geometry>(); List<Geometry> geomList = new ArrayList<>();
PixelExtent extent = clipToProjExtent(projExtent); PixelExtent extent = clipToProjExtent(projExtent);
Geometry boundingGeom = JTS.transform( Geometry boundingGeom = JTS.transform(
buildBoundingGeometry(extent, worldToScreenRatio, kmPerPixel), buildBoundingGeometry(extent, worldToScreenRatio, kmPerPixel),
latLonToIncoming); latLonToIncoming);
flattenGeometry(boundingGeom, geomList); flattenGeometry(boundingGeom, geomList);
List<Filter> filterList = new ArrayList<Filter>(geomList.size()); List<Filter> filterList = new ArrayList<>(geomList.size());
for (Geometry g : geomList) { for (Geometry g : geomList) {
Filter filter = ff Filter filter = ff
.intersects(ff.property(geomField), ff.literal(g)); .intersects(ff.property(geomField), ff.literal(g));
@ -1055,6 +1059,10 @@ public class DataStoreResource extends
featureCollection = featureSource.getFeatures(query); featureCollection = featureSource.getFeatures(query);
/*
* TODO get the size some other way, as featureCollection.size() may
* iterate over everything and potentially be slow
*/
int size = featureCollection.size(); int size = featureCollection.size();
Set<String> attributeNames = attrTypeMap.keySet(); Set<String> attributeNames = attrTypeMap.keySet();
attributes = new Object[size][attributeNames.size()]; attributes = new Object[size][attributeNames.size()];
@ -1280,10 +1288,9 @@ public class DataStoreResource extends
* worldToScreenRatio; * worldToScreenRatio;
RGB color = getCapability(ColorableCapability.class).getColor(); RGB color = getCapability(ColorableCapability.class).getColor();
IExtent extent = paintProps.getView().getExtent(); IExtent extent = paintProps.getView().getExtent();
List<DrawableString> strings = new ArrayList<DrawableString>( List<DrawableString> strings = new ArrayList<>(labels.size());
labels.size()); List<LabelNode> selectedNodes = new ArrayList<>(labels.size());
List<LabelNode> selectedNodes = new ArrayList<LabelNode>(labels.size()); List<IExtent> extents = new ArrayList<>();
List<IExtent> extents = new ArrayList<IExtent>();
String lastLabel = null; String lastLabel = null;
// get min distance // get min distance
double density = this.getCapability(DensityCapability.class) double density = this.getCapability(DensityCapability.class)
@ -1642,9 +1649,9 @@ public class DataStoreResource extends
Geometry clickBox = JTS.transform( Geometry clickBox = JTS.transform(
buildBoundingGeometry(bboxExtent, worldToScreenRatio, buildBoundingGeometry(bboxExtent, worldToScreenRatio,
kmPerPixel), latLonToIncoming); kmPerPixel), latLonToIncoming);
List<Geometry> clickGeomList = new ArrayList<Geometry>(); List<Geometry> clickGeomList = new ArrayList<>();
flattenGeometry(clickBox, clickGeomList); flattenGeometry(clickBox, clickGeomList);
List<Filter> clickFilterList = new ArrayList<Filter>( List<Filter> clickFilterList = new ArrayList<>(
clickGeomList.size()); clickGeomList.size());
for (Geometry g : clickGeomList) { for (Geometry g : clickGeomList) {
Filter filter = ff.intersects(ff.property(geomField), Filter filter = ff.intersects(ff.property(geomField),
@ -1668,7 +1675,7 @@ public class DataStoreResource extends
.getFeatureSource(typeName); .getFeatureSource(typeName);
featureCollection = featureSource.getFeatures(query); featureCollection = featureSource.getFeatures(query);
features = new ArrayList<SimpleFeature>(featureCollection.size()); features = new ArrayList<>(featureCollection.size());
featureIterator = featureCollection.features(); featureIterator = featureCollection.features();
while (featureIterator.hasNext()) { while (featureIterator.hasNext()) {

View file

@ -26,6 +26,7 @@
-Dlogback.statusListenerClass=com.raytheon.uf.common.status.logback.UFLogbackInternalStatusListener -Dlogback.statusListenerClass=com.raytheon.uf.common.status.logback.UFLogbackInternalStatusListener
-Dthrift.stream.maxsize=200 -Dthrift.stream.maxsize=200
-Dviz.memory.warn.threshold=99 -Dviz.memory.warn.threshold=99
-Dorg.eclipse.swt.internal.gtk.cairoGraphics=false
-XX:MaxDirectMemorySize=1G -XX:MaxDirectMemorySize=1G
-XX:+UnlockExperimentalVMOptions -XX:+UnlockExperimentalVMOptions
-XX:G1HeapRegionSize=4M -XX:G1HeapRegionSize=4M
@ -51,12 +52,10 @@
</win> </win>
</launcher> </launcher>
<vm> <vm>
<windows include="true">jdk1.6.0</windows> <windows include="true">jdk1.6.0</windows>
</vm> </vm>
<plugins> <plugins>
</plugins> </plugins>