/* *************************************************************************************** * 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.core.context.factory; import com.espertech.esper.client.EventType; import com.espertech.esper.collection.Pair; import com.espertech.esper.core.context.activator.ViewableActivator; import com.espertech.esper.core.context.subselect.SubSelectStrategyCollection; import com.espertech.esper.core.context.util.AgentInstanceContext; import com.espertech.esper.core.service.EPServicesContext; import com.espertech.esper.core.service.StatementContext; 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.core.ExprNode; import com.espertech.esper.epl.expression.core.ExprValidationException; import com.espertech.esper.epl.join.hint.ExcludePlanHint; import com.espertech.esper.epl.join.hint.IndexHint; import com.espertech.esper.epl.join.table.EventTable; import com.espertech.esper.epl.lookup.SubordWMatchExprLookupStrategy; import com.espertech.esper.epl.lookup.SubordinateQueryPlanner; import com.espertech.esper.epl.lookup.SubordinateQueryPlannerUtil; import com.espertech.esper.epl.lookup.SubordinateWMatchExprQueryPlanResult; import com.espertech.esper.epl.spec.OnTriggerType; import com.espertech.esper.epl.spec.OnTriggerWindowDesc; import com.espertech.esper.epl.spec.StatementSpecCompiled; import com.espertech.esper.epl.table.mgmt.TableMetadata; import com.espertech.esper.epl.table.mgmt.TableServiceImpl; import com.espertech.esper.epl.table.mgmt.TableStateInstance; import com.espertech.esper.epl.table.onaction.TableOnViewBase; import com.espertech.esper.epl.table.onaction.TableOnViewFactory; import com.espertech.esper.epl.view.OutputProcessViewFactory; import com.espertech.esper.util.StopCallback; import com.espertech.esper.view.View; import java.util.List; public class StatementAgentInstanceFactoryOnTriggerTable extends StatementAgentInstanceFactoryOnTriggerBase { private final ResultSetProcessorFactoryDesc resultSetProcessorPrototype; private final ResultSetProcessorFactoryDesc outputResultSetProcessorPrototype; private final OutputProcessViewFactory outputProcessViewFactory; private final TableOnViewFactory onExprFactory; private final SubordinateWMatchExprQueryPlanResult queryPlanResult; public StatementAgentInstanceFactoryOnTriggerTable(StatementContext statementContext, StatementSpecCompiled statementSpec, EPServicesContext services, ViewableActivator activator, SubSelectStrategyCollection subSelectStrategyCollection, ResultSetProcessorFactoryDesc resultSetProcessorPrototype, ExprNode validatedJoin, TableOnViewFactory onExprFactory, EventType activatorResultEventType, TableMetadata tableMetadata, ResultSetProcessorFactoryDesc outputResultSetProcessorPrototype, OutputProcessViewFactory outputProcessViewFactory) throws ExprValidationException { super(statementContext, statementSpec, services, activator, subSelectStrategyCollection); this.resultSetProcessorPrototype = resultSetProcessorPrototype; this.onExprFactory = onExprFactory; this.outputResultSetProcessorPrototype = outputResultSetProcessorPrototype; this.outputProcessViewFactory = outputProcessViewFactory; StatementAgentInstanceFactoryOnTriggerNamedWindow.IndexHintPair pair = StatementAgentInstanceFactoryOnTriggerNamedWindow.getIndexHintPair(statementContext, statementSpec); IndexHint indexHint = pair.getIndexHint(); ExcludePlanHint excludePlanHint = pair.getExcludePlanHint(); queryPlanResult = SubordinateQueryPlanner.planOnExpression( validatedJoin, activatorResultEventType, indexHint, true, -1, excludePlanHint, false, tableMetadata.getEventTableIndexMetadataRepo(), tableMetadata.getInternalEventType(), tableMetadata.getUniqueKeyProps(), true, statementContext.getStatementName(), statementContext.getStatementId(), statementContext.getAnnotations()); if (queryPlanResult.getIndexDescs() != null) { for (int i = 0; i < queryPlanResult.getIndexDescs().length; i++) { tableMetadata.addIndexReference(queryPlanResult.getIndexDescs()[i].getIndexName(), statementContext.getStatementName()); } } SubordinateQueryPlannerUtil.queryPlanLogOnExpr(tableMetadata.isQueryPlanLogging(), TableServiceImpl.getQueryPlanLog(), queryPlanResult, statementContext.getAnnotations(), statementContext.getEngineImportService()); } public OnExprViewResult determineOnExprView(AgentInstanceContext agentInstanceContext, List<StopCallback> stopCallbacks, boolean isRecoveringReslient) { OnTriggerWindowDesc onTriggerWindowDesc = (OnTriggerWindowDesc) statementSpec.getOnTriggerDesc(); // get result set processor and aggregation services Pair<ResultSetProcessor, AggregationService> pair = EPStatementStartMethodHelperUtil.startResultSetAndAggregation(resultSetProcessorPrototype, agentInstanceContext, false, null); TableStateInstance state = services.getTableService().getState(onTriggerWindowDesc.getWindowName(), agentInstanceContext.getAgentInstanceId()); EventTable[] indexes; if (queryPlanResult.getIndexDescs() == null) { indexes = null; } else { indexes = new EventTable[queryPlanResult.getIndexDescs().length]; for (int i = 0; i < indexes.length; i++) { indexes[i] = state.getIndexRepository().getIndexByDesc(queryPlanResult.getIndexDescs()[i].getIndexMultiKey()); } } SubordWMatchExprLookupStrategy strategy = queryPlanResult.getFactory().realize(indexes, agentInstanceContext, state.getIterableTableScan(), null); TableOnViewBase onExprBaseView = onExprFactory.make(strategy, state, agentInstanceContext, pair.getFirst()); return new OnExprViewResult(onExprBaseView, pair.getSecond()); } public View determineFinalOutputView(AgentInstanceContext agentInstanceContext, View onExprView) { if ((statementSpec.getOnTriggerDesc().getOnTriggerType() == OnTriggerType.ON_DELETE) || (statementSpec.getOnTriggerDesc().getOnTriggerType() == OnTriggerType.ON_UPDATE) || (statementSpec.getOnTriggerDesc().getOnTriggerType() == OnTriggerType.ON_MERGE)) { ResultSetProcessor outputResultSetProcessor = outputResultSetProcessorPrototype.getResultSetProcessorFactory().instantiate(null, null, agentInstanceContext); View outputView = outputProcessViewFactory.makeView(outputResultSetProcessor, agentInstanceContext); onExprView.addView(outputView); return outputView; } return onExprView; } }