Ejemplo n.º 1
0
        private OnTriggerActivatorDesc ActivatorNamedWindow(
            NamedWindowConsumerStreamSpec namedSpec,
            StatementCompileTimeServices services)
        {
            var namedWindow = namedSpec.NamedWindow;
            var triggerEventTypeName = namedSpec.NamedWindow.EventType.Name;

            var typesFilterValidation = new StreamTypeServiceImpl(
                namedWindow.EventType,
                namedSpec.OptionalStreamName,
                false);
            var filterSingle =
                ExprNodeUtilityMake.ConnectExpressionsByLogicalAndWhenNeeded(namedSpec.FilterExpressions);
            var filterQueryGraph = EPLValidationUtil.ValidateFilterGetQueryGraphSafe(
                filterSingle,
                typesFilterValidation,
                @base.StatementRawInfo,
                services);
            var activator = new ViewableActivatorNamedWindowForge(
                namedSpec,
                namedWindow,
                filterSingle,
                filterQueryGraph,
                false,
                namedSpec.OptPropertyEvaluator);

            var activatorResultEventType = namedWindow.EventType;
            if (namedSpec.OptPropertyEvaluator != null) {
                activatorResultEventType = namedSpec.OptPropertyEvaluator.FragmentEventType;
            }

            return new OnTriggerActivatorDesc(activator, triggerEventTypeName, activatorResultEventType);
        }
Ejemplo n.º 2
0
        public static FireAndForgetProcessor ValidateResolveProcessor(StreamSpecCompiled streamSpec, EPServicesContext services)

        {
            // resolve processor
            string processorName;

            if (streamSpec is NamedWindowConsumerStreamSpec)
            {
                NamedWindowConsumerStreamSpec namedSpec = (NamedWindowConsumerStreamSpec)streamSpec;
                processorName = namedSpec.WindowName;
            }
            else
            {
                TableQueryStreamSpec tableSpec = (TableQueryStreamSpec)streamSpec;
                processorName = tableSpec.TableName;
            }

            // get processor instance
            TableMetadata tableMetadata = services.TableService.GetTableMetadata(processorName);

            if (tableMetadata != null)
            {
                return(new FireAndForgetProcessorTable(services.TableService, tableMetadata));
            }
            else
            {
                NamedWindowProcessor nwprocessor = services.NamedWindowService.GetProcessor(processorName);
                if (nwprocessor == null)
                {
                    throw new ExprValidationException("A table or named window by name '" + processorName + "' does not exist");
                }
                return(new FireAndForgetProcessorNamedWindow(nwprocessor));
            }
        }
 public void AddConsumer(StatementContext statementContext, NamedWindowConsumerStreamSpec namedSpec)
 {
     if (Log.IsDebugEnabled)
     {
         Log.Debug("Statement '" + statementContext.StatementName + " registers consumer for '" + namedSpec.WindowName + "'");
     }
 }
 public void AddConsumer(StatementContext statementContext, NamedWindowConsumerStreamSpec namedSpec)
 {
     if (Log.IsDebugEnabled)
     {
         Log.Debug("Statement '{0} registers consumer for '{1}'", statementContext.StatementName, namedSpec.WindowName);
     }
 }
Ejemplo n.º 5
0
 public ViewableActivatorNamedWindowForge(
     NamedWindowConsumerStreamSpec spec,
     NamedWindowMetaData namedWindow,
     ExprNode filterEvaluator,
     QueryGraphForge filterQueryGraph,
     bool subquery,
     PropertyEvaluatorForge optPropertyEvaluator)
 {
     this.spec = spec;
     this.namedWindow = namedWindow;
     this.filterEvaluator = filterEvaluator;
     this.filterQueryGraph = filterQueryGraph;
     this.subquery = subquery;
     this.optPropertyEvaluator = optPropertyEvaluator;
 }
Ejemplo n.º 6
0
        public ViewableActivator CreateNamedWindow(
            NamedWindowProcessor processor,
            NamedWindowConsumerStreamSpec streamSpec,
            StatementContext statementContext)
        {
            if (ProcCreateNamedWindow == null)
            {
                throw new NotSupportedException();
            }

            return(ProcCreateNamedWindow.Invoke(
                       processor,
                       streamSpec,
                       statementContext));
        }
Ejemplo n.º 7
0
        private static StatementSpecCompiled AssociatedFromClause(
            StatementSpecCompiled statementSpec,
            StatementCompileTimeServices services)
        {
            var raw = statementSpec.Raw;
            if (raw.WhereClause != null ||
                statementSpec.StreamSpecs.Length > 0 ||
                raw.HavingClause != null ||
                raw.OutputLimitSpec != null ||
                raw.ForClauseSpec != null ||
                raw.MatchRecognizeSpec != null ||
                raw.OrderByList != null && !raw.OrderByList.IsEmpty() ||
                raw.RowLimitSpec != null) {
                throw new ExprValidationException(
                    "Insert-into fire-and-forget query can only consist of an insert-into clause and a select-clause");
            }

            var infraName = statementSpec.Raw.InsertIntoDesc.EventTypeName;
            var namedWindow = services.NamedWindowCompileTimeResolver.Resolve(infraName);
            var table = services.TableCompileTimeResolver.Resolve(infraName);
            if (namedWindow == null && table == null) {
                throw new ExprValidationException("Failed to find named window or table '" + infraName + "'");
            }

            StreamSpecCompiled stream;
            if (namedWindow != null) {
                stream = new NamedWindowConsumerStreamSpec(
                    namedWindow,
                    null,
                    new ViewSpec[0],
                    Collections.GetEmptyList<ExprNode>(),
                    StreamSpecOptions.DEFAULT,
                    null);
            }
            else {
                stream = new TableQueryStreamSpec(
                    null,
                    new ViewSpec[0],
                    StreamSpecOptions.DEFAULT,
                    table,
                    Collections.GetEmptyList<ExprNode>());
            }

            return new StatementSpecCompiled(statementSpec, new[] {stream});
        }
Ejemplo n.º 8
0
        private static StatementSpecCompiled AssociatedFromClause(StatementSpecCompiled statementSpec)
        {
            if (statementSpec.FilterRootNode != null ||
                statementSpec.StreamSpecs.Length > 0 ||
                statementSpec.HavingExprRootNode != null ||
                statementSpec.OutputLimitSpec != null ||
                statementSpec.ForClauseSpec != null ||
                statementSpec.MatchRecognizeSpec != null ||
                statementSpec.OrderByList.Length > 0 ||
                statementSpec.RowLimitSpec != null)
            {
                throw new ExprValidationException("Insert-into fire-and-forget query can only consist of an insert-into clause and a select-clause");
            }

            var namedWindowName   = statementSpec.InsertIntoDesc.EventTypeName;
            var namedWindowStream = new NamedWindowConsumerStreamSpec(namedWindowName, null, new ViewSpec[0], Collections.GetEmptyList <ExprNode>(), new StreamSpecOptions(), null);

            statementSpec.StreamSpecs = new StreamSpecCompiled[] { namedWindowStream };
            return(statementSpec);
        }
Ejemplo n.º 9
0
 public ViewableActivator CreateNamedWindow(NamedWindowProcessor processor, NamedWindowConsumerStreamSpec streamSpec, StatementContext statementContext)
 {
     return(new ViewableActivatorNamedWindow(processor, streamSpec.FilterExpressions, streamSpec.OptPropertyEvaluator));
 }
Ejemplo n.º 10
0
        public static SubSelectActivationDesc CreateSubSelectActivation(
            IList <FilterSpecCompiled> filterSpecCompileds,
            IList <NamedWindowConsumerStreamSpec> namedWindowConsumers,
            StatementBaseInfo statement,
            StatementCompileTimeServices services)
        {
            IDictionary <ExprSubselectNode, SubSelectActivationPlan> result = new LinkedHashMap <ExprSubselectNode, SubSelectActivationPlan>();
            IList <StmtClassForgeableFactory> additionalForgeables          = new List <StmtClassForgeableFactory>();

            // Process all subselect expression nodes
            foreach (ExprSubselectNode subselect in statement.StatementSpec.SubselectNodes)
            {
                StatementSpecCompiled statementSpec = subselect.StatementSpecCompiled;
                StreamSpecCompiled    streamSpec    = statementSpec.StreamSpecs[0];
                int subqueryNumber = subselect.SubselectNumber;
                if (subqueryNumber == -1)
                {
                    throw new IllegalStateException("Unexpected subquery");
                }

                ViewFactoryForgeArgs args = new ViewFactoryForgeArgs(-1, true, subqueryNumber, streamSpec.Options, null, statement.StatementRawInfo, services);

                if (streamSpec is FilterStreamSpecCompiled)
                {
                    if (services.IsFireAndForget)
                    {
                        throw new ExprValidationException("Fire-and-forget queries only allow subqueries against named windows and tables");
                    }

                    FilterStreamSpecCompiled filterStreamSpec = (FilterStreamSpecCompiled)statementSpec.StreamSpecs[0];

                    // Register filter, create view factories
                    ViewableActivatorForge activatorDeactivator = new ViewableActivatorFilterForge(
                        filterStreamSpec.FilterSpecCompiled,
                        false,
                        null,
                        true,
                        subqueryNumber);
                    ViewFactoryForgeDesc viewForgeDesc = ViewFactoryForgeUtil.CreateForges(
                        streamSpec.ViewSpecs,
                        args,
                        filterStreamSpec.FilterSpecCompiled.ResultEventType);
                    IList <ViewFactoryForge> forges = viewForgeDesc.Forges;
                    additionalForgeables.AddAll(viewForgeDesc.MultikeyForges);
                    EventType eventType = forges.IsEmpty() ? filterStreamSpec.FilterSpecCompiled.ResultEventType : forges[forges.Count - 1].EventType;
                    subselect.RawEventType = eventType;
                    filterSpecCompileds.Add(filterStreamSpec.FilterSpecCompiled);

                    // Add lookup to list, for later starts
                    result.Put(
                        subselect,
                        new SubSelectActivationPlan(filterStreamSpec.FilterSpecCompiled.ResultEventType, forges, activatorDeactivator, streamSpec));
                }
                else if (streamSpec is TableQueryStreamSpec)
                {
                    TableQueryStreamSpec   table             = (TableQueryStreamSpec)streamSpec;
                    ExprNode               filter            = ExprNodeUtilityMake.ConnectExpressionsByLogicalAndWhenNeeded(table.FilterExpressions);
                    ViewableActivatorForge viewableActivator = new ViewableActivatorTableForge(table.Table, filter);
                    result.Put(
                        subselect,
                        new SubSelectActivationPlan(table.Table.InternalEventType, EmptyList <ViewFactoryForge> .Instance, viewableActivator, streamSpec));
                    subselect.RawEventType = table.Table.InternalEventType;
                }
                else
                {
                    NamedWindowConsumerStreamSpec namedSpec = (NamedWindowConsumerStreamSpec)statementSpec.StreamSpecs[0];
                    namedWindowConsumers.Add(namedSpec);
                    NamedWindowMetaData nwinfo = namedSpec.NamedWindow;

                    EventType namedWindowType = nwinfo.EventType;
                    if (namedSpec.OptPropertyEvaluator != null)
                    {
                        namedWindowType = namedSpec.OptPropertyEvaluator.FragmentEventType;
                    }

                    // if named-window index sharing is disabled (the default) or filter expressions are provided then consume the insert-remove stream
                    bool disableIndexShare          = HintEnum.DISABLE_WINDOW_SUBQUERY_INDEXSHARE.GetHint(statement.StatementRawInfo.Annotations) != null;
                    bool processorDisableIndexShare = !namedSpec.NamedWindow.IsEnableIndexShare;
                    if (disableIndexShare && namedSpec.NamedWindow.IsVirtualDataWindow)
                    {
                        disableIndexShare = false;
                    }

                    if ((!namedSpec.FilterExpressions.IsEmpty() || processorDisableIndexShare || disableIndexShare) && (!services.IsFireAndForget))
                    {
                        ExprNode filterEvaluator = null;
                        if (!namedSpec.FilterExpressions.IsEmpty())
                        {
                            filterEvaluator = ExprNodeUtilityMake.ConnectExpressionsByLogicalAndWhenNeeded(namedSpec.FilterExpressions);
                        }

                        ViewableActivatorForge activatorNamedWindow = new ViewableActivatorNamedWindowForge(
                            namedSpec,
                            nwinfo,
                            filterEvaluator,
                            null,
                            true,
                            namedSpec.OptPropertyEvaluator);
                        ViewFactoryForgeDesc     viewForgeDesc = ViewFactoryForgeUtil.CreateForges(streamSpec.ViewSpecs, args, namedWindowType);
                        IList <ViewFactoryForge> forges        = viewForgeDesc.Forges;
                        additionalForgeables.AddAll(viewForgeDesc.MultikeyForges);
                        subselect.RawEventType = forges.IsEmpty() ? namedWindowType : forges[forges.Count - 1].EventType;
                        result.Put(subselect, new SubSelectActivationPlan(namedWindowType, forges, activatorNamedWindow, streamSpec));
                    }
                    else
                    {
                        // else if there are no named window stream filter expressions and index sharing is enabled
                        ViewFactoryForgeDesc     viewForgeDesc = ViewFactoryForgeUtil.CreateForges(streamSpec.ViewSpecs, args, namedWindowType);
                        IList <ViewFactoryForge> forges        = viewForgeDesc.Forges;
                        additionalForgeables.AddAll(viewForgeDesc.MultikeyForges);
                        subselect.RawEventType = namedWindowType;
                        ViewableActivatorForge activatorNamedWindow = new ViewableActivatorSubselectNoneForge(namedWindowType);
                        result.Put(subselect, new SubSelectActivationPlan(namedWindowType, forges, activatorNamedWindow, streamSpec));
                    }
                }
            }

            return(new SubSelectActivationDesc(result, additionalForgeables));
        }
Ejemplo n.º 11
0
        public static StreamSpecCompiledDesc CompileFilter(
            FilterStreamSpecRaw streamSpec,
            bool isInsertInto,
            bool isJoin,
            bool isContextDeclaration,
            bool isOnTrigger,
            string optionalStreamName,
            StatementRawInfo statementRawInfo,
            StatementCompileTimeServices services)
        {
            // Determine the event type
            var rawFilterSpec = streamSpec.RawFilterSpec;
            var eventTypeName = rawFilterSpec.EventTypeName;

            var table = services.TableCompileTimeResolver.Resolve(eventTypeName);
            if (table != null) {
                if (streamSpec.ViewSpecs != null && streamSpec.ViewSpecs.Length > 0) {
                    throw new ExprValidationException("Views are not supported with tables");
                }

                if (streamSpec.RawFilterSpec.OptionalPropertyEvalSpec != null) {
                    throw new ExprValidationException("Contained-event expressions are not supported with tables");
                }

                StreamTypeService streamTypeService = new StreamTypeServiceImpl(
                    new[] {table.InternalEventType},
                    new[] {optionalStreamName},
                    new[] {true},
                    false,
                    false);
                FilterSpecValidatedDesc descX = FilterSpecCompiler.ValidateAllowSubquery(
                    ExprNodeOrigin.FILTER,
                    rawFilterSpec.FilterExpressions,
                    streamTypeService,
                    null,
                    null,
                    statementRawInfo,
                    services);
                TableQueryStreamSpec tableStreamSpec = new TableQueryStreamSpec(
                    streamSpec.OptionalStreamName,
                    streamSpec.ViewSpecs,
                    streamSpec.Options,
                    table,
                    descX.Expressions);
                return new StreamSpecCompiledDesc(
                    tableStreamSpec,
                    descX.AdditionalForgeables);
            }

            // Could be a named window
            var namedWindowInfo = services.NamedWindowCompileTimeResolver.Resolve(eventTypeName);
            if (namedWindowInfo != null) {
                StreamTypeService streamTypeService = new StreamTypeServiceImpl(
                    new[] {namedWindowInfo.EventType},
                    new[] {optionalStreamName},
                    new[] {true},
                    false,
                    false);

                FilterSpecValidatedDesc validated = FilterSpecCompiler.ValidateAllowSubquery(
                    ExprNodeOrigin.FILTER,
                    rawFilterSpec.FilterExpressions,
                    streamTypeService,
                    null,
                    null,
                    statementRawInfo,
                    services);

                PropertyEvaluatorForge optionalPropertyEvaluator = null;
                if (rawFilterSpec.OptionalPropertyEvalSpec != null) {
                    optionalPropertyEvaluator = PropertyEvaluatorForgeFactory.MakeEvaluator(
                        rawFilterSpec.OptionalPropertyEvalSpec,
                        namedWindowInfo.EventType,
                        streamSpec.OptionalStreamName,
                        statementRawInfo,
                        services);
                }

                NamedWindowConsumerStreamSpec consumer = new NamedWindowConsumerStreamSpec(
                    namedWindowInfo,
                    streamSpec.OptionalStreamName,
                    streamSpec.ViewSpecs,
                    validated.Expressions,
                    streamSpec.Options,
                    optionalPropertyEvaluator);

                return new StreamSpecCompiledDesc(consumer, validated.AdditionalForgeables);
            }

            var eventType = ResolveTypeName(eventTypeName, services.EventTypeCompileTimeResolver);

            // Validate all nodes, make sure each returns a boolean and types are good;
            // Also decompose all AND super nodes into individual expressions
            StreamTypeService streamTypeServiceX = new StreamTypeServiceImpl(
                new[] {eventType},
                new[] {streamSpec.OptionalStreamName},
                new[] {true},
                false,
                false);

            FilterSpecCompiledDesc desc = FilterSpecCompiler.MakeFilterSpec(
                eventType, 
                eventTypeName,
                rawFilterSpec.FilterExpressions,
                rawFilterSpec.OptionalPropertyEvalSpec,
                null, null, null, // no tags
                streamTypeServiceX,
                streamSpec.OptionalStreamName,
                statementRawInfo,
                services);
            
            FilterStreamSpecCompiled compiled = new FilterStreamSpecCompiled(
                desc.FilterSpecCompiled,
                streamSpec.ViewSpecs,
                streamSpec.OptionalStreamName,
                streamSpec.Options);

            return new StreamSpecCompiledDesc(compiled, desc.AdditionalForgeables);
        }