/*
* *************************************************************************************
* Copyright (C) 2008 EsperTech, Inc. All rights reserved. *
* http://esper.codehaus.org *
* 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.core.context.factory;
import com.espertech.esper.client.EventType;
import com.espertech.esper.collection.Pair;
import com.espertech.esper.core.context.activator.ViewableActivationResult;
import com.espertech.esper.core.context.activator.ViewableActivator;
import com.espertech.esper.core.context.subselect.SubSelectStrategyCollection;
import com.espertech.esper.core.context.subselect.SubSelectStrategyHolder;
import com.espertech.esper.core.context.util.AgentInstanceContext;
import com.espertech.esper.core.context.util.StatementAgentInstanceUtil;
import com.espertech.esper.core.service.EPServicesContext;
import com.espertech.esper.core.service.StatementContext;
import com.espertech.esper.core.start.EPStatementStartMethodCreateWindow;
import com.espertech.esper.core.start.EPStatementStartMethodHelperSubselect;
import com.espertech.esper.core.start.EPStatementStartMethodHelperUtil;
import com.espertech.esper.epl.agg.service.AggregationService;
import com.espertech.esper.epl.core.ResultSetProcessor;
import com.espertech.esper.epl.core.ResultSetProcessorFactoryDesc;
import com.espertech.esper.epl.expression.ExprNode;
import com.espertech.esper.epl.expression.ExprSubselectNode;
import com.espertech.esper.epl.named.NamedWindowOnExprBaseView;
import com.espertech.esper.epl.named.NamedWindowOnExprFactory;
import com.espertech.esper.epl.named.NamedWindowProcessor;
import com.espertech.esper.epl.named.NamedWindowProcessorInstance;
import com.espertech.esper.epl.spec.*;
import com.espertech.esper.epl.variable.OnSetVariableViewFactory;
import com.espertech.esper.epl.view.OutputProcessViewFactory;
import com.espertech.esper.pattern.EvalRootState;
import com.espertech.esper.util.StopCallback;
import com.espertech.esper.view.View;
import com.espertech.esper.view.internal.RouteResultView;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class StatementAgentInstanceFactoryOnTrigger implements StatementAgentInstanceFactory {
private static final Log log = LogFactory.getLog(EPStatementStartMethodCreateWindow.class);
private final StatementContext statementContext;
private final StatementSpecCompiled statementSpec;
private final EPServicesContext services;
private final ViewableActivator activator;
private final SubSelectStrategyCollection subSelectStrategyCollection;
private final ResultSetProcessorFactoryDesc resultSetProcessorPrototype;
private final ExprNode validatedJoin;
private final EventType activatorResultEventType;
private final StatementAgentInstanceFactoryOnTriggerSplitDesc splitDesc;
private final ResultSetProcessorFactoryDesc outputResultSetProcessorPrototype;
private final OnSetVariableViewFactory onSetVariableViewFactory;
private final NamedWindowOnExprFactory onExprFactory;
private final OutputProcessViewFactory outputProcessViewFactory;
public StatementAgentInstanceFactoryOnTrigger(StatementContext statementContext, StatementSpecCompiled statementSpec, EPServicesContext services, ViewableActivator activator, SubSelectStrategyCollection subSelectStrategyCollection, ResultSetProcessorFactoryDesc resultSetProcessorPrototype, ExprNode validatedJoin, EventType activatorResultEventType, StatementAgentInstanceFactoryOnTriggerSplitDesc splitDesc, ResultSetProcessorFactoryDesc outputResultSetProcessorPrototype, OnSetVariableViewFactory onSetVariableViewFactory, NamedWindowOnExprFactory onExprFactory, OutputProcessViewFactory outputProcessViewFactory, boolean recoveringStatement) {
this.statementContext = statementContext;
this.statementSpec = statementSpec;
this.services = services;
this.activator = activator;
this.subSelectStrategyCollection = subSelectStrategyCollection;
this.resultSetProcessorPrototype = resultSetProcessorPrototype;
this.validatedJoin = validatedJoin;
this.activatorResultEventType = activatorResultEventType;
this.splitDesc = splitDesc;
this.outputResultSetProcessorPrototype = outputResultSetProcessorPrototype;
this.onSetVariableViewFactory = onSetVariableViewFactory;
this.onExprFactory = onExprFactory;
this.outputProcessViewFactory = outputProcessViewFactory;
}
public StatementAgentInstanceFactoryOnTriggerResult newContext(final AgentInstanceContext agentInstanceContext, boolean isRecoveringResilient)
{
final List<StopCallback> stopCallbacks = new ArrayList<StopCallback>();
StopCallback stopCallback = new StopCallback() {
public void stop() {
StatementAgentInstanceUtil.stopSafe(agentInstanceContext.getTerminationCallbacks(), stopCallbacks, statementContext);
}
};
View onExprView;
Map<ExprSubselectNode, SubSelectStrategyHolder> subselectStrategies;
AggregationService aggregationService = null;
EvalRootState optPatternRoot;
try {
if (services.getSchedulableAgentInstanceDirectory() != null) {
services.getSchedulableAgentInstanceDirectory().add(agentInstanceContext.getEpStatementAgentInstanceHandle());
}
OnTriggerDesc onTriggerDesc = statementSpec.getOnTriggerDesc();
// Start: for on-delete and on-select and on-update triggers
if (onTriggerDesc instanceof OnTriggerWindowDesc)
{
OnTriggerWindowDesc onTriggerWindowDesc = (OnTriggerWindowDesc) onTriggerDesc;
// get result set processor and aggregation services
Pair<ResultSetProcessor, AggregationService> pair = EPStatementStartMethodHelperUtil.startResultSetAndAggregation(resultSetProcessorPrototype, agentInstanceContext);
aggregationService = pair.getSecond();
// get named window processor instance
NamedWindowProcessor processor = services.getNamedWindowService().getProcessor(onTriggerWindowDesc.getWindowName());
NamedWindowProcessorInstance processorInstance = processor.getProcessorInstance(agentInstanceContext);
// obtain on-expr view
NamedWindowOnExprBaseView onExprBaseView = processorInstance.getRootViewInstance().addOnExpr(onExprFactory, agentInstanceContext, validatedJoin, activatorResultEventType, pair.getFirst());
onExprView = onExprBaseView;
stopCallbacks.add(onExprBaseView);
}
// variable assignments
else if (statementSpec.getOnTriggerDesc() instanceof OnTriggerSetDesc)
{
onExprView = onSetVariableViewFactory.instantiate(agentInstanceContext);
}
// split-stream use case
else
{
ResultSetProcessor[] processors = new ResultSetProcessor[splitDesc.getProcessorFactories().length];
for (int i = 0; i < processors.length; i++) {
ResultSetProcessorFactoryDesc factory = splitDesc.getProcessorFactories()[i];
ResultSetProcessor processor = factory.getResultSetProcessorFactory().instantiate(null, null, agentInstanceContext);
processors[i] = processor;
}
OnTriggerSplitStreamDesc desc = (OnTriggerSplitStreamDesc) statementSpec.getOnTriggerDesc();
onExprView = new RouteResultView(desc.isFirst(), activatorResultEventType, statementContext.getEpStatementHandle(), services.getInternalEventRouter(), splitDesc.getNamedWindowInsert(), processors, splitDesc.getWhereClauses(), statementContext);
}
// attach stream to view
final ViewableActivationResult activationResult = activator.activate(agentInstanceContext, false, isRecoveringResilient);
activationResult.getViewable().addView(onExprView);
stopCallbacks.add(activationResult.getStopCallback());
optPatternRoot = activationResult.getOptionalPatternRoot();
// start subselects
subselectStrategies = EPStatementStartMethodHelperSubselect.startSubselects(services, subSelectStrategyCollection, agentInstanceContext, stopCallbacks);
// attach view to output: for on-delete, create an output processor that passes on as a wildcard the underlying event
if ((statementSpec.getOnTriggerDesc().getOnTriggerType() == OnTriggerType.ON_DELETE) ||
(statementSpec.getOnTriggerDesc().getOnTriggerType() == OnTriggerType.ON_SET) ||
(statementSpec.getOnTriggerDesc().getOnTriggerType() == OnTriggerType.ON_UPDATE) ||
(statementSpec.getOnTriggerDesc().getOnTriggerType() == OnTriggerType.ON_MERGE))
{
ResultSetProcessor outputResultSetProcessor = outputResultSetProcessorPrototype.getResultSetProcessorFactory().instantiate(null, null, agentInstanceContext);
// Attach output view
View outputView = outputProcessViewFactory.makeView(outputResultSetProcessor, agentInstanceContext);
onExprView.addView(outputView);
onExprView = outputView;
}
}
catch (RuntimeException ex) {
StatementAgentInstanceUtil.stopSafe(stopCallback, statementContext);
throw ex;
}
log.debug(".start Statement start completed");
return new StatementAgentInstanceFactoryOnTriggerResult(onExprView, stopCallback, agentInstanceContext, aggregationService, subselectStrategies, optPatternRoot);
}
}