/*
***************************************************************************************
* Copyright (C) 2006 EsperTech, Inc. All rights reserved. *
* http://www.espertech.com/esper *
* http://www.espertech.com *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the GPL license *
* a copy of which has been included with this distribution in the license.txt file. *
***************************************************************************************
*/
package com.espertech.esper.epl.core;
import com.espertech.esper.client.EventBean;
import com.espertech.esper.client.EventType;
import com.espertech.esper.collection.ArrayEventIterator;
import com.espertech.esper.collection.MultiKey;
import com.espertech.esper.collection.TransformEventIterator;
import com.espertech.esper.collection.UniformPair;
import com.espertech.esper.core.context.util.AgentInstanceContext;
import com.espertech.esper.epl.expression.core.ExprEvaluatorContext;
import com.espertech.esper.util.CollectionUtil;
import com.espertech.esper.view.Viewable;
import java.util.Iterator;
import java.util.Set;
/**
* Result set processor for the hand-through case:
* no aggregation functions used in the select clause, and no group-by, no having and ordering.
*/
public class ResultSetProcessorHandThrough extends ResultSetProcessorBaseSimple {
private final ResultSetProcessorHandThroughFactory prototype;
private final SelectExprProcessor selectExprProcessor;
private AgentInstanceContext agentInstanceContext;
public ResultSetProcessorHandThrough(ResultSetProcessorHandThroughFactory prototype, SelectExprProcessor selectExprProcessor, AgentInstanceContext agentInstanceContext) {
this.prototype = prototype;
this.selectExprProcessor = selectExprProcessor;
this.agentInstanceContext = agentInstanceContext;
}
public void setAgentInstanceContext(AgentInstanceContext agentInstanceContext) {
this.agentInstanceContext = agentInstanceContext;
}
public EventType getResultEventType() {
return prototype.getResultEventType();
}
public UniformPair<EventBean[]> processJoinResult(Set<MultiKey<EventBean>> newEvents, Set<MultiKey<EventBean>> oldEvents, boolean isSynthesize) {
EventBean[] selectOldEvents = null;
EventBean[] selectNewEvents;
if (prototype.isSelectRStream()) {
selectOldEvents = getSelectEventsNoHaving(selectExprProcessor, oldEvents, false, isSynthesize, agentInstanceContext);
}
selectNewEvents = getSelectEventsNoHaving(selectExprProcessor, newEvents, true, isSynthesize, agentInstanceContext);
return new UniformPair<EventBean[]>(selectNewEvents, selectOldEvents);
}
public UniformPair<EventBean[]> processViewResult(EventBean[] newData, EventBean[] oldData, boolean isSynthesize) {
EventBean[] selectOldEvents = null;
if (prototype.isSelectRStream()) {
selectOldEvents = getSelectEventsNoHaving(selectExprProcessor, oldData, false, isSynthesize, agentInstanceContext);
}
EventBean[] selectNewEvents = getSelectEventsNoHaving(selectExprProcessor, newData, true, isSynthesize, agentInstanceContext);
return new UniformPair<EventBean[]>(selectNewEvents, selectOldEvents);
}
/**
* Applies the select-clause to the given events returning the selected events. The number of events stays the
* same, i.e. this method does not filter it just transforms the result set.
*
* @param exprProcessor - processes each input event and returns output event
* @param events - input events
* @param isNewData - indicates whether we are dealing with new data (istream) or old data (rstream)
* @param isSynthesize - set to true to indicate that synthetic events are required for an iterator result set
* @param agentInstanceContext context
* @return output events, one for each input event
*/
protected static EventBean[] getSelectEventsNoHaving(SelectExprProcessor exprProcessor, EventBean[] events, boolean isNewData, boolean isSynthesize, ExprEvaluatorContext agentInstanceContext) {
if (events == null) {
return null;
}
EventBean[] result = new EventBean[events.length];
EventBean[] eventsPerStream = new EventBean[1];
for (int i = 0; i < events.length; i++) {
eventsPerStream[0] = events[i];
result[i] = exprProcessor.process(eventsPerStream, isNewData, isSynthesize, agentInstanceContext);
}
return result;
}
/**
* Applies the select-clause to the given events returning the selected events. The number of events stays the
* same, i.e. this method does not filter it just transforms the result set.
*
* @param exprProcessor - processes each input event and returns output event
* @param events - input events
* @param isNewData - indicates whether we are dealing with new data (istream) or old data (rstream)
* @param isSynthesize - set to true to indicate that synthetic events are required for an iterator result set
* @param agentInstanceContext context
* @return output events, one for each input event
*/
protected static EventBean[] getSelectEventsNoHaving(SelectExprProcessor exprProcessor, Set<MultiKey<EventBean>> events, boolean isNewData, boolean isSynthesize, ExprEvaluatorContext agentInstanceContext) {
int length = events.size();
if (length == 0) {
return null;
}
EventBean[] result = new EventBean[length];
int count = 0;
for (MultiKey<EventBean> key : events) {
EventBean[] eventsPerStream = key.getArray();
result[count] = exprProcessor.process(eventsPerStream, isNewData, isSynthesize, agentInstanceContext);
count++;
}
return result;
}
public void clear() {
// No need to clear state, there is no state held
}
public Iterator<EventBean> getIterator(Viewable parent) {
// Return an iterator that gives row-by-row a result
return new TransformEventIterator(parent.iterator(), new ResultSetProcessorSimpleTransform(this));
}
public Iterator<EventBean> getIterator(Set<MultiKey<EventBean>> joinSet) {
// Process join results set as a regular join, includes sorting and having-clause filter
UniformPair<EventBean[]> result = processJoinResult(joinSet, CollectionUtil.EMPTY_ROW_SET, true);
return new ArrayEventIterator(result.getFirst());
}
public boolean hasAggregation() {
return false;
}
public void applyViewResult(EventBean[] newData, EventBean[] oldData) {
}
public void applyJoinResult(Set<MultiKey<EventBean>> newEvents, Set<MultiKey<EventBean>> oldEvents) {
}
public void processOutputLimitedLastAllNonBufferedView(EventBean[] newData, EventBean[] oldData, boolean isGenerateSynthetic, boolean isAll) {
}
public void processOutputLimitedLastAllNonBufferedJoin(Set<MultiKey<EventBean>> newEvents, Set<MultiKey<EventBean>> oldEvents, boolean isGenerateSynthetic, boolean isAll) {
}
public UniformPair<EventBean[]> continueOutputLimitedLastAllNonBufferedView(boolean isSynthesize, boolean isAll) {
return null;
}
public UniformPair<EventBean[]> continueOutputLimitedLastAllNonBufferedJoin(boolean isSynthesize, boolean isAll) {
return null;
}
public void stop() {
// no action required
}
public void acceptHelperVisitor(ResultSetProcessorOutputHelperVisitor visitor) {
// nothing to visit
}
}