/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.siddhi.core.query.input.stream.state;
import org.wso2.siddhi.core.event.ComplexEventChunk;
import org.wso2.siddhi.core.event.state.StateEvent;
import org.wso2.siddhi.core.event.stream.StreamEvent;
import org.wso2.siddhi.query.api.execution.query.input.stream.StateInputStream;
/**
* Created on 1/6/15.
*/
public class CountPostStateProcessor extends StreamPostStateProcessor {
private final int minCount;
private final int maxCount;
public CountPostStateProcessor(int minCount, int maxCount) {
this.minCount = minCount;
this.maxCount = maxCount;
}
public PostStateProcessor cloneProcessor(String key) {
CountPostStateProcessor countPostStateProcessor = new CountPostStateProcessor(minCount, maxCount);
cloneProperties(countPostStateProcessor);
return countPostStateProcessor;
}
protected void process(StateEvent stateEvent, ComplexEventChunk complexEventChunk) {
StreamEvent streamEvent = stateEvent.getStreamEvent(stateId);
int streamEvents = 1;
while (streamEvent.getNext() != null) {
streamEvents++;
streamEvent = streamEvent.getNext();
}
((CountPreStateProcessor) thisStatePreProcessor).successCondition();
stateEvent.setTimestamp(streamEvent.getTimestamp());
if (streamEvents >= minCount) {
if (thisStatePreProcessor.stateType == StateInputStream.Type.SEQUENCE) {
if (nextStatePerProcessor != null) {
nextStatePerProcessor.addState(stateEvent);
}
if (streamEvents != maxCount) {
thisStatePreProcessor.addState(stateEvent);
}
} else if (streamEvents == minCount) {
processMinCountReached(stateEvent, complexEventChunk);
}
if (streamEvents == maxCount) {
thisStatePreProcessor.stateChanged();
}
}
}
public void processMinCountReached(StateEvent stateEvent, ComplexEventChunk complexEventChunk) {
if (nextProcessor != null) {
thisStatePreProcessor.stateChanged();
complexEventChunk.reset();
this.isEventReturned = true;
}
if (nextStatePerProcessor != null) {
nextStatePerProcessor.addState(stateEvent);
}
if (nextEveryStatePerProcessor != null) {
nextEveryStatePerProcessor.addEveryState(stateEvent);
}
}
public void setNextStatePreProcessor(PreStateProcessor preStateProcessor) {
this.nextStatePerProcessor = preStateProcessor;
if (thisStatePreProcessor.isStartState &&
thisStatePreProcessor.stateType == StateInputStream.Type.SEQUENCE &&
minCount == 0) {
preStateProcessor.getThisStatePostProcessor().setCallbackPreStateProcessor(
(CountPreStateProcessor) thisStatePreProcessor);
}
}
}