Merge "Issue #1316 pass original constraints through when doing time queries in derived parameters." into development
Former-commit-id:847abb1ce0
[formerlyc8d397e2be
[formerlya605638948
] [formerly847abb1ce0
[formerly db7957b642327ee7a3e592467d75cb776e7fb522]]] Former-commit-id:c8d397e2be
[formerlya605638948
] Former-commit-id:c8d397e2be
Former-commit-id:63a2de9a5d
This commit is contained in:
commit
9b4704d7c4
24 changed files with 227 additions and 119 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
/**
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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>(
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue