diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/data/AbstractDataCubeAdapter.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/data/AbstractDataCubeAdapter.java index ee3057db45..fea9a392ed 100644 --- a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/data/AbstractDataCubeAdapter.java +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/data/AbstractDataCubeAdapter.java @@ -22,14 +22,19 @@ package com.raytheon.uf.viz.derivparam.data; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import com.raytheon.uf.common.dataplugin.PluginDataObject; +import com.raytheon.uf.common.dataquery.requests.DbQueryRequest; +import com.raytheon.uf.common.dataquery.requests.DbQueryRequestSet; import com.raytheon.uf.common.dataquery.requests.RequestConstraint; import com.raytheon.uf.common.dataquery.requests.TimeQueryRequest; +import com.raytheon.uf.common.dataquery.responses.DbQueryResponse; +import com.raytheon.uf.common.dataquery.responses.DbQueryResponseSet; import com.raytheon.uf.common.datastorage.Request; import com.raytheon.uf.common.datastorage.records.IDataRecord; import com.raytheon.uf.common.pointdata.PointDataContainer; @@ -38,6 +43,7 @@ import com.raytheon.uf.viz.core.catalog.LayerProperty; import com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter; import com.raytheon.uf.viz.core.datastructure.VizDataCubeException; import com.raytheon.uf.viz.core.exception.VizException; +import com.raytheon.uf.viz.core.requests.ThriftClient; import com.raytheon.uf.viz.derivparam.inv.AvailabilityContainer; import com.raytheon.uf.viz.derivparam.inv.MetadataContainer; import com.raytheon.uf.viz.derivparam.inv.TimeAndSpace; @@ -91,20 +97,49 @@ public abstract class AbstractDataCubeAdapter implements IDataCubeAdapter { @Override public List> timeQuery(List requests) throws VizException { - AvailabilityContainer container = createAvailabilityContainer(); - + List containers = new ArrayList( + requests.size()); + List> requestLists = new ArrayList>( + requests.size()); + List fullList = new ArrayList( + requests.size()); for (TimeQueryRequest request : requests) { + AvailabilityContainer container = createAvailabilityContainer(request + .getQueryTerms()); List requestNodes = evaluateRequestConstraints(request .getQueryTerms()); // pull out time queries and bulk submit for (AbstractRequestableNode requestNode : requestNodes) { container.prepareRequests(requestNode); } + containers.add(container); + List containerRequests = container + .getAvailabilityRequests(); + requestLists.add(containerRequests); + fullList.addAll(containerRequests); } + // bulk up all the requests. + DbQueryRequestSet requestSet = new DbQueryRequestSet(); + requestSet.setQueries(fullList.toArray(new DbQueryRequest[0])); + DbQueryResponseSet responseSet = (DbQueryResponseSet) ThriftClient + .sendRequest(requestSet); + DbQueryResponse[] responses = responseSet.getResults(); + int responseIndex = 0; List> finalResponse = new ArrayList>( requests.size()); - for (TimeQueryRequest request : requests) { + for (int i = 0; i < requests.size(); i += 1) { + TimeQueryRequest request = requests.get(i); + AvailabilityContainer container = containers.get(i); + // set the bulked responses back into the container + List containerRequests = requestLists.get(i); + Map responseMap = new HashMap( + (int) (containerRequests.size() / 0.75) + 1, 0.75f); + for (int j = 0; j < containerRequests.size(); j += 1) { + responseMap.put(containerRequests.get(j), + responses[responseIndex++]); + } + container.setAvailabilityResponses(responseMap); List requestNodes = evaluateRequestConstraints(request .getQueryTerms()); // pull the actual results from the cache @@ -197,7 +232,6 @@ public abstract class AbstractDataCubeAdapter implements IDataCubeAdapter { for (AbstractRequestableNode request : requests) { container.prepareRequests(request, availability); } - for (AbstractRequestableNode request : requests) { requesters.addAll(container.getData(request, availability)); } @@ -207,11 +241,13 @@ public abstract class AbstractDataCubeAdapter implements IDataCubeAdapter { protected MetadataContainer createMetadataContainer( Map constraints) { - return new MetadataContainer(constraints); + return new MetadataContainer(constraints, + createAvailabilityContainer(constraints)); } - protected AvailabilityContainer createAvailabilityContainer() { - return new AvailabilityContainer(); + protected AvailabilityContainer createAvailabilityContainer( + Map constraints) { + return new AvailabilityContainer(constraints); } /* diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/inv/AvailabilityContainer.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/inv/AvailabilityContainer.java index d988e902c0..96956a5a5a 100644 --- a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/inv/AvailabilityContainer.java +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/inv/AvailabilityContainer.java @@ -31,6 +31,8 @@ import java.util.Set; import com.raytheon.uf.common.dataquery.requests.DbQueryRequest; import com.raytheon.uf.common.dataquery.requests.DbQueryRequestSet; +import com.raytheon.uf.common.dataquery.requests.RequestConstraint; +import com.raytheon.uf.common.dataquery.responses.DbQueryResponse; import com.raytheon.uf.common.dataquery.responses.DbQueryResponseSet; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.requests.ThriftClient; @@ -65,10 +67,17 @@ public class AvailabilityContainer { .unmodifiableSet(new HashSet(Arrays .asList(new TimeAndSpace()))); + protected final Map originalConstraints; + protected Map requestCache = new HashMap(); protected Map> availabilityCache = new HashMap>(); + public AvailabilityContainer( + Map originalConstraints) { + this.originalConstraints = originalConstraints; + } + /** * Get the availability in Time and space for a given node. * @@ -144,7 +153,8 @@ public class AvailabilityContainer { } if (node instanceof AbstractBaseDataNode) { AbstractBaseDataNode dataNode = (AbstractBaseDataNode) node; - requestCache.put(dataNode, dataNode.getAvailabilityRequest()); + requestCache.put(dataNode, + dataNode.getAvailabilityRequest(originalConstraints)); } else if (node instanceof AbstractDerivedDataNode) { AbstractDerivedDataNode dataNode = (AbstractDerivedDataNode) node; for (Dependency d : dataNode.getDependencies()) { @@ -160,30 +170,46 @@ public class AvailabilityContainer { * @throws VizException */ protected void processRequests() throws VizException { - List nodes = new ArrayList(); - List requests = new ArrayList(); - for (Entry entry : requestCache - .entrySet()) { - if (availabilityCache.containsKey(entry.getKey())) { - continue; - } else if (entry.getValue() == null) { - availabilityCache.put(entry.getKey(), entry.getKey() - .getAvailability(null)); - } else { - nodes.add(entry.getKey()); - requests.add(entry.getValue()); - } - } - if (nodes.isEmpty()) { - return; - } + List requests = getAvailabilityRequests(); DbQueryRequestSet requestSet = new DbQueryRequestSet(); requestSet.setQueries(requests.toArray(new DbQueryRequest[0])); DbQueryResponseSet responseSet = (DbQueryResponseSet) ThriftClient .sendRequest(requestSet); - for (int i = 0; i < nodes.size(); i++) { - availabilityCache.put(nodes.get(i), - nodes.get(i).getAvailability(responseSet.getResults()[i])); + DbQueryResponse[] responses = responseSet.getResults(); + Map responseMap = new HashMap( + (int) (responses.length / 0.75) + 1, 0.75f); + for (int i = 0; i < responses.length; i++) { + responseMap.put(requests.get(i), responses[i]); + } + setAvailabilityResponses(responseMap); + } + + public synchronized List getAvailabilityRequests() { + List requests = new ArrayList( + requestCache.size()); + for (Entry entry : requestCache + .entrySet()) { + if (availabilityCache.containsKey(entry.getKey())) { + continue; + } else if (entry.getValue() != null) { + requests.add(entry.getValue()); + } + } + return requests; + } + + public synchronized void setAvailabilityResponses( + Map responses) throws VizException { + for (Entry entry : requestCache + .entrySet()) { + DbQueryResponse response = null; + if (availabilityCache.containsKey(entry.getKey())) { + continue; + } else if (entry.getValue() != null) { + response = responses.get(entry.getValue()); + } + availabilityCache.put(entry.getKey(), entry.getKey() + .getAvailability(originalConstraints, response)); } } diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/inv/MetadataContainer.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/inv/MetadataContainer.java index 24a2a12dbc..a34b72e3dd 100644 --- a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/inv/MetadataContainer.java +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/inv/MetadataContainer.java @@ -63,12 +63,17 @@ public class MetadataContainer { protected final Map originalConstraints; + protected final AvailabilityContainer availabilityContainer; + protected Map> availCache = new HashMap>(); protected Map> dataCache = new HashMap>(); - public MetadataContainer(Map originalConstraints) { + public MetadataContainer( + Map originalConstraints, + AvailabilityContainer availabilityContainer) { this.originalConstraints = originalConstraints; + this.availabilityContainer = availabilityContainer; } /** @@ -173,7 +178,8 @@ public class MetadataContainer { if (node instanceof AbstractDerivedDataNode) { AbstractDerivedDataNode derivedNode = (AbstractDerivedDataNode) node; Map> avail = derivedNode - .getDataDependency(new HashSet(availability)); + .getDataDependency(new HashSet(availability), + availabilityContainer); for (Entry> entry : avail .entrySet()) { diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractAliasLevelNode.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractAliasLevelNode.java index 6ae275dc35..153634379e 100644 --- a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractAliasLevelNode.java +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractAliasLevelNode.java @@ -27,6 +27,7 @@ import java.util.Set; import com.raytheon.uf.common.dataplugin.level.Level; import com.raytheon.uf.viz.core.exception.VizException; +import com.raytheon.uf.viz.derivparam.inv.AvailabilityContainer; import com.raytheon.uf.viz.derivparam.inv.TimeAndSpace; import com.raytheon.uf.viz.derivparam.library.DerivParamDesc; import com.raytheon.uf.viz.derivparam.library.DerivParamMethod; @@ -116,7 +117,7 @@ public abstract class AbstractAliasLevelNode extends AbstractDerivedDataNode { @Override public Map> getDataDependency( - Set times) { + Set times, AvailabilityContainer container) { Map> result = new HashMap>(); result.put(sourceNode, times); return result; diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractBaseDataNode.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractBaseDataNode.java index d5f9d0f0f8..38e6a2faa6 100644 --- a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractBaseDataNode.java +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractBaseDataNode.java @@ -72,7 +72,8 @@ public abstract class AbstractBaseDataNode extends AbstractRequestableNode { * * @return */ - public abstract DbQueryRequest getAvailabilityRequest(); + public abstract DbQueryRequest getAvailabilityRequest( + Map originalConstraints); /** * Optional method to provide a request to the DataContainer so that it can @@ -102,7 +103,8 @@ public abstract class AbstractBaseDataNode extends AbstractRequestableNode { * @return the TimeAndSpace when this node has available data. * @throws VizException */ - public abstract Set getAvailability(Object response) + public abstract Set getAvailability( + Map originalConstraints, Object response) throws VizException; /** diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractCubeLevelNode.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractCubeLevelNode.java index bcdd3d1983..806711ecb8 100644 --- a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractCubeLevelNode.java +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractCubeLevelNode.java @@ -31,6 +31,7 @@ import com.raytheon.uf.common.dataplugin.level.Level; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.derivparam.data.AbstractRequestableData; import com.raytheon.uf.viz.derivparam.data.CubeRequestableData; +import com.raytheon.uf.viz.derivparam.inv.AvailabilityContainer; import com.raytheon.uf.viz.derivparam.inv.TimeAndSpace; import com.raytheon.uf.viz.derivparam.inv.TimeAndSpaceMatcher; import com.raytheon.uf.viz.derivparam.inv.TimeAndSpaceMatcher.MatchResult; @@ -106,7 +107,8 @@ public abstract class AbstractCubeLevelNode extends AbstractDerivedDataNode { @Override public Map> getDataDependency( - Set availability) throws VizException { + Set availability, + AvailabilityContainer availabilityContainer) throws VizException { Map> result = new HashMap>(); for (CubeLevel level : levels) { result.put(level.getParam(), availability); diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractDerivedDataNode.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractDerivedDataNode.java index 91faf3b8b2..2245913150 100644 --- a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractDerivedDataNode.java +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractDerivedDataNode.java @@ -27,6 +27,7 @@ import com.raytheon.uf.common.dataplugin.level.Level; import com.raytheon.uf.common.derivparam.tree.LevelNode; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.derivparam.data.AbstractRequestableData; +import com.raytheon.uf.viz.derivparam.inv.AvailabilityContainer; import com.raytheon.uf.viz.derivparam.inv.TimeAndSpace; import com.raytheon.uf.viz.derivparam.library.DerivParamDesc; import com.raytheon.uf.viz.derivparam.library.DerivParamMethod; @@ -215,7 +216,8 @@ public abstract class AbstractDerivedDataNode extends AbstractRequestableNode { * @return */ public abstract Map> getDataDependency( - Set availability) throws VizException; + Set availability, AvailabilityContainer container) + throws VizException; /** * Get data from this node. diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/DerivedLevelNode.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/DerivedLevelNode.java index 312b8fe16e..ceea8b34f5 100644 --- a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/DerivedLevelNode.java +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/DerivedLevelNode.java @@ -68,20 +68,10 @@ import com.raytheon.uf.viz.derivparam.library.IDerivParamField; public class DerivedLevelNode extends AbstractDerivedDataNode { - private static final int TIME_QUERY_CACHE_TIME = 30000; - private Map fieldStaticData = null; private Map fields = null; - /** - * Time cache should be reset every time a time query is performed and then - * it can be used to correlate times when requesting data. - */ - private Map> availCache = null; - - private long lastTimeQuery = 0; - private int dt; public DerivedLevelNode(Level level, DerivParamDesc desc, @@ -193,21 +183,16 @@ public class DerivedLevelNode extends AbstractDerivedDataNode { public Set getAvailability( Map> availability) throws VizException { - this.lastTimeQuery = System.currentTimeMillis(); TimeAndSpaceMatcher matcher = getMatcher(); - Map> availCache = new HashMap>(); // We have a derived parameter for the requested grid Set availableDataTimes = null; if (fields == null) { availableDataTimes = AvailabilityContainer.AGNOSTIC_SET; - availCache.put(null, availableDataTimes); - this.availCache = availCache; return availableDataTimes; } for (DerivParamField field : fields.keySet()) { AbstractRequestableNode node = fields.get(field); Set queryDataTimes = availability.get(node); - availCache.put(field, queryDataTimes); if (queryDataTimes != null && queryDataTimes.size() > 0) { Map shiftMap = shiftTime(field, queryDataTimes); @@ -230,30 +215,19 @@ public class DerivedLevelNode extends AbstractDerivedDataNode { } }// FIELD_LOOP - if (availableDataTimes != null) { - availCache.put(null, availableDataTimes); - this.availCache = availCache; - } else { - availCache = new HashMap>(); + if (availableDataTimes == null) { availableDataTimes = new HashSet(0); - availCache.put(null, availableDataTimes); - this.availCache = availCache; } return availableDataTimes; } @Override public Map> getDataDependency( - Set availability) throws VizException { - if (this.availCache == null - || this.lastTimeQuery + TIME_QUERY_CACHE_TIME < System - .currentTimeMillis()) { - new AvailabilityContainer().getAvailability(this); - } + Set availability, + AvailabilityContainer availabilityContainer) throws VizException { TimeAndSpaceMatcher matcher = getMatcher(); - Map> availCache = this.availCache; - availability = matcher.match(availability, availCache.get(null)) - .keySet(); + availability = matcher.match(availability, + availabilityContainer.getAvailability(this)).keySet(); if (availability.isEmpty()) { return Collections.emptyMap(); } @@ -261,7 +235,8 @@ public class DerivedLevelNode extends AbstractDerivedDataNode { if (fields != null) { for (Entry field : fields .entrySet()) { - Set queryTimes = availCache.get(field.getKey()); + Set queryTimes = availabilityContainer + .getAvailability(field.getValue()); Map shiftMap = shiftTime( field.getKey(), queryTimes); if (shiftMap != null) { @@ -299,14 +274,19 @@ public class DerivedLevelNode extends AbstractDerivedDataNode { Set availability, Map> dependencyData) throws VizException { - if (this.availCache == null - || this.lastTimeQuery + TIME_QUERY_CACHE_TIME < System - .currentTimeMillis()) { - new AvailabilityContainer().getAvailability(this); + Map> availCache = new HashMap>( + (int) (dependencyData.size() / 0.75) + 1, 0.75f); + for (AbstractRequestableNode node : fields.values()) { + Set dataSet = dependencyData.get(node); + Set tas = new HashSet( + (int) (dataSet.size() / 0.75) + 1, 0.75f); + for (AbstractRequestableData data : dataSet) { + tas.add(data.getTimeAndSpace()); + } + availCache.put(node, tas); } TimeAndSpaceMatcher matcher = getMatcher(); - Map> availCache = this.availCache; - availability = matcher.match(availability, availCache.get(null)) + availability = matcher.match(availability, getAvailability(availCache)) .keySet(); if (availability.isEmpty()) { return Collections.emptySet(); @@ -344,7 +324,7 @@ public class DerivedLevelNode extends AbstractDerivedDataNode { DerivParamField field = (DerivParamField) ifield; AbstractRequestableNode fieldNode = fields.get(field); - Set fieldAvailability = availCache.get(field); + Set fieldAvailability = availCache.get(fieldNode); Map shiftMap = shiftTime(field, fieldAvailability); if (shiftMap != null) { diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/OrLevelNode.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/OrLevelNode.java index 526cc84048..1e0dffec58 100644 --- a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/OrLevelNode.java +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/OrLevelNode.java @@ -29,6 +29,7 @@ import java.util.Set; import com.raytheon.uf.common.dataplugin.level.Level; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.derivparam.data.AbstractRequestableData; +import com.raytheon.uf.viz.derivparam.inv.AvailabilityContainer; import com.raytheon.uf.viz.derivparam.inv.TimeAndSpace; import com.raytheon.uf.viz.derivparam.library.DerivParamDesc; import com.raytheon.uf.viz.derivparam.library.DerivParamMethod; @@ -106,7 +107,8 @@ public class OrLevelNode extends AbstractDerivedDataNode { @Override public Map> getDataDependency( - Set availability) throws VizException { + Set availability, + AvailabilityContainer availabilityContainer) throws VizException { Map> result = new HashMap>(); for (AbstractRequestableNode node : nodes) { result.put(node, availability); diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/StaticDataLevelNode.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/StaticDataLevelNode.java index becba04635..8e4413f31d 100644 --- a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/StaticDataLevelNode.java +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/StaticDataLevelNode.java @@ -29,6 +29,7 @@ import java.util.Set; import com.raytheon.uf.common.dataplugin.level.Level; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.derivparam.data.AbstractRequestableData; +import com.raytheon.uf.viz.derivparam.inv.AvailabilityContainer; import com.raytheon.uf.viz.derivparam.inv.TimeAndSpace; import com.raytheon.uf.viz.derivparam.library.DerivParamDesc; import com.raytheon.uf.viz.derivparam.library.DerivParamMethod; @@ -81,7 +82,8 @@ public class StaticDataLevelNode extends AbstractDerivedDataNode { @Override public Map> getDataDependency( - Set availability) throws VizException { + Set availability, + AvailabilityContainer availabilityContainer) throws VizException { return Collections.emptyMap(); } diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/TimeRangeLevelNode.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/TimeRangeLevelNode.java index 842da925e8..e342f25578 100644 --- a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/TimeRangeLevelNode.java +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/TimeRangeLevelNode.java @@ -31,6 +31,7 @@ import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.derivparam.data.AbstractRequestableData; import com.raytheon.uf.viz.derivparam.data.AggregateRequestableData; +import com.raytheon.uf.viz.derivparam.inv.AvailabilityContainer; import com.raytheon.uf.viz.derivparam.inv.TimeAndSpace; import com.raytheon.uf.viz.derivparam.inv.TimeAndSpaceMatcher; import com.raytheon.uf.viz.derivparam.inv.TimeAndSpaceMatcher.MatchResult; @@ -134,7 +135,8 @@ public class TimeRangeLevelNode extends AbstractAliasLevelNode { @Override public Map> getDataDependency( - Set availability) { + Set availability, + AvailabilityContainer availabilityContainer) { TimeAndSpaceMatcher matcher = new TimeAndSpaceMatcher(); matcher.setIgnoreRange(true); Set sourceAvailability = new HashSet( diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/UnionLevelNode.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/UnionLevelNode.java index a0616adb9e..fe525d6797 100644 --- a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/UnionLevelNode.java +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/UnionLevelNode.java @@ -33,6 +33,7 @@ import com.raytheon.uf.common.dataplugin.level.Level; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.derivparam.data.AbstractRequestableData; import com.raytheon.uf.viz.derivparam.data.AggregateRequestableData; +import com.raytheon.uf.viz.derivparam.inv.AvailabilityContainer; import com.raytheon.uf.viz.derivparam.inv.TimeAndSpace; import com.raytheon.uf.viz.derivparam.library.DerivParamDesc; import com.raytheon.uf.viz.derivparam.library.DerivParamMethod; @@ -102,7 +103,8 @@ public class UnionLevelNode extends AbstractDerivedDataNode { @Override public Map> getDataDependency( - Set availability) throws VizException { + Set availability, + AvailabilityContainer availabilityContainer) throws VizException { Map> result = new HashMap>(); for (AbstractRequestableNode node : nodes) { result.put(node, availability); diff --git a/cave/com.raytheon.uf.viz.npp.viirs/src/com/raytheon/uf/viz/npp/viirs/data/VIIRSRequestableLevelNode.java b/cave/com.raytheon.uf.viz.npp.viirs/src/com/raytheon/uf/viz/npp/viirs/data/VIIRSRequestableLevelNode.java index f3d454ff4b..72a23784ef 100644 --- a/cave/com.raytheon.uf.viz.npp.viirs/src/com/raytheon/uf/viz/npp/viirs/data/VIIRSRequestableLevelNode.java +++ b/cave/com.raytheon.uf.viz.npp.viirs/src/com/raytheon/uf/viz/npp/viirs/data/VIIRSRequestableLevelNode.java @@ -101,26 +101,38 @@ public class VIIRSRequestableLevelNode extends AbstractBaseDataNode { return false; return true; } - + public Map getRequestConstraintMap() { return requestConstraints; } - /* (non-Javadoc) - * @see com.raytheon.uf.viz.derivparam.tree.AbstractBaseDataNode#getAvailabilityRequest() + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.derivparam.tree.AbstractBaseDataNode# + * getAvailabilityRequest() */ @Override - public DbQueryRequest getAvailabilityRequest() { + public DbQueryRequest getAvailabilityRequest( + Map originalConstraints) { + Map constraints = new HashMap( + originalConstraints); + constraints.putAll(requestConstraints); + constraints.put("pluginName", new RequestConstraint("viirs")); DbQueryRequest request = new DbQueryRequest(); request.setEntityClass(VIIRSDataRecord.class.getName()); request.addRequestField("dataTime"); request.setDistinct(true); - request.setConstraints(requestConstraints); + request.setConstraints(constraints); return request; } - /* (non-Javadoc) - * @see com.raytheon.uf.viz.derivparam.tree.AbstractBaseDataNode#getDataRequest(java.util.Map, java.util.Set) + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.derivparam.tree.AbstractBaseDataNode#getDataRequest + * (java.util.Map, java.util.Set) */ @Override public DbQueryRequest getDataRequest( @@ -136,24 +148,33 @@ public class VIIRSRequestableLevelNode extends AbstractBaseDataNode { return request; } - /* (non-Javadoc) - * @see com.raytheon.uf.viz.derivparam.tree.AbstractBaseDataNode#getAvailability(java.lang.Object) + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.derivparam.tree.AbstractBaseDataNode#getAvailability + * (java.lang.Object) */ @Override - public Set getAvailability(Object response) + public Set getAvailability( + Map originalConstraints, Object response) throws VizException { Set result = new HashSet(); - DbQueryResponse dbresponse = (DbQueryResponse) response; - for (Map map : dbresponse.getResults()) { - DataTime time = (DataTime) map.get("dataTime"); - - result.add(new TimeAndSpace(time)); - } + DbQueryResponse dbresponse = (DbQueryResponse) response; + for (Map map : dbresponse.getResults()) { + DataTime time = (DataTime) map.get("dataTime"); + + result.add(new TimeAndSpace(time)); + } return result; } - /* (non-Javadoc) - * @see com.raytheon.uf.viz.derivparam.tree.AbstractBaseDataNode#getData(java.util.Map, java.util.Set, java.lang.Object) + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.derivparam.tree.AbstractBaseDataNode#getData(java + * .util.Map, java.util.Set, java.lang.Object) */ @Override public Set getData( diff --git a/cave/com.raytheon.viz.feature.awips.developer/feature.xml b/cave/com.raytheon.viz.feature.awips.developer/feature.xml index 56fc0818dd..d4ef19206a 100644 --- a/cave/com.raytheon.viz.feature.awips.developer/feature.xml +++ b/cave/com.raytheon.viz.feature.awips.developer/feature.xml @@ -153,15 +153,19 @@ - + - + - + version="0.0.0"/> + + + diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/GridMetadataContainer.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/GridMetadataContainer.java index 38315370d4..0c08b804af 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/GridMetadataContainer.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/GridMetadataContainer.java @@ -37,6 +37,7 @@ import com.raytheon.uf.viz.core.datastructure.DecisionTree; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.requests.ThriftClient; import com.raytheon.uf.viz.derivparam.data.AbstractRequestableData; +import com.raytheon.uf.viz.derivparam.inv.AvailabilityContainer; import com.raytheon.uf.viz.derivparam.inv.MetadataContainer; import com.raytheon.uf.viz.derivparam.tree.AbstractRequestableNode; import com.raytheon.viz.grid.data.GridRequestableData; @@ -65,8 +66,9 @@ public class GridMetadataContainer extends MetadataContainer { * @param originalConstraints */ public GridMetadataContainer( - Map originalConstraints) { - super(originalConstraints); + Map originalConstraints, + AvailabilityContainer availabilityContainer) { + super(originalConstraints, availabilityContainer); } @Override @@ -106,6 +108,7 @@ public class GridMetadataContainer extends MetadataContainer { requestSet.setQueries(requests.toArray(new DbQueryRequest[0])); DbQueryResponseSet responseSet = (DbQueryResponseSet) ThriftClient .sendRequest(requestSet); + Map> dataCache = new HashMap>(); GridRequestableDataFactory grdf = GridRequestableDataFactory .getInstance(); @@ -128,6 +131,7 @@ public class GridMetadataContainer extends MetadataContainer { } this.dataCache.putAll(dataCache); super.processRequests(); + } /** diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/GridRequestableNode.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/GridRequestableNode.java index a7b5d8553e..2eff0b93f0 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/GridRequestableNode.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/GridRequestableNode.java @@ -228,7 +228,8 @@ public class GridRequestableNode extends AbstractBaseDataNode { } @Override - public DbQueryRequest getAvailabilityRequest() { + public DbQueryRequest getAvailabilityRequest( + Map originalConstraints) { if (GridTimeCache.getInstance().getTimes(this) != null) { return null; } @@ -251,15 +252,17 @@ public class GridRequestableNode extends AbstractBaseDataNode { } @Override - public Set getAvailability(Object response) + public Set getAvailability( + Map originalConstraints, Object response) throws VizException { Set result = new HashSet(); if (response == null) { result = GridTimeCache.getInstance().getTimes(this); if (result == null) { // Oh No! the cache has been cleared since we made our request. - response = ThriftClient.sendRequest(getAvailabilityRequest()); - return getAvailability(response); + response = ThriftClient + .sendRequest(getAvailabilityRequest(originalConstraints)); + return getAvailability(originalConstraints, response); } GridTimeCache.getInstance().setTimes(this, result); } else if (response instanceof DbQueryResponse) { diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/ImportLevelNode.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/ImportLevelNode.java index 44be703029..f66a7c06ec 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/ImportLevelNode.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/ImportLevelNode.java @@ -33,6 +33,7 @@ import com.raytheon.uf.common.gridcoverage.GridCoverage; import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.derivparam.data.AbstractRequestableData; +import com.raytheon.uf.viz.derivparam.inv.AvailabilityContainer; import com.raytheon.uf.viz.derivparam.inv.TimeAndSpace; import com.raytheon.uf.viz.derivparam.library.DerivParamDesc; import com.raytheon.uf.viz.derivparam.library.DerivParamMethod; @@ -120,7 +121,7 @@ public class ImportLevelNode extends AbstractAliasLevelNode { @Override public Map> getDataDependency( - Set times) { + Set times, AvailabilityContainer availabilityContainer) { Map> result = new HashMap>(); result.put(sourceNode, getSourceAvailability(times)); return result; diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/RadarRequestableLevelNode.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/RadarRequestableLevelNode.java index 18b362ef1e..a444771af0 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/RadarRequestableLevelNode.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/RadarRequestableLevelNode.java @@ -107,12 +107,14 @@ public class RadarRequestableLevelNode extends AbstractBaseDataNode { } @Override - public DbQueryRequest getAvailabilityRequest() { + public DbQueryRequest getAvailabilityRequest( + Map originalConstraints) { return null; } @Override - public Set getAvailability(Object response) + public Set getAvailability( + Map originalConstraints, Object response) throws VizException { Set resultsSet = RadarUpdater.getInstance() .getTimes(this); diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/StaticGridDataLevelNode.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/StaticGridDataLevelNode.java index 9e7d2b2bd4..ea902e0428 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/StaticGridDataLevelNode.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/StaticGridDataLevelNode.java @@ -71,12 +71,14 @@ public class StaticGridDataLevelNode extends AbstractBaseDataNode { } @Override - public DbQueryRequest getAvailabilityRequest() { + public DbQueryRequest getAvailabilityRequest( + Map originalConstraints) { return null; } @Override - public Set getAvailability(Object response) + public Set getAvailability( + Map originalConstraints, Object response) throws VizException { Set result = new HashSet(); for (GridCoverage coverage : CoverageUtils.getInstance().getCoverages( diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/util/GridDataCubeAdapter.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/util/GridDataCubeAdapter.java index d8e3b59eb5..80b00bcd3d 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/util/GridDataCubeAdapter.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/util/GridDataCubeAdapter.java @@ -495,16 +495,18 @@ public class GridDataCubeAdapter extends AbstractDataCubeAdapter { @Override protected MetadataContainer createMetadataContainer( Map constraints) { - return new GridMetadataContainer(constraints); + return new GridMetadataContainer(constraints, + createAvailabilityContainer(constraints)); } @Override - protected AvailabilityContainer createAvailabilityContainer() { + protected AvailabilityContainer createAvailabilityContainer( + Map constraints) { // using a grid specific container which is able to merge constraints // will result in faster database queries, however the extra processing // time it takes to route the times to the correct nodes is larger than // the time saved. - return super.createAvailabilityContainer(); + return super.createAvailabilityContainer(constraints); } } diff --git a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/HeightOfLevelNode.java b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/HeightOfLevelNode.java index 5a7a36cc64..163b5b2097 100644 --- a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/HeightOfLevelNode.java +++ b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/HeightOfLevelNode.java @@ -77,7 +77,8 @@ public class HeightOfLevelNode extends AbstractDerivedDataNode { @Override public Map> getDataDependency( - Set availability) throws VizException { + Set availability, + AvailabilityContainer availabilityContainer) throws VizException { Map> result = new HashMap>(); result.put(latNode, availability); result.put(lonNode, availability); diff --git a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/PointAccumLevelNode.java b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/PointAccumLevelNode.java index bd6aa3dc95..b867af2950 100644 --- a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/PointAccumLevelNode.java +++ b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/PointAccumLevelNode.java @@ -79,7 +79,8 @@ public class PointAccumLevelNode extends AbstractDerivedDataNode { @Override public Map> getDataDependency( - Set availability) throws VizException { + Set availability, + AvailabilityContainer availabilityContainer) throws VizException { Map> rval = new HashMap>(); for (AbstractRequestableNode idNode : idNodes) { rval.put(idNode, availability); diff --git a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/PointDataLevelNode.java b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/PointDataLevelNode.java index cf04869ba2..f55e8ee991 100644 --- a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/PointDataLevelNode.java +++ b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/PointDataLevelNode.java @@ -126,12 +126,14 @@ public class PointDataLevelNode extends AbstractBaseDataNode { } @Override - public DbQueryRequest getAvailabilityRequest() { + public DbQueryRequest getAvailabilityRequest( + Map originalConstraints) { return null; } @Override - public Set getAvailability(Object response) { + public Set getAvailability( + Map originalConstraints, Object response) { return AvailabilityContainer.AGNOSTIC_SET; } diff --git a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/PointMetadataContainer.java b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/PointMetadataContainer.java index bb10bc9781..35e06b2f6f 100644 --- a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/PointMetadataContainer.java +++ b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/PointMetadataContainer.java @@ -31,6 +31,7 @@ import com.raytheon.uf.common.datastorage.records.IDataRecord; import com.raytheon.uf.common.pointdata.PointDataContainer; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.derivparam.data.AbstractRequestableData; +import com.raytheon.uf.viz.derivparam.inv.AvailabilityContainer; import com.raytheon.uf.viz.derivparam.inv.MetadataContainer; import com.raytheon.uf.viz.derivparam.tree.AbstractRequestableNode; @@ -64,7 +65,8 @@ public class PointMetadataContainer extends MetadataContainer { public PointMetadataContainer( Map originalConstraints, List requestedParameters, PointDataCubeAdapter pdca) { - super(originalConstraints); + super(originalConstraints, new AvailabilityContainer( + originalConstraints)); this.requestedParameters = requestedParameters; this.pdca = pdca; }