use of org.wso2.siddhi.core.query.StoreQueryRuntime in project siddhi by wso2.
the class StoreQueryParser method parse.
/**
* Parse a storeQuery and return corresponding StoreQueryRuntime.
*
* @param storeQuery storeQuery to be parsed.
* @param siddhiAppContext associated Siddhi app context.
* @param tableMap keyvalue containing tables.
* @param windowMap keyvalue containing windows.
* @param aggregationMap keyvalue containing aggregation runtimes.
* @return StoreQueryRuntime
*/
public static StoreQueryRuntime parse(StoreQuery storeQuery, SiddhiAppContext siddhiAppContext, Map<String, Table> tableMap, Map<String, Window> windowMap, Map<String, AggregationRuntime> aggregationMap) {
String queryName = "store_query_" + storeQuery.getInputStore().getStoreId();
InputStore inputStore = storeQuery.getInputStore();
int metaPosition = SiddhiConstants.UNKNOWN_STATE;
Within within = null;
Expression per = null;
try {
SnapshotService.getSkipSnapshotableThreadLocal().set(true);
Expression onCondition = Expression.value(true);
MetaStreamEvent metaStreamEvent = new MetaStreamEvent();
metaStreamEvent.setInputReferenceId(inputStore.getStoreReferenceId());
if (inputStore instanceof AggregationInputStore) {
AggregationInputStore aggregationInputStore = (AggregationInputStore) inputStore;
if (aggregationMap.get(inputStore.getStoreId()) == null) {
throw new StoreQueryCreationException("Aggregation \"" + inputStore.getStoreId() + "\" has not been defined");
}
if (aggregationInputStore.getPer() != null && aggregationInputStore.getWithin() != null) {
within = aggregationInputStore.getWithin();
per = aggregationInputStore.getPer();
} else if (aggregationInputStore.getPer() != null || aggregationInputStore.getWithin() != null) {
throw new StoreQueryCreationException(inputStore.getStoreId() + " should either have both 'within' and 'per' defined or none.");
}
if (((AggregationInputStore) inputStore).getOnCondition() != null) {
onCondition = ((AggregationInputStore) inputStore).getOnCondition();
}
} else if (inputStore instanceof ConditionInputStore) {
if (((ConditionInputStore) inputStore).getOnCondition() != null) {
onCondition = ((ConditionInputStore) inputStore).getOnCondition();
}
}
List<VariableExpressionExecutor> variableExpressionExecutors = new ArrayList<>();
Table table = tableMap.get(inputStore.getStoreId());
if (table != null) {
return constructStoreQueryRuntime(table, storeQuery, siddhiAppContext, tableMap, queryName, metaPosition, onCondition, metaStreamEvent, variableExpressionExecutors);
} else {
AggregationRuntime aggregation = aggregationMap.get(inputStore.getStoreId());
if (aggregation != null) {
return constructStoreQueryRuntime(aggregation, storeQuery, siddhiAppContext, tableMap, queryName, within, per, onCondition, metaStreamEvent, variableExpressionExecutors);
} else {
Window window = windowMap.get(inputStore.getStoreId());
if (window != null) {
return constructStoreQueryRuntime(window, storeQuery, siddhiAppContext, tableMap, queryName, metaPosition, onCondition, metaStreamEvent, variableExpressionExecutors);
} else {
throw new StoreQueryCreationException(inputStore.getStoreId() + " is neither a table, aggregation or window");
}
}
}
} finally {
SnapshotService.getSkipSnapshotableThreadLocal().set(null);
}
}
use of org.wso2.siddhi.core.query.StoreQueryRuntime in project siddhi by wso2.
the class StoreQueryParser method constructStoreQueryRuntime.
private static StoreQueryRuntime constructStoreQueryRuntime(Window window, StoreQuery storeQuery, SiddhiAppContext siddhiAppContext, Map<String, Table> tableMap, String queryName, int metaPosition, Expression onCondition, MetaStreamEvent metaStreamEvent, List<VariableExpressionExecutor> variableExpressionExecutors) {
metaStreamEvent.setEventType(EventType.WINDOW);
initMetaStreamEvent(metaStreamEvent, window.getWindowDefinition());
MatchingMetaInfoHolder metaStreamInfoHolder = generateMatchingMetaInfoHolder(metaStreamEvent, window.getWindowDefinition());
CompiledCondition compiledCondition = window.compileCondition(onCondition, generateMatchingMetaInfoHolder(metaStreamEvent, window.getWindowDefinition()), siddhiAppContext, variableExpressionExecutors, tableMap, queryName);
FindStoreQueryRuntime findStoreQueryRuntime = new FindStoreQueryRuntime(window, compiledCondition, queryName, metaStreamEvent);
populateFindStoreQueryRuntime(findStoreQueryRuntime, metaStreamInfoHolder, storeQuery.getSelector(), variableExpressionExecutors, siddhiAppContext, tableMap, queryName, metaPosition);
return findStoreQueryRuntime;
}
use of org.wso2.siddhi.core.query.StoreQueryRuntime in project siddhi by wso2.
the class StoreQueryParser method constructStoreQueryRuntime.
private static StoreQueryRuntime constructStoreQueryRuntime(AggregationRuntime aggregation, StoreQuery storeQuery, SiddhiAppContext siddhiAppContext, Map<String, Table> tableMap, String queryName, Within within, Expression per, Expression onCondition, MetaStreamEvent metaStreamEvent, List<VariableExpressionExecutor> variableExpressionExecutors) {
int metaPosition;
metaStreamEvent.setEventType(EventType.AGGREGATE);
initMetaStreamEvent(metaStreamEvent, aggregation.getAggregationDefinition());
MatchingMetaInfoHolder metaStreamInfoHolder = generateMatchingMetaInfoHolder(metaStreamEvent, aggregation.getAggregationDefinition());
CompiledCondition compiledCondition = aggregation.compileExpression(onCondition, within, per, metaStreamInfoHolder, variableExpressionExecutors, tableMap, queryName, siddhiAppContext);
metaStreamInfoHolder = ((IncrementalAggregateCompileCondition) compiledCondition).getAlteredMatchingMetaInfoHolder();
FindStoreQueryRuntime findStoreQueryRuntime = new FindStoreQueryRuntime(aggregation, compiledCondition, queryName, metaStreamEvent);
metaPosition = 1;
populateFindStoreQueryRuntime(findStoreQueryRuntime, metaStreamInfoHolder, storeQuery.getSelector(), variableExpressionExecutors, siddhiAppContext, tableMap, queryName, metaPosition);
ComplexEventPopulater complexEventPopulater = StreamEventPopulaterFactory.constructEventPopulator(metaStreamInfoHolder.getMetaStateEvent().getMetaStreamEvent(0), 0, ((IncrementalAggregateCompileCondition) compiledCondition).getAdditionalAttributes());
((IncrementalAggregateCompileCondition) compiledCondition).setComplexEventPopulater(complexEventPopulater);
return findStoreQueryRuntime;
}
use of org.wso2.siddhi.core.query.StoreQueryRuntime in project siddhi by wso2.
the class SiddhiAppRuntime method getStoreQueryOutputAttributes.
/**
* This method get the storeQuery and return the corresponding output and its types.
*
* @param storeQuery this storeQuery is processed and get the output attributes.
* @param storeQueryString this passed to report errors with context if there are any.
* @return List of output attributes
*/
private Attribute[] getStoreQueryOutputAttributes(StoreQuery storeQuery, String storeQueryString) {
try {
StoreQueryRuntime storeQueryRuntime = storeQueryRuntimeMap.get(storeQuery);
if (storeQueryRuntime == null) {
storeQueryRuntime = StoreQueryParser.parse(storeQuery, siddhiAppContext, tableMap, windowMap, aggregationMap);
storeQueryRuntimeMap.put(storeQuery, storeQueryRuntime);
}
return storeQueryRuntime.getStoreQueryOutputAttributes();
} catch (RuntimeException e) {
if (e instanceof SiddhiAppContextException) {
throw new StoreQueryCreationException(((SiddhiAppContextException) e).getMessageWithOutContext(), e, ((SiddhiAppContextException) e).getQueryContextStartIndex(), ((SiddhiAppContextException) e).getQueryContextEndIndex(), null, siddhiAppContext.getSiddhiAppString());
}
throw new StoreQueryCreationException(e.getMessage(), e);
}
}
use of org.wso2.siddhi.core.query.StoreQueryRuntime in project siddhi by wso2.
the class SiddhiAppRuntime method query.
private Event[] query(StoreQuery storeQuery, String storeQueryString) {
try {
if (siddhiAppContext.isStatsEnabled() && storeQueryLatencyTracker != null) {
storeQueryLatencyTracker.markIn();
}
StoreQueryRuntime storeQueryRuntime = storeQueryRuntimeMap.get(storeQuery);
if (storeQueryRuntime == null) {
storeQueryRuntime = StoreQueryParser.parse(storeQuery, siddhiAppContext, tableMap, windowMap, aggregationMap);
storeQueryRuntimeMap.put(storeQuery, storeQueryRuntime);
} else {
storeQueryRuntime.reset();
}
return storeQueryRuntime.execute();
} catch (RuntimeException e) {
if (e instanceof SiddhiAppContextException) {
throw new StoreQueryCreationException(((SiddhiAppContextException) e).getMessageWithOutContext(), e, ((SiddhiAppContextException) e).getQueryContextStartIndex(), ((SiddhiAppContextException) e).getQueryContextEndIndex(), null, storeQueryString);
}
throw new StoreQueryCreationException(e.getMessage(), e);
} finally {
if (siddhiAppContext.isStatsEnabled() && storeQueryLatencyTracker != null) {
storeQueryLatencyTracker.markOut();
}
}
}
Aggregations