From 9b3bde3b49c77cc084cab0b52e7c607546d818ee Mon Sep 17 00:00:00 2001 From: Ben Steffensmeier Date: Mon, 6 Jan 2014 15:33:22 -0600 Subject: [PATCH] Issue #2537 Increase efficiency of DAF geometry requests when geometries are reused. Change-Id: Idf0822745cdf3d52668223038f83c76e3de1c55c Former-commit-id: ed2e34e5aaa2ef671f9f1b6eb8c9505ceaa273ca [formerly fa46a08fec22c6d683a893fa9fd3fa87554ef21c [formerly 05c62ceb516807719a1649e0559a395ce604aee9]] Former-commit-id: fa46a08fec22c6d683a893fa9fd3fa87554ef21c Former-commit-id: 3f3f74087a7a13081ecf4ec01d1805861253617e --- .../response/GeometryResponseData.java | 21 +++++++------- .../response/GetGeometryDataResponse.java | 28 ++++++++++++++++--- .../response/GeometryResponseData.py | 11 ++++---- .../response/GetGeometryDataResponse.py | 7 +++++ .../ufpy/dataaccess/PyGeometryData.py | 7 ++--- .../ufpy/dataaccess/ThriftClientRouter.py | 11 ++++++-- 6 files changed, 60 insertions(+), 25 deletions(-) diff --git a/edexOsgi/com.raytheon.uf.common.dataaccess/src/com/raytheon/uf/common/dataaccess/response/GeometryResponseData.java b/edexOsgi/com.raytheon.uf.common.dataaccess/src/com/raytheon/uf/common/dataaccess/response/GeometryResponseData.java index a2878bf5dd..7e24fae949 100644 --- a/edexOsgi/com.raytheon.uf.common.dataaccess/src/com/raytheon/uf/common/dataaccess/response/GeometryResponseData.java +++ b/edexOsgi/com.raytheon.uf.common.dataaccess/src/com/raytheon/uf/common/dataaccess/response/GeometryResponseData.java @@ -34,9 +34,10 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * * SOFTWARE HISTORY * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * Jun 03, 2013 dgilling Initial creation + * Date Ticket# Engineer Description + * ------------- -------- ----------- -------------------------- + * Jun 03, 2013 dgilling Initial creation + * Jan 06, 2014 2537 bsteffen Store geometry index instead of WKT. * * * @@ -51,13 +52,13 @@ public class GeometryResponseData extends AbstractResponseData { private Map dataMap; @DynamicSerializeElement - private String geometryWKT; + private int geometryWKTindex; public GeometryResponseData() { // no-op, for serialization } - public GeometryResponseData(final IGeometryData data) { + public GeometryResponseData(final IGeometryData data, final int geometryWKTindex) { super(data); Set parameters = data.getParameters(); @@ -75,7 +76,7 @@ public class GeometryResponseData extends AbstractResponseData { } dataMap.put(param, dataTuple); } - geometryWKT = data.getGeometry().toText(); + this.geometryWKTindex = geometryWKTindex; } public Map getDataMap() { @@ -86,11 +87,11 @@ public class GeometryResponseData extends AbstractResponseData { this.dataMap = dataMap; } - public String getGeometryWKT() { - return geometryWKT; + public int getGeometryWKTindex() { + return geometryWKTindex; } - public void setGeometryWKT(String geometry) { - this.geometryWKT = geometry; + public void setGeometryWKTindex(int geometryWKTindex) { + this.geometryWKTindex = geometryWKTindex; } } diff --git a/edexOsgi/com.raytheon.uf.common.dataaccess/src/com/raytheon/uf/common/dataaccess/response/GetGeometryDataResponse.java b/edexOsgi/com.raytheon.uf.common.dataaccess/src/com/raytheon/uf/common/dataaccess/response/GetGeometryDataResponse.java index 4300c7143d..646c73cfa8 100644 --- a/edexOsgi/com.raytheon.uf.common.dataaccess/src/com/raytheon/uf/common/dataaccess/response/GetGeometryDataResponse.java +++ b/edexOsgi/com.raytheon.uf.common.dataaccess/src/com/raytheon/uf/common/dataaccess/response/GetGeometryDataResponse.java @@ -34,9 +34,10 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * * SOFTWARE HISTORY * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * Jun 3, 2013 dgilling Initial creation + * Date Ticket# Engineer Description + * ------------- -------- ----------- -------------------------- + * Jun 3, 2013 dgilling Initial creation + * Jan 06, 2014 2537 bsteffen Share geometry WKT. * * * @@ -47,6 +48,9 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize public class GetGeometryDataResponse { + @DynamicSerializeElement + private List geometryWKTs; + @DynamicSerializeElement private List geoData; @@ -55,9 +59,16 @@ public class GetGeometryDataResponse { } public GetGeometryDataResponse(final Collection geoData) { + this.geometryWKTs = new ArrayList(); this.geoData = new ArrayList(geoData.size()); for (IGeometryData element : geoData) { - this.geoData.add(new GeometryResponseData(element)); + String wkt = element.getGeometry().toText(); + int index = geometryWKTs.indexOf(wkt); + if (index == -1) { + index = geometryWKTs.size(); + geometryWKTs.add(wkt); + } + this.geoData.add(new GeometryResponseData(element, index)); } } @@ -68,4 +79,13 @@ public class GetGeometryDataResponse { public void setGeoData(List geoData) { this.geoData = geoData; } + + public List getGeometryWKTs() { + return geometryWKTs; + } + + public void setGeometryWKTs(List geometryWKTs) { + this.geometryWKTs = geometryWKTs; + } + } diff --git a/pythonPackages/dynamicserialize/dstypes/com/raytheon/uf/common/dataaccess/response/GeometryResponseData.py b/pythonPackages/dynamicserialize/dstypes/com/raytheon/uf/common/dataaccess/response/GeometryResponseData.py index 8df2cd336c..9a1c69758f 100644 --- a/pythonPackages/dynamicserialize/dstypes/com/raytheon/uf/common/dataaccess/response/GeometryResponseData.py +++ b/pythonPackages/dynamicserialize/dstypes/com/raytheon/uf/common/dataaccess/response/GeometryResponseData.py @@ -26,6 +26,7 @@ # Date Ticket# Engineer Description # ------------ ---------- ----------- -------------------------- # 06/04/13 #2023 dgilling Initial Creation. +# 01/06/14 #2537 bsteffen Store geometry index instead of WKT. # # @@ -37,7 +38,7 @@ class GeometryResponseData(AbstractResponseData): def __init__(self): super(GeometryResponseData, self).__init__() self.dataMap = None - self.geometryWKT = None + self.geometryWKTindex = None def getDataMap(self): return self.dataMap @@ -45,8 +46,8 @@ class GeometryResponseData(AbstractResponseData): def setDataMap(self, dataMap): self.dataMap = dataMap - def getGeometryWKT(self): - return self.geometryWKT + def getGeometryWKTindex(self): + return self.geometryWKTindex - def setGeometryWKT(self, geometryWKT): - self.geometryWKT = geometryWKT + def setGeometryWKTindex(self, geometryWKTindex): + self.geometryWKTindex = geometryWKTindex diff --git a/pythonPackages/dynamicserialize/dstypes/com/raytheon/uf/common/dataaccess/response/GetGeometryDataResponse.py b/pythonPackages/dynamicserialize/dstypes/com/raytheon/uf/common/dataaccess/response/GetGeometryDataResponse.py index e1f635f301..2107a0704f 100644 --- a/pythonPackages/dynamicserialize/dstypes/com/raytheon/uf/common/dataaccess/response/GetGeometryDataResponse.py +++ b/pythonPackages/dynamicserialize/dstypes/com/raytheon/uf/common/dataaccess/response/GetGeometryDataResponse.py @@ -23,8 +23,15 @@ class GetGeometryDataResponse(object): def __init__(self): + self.geometryWKTs = None self.geoData = None + def getGeometryWKTs(self): + return self.geometryWKTs + + def setGeometryWKTs(self, geometryWKTs): + self.geometryWKTs = geometryWKTs + def getGeoData(self): return self.geoData diff --git a/pythonPackages/ufpy/dataaccess/PyGeometryData.py b/pythonPackages/ufpy/dataaccess/PyGeometryData.py index abe70ce534..934182ef77 100644 --- a/pythonPackages/ufpy/dataaccess/PyGeometryData.py +++ b/pythonPackages/ufpy/dataaccess/PyGeometryData.py @@ -28,19 +28,18 @@ # Date Ticket# Engineer Description # ------------ ---------- ----------- -------------------------- # 06/03/13 dgilling Initial Creation. +# 01/06/14 #2537 bsteffen Share geometry WKT. # # from ufpy.dataaccess import IGeometryData from ufpy.dataaccess import PyData -import shapely.wkt - class PyGeometryData(IGeometryData, PyData.PyData): - def __init__(self, geoDataRecord): + def __init__(self, geoDataRecord, geometry): PyData.PyData.__init__(self, geoDataRecord) - self.__geometry = shapely.wkt.loads(geoDataRecord.getGeometryWKT()) + self.__geometry = geometry self.__dataMap = {} tempDataMap = geoDataRecord.getDataMap() for key, value in tempDataMap.items(): diff --git a/pythonPackages/ufpy/dataaccess/ThriftClientRouter.py b/pythonPackages/ufpy/dataaccess/ThriftClientRouter.py index 8e8fac6dd4..941e57e19d 100644 --- a/pythonPackages/ufpy/dataaccess/ThriftClientRouter.py +++ b/pythonPackages/ufpy/dataaccess/ThriftClientRouter.py @@ -28,10 +28,12 @@ # Date Ticket# Engineer Description # ------------ ---------- ----------- -------------------------- # 05/21/13 #2023 dgilling Initial Creation. +# 01/06/14 #2537 bsteffen Share geometry WKT. # import numpy +import shapely.wkt from dynamicserialize.dstypes.com.raytheon.uf.common.dataaccess.impl import DefaultDataRequest from dynamicserialize.dstypes.com.raytheon.uf.common.dataaccess.request import GetAvailableLocationNamesRequest @@ -43,6 +45,7 @@ from ufpy import ThriftClient from ufpy.dataaccess import PyGeometryData from ufpy.dataaccess import PyGridData + class ThriftClientRouter(object): def __init__(self, host='localhost'): @@ -97,10 +100,14 @@ class ThriftClientRouter(object): except TypeError: geoDataRequest.setRequestedPeriod(times) response = self._client.sendRequest(geoDataRequest) - + geometries = [] + for wkt in response.getGeometryWKTs(): + geometries.append(shapely.wkt.loads(wkt)) + retVal = [] for geoDataRecord in response.getGeoData(): - retVal.append(PyGeometryData.PyGeometryData(geoDataRecord)) + geom = geometries[geoDataRecord.getGeometryWKTindex()] + retVal.append(PyGeometryData.PyGeometryData(geoDataRecord, geom)) return retVal def getAvailableLocationNames(self, request):