Issue #1316 pass original constraints through when doing time queries in derived parameters.

Former-commit-id: 7061c6db78 [formerly 7061c6db78 [formerly 5f67639bdd24711dc6f77b41163f49bf8626b7d3]]
Former-commit-id: f6a502fb78
Former-commit-id: 59a00a75f9
This commit is contained in:
Ben Steffensmeier 2012-11-21 14:20:21 -06:00
parent 55c6fa7bb7
commit d08d71d471
24 changed files with 227 additions and 119 deletions

View file

@ -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<List<DataTime>> timeQuery(List<TimeQueryRequest> requests)
throws VizException {
AvailabilityContainer container = createAvailabilityContainer();
List<AvailabilityContainer> containers = new ArrayList<AvailabilityContainer>(
requests.size());
List<List<DbQueryRequest>> requestLists = new ArrayList<List<DbQueryRequest>>(
requests.size());
List<DbQueryRequest> fullList = new ArrayList<DbQueryRequest>(
requests.size());
for (TimeQueryRequest request : requests) {
AvailabilityContainer container = createAvailabilityContainer(request
.getQueryTerms());
List<AbstractRequestableNode> requestNodes = evaluateRequestConstraints(request
.getQueryTerms());
// pull out time queries and bulk submit
for (AbstractRequestableNode requestNode : requestNodes) {
container.prepareRequests(requestNode);
}
containers.add(container);
List<DbQueryRequest> 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<List<DataTime>> finalResponse = new ArrayList<List<DataTime>>(
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<DbQueryRequest> containerRequests = requestLists.get(i);
Map<DbQueryRequest, DbQueryResponse> responseMap = new HashMap<DbQueryRequest, DbQueryResponse>(
(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<AbstractRequestableNode> 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<String, RequestConstraint> constraints) {
return new MetadataContainer(constraints);
return new MetadataContainer(constraints,
createAvailabilityContainer(constraints));
}
protected AvailabilityContainer createAvailabilityContainer() {
return new AvailabilityContainer();
protected AvailabilityContainer createAvailabilityContainer(
Map<String, RequestConstraint> constraints) {
return new AvailabilityContainer(constraints);
}
/*

View file

@ -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<TimeAndSpace>(Arrays
.asList(new TimeAndSpace())));
protected final Map<String, RequestConstraint> originalConstraints;
protected Map<AbstractBaseDataNode, DbQueryRequest> requestCache = new HashMap<AbstractBaseDataNode, DbQueryRequest>();
protected Map<AbstractRequestableNode, Set<TimeAndSpace>> availabilityCache = new HashMap<AbstractRequestableNode, Set<TimeAndSpace>>();
public AvailabilityContainer(
Map<String, RequestConstraint> 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<AbstractBaseDataNode> nodes = new ArrayList<AbstractBaseDataNode>();
List<DbQueryRequest> requests = new ArrayList<DbQueryRequest>();
for (Entry<AbstractBaseDataNode, DbQueryRequest> 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<DbQueryRequest> 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<DbQueryRequest, DbQueryResponse> responseMap = new HashMap<DbQueryRequest, DbQueryResponse>(
(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<DbQueryRequest> getAvailabilityRequests() {
List<DbQueryRequest> requests = new ArrayList<DbQueryRequest>(
requestCache.size());
for (Entry<AbstractBaseDataNode, DbQueryRequest> 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<DbQueryRequest, DbQueryResponse> responses) throws VizException {
for (Entry<AbstractBaseDataNode, DbQueryRequest> 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));
}
}

View file

@ -63,12 +63,17 @@ public class MetadataContainer {
protected final Map<String, RequestConstraint> originalConstraints;
protected final AvailabilityContainer availabilityContainer;
protected Map<AbstractRequestableNode, Set<TimeAndSpace>> availCache = new HashMap<AbstractRequestableNode, Set<TimeAndSpace>>();
protected Map<AbstractRequestableNode, Set<AbstractRequestableData>> dataCache = new HashMap<AbstractRequestableNode, Set<AbstractRequestableData>>();
public MetadataContainer(Map<String, RequestConstraint> originalConstraints) {
public MetadataContainer(
Map<String, RequestConstraint> 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<AbstractRequestableNode, Set<TimeAndSpace>> avail = derivedNode
.getDataDependency(new HashSet<TimeAndSpace>(availability));
.getDataDependency(new HashSet<TimeAndSpace>(availability),
availabilityContainer);
for (Entry<AbstractRequestableNode, Set<TimeAndSpace>> entry : avail
.entrySet()) {

View file

@ -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<AbstractRequestableNode, Set<TimeAndSpace>> getDataDependency(
Set<TimeAndSpace> times) {
Set<TimeAndSpace> times, AvailabilityContainer container) {
Map<AbstractRequestableNode, Set<TimeAndSpace>> result = new HashMap<AbstractRequestableNode, Set<TimeAndSpace>>();
result.put(sourceNode, times);
return result;

View file

@ -72,7 +72,8 @@ public abstract class AbstractBaseDataNode extends AbstractRequestableNode {
*
* @return
*/
public abstract DbQueryRequest getAvailabilityRequest();
public abstract DbQueryRequest getAvailabilityRequest(
Map<String, RequestConstraint> 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<TimeAndSpace> getAvailability(Object response)
public abstract Set<TimeAndSpace> getAvailability(
Map<String, RequestConstraint> originalConstraints, Object response)
throws VizException;
/**

View file

@ -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<AbstractRequestableNode, Set<TimeAndSpace>> getDataDependency(
Set<TimeAndSpace> availability) throws VizException {
Set<TimeAndSpace> availability,
AvailabilityContainer availabilityContainer) throws VizException {
Map<AbstractRequestableNode, Set<TimeAndSpace>> result = new HashMap<AbstractRequestableNode, Set<TimeAndSpace>>();
for (CubeLevel<AbstractRequestableNode, AbstractRequestableNode> level : levels) {
result.put(level.getParam(), availability);

View file

@ -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<AbstractRequestableNode, Set<TimeAndSpace>> getDataDependency(
Set<TimeAndSpace> availability) throws VizException;
Set<TimeAndSpace> availability, AvailabilityContainer container)
throws VizException;
/**
* Get data from this node.

View file

@ -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<IDerivParamField, AbstractRequestableData> fieldStaticData = null;
private Map<DerivParamField, AbstractRequestableNode> 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<DerivParamField, Set<TimeAndSpace>> 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<TimeAndSpace> getAvailability(
Map<AbstractRequestableNode, Set<TimeAndSpace>> availability)
throws VizException {
this.lastTimeQuery = System.currentTimeMillis();
TimeAndSpaceMatcher matcher = getMatcher();
Map<DerivParamField, Set<TimeAndSpace>> availCache = new HashMap<DerivParamField, Set<TimeAndSpace>>();
// We have a derived parameter for the requested grid
Set<TimeAndSpace> 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<TimeAndSpace> queryDataTimes = availability.get(node);
availCache.put(field, queryDataTimes);
if (queryDataTimes != null && queryDataTimes.size() > 0) {
Map<TimeAndSpace, TimeAndSpace> 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<DerivParamField, Set<TimeAndSpace>>();
if (availableDataTimes == null) {
availableDataTimes = new HashSet<TimeAndSpace>(0);
availCache.put(null, availableDataTimes);
this.availCache = availCache;
}
return availableDataTimes;
}
@Override
public Map<AbstractRequestableNode, Set<TimeAndSpace>> getDataDependency(
Set<TimeAndSpace> availability) throws VizException {
if (this.availCache == null
|| this.lastTimeQuery + TIME_QUERY_CACHE_TIME < System
.currentTimeMillis()) {
new AvailabilityContainer().getAvailability(this);
}
Set<TimeAndSpace> availability,
AvailabilityContainer availabilityContainer) throws VizException {
TimeAndSpaceMatcher matcher = getMatcher();
Map<DerivParamField, Set<TimeAndSpace>> 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<DerivParamField, AbstractRequestableNode> field : fields
.entrySet()) {
Set<TimeAndSpace> queryTimes = availCache.get(field.getKey());
Set<TimeAndSpace> queryTimes = availabilityContainer
.getAvailability(field.getValue());
Map<TimeAndSpace, TimeAndSpace> shiftMap = shiftTime(
field.getKey(), queryTimes);
if (shiftMap != null) {
@ -299,14 +274,19 @@ public class DerivedLevelNode extends AbstractDerivedDataNode {
Set<TimeAndSpace> availability,
Map<AbstractRequestableNode, Set<AbstractRequestableData>> dependencyData)
throws VizException {
if (this.availCache == null
|| this.lastTimeQuery + TIME_QUERY_CACHE_TIME < System
.currentTimeMillis()) {
new AvailabilityContainer().getAvailability(this);
Map<AbstractRequestableNode, Set<TimeAndSpace>> availCache = new HashMap<AbstractRequestableNode, Set<TimeAndSpace>>(
(int) (dependencyData.size() / 0.75) + 1, 0.75f);
for (AbstractRequestableNode node : fields.values()) {
Set<AbstractRequestableData> dataSet = dependencyData.get(node);
Set<TimeAndSpace> tas = new HashSet<TimeAndSpace>(
(int) (dataSet.size() / 0.75) + 1, 0.75f);
for (AbstractRequestableData data : dataSet) {
tas.add(data.getTimeAndSpace());
}
availCache.put(node, tas);
}
TimeAndSpaceMatcher matcher = getMatcher();
Map<DerivParamField, Set<TimeAndSpace>> 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<TimeAndSpace> fieldAvailability = availCache.get(field);
Set<TimeAndSpace> fieldAvailability = availCache.get(fieldNode);
Map<TimeAndSpace, TimeAndSpace> shiftMap = shiftTime(field,
fieldAvailability);
if (shiftMap != null) {

View file

@ -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<AbstractRequestableNode, Set<TimeAndSpace>> getDataDependency(
Set<TimeAndSpace> availability) throws VizException {
Set<TimeAndSpace> availability,
AvailabilityContainer availabilityContainer) throws VizException {
Map<AbstractRequestableNode, Set<TimeAndSpace>> result = new HashMap<AbstractRequestableNode, Set<TimeAndSpace>>();
for (AbstractRequestableNode node : nodes) {
result.put(node, availability);

View file

@ -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<AbstractRequestableNode, Set<TimeAndSpace>> getDataDependency(
Set<TimeAndSpace> availability) throws VizException {
Set<TimeAndSpace> availability,
AvailabilityContainer availabilityContainer) throws VizException {
return Collections.emptyMap();
}

View file

@ -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<AbstractRequestableNode, Set<TimeAndSpace>> getDataDependency(
Set<TimeAndSpace> availability) {
Set<TimeAndSpace> availability,
AvailabilityContainer availabilityContainer) {
TimeAndSpaceMatcher matcher = new TimeAndSpaceMatcher();
matcher.setIgnoreRange(true);
Set<TimeAndSpace> sourceAvailability = new HashSet<TimeAndSpace>(

View file

@ -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<AbstractRequestableNode, Set<TimeAndSpace>> getDataDependency(
Set<TimeAndSpace> availability) throws VizException {
Set<TimeAndSpace> availability,
AvailabilityContainer availabilityContainer) throws VizException {
Map<AbstractRequestableNode, Set<TimeAndSpace>> result = new HashMap<AbstractRequestableNode, Set<TimeAndSpace>>();
for (AbstractRequestableNode node : nodes) {
result.put(node, availability);

View file

@ -101,26 +101,38 @@ public class VIIRSRequestableLevelNode extends AbstractBaseDataNode {
return false;
return true;
}
public Map<String, RequestConstraint> 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<String, RequestConstraint> originalConstraints) {
Map<String, RequestConstraint> constraints = new HashMap<String, RequestConstraint>(
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<TimeAndSpace> getAvailability(Object response)
public Set<TimeAndSpace> getAvailability(
Map<String, RequestConstraint> originalConstraints, Object response)
throws VizException {
Set<TimeAndSpace> result = new HashSet<TimeAndSpace>();
DbQueryResponse dbresponse = (DbQueryResponse) response;
for (Map<String, Object> map : dbresponse.getResults()) {
DataTime time = (DataTime) map.get("dataTime");
result.add(new TimeAndSpace(time));
}
DbQueryResponse dbresponse = (DbQueryResponse) response;
for (Map<String, Object> 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<AbstractRequestableData> getData(

View file

@ -153,15 +153,19 @@
<includes
id="com.raytheon.uf.viz.useradmin.feature"
version="0.0.0"/>
<includes
id="com.raytheon.uf.viz.collaboration.feature"
version="0.0.0"/>
<includes
id="com.raytheon.uf.viz.kml.export.feature"
version="0.0.0"/>
version="0.0.0"/>
<includes
id="com.raytheon.uf.viz.npp.feature"
version="0.0.0"/>
<requires>
<import feature="com.raytheon.uf.viz.core.feature" version="1.0.0.qualifier"/>
</requires>

View file

@ -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<String, RequestConstraint> originalConstraints) {
super(originalConstraints);
Map<String, RequestConstraint> 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<AbstractRequestableNode, Set<AbstractRequestableData>> dataCache = new HashMap<AbstractRequestableNode, Set<AbstractRequestableData>>();
GridRequestableDataFactory grdf = GridRequestableDataFactory
.getInstance();
@ -128,6 +131,7 @@ public class GridMetadataContainer extends MetadataContainer {
}
this.dataCache.putAll(dataCache);
super.processRequests();
}
/**

View file

@ -228,7 +228,8 @@ public class GridRequestableNode extends AbstractBaseDataNode {
}
@Override
public DbQueryRequest getAvailabilityRequest() {
public DbQueryRequest getAvailabilityRequest(
Map<String, RequestConstraint> originalConstraints) {
if (GridTimeCache.getInstance().getTimes(this) != null) {
return null;
}
@ -251,15 +252,17 @@ public class GridRequestableNode extends AbstractBaseDataNode {
}
@Override
public Set<TimeAndSpace> getAvailability(Object response)
public Set<TimeAndSpace> getAvailability(
Map<String, RequestConstraint> originalConstraints, Object response)
throws VizException {
Set<TimeAndSpace> result = new HashSet<TimeAndSpace>();
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) {

View file

@ -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<AbstractRequestableNode, Set<TimeAndSpace>> getDataDependency(
Set<TimeAndSpace> times) {
Set<TimeAndSpace> times, AvailabilityContainer availabilityContainer) {
Map<AbstractRequestableNode, Set<TimeAndSpace>> result = new HashMap<AbstractRequestableNode, Set<TimeAndSpace>>();
result.put(sourceNode, getSourceAvailability(times));
return result;

View file

@ -107,12 +107,14 @@ public class RadarRequestableLevelNode extends AbstractBaseDataNode {
}
@Override
public DbQueryRequest getAvailabilityRequest() {
public DbQueryRequest getAvailabilityRequest(
Map<String, RequestConstraint> originalConstraints) {
return null;
}
@Override
public Set<TimeAndSpace> getAvailability(Object response)
public Set<TimeAndSpace> getAvailability(
Map<String, RequestConstraint> originalConstraints, Object response)
throws VizException {
Set<TimeAndSpace> resultsSet = RadarUpdater.getInstance()
.getTimes(this);

View file

@ -71,12 +71,14 @@ public class StaticGridDataLevelNode extends AbstractBaseDataNode {
}
@Override
public DbQueryRequest getAvailabilityRequest() {
public DbQueryRequest getAvailabilityRequest(
Map<String, RequestConstraint> originalConstraints) {
return null;
}
@Override
public Set<TimeAndSpace> getAvailability(Object response)
public Set<TimeAndSpace> getAvailability(
Map<String, RequestConstraint> originalConstraints, Object response)
throws VizException {
Set<TimeAndSpace> result = new HashSet<TimeAndSpace>();
for (GridCoverage coverage : CoverageUtils.getInstance().getCoverages(

View file

@ -495,16 +495,18 @@ public class GridDataCubeAdapter extends AbstractDataCubeAdapter {
@Override
protected MetadataContainer createMetadataContainer(
Map<String, RequestConstraint> constraints) {
return new GridMetadataContainer(constraints);
return new GridMetadataContainer(constraints,
createAvailabilityContainer(constraints));
}
@Override
protected AvailabilityContainer createAvailabilityContainer() {
protected AvailabilityContainer createAvailabilityContainer(
Map<String, RequestConstraint> 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);
}
}

View file

@ -77,7 +77,8 @@ public class HeightOfLevelNode extends AbstractDerivedDataNode {
@Override
public Map<AbstractRequestableNode, Set<TimeAndSpace>> getDataDependency(
Set<TimeAndSpace> availability) throws VizException {
Set<TimeAndSpace> availability,
AvailabilityContainer availabilityContainer) throws VizException {
Map<AbstractRequestableNode, Set<TimeAndSpace>> result = new HashMap<AbstractRequestableNode, Set<TimeAndSpace>>();
result.put(latNode, availability);
result.put(lonNode, availability);

View file

@ -79,7 +79,8 @@ public class PointAccumLevelNode extends AbstractDerivedDataNode {
@Override
public Map<AbstractRequestableNode, Set<TimeAndSpace>> getDataDependency(
Set<TimeAndSpace> availability) throws VizException {
Set<TimeAndSpace> availability,
AvailabilityContainer availabilityContainer) throws VizException {
Map<AbstractRequestableNode, Set<TimeAndSpace>> rval = new HashMap<AbstractRequestableNode, Set<TimeAndSpace>>();
for (AbstractRequestableNode idNode : idNodes) {
rval.put(idNode, availability);

View file

@ -126,12 +126,14 @@ public class PointDataLevelNode extends AbstractBaseDataNode {
}
@Override
public DbQueryRequest getAvailabilityRequest() {
public DbQueryRequest getAvailabilityRequest(
Map<String, RequestConstraint> originalConstraints) {
return null;
}
@Override
public Set<TimeAndSpace> getAvailability(Object response) {
public Set<TimeAndSpace> getAvailability(
Map<String, RequestConstraint> originalConstraints, Object response) {
return AvailabilityContainer.AGNOSTIC_SET;
}

View file

@ -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<String, RequestConstraint> originalConstraints,
List<String> requestedParameters, PointDataCubeAdapter pdca) {
super(originalConstraints);
super(originalConstraints, new AvailabilityContainer(
originalConstraints));
this.requestedParameters = requestedParameters;
this.pdca = pdca;
}