Search in sources :

Example 6 with GroupedComplexEvent

use of io.siddhi.core.event.GroupedComplexEvent in project siddhi by wso2.

the class QuerySelector method processGroupBy.

private ComplexEventChunk<ComplexEvent> processGroupBy(ComplexEventChunk complexEventChunk) {
    complexEventChunk.reset();
    ComplexEventChunk<ComplexEvent> currentComplexEventChunk = new ComplexEventChunk<ComplexEvent>();
    synchronized (this) {
        int limitCount = 0;
        while (complexEventChunk.hasNext()) {
            ComplexEvent event = complexEventChunk.next();
            switch(event.getType()) {
                case CURRENT:
                case EXPIRED:
                    eventPopulator.populateStateEvent(event);
                    String groupByKey = groupByKeyGenerator.constructEventKey(event);
                    SiddhiAppContext.startGroupByFlow(groupByKey);
                    try {
                        for (AttributeProcessor attributeProcessor : attributeProcessorList) {
                            attributeProcessor.process(event);
                        }
                        if ((event.getType() == StreamEvent.Type.CURRENT && currentOn) || (event.getType() == StreamEvent.Type.EXPIRED && expiredOn)) {
                            if (!(havingConditionExecutor != null && !havingConditionExecutor.execute(event))) {
                                complexEventChunk.remove();
                                if (limit == SiddhiConstants.UNKNOWN_STATE) {
                                    currentComplexEventChunk.add(new GroupedComplexEvent(groupByKey, event));
                                } else {
                                    if (limitCount < limit) {
                                        currentComplexEventChunk.add(new GroupedComplexEvent(groupByKey, event));
                                        limitCount++;
                                    }
                                }
                            }
                        }
                    } finally {
                        SiddhiAppContext.stopGroupByFlow();
                    }
                    break;
                case TIMER:
                    break;
                case RESET:
                    for (AttributeProcessor attributeProcessor : attributeProcessorList) {
                        attributeProcessor.process(event);
                    }
                    break;
            }
        }
    }
    if (isOrderBy) {
        orderEventChunk(complexEventChunk);
    }
    if (offset != SiddhiConstants.UNKNOWN_STATE) {
        offsetEventChunk(complexEventChunk);
    }
    if (limit != SiddhiConstants.UNKNOWN_STATE) {
        limitEventChunk(complexEventChunk);
    }
    currentComplexEventChunk.reset();
    if (currentComplexEventChunk.hasNext()) {
        return currentComplexEventChunk;
    }
    return null;
}
Also used : ComplexEvent(io.siddhi.core.event.ComplexEvent) GroupedComplexEvent(io.siddhi.core.event.GroupedComplexEvent) ComplexEventChunk(io.siddhi.core.event.ComplexEventChunk) GroupedComplexEvent(io.siddhi.core.event.GroupedComplexEvent) AttributeProcessor(io.siddhi.core.query.selector.attribute.processor.AttributeProcessor)

Example 7 with GroupedComplexEvent

use of io.siddhi.core.event.GroupedComplexEvent in project siddhi by wso2.

the class WindowedPerSnapshotOutputRateLimiter method process.

@Override
public void process(ComplexEventChunk complexEventChunk) {
    List<ComplexEventChunk> outputEventChunks = new LinkedList<>();
    complexEventChunk.reset();
    RateLimiterState state = stateHolder.getState();
    try {
        synchronized (state) {
            while (complexEventChunk.hasNext()) {
                ComplexEvent event = complexEventChunk.next();
                if (event instanceof GroupedComplexEvent) {
                    event = ((GroupedComplexEvent) event).getComplexEvent();
                }
                if (event.getType() == ComplexEvent.Type.TIMER) {
                    tryFlushEvents(outputEventChunks, event, state);
                } else if (event.getType() == ComplexEvent.Type.CURRENT) {
                    complexEventChunk.remove();
                    tryFlushEvents(outputEventChunks, event, state);
                    state.eventList.add(event);
                } else if (event.getType() == ComplexEvent.Type.EXPIRED) {
                    tryFlushEvents(outputEventChunks, event, state);
                    for (Iterator<ComplexEvent> iterator = state.eventList.iterator(); iterator.hasNext(); ) {
                        ComplexEvent currentEvent = iterator.next();
                        if (comparator.compare(currentEvent, event) == 0) {
                            iterator.remove();
                            break;
                        }
                    }
                } else if (event.getType() == ComplexEvent.Type.RESET) {
                    tryFlushEvents(outputEventChunks, event, state);
                    state.eventList.clear();
                }
            }
        }
    } finally {
        stateHolder.returnState(state);
    }
    sendToCallBacks(outputEventChunks);
}
Also used : ComplexEvent(io.siddhi.core.event.ComplexEvent) GroupedComplexEvent(io.siddhi.core.event.GroupedComplexEvent) ComplexEventChunk(io.siddhi.core.event.ComplexEventChunk) GroupedComplexEvent(io.siddhi.core.event.GroupedComplexEvent) LinkedList(java.util.LinkedList)

Example 8 with GroupedComplexEvent

use of io.siddhi.core.event.GroupedComplexEvent in project siddhi by wso2.

the class LastGroupByPerEventOutputRateLimiter method process.

@Override
public void process(ComplexEventChunk complexEventChunk) {
    complexEventChunk.reset();
    ComplexEventChunk<ComplexEvent> outputEventChunk = new ComplexEventChunk<>();
    RateLimiterState state = stateHolder.getState();
    try {
        synchronized (state) {
            while (complexEventChunk.hasNext()) {
                ComplexEvent event = complexEventChunk.next();
                if (event.getType() == ComplexEvent.Type.CURRENT || event.getType() == ComplexEvent.Type.EXPIRED) {
                    complexEventChunk.remove();
                    GroupedComplexEvent groupedComplexEvent = ((GroupedComplexEvent) event);
                    state.allGroupByKeyEvents.put(groupedComplexEvent.getGroupKey(), groupedComplexEvent.getComplexEvent());
                    if (++state.counter == value) {
                        state.counter = 0;
                        if (state.allGroupByKeyEvents.size() != 0) {
                            for (ComplexEvent complexEvent : state.allGroupByKeyEvents.values()) {
                                outputEventChunk.add(complexEvent);
                            }
                            state.allGroupByKeyEvents.clear();
                        }
                    }
                }
            }
        }
    } finally {
        stateHolder.returnState(state);
    }
    outputEventChunk.reset();
    if (outputEventChunk.hasNext()) {
        sendToCallBacks(outputEventChunk);
    }
}
Also used : ComplexEvent(io.siddhi.core.event.ComplexEvent) GroupedComplexEvent(io.siddhi.core.event.GroupedComplexEvent) ComplexEventChunk(io.siddhi.core.event.ComplexEventChunk) GroupedComplexEvent(io.siddhi.core.event.GroupedComplexEvent)

Example 9 with GroupedComplexEvent

use of io.siddhi.core.event.GroupedComplexEvent in project siddhi by wso2.

the class AggregationGroupByWindowedPerSnapshotOutputRateLimiter method process.

@Override
public void process(ComplexEventChunk complexEventChunk) {
    complexEventChunk.reset();
    List<ComplexEventChunk> outputEventChunks = new LinkedList<>();
    AggregationGroupByRateLimiterState state = (AggregationGroupByRateLimiterState) stateHolder.getState();
    try {
        synchronized (state) {
            complexEventChunk.reset();
            String currentGroupByKey = null;
            Map<Integer, Object> currentAggregateAttributeValueMap = null;
            while (complexEventChunk.hasNext()) {
                ComplexEvent event = complexEventChunk.next();
                if (event.getType() == ComplexEvent.Type.TIMER) {
                    tryFlushEvents(outputEventChunks, event, state);
                } else {
                    complexEventChunk.remove();
                    tryFlushEvents(outputEventChunks, event, state);
                    GroupedComplexEvent groupedComplexEvent = ((GroupedComplexEvent) event);
                    if (currentGroupByKey == null || !currentGroupByKey.equals(groupedComplexEvent.getGroupKey())) {
                        currentGroupByKey = groupedComplexEvent.getGroupKey();
                        currentAggregateAttributeValueMap = state.groupByAggregateAttributeValueMap.get(currentGroupByKey);
                        if (currentAggregateAttributeValueMap == null) {
                            currentAggregateAttributeValueMap = new HashMap<Integer, Object>(aggregateAttributePositionList.size());
                            state.groupByAggregateAttributeValueMap.put(currentGroupByKey, currentAggregateAttributeValueMap);
                        }
                    }
                    if (groupedComplexEvent.getType() == ComplexEvent.Type.CURRENT) {
                        state.eventList.add(groupedComplexEvent);
                        for (Integer position : aggregateAttributePositionList) {
                            currentAggregateAttributeValueMap.put(position, event.getOutputData()[position]);
                        }
                    } else if (groupedComplexEvent.getType() == ComplexEvent.Type.EXPIRED) {
                        for (Iterator<GroupedComplexEvent> iterator = state.eventList.iterator(); iterator.hasNext(); ) {
                            GroupedComplexEvent currentEvent = iterator.next();
                            if (comparator.compare(currentEvent.getComplexEvent(), groupedComplexEvent.getComplexEvent()) == 0) {
                                iterator.remove();
                                for (Integer position : aggregateAttributePositionList) {
                                    currentAggregateAttributeValueMap.put(position, groupedComplexEvent.getOutputData()[position]);
                                }
                                break;
                            }
                        }
                    } else if (groupedComplexEvent.getType() == ComplexEvent.Type.RESET) {
                        state.eventList.clear();
                        state.groupByAggregateAttributeValueMap.clear();
                    }
                }
            }
        }
    } finally {
        stateHolder.returnState(state);
    }
    sendToCallBacks(outputEventChunks);
}
Also used : ComplexEvent(io.siddhi.core.event.ComplexEvent) GroupedComplexEvent(io.siddhi.core.event.GroupedComplexEvent) ComplexEventChunk(io.siddhi.core.event.ComplexEventChunk) Iterator(java.util.Iterator) GroupedComplexEvent(io.siddhi.core.event.GroupedComplexEvent) LinkedList(java.util.LinkedList)

Example 10 with GroupedComplexEvent

use of io.siddhi.core.event.GroupedComplexEvent in project siddhi by wso2.

the class AggregationGroupByWindowedPerSnapshotOutputRateLimiter method constructOutputChunk.

private void constructOutputChunk(List<ComplexEventChunk> outputEventChunks, AggregationGroupByRateLimiterState state) {
    ComplexEventChunk<ComplexEvent> outputEventChunk = new ComplexEventChunk<>();
    Set<String> outputGroupingKeys = new HashSet<>();
    for (GroupedComplexEvent originalComplexEvent : state.eventList) {
        String currentGroupByKey = originalComplexEvent.getGroupKey();
        if (!outputGroupingKeys.contains(currentGroupByKey)) {
            outputGroupingKeys.add(currentGroupByKey);
            Map<Integer, Object> currentAggregateAttributeValueMap = state.groupByAggregateAttributeValueMap.get(currentGroupByKey);
            ComplexEvent eventCopy = cloneComplexEvent(originalComplexEvent.getComplexEvent());
            for (Integer position : aggregateAttributePositionList) {
                eventCopy.getOutputData()[position] = currentAggregateAttributeValueMap.get(position);
            }
            outputEventChunk.add(eventCopy);
        }
    }
    outputEventChunks.add(outputEventChunk);
}
Also used : ComplexEvent(io.siddhi.core.event.ComplexEvent) GroupedComplexEvent(io.siddhi.core.event.GroupedComplexEvent) ComplexEventChunk(io.siddhi.core.event.ComplexEventChunk) GroupedComplexEvent(io.siddhi.core.event.GroupedComplexEvent) HashSet(java.util.HashSet)

Aggregations

ComplexEvent (io.siddhi.core.event.ComplexEvent)11 GroupedComplexEvent (io.siddhi.core.event.GroupedComplexEvent)11 ComplexEventChunk (io.siddhi.core.event.ComplexEventChunk)10 LinkedList (java.util.LinkedList)4 AttributeProcessor (io.siddhi.core.query.selector.attribute.processor.AttributeProcessor)2 HashSet (java.util.HashSet)1 Iterator (java.util.Iterator)1 LinkedHashMap (java.util.LinkedHashMap)1 Map (java.util.Map)1