public QueryGraph GetLogicQueryGraph()
 {
     QueryGraph qg = new QueryGraph();
     //create nodes
     foreach (ViewerQueryNode vqn in m_ViewerQueryGraph.NodesList)
     {
         ISubgraphMatchCell c = vqn.ToCell();
         qg.AddCell(c);
         m_Viewer2LogicDic.Add(vqn.ID, c.CellID);
         m_Logic2ViewerDic.Add(c.CellID, vqn.ID);
     }
     //create edges
     foreach (ViewerQueryNode vqn in m_ViewerQueryGraph.NodesList)
     {
         ISubgraphMatchCell c1 = qg.LoadCell(m_Viewer2LogicDic[vqn.ID]);
         foreach (int id in vqn.OutLinkList)
         {
             ISubgraphMatchCell c2 = qg.LoadCell(m_Viewer2LogicDic[id]);
             c1.TargetCellSet.Add(c2.CellID);
             c2.SourceCellSet.Add(c1.CellID);
         }
     }
     return qg;
 }
        /// <summary>
        /// Ctor.
        /// </summary>
        /// <param name="statementSpec">
        /// is a container for the definition of all statement constructs that may have been used in the
        /// statement, i.e. if defines the select clauses, insert into, outer joins etc.
        /// </param>
        /// <param name="services">is the service instances for dependency injection</param>
        /// <param name="statementContext">is statement-level information and statement services</param>
        /// <throws>ExprValidationException if the preparation failed</throws>
        public EPPreparedExecuteMethodQuery(
            StatementSpecCompiled statementSpec,
            EPServicesContext services,
            StatementContext statementContext)
        {
            var queryPlanLogging = services.ConfigSnapshot.EngineDefaults.Logging.IsEnableQueryPlan;

            if (queryPlanLogging)
            {
                QueryPlanLog.Info("Query plans for Fire-and-forget query '" + statementContext.Expression + "'");
            }

            _hasTableAccess = (statementSpec.TableNodes != null && statementSpec.TableNodes.Length > 0);
            foreach (var streamSpec in statementSpec.StreamSpecs)
            {
                _hasTableAccess |= streamSpec is TableQueryStreamSpec;
            }

            _statementSpec = statementSpec;
            _services      = services;

            EPPreparedExecuteMethodHelper.ValidateFAFQuery(statementSpec);

            var numStreams     = statementSpec.StreamSpecs.Length;
            var typesPerStream = new EventType[numStreams];
            var namesPerStream = new string[numStreams];

            _processors           = new FireAndForgetProcessor[numStreams];
            _agentInstanceContext = new AgentInstanceContext(statementContext, null, -1, null, null, statementContext.DefaultAgentInstanceScriptContext);

            // resolve types and processors
            for (var i = 0; i < numStreams; i++)
            {
                var streamSpec = statementSpec.StreamSpecs[i];
                _processors[i] = FireAndForgetProcessorFactory.ValidateResolveProcessor(streamSpec, services);

                string streamName = _processors[i].NamedWindowOrTableName;
                if (streamSpec.OptionalStreamName != null)
                {
                    streamName = streamSpec.OptionalStreamName;
                }
                namesPerStream[i] = streamName;
                typesPerStream[i] = _processors[i].EventTypeResultSetProcessor;
            }

            // compile filter to optimize access to named window
            var types           = new StreamTypeServiceImpl(typesPerStream, namesPerStream, new bool[numStreams], services.EngineURI, false);
            var excludePlanHint = ExcludePlanHint.GetHint(types.StreamNames, statementContext);

            _queryGraph = new QueryGraph(numStreams, excludePlanHint, false);

            if (statementSpec.FilterRootNode != null)
            {
                for (var i = 0; i < numStreams; i++)
                {
                    try
                    {
                        ExprEvaluatorContextStatement evaluatorContextStmt = new ExprEvaluatorContextStatement(statementContext, false);
                        ExprValidationContext         validationContext    = new ExprValidationContext(
                            statementContext.Container,
                            types,
                            statementContext.EngineImportService,
                            statementContext.StatementExtensionServicesContext, null,
                            statementContext.TimeProvider,
                            statementContext.VariableService,
                            statementContext.TableService, evaluatorContextStmt,
                            statementContext.EventAdapterService,
                            statementContext.StatementName,
                            statementContext.StatementId,
                            statementContext.Annotations,
                            statementContext.ContextDescriptor,
                            statementContext.ScriptingService,
                            false, false, true, false, null, true);
                        ExprNode validated = ExprNodeUtility.GetValidatedSubtree(ExprNodeOrigin.FILTER, statementSpec.FilterRootNode, validationContext);
                        FilterExprAnalyzer.Analyze(validated, _queryGraph, false);
                    }
                    catch (Exception ex)
                    {
                        Log.Warn("Unexpected exception analyzing filter paths: " + ex.Message, ex);
                    }
                }
            }

            // obtain result set processor
            var isIStreamOnly = new bool[namesPerStream.Length];

            CompatExtensions.Fill(isIStreamOnly, true);
            StreamTypeService typeService = new StreamTypeServiceImpl(typesPerStream, namesPerStream, isIStreamOnly, services.EngineURI, true);

            EPStatementStartMethodHelperValidate.ValidateNodes(statementSpec, statementContext, typeService, null);

            var resultSetProcessorPrototype = ResultSetProcessorFactoryFactory.GetProcessorPrototype(statementSpec, statementContext, typeService, null, new bool[0], true, ContextPropertyRegistryImpl.EMPTY_REGISTRY, null, services.ConfigSnapshot, services.ResultSetProcessorHelperFactory, true, false);

            _resultSetProcessor = EPStatementStartMethodHelperAssignExpr.GetAssignResultSetProcessor(_agentInstanceContext, resultSetProcessorPrototype, false, null, true);

            if (statementSpec.SelectClauseSpec.IsDistinct)
            {
                if (_resultSetProcessor.ResultEventType is EventTypeSPI)
                {
                    _eventBeanReader = ((EventTypeSPI)_resultSetProcessor.ResultEventType).Reader;
                }
                if (_eventBeanReader == null)
                {
                    _eventBeanReader = new EventBeanReaderDefaultImpl(_resultSetProcessor.ResultEventType);
                }
            }

            // check context partition use
            if (statementSpec.OptionalContextName != null)
            {
                if (numStreams > 1)
                {
                    throw new ExprValidationException("Joins in runtime queries for context partitions are not supported");
                }
            }

            // plan joins or simple queries
            if (numStreams > 1)
            {
                var streamJoinAnalysisResult = new StreamJoinAnalysisResult(numStreams);
                CompatExtensions.Fill(streamJoinAnalysisResult.NamedWindow, true);
                for (var i = 0; i < numStreams; i++)
                {
                    var processorInstance = _processors[i].GetProcessorInstance(_agentInstanceContext);
                    if (_processors[i].IsVirtualDataWindow)
                    {
                        streamJoinAnalysisResult.ViewExternal[i] = agentInstanceContext => processorInstance.VirtualDataWindow;
                    }
                    var uniqueIndexes = _processors[i].GetUniqueIndexes(processorInstance);
                    streamJoinAnalysisResult.UniqueKeys[i] = uniqueIndexes;
                }

                var hasAggregations = !resultSetProcessorPrototype.AggregationServiceFactoryDesc.Expressions.IsEmpty();

                _joinSetComposerPrototype = JoinSetComposerPrototypeFactory.MakeComposerPrototype(null, -1,
                                                                                                  statementSpec.OuterJoinDescList, statementSpec.FilterRootNode, typesPerStream, namesPerStream,
                                                                                                  streamJoinAnalysisResult, queryPlanLogging, statementContext, new HistoricalViewableDesc(numStreams),
                                                                                                  _agentInstanceContext, false, hasAggregations, services.TableService, true,
                                                                                                  services.EventTableIndexService.AllowInitIndex(false));
            }
        }
Esempio n. 3
0
 public override ICollection <EventBean> SnapshotBestEffort(EPPreparedExecuteMethodQuery query, QueryGraph queryGraph, Attribute[] annotations)
 {
     EPPreparedExecuteTableHelper.AssignTableAccessStrategies(query.Services, query.TableNodes, _processorInstance.TailViewInstance.AgentInstanceContext);
     return(_processorInstance.TailViewInstance.Snapshot(queryGraph, annotations));
 }
        public void Apply(QueryGraph queryGraph)
        {
            ExprIdentNode targetExpr = ExprNodeUtility.GetExprIdentNode(typesPerStream, targetStreamNum, targetPropertyName);

            RangeFilterAnalyzer.Apply(targetExpr, start, end, includeLow, includeHigh, false, queryGraph);
        }
Esempio n. 5
0
 public ICollection<EventBean> Snapshot(
     QueryGraph queryGraph,
     Attribute[] annotations)
     => ProcSnapshot(queryGraph, annotations);
 public abstract EPPreparedExecuteIUDSingleStreamExec GetExecutor(QueryGraph queryGraph, string aliasName);
        /// <summary>
        /// Ctor.
        /// </summary>
        /// <param name="statementSpec">is a container for the definition of all statement constructs thatmay have been used in the statement, i.e. if defines the select clauses, insert into, outer joins etc.
        /// </param>
        /// <param name="services">is the service instances for dependency injection</param>
        /// <param name="statementContext">is statement-level information and statement services</param>
        /// <throws>com.espertech.esper.epl.expression.core.ExprValidationException if the preparation failed</throws>
        public EPPreparedExecuteIUDSingleStream(
            StatementSpecCompiled statementSpec,
            EPServicesContext services,
            StatementContext statementContext)
        {
            var queryPlanLogging = services.ConfigSnapshot.EngineDefaults.Logging.IsEnableQueryPlan;

            if (queryPlanLogging)
            {
                QueryPlanLog.Info("Query plans for Fire-and-forget query '" + statementContext.Expression + "'");
            }

            HasTableAccess = statementSpec.IntoTableSpec != null ||
                             (statementSpec.TableNodes != null && statementSpec.TableNodes.Length > 0);
            if (statementSpec.InsertIntoDesc != null && services.TableService.GetTableMetadata(statementSpec.InsertIntoDesc.EventTypeName) != null)
            {
                HasTableAccess = true;
            }
            if (statementSpec.FireAndForgetSpec is FireAndForgetSpecUpdate ||
                statementSpec.FireAndForgetSpec is FireAndForgetSpecDelete)
            {
                HasTableAccess |= statementSpec.StreamSpecs[0] is TableQueryStreamSpec;
            }

            StatementSpec    = statementSpec;
            Services         = services;
            StatementContext = statementContext;

            // validate general FAF criteria
            EPPreparedExecuteMethodHelper.ValidateFAFQuery(statementSpec);

            // obtain processor
            var streamSpec = statementSpec.StreamSpecs[0];

            Processor = FireAndForgetProcessorFactory.ValidateResolveProcessor(streamSpec, services);

            // obtain name and type
            var processorName = Processor.NamedWindowOrTableName;
            var eventType     = Processor.EventTypeResultSetProcessor;

            // determine alias
            var aliasName = processorName;

            if (streamSpec.OptionalStreamName != null)
            {
                aliasName = streamSpec.OptionalStreamName;
            }

            // compile filter to optimize access to named window
            var typeService     = new StreamTypeServiceImpl(new EventType[] { eventType }, new string[] { aliasName }, new bool[] { true }, services.EngineURI, true);
            var excludePlanHint = ExcludePlanHint.GetHint(typeService.StreamNames, statementContext);
            var queryGraph      = new QueryGraph(1, excludePlanHint, false);

            if (statementSpec.FilterRootNode != null)
            {
                ExprNodeUtility.ValidateFilterWQueryGraphSafe(
                    queryGraph, statementSpec.FilterRootNode,
                    statementContext, typeService);
            }

            // validate expressions
            EPStatementStartMethodHelperValidate.ValidateNodes(statementSpec, statementContext, typeService, null);

            // get executor
            Executor = GetExecutor(queryGraph, aliasName);
        }
Esempio n. 8
0
 public TestSchema()
 {
     Query = new QueryGraph();
 }
Esempio n. 9
0
 public WikidataEndpointQueryRunner(QueryGraph graph)
 {
     //graph.ResetTraverse();
     QueryGraph = graph;
 }
Esempio n. 10
0
 public abstract ICollection <EventBean> SnapshotBestEffort(EPPreparedExecuteMethodQuery epPreparedExecuteMethodQuery, QueryGraph queryGraph, Attribute[] annotations);
        public override EPPreparedExecuteIUDSingleStreamExec GetExecutor(QueryGraph queryGraph, string aliasName)
        {
            var statementSpec                 = base.StatementSpec;
            var statementContext              = base.StatementContext;
            var selectNoWildcard              = NamedWindowOnMergeHelper.CompileSelectNoWildcard(UuidGenerator.Generate(), statementSpec.SelectClauseSpec.SelectExprList);
            var streamTypeService             = new StreamTypeServiceImpl(statementContext.EngineURI, true);
            var exprEvaluatorContextStatement = new ExprEvaluatorContextStatement(statementContext, true);

            // assign names
            var validationContext = new ExprValidationContext(
                statementContext.Container,
                streamTypeService,
                statementContext.EngineImportService,
                statementContext.StatementExtensionServicesContext, null,
                statementContext.TimeProvider,
                statementContext.VariableService,
                statementContext.TableService,
                exprEvaluatorContextStatement,
                statementContext.EventAdapterService,
                statementContext.StatementName,
                statementContext.StatementId,
                statementContext.Annotations,
                statementContext.ContextDescriptor,
                statementContext.ScriptingService,
                false, false, true, false, null, false);

            var processor = base.Processor;

            // determine whether column names are provided
            // if the "values" keyword was used, allow sequential automatic name assignment
            string[] assignedSequentialNames = null;
            if (statementSpec.InsertIntoDesc.ColumnNames.IsEmpty())
            {
                var insert = (FireAndForgetSpecInsert)statementSpec.FireAndForgetSpec;
                if (insert.IsUseValuesKeyword)
                {
                    assignedSequentialNames = processor.EventTypePublic.PropertyNames;
                }
            }

            var count = -1;

            foreach (var compiled in statementSpec.SelectClauseSpec.SelectExprList)
            {
                count++;
                if (compiled is SelectClauseExprCompiledSpec)
                {
                    var expr = (SelectClauseExprCompiledSpec)compiled;
                    var validatedExpression = ExprNodeUtility.GetValidatedSubtree(ExprNodeOrigin.SELECT, expr.SelectExpression, validationContext);
                    expr.SelectExpression = validatedExpression;
                    if (expr.AssignedName == null)
                    {
                        if (expr.ProvidedName == null)
                        {
                            if (assignedSequentialNames != null && count < assignedSequentialNames.Length)
                            {
                                expr.AssignedName = assignedSequentialNames[count];
                            }
                            else
                            {
                                expr.AssignedName = ExprNodeUtility.ToExpressionStringMinPrecedenceSafe(expr.SelectExpression);
                            }
                        }
                        else
                        {
                            expr.AssignedName = expr.ProvidedName;
                        }
                    }
                }
            }

            var optionalInsertIntoEventType = processor.EventTypeResultSetProcessor;
            var selectExprEventTypeRegistry = new SelectExprEventTypeRegistry(statementContext.StatementName, statementContext.StatementEventTypeRef);
            var insertHelper = SelectExprProcessorFactory.GetProcessor(
                statementContext.Container,
                Collections.SingletonList(0),
                selectNoWildcard.ToArray(), false,
                statementSpec.InsertIntoDesc, optionalInsertIntoEventType, null, streamTypeService,
                statementContext.EventAdapterService,
                statementContext.StatementResultService,
                statementContext.ValueAddEventService,
                selectExprEventTypeRegistry,
                statementContext.EngineImportService,
                exprEvaluatorContextStatement,
                statementContext.VariableService,
                statementContext.ScriptingService,
                statementContext.TableService,
                statementContext.TimeProvider,
                statementContext.EngineURI,
                statementContext.StatementId,
                statementContext.StatementName,
                statementContext.Annotations,
                statementContext.ContextDescriptor,
                statementContext.ConfigSnapshot, null,
                statementContext.NamedWindowMgmtService,
                null, null,
                statementContext.StatementExtensionServicesContext);

            return(new EPPreparedExecuteIUDSingleStreamExecInsert(exprEvaluatorContextStatement, insertHelper, statementSpec.TableNodes, base.Services));
        }
Esempio n. 12
0
        public void Apply(QueryGraph queryGraph)
        {
            if (_targetStreamNum == _parameterStreamNum)
            {
                return;
            }

            ExprIdentNode targetStartExpr = ExprNodeUtility.GetExprIdentNode(
                _typesPerStream, _targetStreamNum, _targetStartProp);
            ExprIdentNode targetEndExpr = ExprNodeUtility.GetExprIdentNode(
                _typesPerStream, _targetStreamNum, _targetEndProp);
            ExprIdentNode parameterStartExpr = ExprNodeUtility.GetExprIdentNode(
                _typesPerStream, _parameterStreamNum, _parameterStartProp);
            ExprIdentNode parameterEndExpr = ExprNodeUtility.GetExprIdentNode(
                _typesPerStream, _parameterStreamNum, _parameterEndProp);

            if (targetStartExpr.ExprEvaluator.ReturnType != parameterStartExpr.ExprEvaluator.ReturnType)
            {
                return;
            }

            if (_currentMethod == DatetimeMethodEnum.BEFORE)
            {
                // a.end < b.start
                queryGraph.AddRelationalOpStrict(
                    _targetStreamNum, targetEndExpr,
                    _parameterStreamNum, parameterStartExpr,
                    RelationalOpEnum.LT);
            }
            else if (_currentMethod == DatetimeMethodEnum.AFTER)
            {
                // a.start > b.end
                queryGraph.AddRelationalOpStrict(
                    _targetStreamNum, targetStartExpr,
                    _parameterStreamNum, parameterEndExpr,
                    RelationalOpEnum.GT);
            }
            else if (_currentMethod == DatetimeMethodEnum.COINCIDES)
            {
                // a.startTimestamp = b.startTimestamp and a.endTimestamp = b.endTimestamp
                queryGraph.AddStrictEquals(_targetStreamNum, _targetStartProp, targetStartExpr,
                                           _parameterStreamNum, _parameterStartProp, parameterStartExpr);

                var noDuration = _parameterEndProp.Equals(_parameterStartProp) &&
                                 _targetEndProp.Equals(_targetStartProp);
                if (!noDuration)
                {
                    ExprIdentNode leftEndExpr = ExprNodeUtility.GetExprIdentNode(
                        _typesPerStream, _targetStreamNum, _targetEndProp);
                    ExprIdentNode rightEndExpr = ExprNodeUtility.GetExprIdentNode(
                        _typesPerStream, _parameterStreamNum, _parameterEndProp);
                    queryGraph.AddStrictEquals(
                        _targetStreamNum, _targetEndProp, leftEndExpr, _parameterStreamNum, _parameterEndProp, rightEndExpr);
                }
            }
            else if (_currentMethod == DatetimeMethodEnum.DURING || _currentMethod == DatetimeMethodEnum.INCLUDES)
            {
                // DURING:   b.startTimestamp < a.startTimestamp <= a.endTimestamp < b.endTimestamp
                // INCLUDES: a.startTimestamp < b.startTimestamp <= b.endTimestamp < a.endTimestamp
                RelationalOpEnum relop = _currentMethod == DatetimeMethodEnum.DURING
                                             ? RelationalOpEnum.LT
                                             : RelationalOpEnum.GT;
                queryGraph.AddRelationalOpStrict(
                    _parameterStreamNum, parameterStartExpr,
                    _targetStreamNum, targetStartExpr, relop);

                queryGraph.AddRelationalOpStrict(
                    _targetStreamNum, targetEndExpr,
                    _parameterStreamNum, parameterEndExpr, relop);
            }
            else if (_currentMethod == DatetimeMethodEnum.FINISHES || _currentMethod == DatetimeMethodEnum.FINISHEDBY)
            {
                // FINISHES:   b.startTimestamp < a.startTimestamp and a.endTimestamp = b.endTimestamp
                // FINISHEDBY: a.startTimestamp < b.startTimestamp and a.endTimestamp = b.endTimestamp
                RelationalOpEnum relop = _currentMethod == DatetimeMethodEnum.FINISHES
                                             ? RelationalOpEnum.LT
                                             : RelationalOpEnum.GT;
                queryGraph.AddRelationalOpStrict(
                    _parameterStreamNum, parameterStartExpr,
                    _targetStreamNum, targetStartExpr, relop);

                queryGraph.AddStrictEquals(
                    _targetStreamNum, _targetEndProp, targetEndExpr,
                    _parameterStreamNum, _parameterEndProp, parameterEndExpr);
            }
            else if (_currentMethod == DatetimeMethodEnum.MEETS)
            {
                // a.endTimestamp = b.startTimestamp
                queryGraph.AddStrictEquals(_targetStreamNum, _targetEndProp, targetEndExpr,
                                           _parameterStreamNum, _parameterStartProp, parameterStartExpr);
            }
            else if (_currentMethod == DatetimeMethodEnum.METBY)
            {
                // a.startTimestamp = b.endTimestamp
                queryGraph.AddStrictEquals(_targetStreamNum, _targetStartProp, targetStartExpr,
                                           _parameterStreamNum, _parameterEndProp, parameterEndExpr);
            }
            else if (_currentMethod == DatetimeMethodEnum.OVERLAPS || _currentMethod == DatetimeMethodEnum.OVERLAPPEDBY)
            {
                // OVERLAPS:     a.startTimestamp < b.startTimestamp < a.endTimestamp < b.endTimestamp
                // OVERLAPPEDBY: b.startTimestamp < a.startTimestamp < b.endTimestamp < a.endTimestamp
                RelationalOpEnum relop = _currentMethod == DatetimeMethodEnum.OVERLAPS
                                             ? RelationalOpEnum.LT
                                             : RelationalOpEnum.GT;
                queryGraph.AddRelationalOpStrict(
                    _targetStreamNum, targetStartExpr,
                    _parameterStreamNum, parameterStartExpr, relop);

                queryGraph.AddRelationalOpStrict(
                    _targetStreamNum, targetEndExpr,
                    _parameterStreamNum, parameterEndExpr, relop);

                if (_currentMethod == DatetimeMethodEnum.OVERLAPS)
                {
                    queryGraph.AddRelationalOpStrict(
                        _parameterStreamNum, parameterStartExpr,
                        _targetStreamNum, targetEndExpr, RelationalOpEnum.LT);
                }
                else
                {
                    queryGraph.AddRelationalOpStrict(
                        _targetStreamNum, targetStartExpr,
                        _parameterStreamNum, parameterEndExpr, RelationalOpEnum.LT);
                }
            }
            else if (_currentMethod == DatetimeMethodEnum.STARTS || _currentMethod == DatetimeMethodEnum.STARTEDBY)
            {
                // STARTS:       a.startTimestamp = b.startTimestamp and a.endTimestamp < b.endTimestamp
                // STARTEDBY:    a.startTimestamp = b.startTimestamp and b.endTimestamp < a.endTimestamp
                queryGraph.AddStrictEquals(_targetStreamNum, _targetStartProp, targetStartExpr,
                                           _parameterStreamNum, _parameterStartProp, parameterStartExpr);

                RelationalOpEnum relop = _currentMethod == DatetimeMethodEnum.STARTS
                                             ? RelationalOpEnum.LT
                                             : RelationalOpEnum.GT;
                queryGraph.AddRelationalOpStrict(
                    _targetStreamNum, targetEndExpr,
                    _parameterStreamNum, parameterEndExpr, relop);
            }
        }
Esempio n. 13
0
 private List<Match> SampleMatches(QueryGraph qg)
 {
     int matchNum = 20;
     Random ra = new Random();
     List<Match> res = new List<Match>();
     for (int i = 0; i < matchNum; ++i)
     {
         Match m = new Match();
         foreach (long cid in qg.CellIDSet)
         {
             NodePair np = new NodePair(cid, ra.Next());
             m.PartialMatch.Add(np);
         }
         res.Add(m);
     }
     return res;
 }
Esempio n. 14
0
 public FindFilesQuery(QueryGraph graph, EvalHandler handler)
     : base(graph, handler)
 {
 }