Search in sources :

Example 1 with Scheduler

use of org.ballerinalang.siddhi.core.util.Scheduler in project ballerina by ballerina-lang.

the class AggregationParser method parse.

public static AggregationRuntime parse(AggregationDefinition aggregationDefinition, SiddhiAppContext siddhiAppContext, Map<String, AbstractDefinition> streamDefinitionMap, Map<String, AbstractDefinition> tableDefinitionMap, Map<String, AbstractDefinition> windowDefinitionMap, Map<String, AbstractDefinition> aggregationDefinitionMap, Map<String, Table> tableMap, Map<String, Window> windowMap, Map<String, AggregationRuntime> aggregationMap, SiddhiAppRuntimeBuilder siddhiAppRuntimeBuilder) {
    if (aggregationDefinition == null) {
        throw new SiddhiAppCreationException("AggregationDefinition instance is null. " + "Hence, can't create the siddhi app '" + siddhiAppContext.getName() + "'");
    }
    if (aggregationDefinition.getTimePeriod() == null) {
        throw new SiddhiAppCreationException("AggregationDefinition '" + aggregationDefinition.getId() + "'s timePeriod is null. " + "Hence, can't create the siddhi app '" + siddhiAppContext.getName() + "'", aggregationDefinition.getQueryContextStartIndex(), aggregationDefinition.getQueryContextEndIndex());
    }
    if (aggregationDefinition.getSelector() == null) {
        throw new SiddhiAppCreationException("AggregationDefinition '" + aggregationDefinition.getId() + "'s selection is not defined. " + "Hence, can't create the siddhi app '" + siddhiAppContext.getName() + "'", aggregationDefinition.getQueryContextStartIndex(), aggregationDefinition.getQueryContextEndIndex());
    }
    if (streamDefinitionMap.get(aggregationDefinition.getBasicSingleInputStream().getStreamId()) == null) {
        throw new SiddhiAppCreationException("Stream " + aggregationDefinition.getBasicSingleInputStream().getStreamId() + " has not been defined");
    }
    try {
        List<VariableExpressionExecutor> incomingVariableExpressionExecutors = new ArrayList<>();
        String aggregatorName = aggregationDefinition.getId();
        StreamRuntime streamRuntime = InputStreamParser.parse(aggregationDefinition.getBasicSingleInputStream(), siddhiAppContext, streamDefinitionMap, tableDefinitionMap, windowDefinitionMap, aggregationDefinitionMap, tableMap, windowMap, aggregationMap, incomingVariableExpressionExecutors, null, false, aggregatorName);
        // Get original meta for later use.
        MetaStreamEvent incomingMetaStreamEvent = (MetaStreamEvent) streamRuntime.getMetaComplexEvent();
        // Create new meta stream event.
        // This must hold the timestamp, group by attributes (if given) and the incremental attributes, in
        // onAfterWindowData array
        // Example format: AGG_TIMESTAMP, groupByAttribute1, groupByAttribute2, AGG_incAttribute1, AGG_incAttribute2
        // AGG_incAttribute1, AGG_incAttribute2 would have the same attribute names as in
        // finalListOfIncrementalAttributes
        // To enter data as onAfterWindowData
        incomingMetaStreamEvent.initializeAfterWindowData();
        List<ExpressionExecutor> incomingExpressionExecutors = new ArrayList<>();
        List<IncrementalAttributeAggregator> incrementalAttributeAggregators = new ArrayList<>();
        List<Variable> groupByVariableList = aggregationDefinition.getSelector().getGroupByList();
        boolean isProcessingOnExternalTime = aggregationDefinition.getAggregateAttribute() != null;
        // Expressions to get
        List<Expression> outputExpressions = new ArrayList<>();
        // final aggregate outputs. e.g avg = sum/count
        // Expression executors to get
        List<ExpressionExecutor> outputExpressionExecutors = new ArrayList<>();
        // final aggregate outputs. e.g avg = sum/count
        populateIncomingAggregatorsAndExecutors(aggregationDefinition, siddhiAppContext, tableMap, incomingVariableExpressionExecutors, aggregatorName, incomingMetaStreamEvent, incomingExpressionExecutors, incrementalAttributeAggregators, groupByVariableList, outputExpressions);
        int baseAggregatorBeginIndex = incomingMetaStreamEvent.getOutputData().size();
        List<Expression> finalBaseAggregators = getFinalBaseAggregators(siddhiAppContext, tableMap, incomingVariableExpressionExecutors, aggregatorName, incomingMetaStreamEvent, incomingExpressionExecutors, incrementalAttributeAggregators);
        StreamDefinition incomingOutputStreamDefinition = StreamDefinition.id("");
        incomingOutputStreamDefinition.setQueryContextStartIndex(aggregationDefinition.getQueryContextStartIndex());
        incomingOutputStreamDefinition.setQueryContextEndIndex(aggregationDefinition.getQueryContextEndIndex());
        MetaStreamEvent processedMetaStreamEvent = new MetaStreamEvent();
        for (Attribute attribute : incomingMetaStreamEvent.getOutputData()) {
            incomingOutputStreamDefinition.attribute(attribute.getName(), attribute.getType());
            processedMetaStreamEvent.addOutputData(attribute);
        }
        incomingMetaStreamEvent.setOutputDefinition(incomingOutputStreamDefinition);
        processedMetaStreamEvent.addInputDefinition(incomingOutputStreamDefinition);
        processedMetaStreamEvent.setOutputDefinition(incomingOutputStreamDefinition);
        // Executors of processing meta
        List<VariableExpressionExecutor> processVariableExpressionExecutors = new ArrayList<>();
        boolean groupBy = aggregationDefinition.getSelector().getGroupByList().size() != 0;
        List<ExpressionExecutor> processExpressionExecutors = constructProcessExpressionExecutors(siddhiAppContext, tableMap, aggregatorName, baseAggregatorBeginIndex, finalBaseAggregators, incomingOutputStreamDefinition, processedMetaStreamEvent, processVariableExpressionExecutors, groupBy);
        outputExpressionExecutors.addAll(outputExpressions.stream().map(expression -> ExpressionParser.parseExpression(expression, processedMetaStreamEvent, 0, tableMap, processVariableExpressionExecutors, siddhiAppContext, groupBy, 0, aggregatorName)).collect(Collectors.toList()));
        // Create group by key generator
        GroupByKeyGenerator groupByKeyGenerator = null;
        if (groupBy) {
            groupByKeyGenerator = new GroupByKeyGenerator(groupByVariableList, processedMetaStreamEvent, SiddhiConstants.UNKNOWN_STATE, tableMap, processVariableExpressionExecutors, siddhiAppContext, aggregatorName);
        }
        // Create new scheduler
        EntryValveExecutor entryValveExecutor = new EntryValveExecutor(siddhiAppContext);
        LockWrapper lockWrapper = new LockWrapper(aggregatorName);
        lockWrapper.setLock(new ReentrantLock());
        Scheduler scheduler = SchedulerParser.parse(siddhiAppContext.getScheduledExecutorService(), entryValveExecutor, siddhiAppContext);
        scheduler.init(lockWrapper, aggregatorName);
        scheduler.setStreamEventPool(new StreamEventPool(processedMetaStreamEvent, 10));
        QueryParserHelper.reduceMetaComplexEvent(incomingMetaStreamEvent);
        QueryParserHelper.reduceMetaComplexEvent(processedMetaStreamEvent);
        QueryParserHelper.updateVariablePosition(incomingMetaStreamEvent, incomingVariableExpressionExecutors);
        QueryParserHelper.updateVariablePosition(processedMetaStreamEvent, processVariableExpressionExecutors);
        List<TimePeriod.Duration> incrementalDurations = getSortedPeriods(aggregationDefinition.getTimePeriod());
        Map<TimePeriod.Duration, Table> aggregationTables = initDefaultTables(aggregatorName, incrementalDurations, processedMetaStreamEvent.getOutputStreamDefinition(), siddhiAppRuntimeBuilder, aggregationDefinition.getAnnotations(), groupByVariableList);
        int bufferSize = 0;
        Element element = AnnotationHelper.getAnnotationElement(SiddhiConstants.ANNOTATION_BUFFER_SIZE, null, aggregationDefinition.getAnnotations());
        if (element != null) {
            try {
                bufferSize = Integer.parseInt(element.getValue());
            } catch (NumberFormatException e) {
                throw new SiddhiAppCreationException(e.getMessage() + ": BufferSize must be an integer");
            }
        }
        if (bufferSize > 0) {
            TimePeriod.Duration rootDuration = incrementalDurations.get(0);
            if (rootDuration == TimePeriod.Duration.MONTHS || rootDuration == TimePeriod.Duration.YEARS) {
                throw new SiddhiAppCreationException("A buffer size greater than 0 can be provided, only when the " + "first duration value is seconds, minutes, hours or days");
            }
            if (!isProcessingOnExternalTime) {
                throw new SiddhiAppCreationException("Buffer size cannot be specified when events are aggregated " + "based on event arrival time.");
            // Buffer size is used to process out of order events. However, events would never be out of
            // order if they are processed based on event arrival time.
            }
        } else if (bufferSize < 0) {
            throw new SiddhiAppCreationException("Expected a positive integer as the buffer size, but found " + bufferSize + " as the provided value");
        }
        boolean ignoreEventsOlderThanBuffer = false;
        element = AnnotationHelper.getAnnotationElement(SiddhiConstants.ANNOTATION_IGNORE_EVENTS_OLDER_THAN_BUFFER, null, aggregationDefinition.getAnnotations());
        if (element != null) {
            if (element.getValue().equalsIgnoreCase("true")) {
                ignoreEventsOlderThanBuffer = true;
            } else if (!element.getValue().equalsIgnoreCase("false")) {
                throw new SiddhiAppCreationException("IgnoreEventsOlderThanBuffer value must " + "be true or false");
            }
        }
        Map<TimePeriod.Duration, IncrementalExecutor> incrementalExecutorMap = buildIncrementalExecutors(isProcessingOnExternalTime, processedMetaStreamEvent, processExpressionExecutors, groupByKeyGenerator, bufferSize, ignoreEventsOlderThanBuffer, incrementalDurations, aggregationTables, siddhiAppContext, aggregatorName);
        // Recreate in-memory data from tables
        RecreateInMemoryData recreateInMemoryData = new RecreateInMemoryData(incrementalDurations, aggregationTables, incrementalExecutorMap, siddhiAppContext, processedMetaStreamEvent, tableMap, windowMap, aggregationMap);
        IncrementalExecutor rootIncrementalExecutor = incrementalExecutorMap.get(incrementalDurations.get(0));
        rootIncrementalExecutor.setScheduler(scheduler);
        // Connect entry valve to root incremental executor
        entryValveExecutor.setNextExecutor(rootIncrementalExecutor);
        QueryParserHelper.initStreamRuntime(streamRuntime, incomingMetaStreamEvent, lockWrapper, aggregatorName);
        LatencyTracker latencyTrackerFind = null;
        LatencyTracker latencyTrackerInsert = null;
        ThroughputTracker throughputTrackerFind = null;
        ThroughputTracker throughputTrackerInsert = null;
        if (siddhiAppContext.getStatisticsManager() != null) {
            latencyTrackerFind = QueryParserHelper.createLatencyTracker(siddhiAppContext, aggregationDefinition.getId(), SiddhiConstants.METRIC_INFIX_WINDOWS, SiddhiConstants.METRIC_TYPE_FIND);
            latencyTrackerInsert = QueryParserHelper.createLatencyTracker(siddhiAppContext, aggregationDefinition.getId(), SiddhiConstants.METRIC_INFIX_WINDOWS, SiddhiConstants.METRIC_TYPE_INSERT);
            throughputTrackerFind = QueryParserHelper.createThroughputTracker(siddhiAppContext, aggregationDefinition.getId(), SiddhiConstants.METRIC_INFIX_WINDOWS, SiddhiConstants.METRIC_TYPE_FIND);
            throughputTrackerInsert = QueryParserHelper.createThroughputTracker(siddhiAppContext, aggregationDefinition.getId(), SiddhiConstants.METRIC_INFIX_WINDOWS, SiddhiConstants.METRIC_TYPE_INSERT);
        }
        streamRuntime.setCommonProcessor(new IncrementalAggregationProcessor(rootIncrementalExecutor, incomingExpressionExecutors, processedMetaStreamEvent, latencyTrackerInsert, throughputTrackerInsert, siddhiAppContext));
        List<ExpressionExecutor> baseExecutors = cloneExpressionExecutors(processExpressionExecutors);
        ExpressionExecutor timestampExecutor = baseExecutors.remove(0);
        return new AggregationRuntime(aggregationDefinition, incrementalExecutorMap, aggregationTables, ((SingleStreamRuntime) streamRuntime), entryValveExecutor, incrementalDurations, siddhiAppContext, baseExecutors, timestampExecutor, processedMetaStreamEvent, outputExpressionExecutors, latencyTrackerFind, throughputTrackerFind, recreateInMemoryData);
    } catch (Throwable t) {
        ExceptionUtil.populateQueryContext(t, aggregationDefinition, siddhiAppContext);
        throw t;
    }
}
Also used : Variable(org.ballerinalang.siddhi.query.api.expression.Variable) Attribute(org.ballerinalang.siddhi.query.api.definition.Attribute) OutputAttribute(org.ballerinalang.siddhi.query.api.execution.query.selection.OutputAttribute) Scheduler(org.ballerinalang.siddhi.core.util.Scheduler) GroupByKeyGenerator(org.ballerinalang.siddhi.core.query.selector.GroupByKeyGenerator) Element(org.ballerinalang.siddhi.query.api.annotation.Element) ArrayList(java.util.ArrayList) IncrementalExecutor(org.ballerinalang.siddhi.core.aggregation.IncrementalExecutor) StreamEventPool(org.ballerinalang.siddhi.core.event.stream.StreamEventPool) StreamRuntime(org.ballerinalang.siddhi.core.query.input.stream.StreamRuntime) SingleStreamRuntime(org.ballerinalang.siddhi.core.query.input.stream.single.SingleStreamRuntime) IncrementalAggregationProcessor(org.ballerinalang.siddhi.core.aggregation.IncrementalAggregationProcessor) AggregationRuntime(org.ballerinalang.siddhi.core.aggregation.AggregationRuntime) ReentrantLock(java.util.concurrent.locks.ReentrantLock) ThroughputTracker(org.ballerinalang.siddhi.core.util.statistics.ThroughputTracker) Table(org.ballerinalang.siddhi.core.table.Table) ExpressionExecutor(org.ballerinalang.siddhi.core.executor.ExpressionExecutor) VariableExpressionExecutor(org.ballerinalang.siddhi.core.executor.VariableExpressionExecutor) StreamDefinition(org.ballerinalang.siddhi.query.api.definition.StreamDefinition) SiddhiAppCreationException(org.ballerinalang.siddhi.core.exception.SiddhiAppCreationException) TimePeriod(org.ballerinalang.siddhi.query.api.aggregation.TimePeriod) SingleStreamRuntime(org.ballerinalang.siddhi.core.query.input.stream.single.SingleStreamRuntime) VariableExpressionExecutor(org.ballerinalang.siddhi.core.executor.VariableExpressionExecutor) EntryValveExecutor(org.ballerinalang.siddhi.core.query.input.stream.single.EntryValveExecutor) LockWrapper(org.ballerinalang.siddhi.core.util.lock.LockWrapper) Expression(org.ballerinalang.siddhi.query.api.expression.Expression) IncrementalAttributeAggregator(org.ballerinalang.siddhi.core.query.selector.attribute.aggregator.incremental.IncrementalAttributeAggregator) RecreateInMemoryData(org.ballerinalang.siddhi.core.aggregation.RecreateInMemoryData) LatencyTracker(org.ballerinalang.siddhi.core.util.statistics.LatencyTracker) MetaStreamEvent(org.ballerinalang.siddhi.core.event.stream.MetaStreamEvent)

Example 2 with Scheduler

use of org.ballerinalang.siddhi.core.util.Scheduler in project ballerina by ballerina-lang.

the class AbsentLogicalPreStateProcessor method cloneProcessor.

@Override
public PreStateProcessor cloneProcessor(String key) {
    AbsentLogicalPreStateProcessor logicalPreStateProcessor = new AbsentLogicalPreStateProcessor(logicalType, stateType, withinStates, waitingTimeConstant);
    cloneProperties(logicalPreStateProcessor, key);
    logicalPreStateProcessor.init(siddhiAppContext, queryName);
    // Set the scheduler
    siddhiAppContext.addEternalReferencedHolder(logicalPreStateProcessor);
    EntryValveProcessor entryValveProcessor = new EntryValveProcessor(siddhiAppContext);
    entryValveProcessor.setToLast(logicalPreStateProcessor);
    Scheduler scheduler = SchedulerParser.parse(siddhiAppContext.getScheduledExecutorService(), entryValveProcessor, siddhiAppContext);
    logicalPreStateProcessor.setScheduler(scheduler);
    return logicalPreStateProcessor;
}
Also used : Scheduler(org.ballerinalang.siddhi.core.util.Scheduler) EntryValveProcessor(org.ballerinalang.siddhi.core.query.input.stream.single.EntryValveProcessor)

Example 3 with Scheduler

use of org.ballerinalang.siddhi.core.util.Scheduler in project ballerina by ballerina-lang.

the class AbsentStreamPreStateProcessor method cloneProcessor.

@Override
public PreStateProcessor cloneProcessor(String key) {
    AbsentStreamPreStateProcessor streamPreStateProcessor = new AbsentStreamPreStateProcessor(stateType, withinStates, waitingTimeConstant);
    cloneProperties(streamPreStateProcessor, key);
    streamPreStateProcessor.init(siddhiAppContext, queryName);
    // Set the scheduler
    siddhiAppContext.addEternalReferencedHolder(streamPreStateProcessor);
    EntryValveProcessor entryValveProcessor = new EntryValveProcessor(siddhiAppContext);
    entryValveProcessor.setToLast(streamPreStateProcessor);
    Scheduler scheduler = SchedulerParser.parse(siddhiAppContext.getScheduledExecutorService(), entryValveProcessor, siddhiAppContext);
    streamPreStateProcessor.setScheduler(scheduler);
    return streamPreStateProcessor;
}
Also used : Scheduler(org.ballerinalang.siddhi.core.util.Scheduler) EntryValveProcessor(org.ballerinalang.siddhi.core.query.input.stream.single.EntryValveProcessor)

Example 4 with Scheduler

use of org.ballerinalang.siddhi.core.util.Scheduler in project ballerina by ballerina-lang.

the class SingleInputStreamParser method parseInputStream.

/**
 * Parse single InputStream and return SingleStreamRuntime.
 *
 * @param inputStream                 single input stream to be parsed
 * @param siddhiAppContext            query to be parsed
 * @param variableExpressionExecutors List to hold VariableExpressionExecutors to update after query parsing
 * @param streamDefinitionMap         Stream Definition Map
 * @param tableDefinitionMap          Table Definition Map
 * @param windowDefinitionMap         window definition map
 * @param aggregationDefinitionMap    aggregation definition map
 * @param tableMap                    Table Map
 * @param metaComplexEvent            MetaComplexEvent
 * @param processStreamReceiver       ProcessStreamReceiver
 * @param supportsBatchProcessing     supports batch processing
 * @param outputExpectsExpiredEvents  is output expects ExpiredEvents
 * @param queryName                   query name of single input stream belongs to.
 * @return SingleStreamRuntime
 */
public static SingleStreamRuntime parseInputStream(SingleInputStream inputStream, SiddhiAppContext siddhiAppContext, List<VariableExpressionExecutor> variableExpressionExecutors, Map<String, AbstractDefinition> streamDefinitionMap, Map<String, AbstractDefinition> tableDefinitionMap, Map<String, AbstractDefinition> windowDefinitionMap, Map<String, AbstractDefinition> aggregationDefinitionMap, Map<String, Table> tableMap, MetaComplexEvent metaComplexEvent, ProcessStreamReceiver processStreamReceiver, boolean supportsBatchProcessing, boolean outputExpectsExpiredEvents, String queryName) {
    Processor processor = null;
    EntryValveProcessor entryValveProcessor = null;
    boolean first = true;
    MetaStreamEvent metaStreamEvent;
    if (metaComplexEvent instanceof MetaStateEvent) {
        metaStreamEvent = new MetaStreamEvent();
        ((MetaStateEvent) metaComplexEvent).addEvent(metaStreamEvent);
        initMetaStreamEvent(inputStream, streamDefinitionMap, tableDefinitionMap, windowDefinitionMap, aggregationDefinitionMap, metaStreamEvent);
    } else {
        metaStreamEvent = (MetaStreamEvent) metaComplexEvent;
        initMetaStreamEvent(inputStream, streamDefinitionMap, tableDefinitionMap, windowDefinitionMap, aggregationDefinitionMap, metaStreamEvent);
    }
    // A window cannot be defined for a window stream
    if (!inputStream.getStreamHandlers().isEmpty() && windowDefinitionMap != null && windowDefinitionMap.containsKey(inputStream.getStreamId())) {
        for (StreamHandler handler : inputStream.getStreamHandlers()) {
            if (handler instanceof Window) {
                throw new OperationNotSupportedException("Cannot create " + ((Window) handler).getName() + " " + "window for the window stream " + inputStream.getStreamId());
            }
        }
    }
    if (!inputStream.getStreamHandlers().isEmpty()) {
        for (StreamHandler handler : inputStream.getStreamHandlers()) {
            Processor currentProcessor = generateProcessor(handler, metaComplexEvent, variableExpressionExecutors, siddhiAppContext, tableMap, supportsBatchProcessing, outputExpectsExpiredEvents, queryName);
            if (currentProcessor instanceof SchedulingProcessor) {
                if (entryValveProcessor == null) {
                    entryValveProcessor = new EntryValveProcessor(siddhiAppContext);
                    if (first) {
                        processor = entryValveProcessor;
                        first = false;
                    } else {
                        processor.setToLast(entryValveProcessor);
                    }
                }
                Scheduler scheduler = SchedulerParser.parse(siddhiAppContext.getScheduledExecutorService(), entryValveProcessor, siddhiAppContext);
                ((SchedulingProcessor) currentProcessor).setScheduler(scheduler);
            }
            if (first) {
                processor = currentProcessor;
                first = false;
            } else {
                processor.setToLast(currentProcessor);
            }
        }
    }
    metaStreamEvent.initializeAfterWindowData();
    return new SingleStreamRuntime(processStreamReceiver, processor, metaComplexEvent);
}
Also used : Window(org.ballerinalang.siddhi.query.api.execution.query.input.handler.Window) OperationNotSupportedException(org.ballerinalang.siddhi.core.exception.OperationNotSupportedException) SchedulingProcessor(org.ballerinalang.siddhi.core.query.processor.SchedulingProcessor) Processor(org.ballerinalang.siddhi.core.query.processor.Processor) EntryValveProcessor(org.ballerinalang.siddhi.core.query.input.stream.single.EntryValveProcessor) StreamProcessor(org.ballerinalang.siddhi.core.query.processor.stream.StreamProcessor) AbstractStreamProcessor(org.ballerinalang.siddhi.core.query.processor.stream.AbstractStreamProcessor) StreamFunctionProcessor(org.ballerinalang.siddhi.core.query.processor.stream.function.StreamFunctionProcessor) WindowProcessor(org.ballerinalang.siddhi.core.query.processor.stream.window.WindowProcessor) SchedulingProcessor(org.ballerinalang.siddhi.core.query.processor.SchedulingProcessor) FilterProcessor(org.ballerinalang.siddhi.core.query.processor.filter.FilterProcessor) Scheduler(org.ballerinalang.siddhi.core.util.Scheduler) SingleStreamRuntime(org.ballerinalang.siddhi.core.query.input.stream.single.SingleStreamRuntime) StreamHandler(org.ballerinalang.siddhi.query.api.execution.query.input.handler.StreamHandler) EntryValveProcessor(org.ballerinalang.siddhi.core.query.input.stream.single.EntryValveProcessor) MetaStreamEvent(org.ballerinalang.siddhi.core.event.stream.MetaStreamEvent) MetaStateEvent(org.ballerinalang.siddhi.core.event.state.MetaStateEvent)

Example 5 with Scheduler

use of org.ballerinalang.siddhi.core.util.Scheduler in project ballerina by ballerina-lang.

the class StateInputStreamParser method parse.

private static InnerStateRuntime parse(StateElement stateElement, Map<String, AbstractDefinition> streamDefinitionMap, Map<String, AbstractDefinition> tableDefinitionMap, Map<String, AbstractDefinition> windowDefinitionMap, Map<String, AbstractDefinition> aggregationDefinitionMap, Map<String, Table> tableMap, MetaStateEvent metaStateEvent, SiddhiAppContext siddhiAppContext, List<VariableExpressionExecutor> variableExpressionExecutors, Map<String, ProcessStreamReceiver> processStreamReceiverMap, StreamPreStateProcessor streamPreStateProcessor, StreamPostStateProcessor streamPostStateProcessor, StateInputStream.Type stateType, ArrayList<Map.Entry<Long, Set<Integer>>> withinStates, LatencyTracker latencyTracker, String queryName) {
    if (stateElement instanceof StreamStateElement) {
        BasicSingleInputStream basicSingleInputStream = ((StreamStateElement) stateElement).getBasicSingleInputStream();
        SingleStreamRuntime singleStreamRuntime = SingleInputStreamParser.parseInputStream(basicSingleInputStream, siddhiAppContext, variableExpressionExecutors, streamDefinitionMap, tableDefinitionMap, windowDefinitionMap, aggregationDefinitionMap, tableMap, metaStateEvent, processStreamReceiverMap.get(basicSingleInputStream.getUniqueStreamIds().get(0)), false, false, queryName);
        int stateIndex = metaStateEvent.getStreamEventCount() - 1;
        if (streamPreStateProcessor == null) {
            if (stateElement.getWithin() != null) {
                Set<Integer> withinStateset = new HashSet<Integer>();
                withinStateset.add(SiddhiConstants.ANY);
                withinStates.add(0, new AbstractMap.SimpleEntry<Long, Set<Integer>>(stateElement.getWithin().getValue(), withinStateset));
            }
            if (stateElement instanceof AbsentStreamStateElement) {
                AbsentStreamPreStateProcessor absentProcessor = new AbsentStreamPreStateProcessor(stateType, clonewithinStates(withinStates), ((AbsentStreamStateElement) stateElement).getWaitingTime());
                // Set the scheduler
                siddhiAppContext.addEternalReferencedHolder(absentProcessor);
                EntryValveProcessor entryValveProcessor = new EntryValveProcessor(siddhiAppContext);
                entryValveProcessor.setToLast(absentProcessor);
                Scheduler scheduler = SchedulerParser.parse(siddhiAppContext.getScheduledExecutorService(), entryValveProcessor, siddhiAppContext);
                absentProcessor.setScheduler(scheduler);
                // Assign the AbsentStreamPreStateProcessor to streamPreStateProcessor
                streamPreStateProcessor = absentProcessor;
            } else {
                streamPreStateProcessor = new StreamPreStateProcessor(stateType, clonewithinStates(withinStates));
            }
            streamPreStateProcessor.init(siddhiAppContext, queryName);
            if (stateElement.getWithin() != null) {
                withinStates.remove(0);
            }
        }
        streamPreStateProcessor.setStateId(stateIndex);
        streamPreStateProcessor.setNextProcessor(singleStreamRuntime.getProcessorChain());
        singleStreamRuntime.setProcessorChain(streamPreStateProcessor);
        if (streamPostStateProcessor == null) {
            if (stateElement instanceof AbsentStreamStateElement) {
                streamPostStateProcessor = new AbsentStreamPostStateProcessor();
            } else {
                streamPostStateProcessor = new StreamPostStateProcessor();
            }
        }
        streamPostStateProcessor.setStateId(stateIndex);
        singleStreamRuntime.getProcessorChain().setToLast(streamPostStateProcessor);
        streamPostStateProcessor.setThisStatePreProcessor(streamPreStateProcessor);
        streamPreStateProcessor.setThisStatePostProcessor(streamPostStateProcessor);
        streamPreStateProcessor.setThisLastProcessor(streamPostStateProcessor);
        StreamInnerStateRuntime innerStateRuntime = new StreamInnerStateRuntime(stateType);
        innerStateRuntime.setFirstProcessor(streamPreStateProcessor);
        innerStateRuntime.setLastProcessor(streamPostStateProcessor);
        innerStateRuntime.addStreamRuntime(singleStreamRuntime);
        return innerStateRuntime;
    } else if (stateElement instanceof NextStateElement) {
        StateElement currentElement = ((NextStateElement) stateElement).getStateElement();
        InnerStateRuntime currentInnerStateRuntime = parse(currentElement, streamDefinitionMap, tableDefinitionMap, windowDefinitionMap, aggregationDefinitionMap, tableMap, metaStateEvent, siddhiAppContext, variableExpressionExecutors, processStreamReceiverMap, streamPreStateProcessor, streamPostStateProcessor, stateType, withinStates, latencyTracker, queryName);
        if (stateElement.getWithin() != null) {
            Set<Integer> withinStateSet = new HashSet<Integer>();
            withinStateSet.add(currentInnerStateRuntime.getFirstProcessor().getStateId());
            withinStateSet.add(currentInnerStateRuntime.getLastProcessor().getStateId());
            withinStates.add(0, new AbstractMap.SimpleEntry<Long, Set<Integer>>(stateElement.getWithin().getValue(), withinStateSet));
        }
        StateElement nextElement = ((NextStateElement) stateElement).getNextStateElement();
        InnerStateRuntime nextInnerStateRuntime = parse(nextElement, streamDefinitionMap, tableDefinitionMap, windowDefinitionMap, aggregationDefinitionMap, tableMap, metaStateEvent, siddhiAppContext, variableExpressionExecutors, processStreamReceiverMap, streamPreStateProcessor, streamPostStateProcessor, stateType, withinStates, latencyTracker, queryName);
        if (stateElement.getWithin() != null) {
            withinStates.remove(0);
        }
        // currentInnerStateRuntime.getFirstProcessor().getStateId()
        currentInnerStateRuntime.getLastProcessor().setNextStatePreProcessor(nextInnerStateRuntime.getFirstProcessor());
        NextInnerStateRuntime nextStateRuntime = new NextInnerStateRuntime(currentInnerStateRuntime, nextInnerStateRuntime, stateType);
        nextStateRuntime.setFirstProcessor(currentInnerStateRuntime.getFirstProcessor());
        nextStateRuntime.setLastProcessor(nextInnerStateRuntime.getLastProcessor());
        for (SingleStreamRuntime singleStreamRuntime : currentInnerStateRuntime.getSingleStreamRuntimeList()) {
            nextStateRuntime.addStreamRuntime(singleStreamRuntime);
        }
        for (SingleStreamRuntime singleStreamRuntime : nextInnerStateRuntime.getSingleStreamRuntimeList()) {
            nextStateRuntime.addStreamRuntime(singleStreamRuntime);
        }
        return nextStateRuntime;
    } else if (stateElement instanceof EveryStateElement) {
        StateElement currentElement = ((EveryStateElement) stateElement).getStateElement();
        InnerStateRuntime innerStateRuntime = parse(currentElement, streamDefinitionMap, tableDefinitionMap, windowDefinitionMap, aggregationDefinitionMap, tableMap, metaStateEvent, siddhiAppContext, variableExpressionExecutors, processStreamReceiverMap, streamPreStateProcessor, streamPostStateProcessor, stateType, withinStates, latencyTracker, queryName);
        EveryInnerStateRuntime everyInnerStateRuntime = new EveryInnerStateRuntime(innerStateRuntime, stateType);
        everyInnerStateRuntime.setFirstProcessor(innerStateRuntime.getFirstProcessor());
        everyInnerStateRuntime.setLastProcessor(innerStateRuntime.getLastProcessor());
        for (SingleStreamRuntime singleStreamRuntime : innerStateRuntime.getSingleStreamRuntimeList()) {
            everyInnerStateRuntime.addStreamRuntime(singleStreamRuntime);
        }
        everyInnerStateRuntime.getLastProcessor().setNextEveryStatePerProcessor(everyInnerStateRuntime.getFirstProcessor());
        return everyInnerStateRuntime;
    } else if (stateElement instanceof LogicalStateElement) {
        LogicalStateElement.Type type = ((LogicalStateElement) stateElement).getType();
        if (stateElement.getWithin() != null) {
            Set<Integer> withinStateset = new HashSet<Integer>();
            withinStateset.add(SiddhiConstants.ANY);
            withinStates.add(0, new AbstractMap.SimpleEntry<Long, Set<Integer>>(stateElement.getWithin().getValue(), withinStateset));
        }
        LogicalPreStateProcessor logicalPreStateProcessor1;
        if (((LogicalStateElement) stateElement).getStreamStateElement1() instanceof AbsentStreamStateElement) {
            logicalPreStateProcessor1 = new AbsentLogicalPreStateProcessor(type, stateType, clonewithinStates(withinStates), ((AbsentStreamStateElement) ((LogicalStateElement) stateElement).getStreamStateElement1()).getWaitingTime());
            // Set the scheduler
            siddhiAppContext.addEternalReferencedHolder((AbsentLogicalPreStateProcessor) logicalPreStateProcessor1);
            EntryValveProcessor entryValveProcessor = new EntryValveProcessor(siddhiAppContext);
            entryValveProcessor.setToLast(logicalPreStateProcessor1);
            Scheduler scheduler = SchedulerParser.parse(siddhiAppContext.getScheduledExecutorService(), entryValveProcessor, siddhiAppContext);
            ((SchedulingProcessor) logicalPreStateProcessor1).setScheduler(scheduler);
        } else {
            logicalPreStateProcessor1 = new LogicalPreStateProcessor(type, stateType, clonewithinStates(withinStates));
        }
        logicalPreStateProcessor1.init(siddhiAppContext, queryName);
        LogicalPostStateProcessor logicalPostStateProcessor1;
        if (((LogicalStateElement) stateElement).getStreamStateElement1() instanceof AbsentStreamStateElement) {
            logicalPostStateProcessor1 = new AbsentLogicalPostStateProcessor(type);
        } else {
            logicalPostStateProcessor1 = new LogicalPostStateProcessor(type);
        }
        LogicalPreStateProcessor logicalPreStateProcessor2;
        if (((LogicalStateElement) stateElement).getStreamStateElement2() instanceof AbsentStreamStateElement) {
            logicalPreStateProcessor2 = new AbsentLogicalPreStateProcessor(type, stateType, clonewithinStates(withinStates), ((AbsentStreamStateElement) ((LogicalStateElement) stateElement).getStreamStateElement2()).getWaitingTime());
            siddhiAppContext.addEternalReferencedHolder((AbsentLogicalPreStateProcessor) logicalPreStateProcessor2);
            EntryValveProcessor entryValveProcessor = new EntryValveProcessor(siddhiAppContext);
            entryValveProcessor.setToLast(logicalPreStateProcessor2);
            Scheduler scheduler = SchedulerParser.parse(siddhiAppContext.getScheduledExecutorService(), entryValveProcessor, siddhiAppContext);
            ((SchedulingProcessor) logicalPreStateProcessor2).setScheduler(scheduler);
        } else {
            logicalPreStateProcessor2 = new LogicalPreStateProcessor(type, stateType, clonewithinStates(withinStates));
        }
        logicalPreStateProcessor2.init(siddhiAppContext, queryName);
        LogicalPostStateProcessor logicalPostStateProcessor2;
        if (((LogicalStateElement) stateElement).getStreamStateElement2() instanceof AbsentStreamStateElement) {
            logicalPostStateProcessor2 = new AbsentLogicalPostStateProcessor(type);
        } else {
            logicalPostStateProcessor2 = new LogicalPostStateProcessor(type);
        }
        if (stateElement.getWithin() != null) {
            withinStates.remove(0);
        }
        logicalPostStateProcessor1.setPartnerPreStateProcessor(logicalPreStateProcessor2);
        logicalPostStateProcessor2.setPartnerPreStateProcessor(logicalPreStateProcessor1);
        logicalPostStateProcessor1.setPartnerPostStateProcessor(logicalPostStateProcessor2);
        logicalPostStateProcessor2.setPartnerPostStateProcessor(logicalPostStateProcessor1);
        logicalPreStateProcessor1.setPartnerStatePreProcessor(logicalPreStateProcessor2);
        logicalPreStateProcessor2.setPartnerStatePreProcessor(logicalPreStateProcessor1);
        StateElement stateElement2 = ((LogicalStateElement) stateElement).getStreamStateElement2();
        InnerStateRuntime innerStateRuntime2 = parse(stateElement2, streamDefinitionMap, tableDefinitionMap, windowDefinitionMap, aggregationDefinitionMap, tableMap, metaStateEvent, siddhiAppContext, variableExpressionExecutors, processStreamReceiverMap, logicalPreStateProcessor2, logicalPostStateProcessor2, stateType, withinStates, latencyTracker, queryName);
        StateElement stateElement1 = ((LogicalStateElement) stateElement).getStreamStateElement1();
        InnerStateRuntime innerStateRuntime1 = parse(stateElement1, streamDefinitionMap, tableDefinitionMap, windowDefinitionMap, aggregationDefinitionMap, tableMap, metaStateEvent, siddhiAppContext, variableExpressionExecutors, processStreamReceiverMap, logicalPreStateProcessor1, logicalPostStateProcessor1, stateType, withinStates, latencyTracker, queryName);
        LogicalInnerStateRuntime logicalInnerStateRuntime = new LogicalInnerStateRuntime(innerStateRuntime1, innerStateRuntime2, stateType);
        logicalInnerStateRuntime.setFirstProcessor(innerStateRuntime1.getFirstProcessor());
        logicalInnerStateRuntime.setLastProcessor(innerStateRuntime2.getLastProcessor());
        for (SingleStreamRuntime singleStreamRuntime : innerStateRuntime2.getSingleStreamRuntimeList()) {
            logicalInnerStateRuntime.addStreamRuntime(singleStreamRuntime);
        }
        for (SingleStreamRuntime singleStreamRuntime : innerStateRuntime1.getSingleStreamRuntimeList()) {
            logicalInnerStateRuntime.addStreamRuntime(singleStreamRuntime);
        }
        return logicalInnerStateRuntime;
    } else if (stateElement instanceof CountStateElement) {
        int minCount = ((CountStateElement) stateElement).getMinCount();
        int maxCount = ((CountStateElement) stateElement).getMaxCount();
        if (minCount == SiddhiConstants.ANY) {
            minCount = 0;
        }
        if (maxCount == SiddhiConstants.ANY) {
            maxCount = Integer.MAX_VALUE;
        }
        if (stateElement.getWithin() != null) {
            Set<Integer> withinStateset = new HashSet<Integer>();
            withinStateset.add(SiddhiConstants.ANY);
            withinStates.add(0, new AbstractMap.SimpleEntry<Long, Set<Integer>>(stateElement.getWithin().getValue(), withinStateset));
        }
        CountPreStateProcessor countPreStateProcessor = new CountPreStateProcessor(minCount, maxCount, stateType, withinStates);
        countPreStateProcessor.init(siddhiAppContext, queryName);
        CountPostStateProcessor countPostStateProcessor = new CountPostStateProcessor(minCount, maxCount);
        if (stateElement.getWithin() != null) {
            withinStates.remove(0);
        }
        countPreStateProcessor.setCountPostStateProcessor(countPostStateProcessor);
        StateElement currentElement = ((CountStateElement) stateElement).getStreamStateElement();
        InnerStateRuntime innerStateRuntime = parse(currentElement, streamDefinitionMap, tableDefinitionMap, windowDefinitionMap, aggregationDefinitionMap, tableMap, metaStateEvent, siddhiAppContext, variableExpressionExecutors, processStreamReceiverMap, countPreStateProcessor, countPostStateProcessor, stateType, withinStates, latencyTracker, queryName);
        return new CountInnerStateRuntime((StreamInnerStateRuntime) innerStateRuntime);
    } else {
        throw new OperationNotSupportedException();
    }
}
Also used : CountPreStateProcessor(org.ballerinalang.siddhi.core.query.input.stream.state.CountPreStateProcessor) Set(java.util.Set) HashSet(java.util.HashSet) NextStateElement(org.ballerinalang.siddhi.query.api.execution.query.input.state.NextStateElement) Scheduler(org.ballerinalang.siddhi.core.util.Scheduler) EveryStateElement(org.ballerinalang.siddhi.query.api.execution.query.input.state.EveryStateElement) LogicalStateElement(org.ballerinalang.siddhi.query.api.execution.query.input.state.LogicalStateElement) StateElement(org.ballerinalang.siddhi.query.api.execution.query.input.state.StateElement) AbsentStreamStateElement(org.ballerinalang.siddhi.query.api.execution.query.input.state.AbsentStreamStateElement) NextStateElement(org.ballerinalang.siddhi.query.api.execution.query.input.state.NextStateElement) CountStateElement(org.ballerinalang.siddhi.query.api.execution.query.input.state.CountStateElement) StreamStateElement(org.ballerinalang.siddhi.query.api.execution.query.input.state.StreamStateElement) AbsentStreamPreStateProcessor(org.ballerinalang.siddhi.core.query.input.stream.state.AbsentStreamPreStateProcessor) StreamPreStateProcessor(org.ballerinalang.siddhi.core.query.input.stream.state.StreamPreStateProcessor) LogicalPostStateProcessor(org.ballerinalang.siddhi.core.query.input.stream.state.LogicalPostStateProcessor) AbsentLogicalPostStateProcessor(org.ballerinalang.siddhi.core.query.input.stream.state.AbsentLogicalPostStateProcessor) EveryInnerStateRuntime(org.ballerinalang.siddhi.core.query.input.stream.state.runtime.EveryInnerStateRuntime) EveryStateElement(org.ballerinalang.siddhi.query.api.execution.query.input.state.EveryStateElement) AbsentLogicalPostStateProcessor(org.ballerinalang.siddhi.core.query.input.stream.state.AbsentLogicalPostStateProcessor) AbstractMap(java.util.AbstractMap) InnerStateRuntime(org.ballerinalang.siddhi.core.query.input.stream.state.runtime.InnerStateRuntime) CountInnerStateRuntime(org.ballerinalang.siddhi.core.query.input.stream.state.runtime.CountInnerStateRuntime) LogicalInnerStateRuntime(org.ballerinalang.siddhi.core.query.input.stream.state.runtime.LogicalInnerStateRuntime) StreamInnerStateRuntime(org.ballerinalang.siddhi.core.query.input.stream.state.runtime.StreamInnerStateRuntime) EveryInnerStateRuntime(org.ballerinalang.siddhi.core.query.input.stream.state.runtime.EveryInnerStateRuntime) NextInnerStateRuntime(org.ballerinalang.siddhi.core.query.input.stream.state.runtime.NextInnerStateRuntime) StreamPostStateProcessor(org.ballerinalang.siddhi.core.query.input.stream.state.StreamPostStateProcessor) AbsentStreamPostStateProcessor(org.ballerinalang.siddhi.core.query.input.stream.state.AbsentStreamPostStateProcessor) CountStateElement(org.ballerinalang.siddhi.query.api.execution.query.input.state.CountStateElement) NextInnerStateRuntime(org.ballerinalang.siddhi.core.query.input.stream.state.runtime.NextInnerStateRuntime) LogicalInnerStateRuntime(org.ballerinalang.siddhi.core.query.input.stream.state.runtime.LogicalInnerStateRuntime) LogicalStateElement(org.ballerinalang.siddhi.query.api.execution.query.input.state.LogicalStateElement) StreamInnerStateRuntime(org.ballerinalang.siddhi.core.query.input.stream.state.runtime.StreamInnerStateRuntime) HashSet(java.util.HashSet) OperationNotSupportedException(org.ballerinalang.siddhi.core.exception.OperationNotSupportedException) CountPostStateProcessor(org.ballerinalang.siddhi.core.query.input.stream.state.CountPostStateProcessor) SingleStreamRuntime(org.ballerinalang.siddhi.core.query.input.stream.single.SingleStreamRuntime) CountInnerStateRuntime(org.ballerinalang.siddhi.core.query.input.stream.state.runtime.CountInnerStateRuntime) AbsentStreamStateElement(org.ballerinalang.siddhi.query.api.execution.query.input.state.AbsentStreamStateElement) AbsentLogicalPreStateProcessor(org.ballerinalang.siddhi.core.query.input.stream.state.AbsentLogicalPreStateProcessor) LogicalPreStateProcessor(org.ballerinalang.siddhi.core.query.input.stream.state.LogicalPreStateProcessor) AbsentLogicalPreStateProcessor(org.ballerinalang.siddhi.core.query.input.stream.state.AbsentLogicalPreStateProcessor) AbsentStreamPreStateProcessor(org.ballerinalang.siddhi.core.query.input.stream.state.AbsentStreamPreStateProcessor) AbsentStreamStateElement(org.ballerinalang.siddhi.query.api.execution.query.input.state.AbsentStreamStateElement) StreamStateElement(org.ballerinalang.siddhi.query.api.execution.query.input.state.StreamStateElement) BasicSingleInputStream(org.ballerinalang.siddhi.query.api.execution.query.input.stream.BasicSingleInputStream) EntryValveProcessor(org.ballerinalang.siddhi.core.query.input.stream.single.EntryValveProcessor) AbsentStreamPostStateProcessor(org.ballerinalang.siddhi.core.query.input.stream.state.AbsentStreamPostStateProcessor)

Aggregations

Scheduler (org.ballerinalang.siddhi.core.util.Scheduler)6 EntryValveProcessor (org.ballerinalang.siddhi.core.query.input.stream.single.EntryValveProcessor)5 MetaStreamEvent (org.ballerinalang.siddhi.core.event.stream.MetaStreamEvent)3 SingleStreamRuntime (org.ballerinalang.siddhi.core.query.input.stream.single.SingleStreamRuntime)3 ArrayList (java.util.ArrayList)2 StreamEventPool (org.ballerinalang.siddhi.core.event.stream.StreamEventPool)2 OperationNotSupportedException (org.ballerinalang.siddhi.core.exception.OperationNotSupportedException)2 SchedulingProcessor (org.ballerinalang.siddhi.core.query.processor.SchedulingProcessor)2 WindowProcessor (org.ballerinalang.siddhi.core.query.processor.stream.window.WindowProcessor)2 Attribute (org.ballerinalang.siddhi.query.api.definition.Attribute)2 AbstractMap (java.util.AbstractMap)1 HashSet (java.util.HashSet)1 Set (java.util.Set)1 ReentrantLock (java.util.concurrent.locks.ReentrantLock)1 AggregationRuntime (org.ballerinalang.siddhi.core.aggregation.AggregationRuntime)1 IncrementalAggregationProcessor (org.ballerinalang.siddhi.core.aggregation.IncrementalAggregationProcessor)1 IncrementalExecutor (org.ballerinalang.siddhi.core.aggregation.IncrementalExecutor)1 RecreateInMemoryData (org.ballerinalang.siddhi.core.aggregation.RecreateInMemoryData)1 MetaStateEvent (org.ballerinalang.siddhi.core.event.state.MetaStateEvent)1 StreamEventCloner (org.ballerinalang.siddhi.core.event.stream.StreamEventCloner)1