示例#1
0
 /// <summary>
 ///     NOTE: Code-generation-invoked method, method name and parameter order matters
 /// </summary>
 /// <param name="streamNum">stream num</param>
 /// <param name="eventsPerStream">events</param>
 /// <returns>value</returns>
 public static AggregationRow TableColumnRow(
     int streamNum,
     EventBean[] eventsPerStream)
 {
     var oa = (ObjectArrayBackedEventBean) eventsPerStream[streamNum];
     return ExprTableEvalStrategyUtil.GetRow(oa);
 }
示例#2
0
 public CodegenMethod InitializeCodegen(
     CodegenMethodScope parent,
     SAIFFInitializeSymbol symbols,
     CodegenClassScope classScope)
 {
     var method = parent.MakeChild(TypeOfSubclass(), GetType(), classScope);
     method.Block
         .DeclareVar(TypeOfSubclass(), "saiff", NewInstance(TypeOfSubclass()))
         .SetProperty(Ref("saiff"), "Activator", activator.MakeCodegen(method, symbols, classScope))
         .SetProperty(
             Ref("saiff"),
             "ResultEventType",
             EventTypeUtility.ResolveTypeCodegen(resultEventType, symbols.GetAddInitSvc(method)))
         .SetProperty(
             Ref("saiff"),
             "Subselects",
             SubSelectFactoryForge.CodegenInitMap(subselects, GetType(), method, symbols, classScope))
         .SetProperty(
             Ref("saiff"),
             "TableAccesses",
             ExprTableEvalStrategyUtil.CodegenInitMap(tableAccesses, GetType(), method, symbols, classScope));
     InlineInitializeOnTriggerBase(Ref("saiff"), method, symbols, classScope);
     method.Block.MethodReturn(Ref("saiff"));
     return method;
 }
示例#3
0
        public void ApplyLeave(EventBean[] eventsPerStream, object optionalGroupKeyPerRow, ExprEvaluatorContext exprEvaluatorContext)
        {
            // acquire table-level write lock
            ExprTableEvalLockUtil.ObtainLockUnless(_tableStateInstance.TableLevelRWLock.WriteLock, exprEvaluatorContext);

            var @event = _tableStateInstance.GetCreateRowIntoTable(null, exprEvaluatorContext);
            var row = ExprTableEvalStrategyUtil.GetRow(@event);
            var evaluateParams = new EvaluateParams(eventsPerStream, false, exprEvaluatorContext);

            if (InstrumentationHelper.ENABLED) { InstrumentationHelper.Get().QAggregationUngroupedApplyEnterLeave(false, row.Methods.Length, row.States.Length); }

            for (var i = 0; i < _methodPairs.Length; i++)
            {
                var methodPair = _methodPairs[i];
                var method = row.Methods[methodPair.TargetIndex];
                if (InstrumentationHelper.ENABLED) { InstrumentationHelper.Get().QAggNoAccessEnterLeave(false, i, method, methodPair.AggregationNode); }
                var columnResult = methodPair.Evaluator.Evaluate(evaluateParams);
                method.Leave(columnResult);
                if (InstrumentationHelper.ENABLED) { InstrumentationHelper.Get().AAggNoAccessEnterLeave(false, i, method); }
            }

            for (var i = 0; i < _targetStates.Length; i++)
            {
                var state = row.States[_targetStates[i]];
                if (InstrumentationHelper.ENABLED) { InstrumentationHelper.Get().QAggAccessEnterLeave(false, i, state, _accessStateExpr[i]); }
                _agents[i].ApplyLeave(eventsPerStream, exprEvaluatorContext, state);
                if (InstrumentationHelper.ENABLED) { InstrumentationHelper.Get().AAggAccessEnterLeave(false, i, state); }
            }

            _tableStateInstance.HandleRowUpdated(@event);
            if (InstrumentationHelper.ENABLED) { InstrumentationHelper.Get().AAggregationUngroupedApplyEnterLeave(false); }
        }
 /// <summary>
 ///     NOTE: Code-generation-invoked method, method name and parameter order matters
 /// </summary>
 /// <param name="streamNum">stream num</param>
 /// <param name="eventsPerStream">events</param>
 public static void TableAggReset(
     int streamNum,
     EventBean[] eventsPerStream)
 {
     var oa = (ObjectArrayBackedEventBean) eventsPerStream[streamNum];
     var row = ExprTableEvalStrategyUtil.GetRow(oa);
     row.Clear();
 }
示例#5
0
 public void MakeMethod(
     CodegenMethod method,
     SAIFFInitializeSymbol symbols,
     CodegenClassScope classScope)
 {
     var select = Ref("select");
     method.Block
         .DeclareVar<FAFQueryMethodSelect>(select.Ref, NewInstance(typeof(FAFQueryMethodSelect)))
         .SetProperty(
             select,
             "Annotations",
             LocalMethod(
                 AnnotationUtil.MakeAnnotations(typeof(Attribute[]), _desc.Annotations, method, classScope)))
         .SetProperty(
             select,
             "Processors",
             FireAndForgetProcessorForgeExtensions.MakeArray(_desc.Processors, method, symbols, classScope))
         .DeclareVar(
             _classNameResultSetProcessor,
             "rsp",
             NewInstance(_classNameResultSetProcessor, symbols.GetAddInitSvc(method), Ref("statementFields")))
         .SetProperty(select, "ResultSetProcessorFactoryProvider", Ref("rsp"))
         .SetProperty(select, "QueryGraph", _desc.QueryGraph.Make(method, symbols, classScope))
         .SetProperty(
             select,
             "WhereClause",
             _desc.WhereClause == null
                 ? ConstantNull()
                 : ExprNodeUtilityCodegen.CodegenEvaluator(
                     _desc.WhereClause.Forge,
                     method,
                     GetType(),
                     classScope))
         .SetProperty(
             select,
             "JoinSetComposerPrototype",
             _desc.Joins == null ? ConstantNull() : _desc.Joins.Make(method, symbols, classScope))
         .SetProperty(
             select,
             "ConsumerFilters",
             ExprNodeUtilityCodegen.CodegenEvaluators(_desc.ConsumerFilters, method, GetType(), classScope))
         .SetProperty(select, "ContextName", Constant(_desc.ContextName))
         .SetProperty(
             select,
             "TableAccesses",
             ExprTableEvalStrategyUtil.CodegenInitMap(
                 _desc.TableAccessForges,
                 GetType(),
                 method,
                 symbols,
                 classScope))
         .SetProperty(select, "HasTableAccess", Constant(_desc.HasTableAccess))
         .SetProperty(select, "IsDistinct", Constant(_desc.IsDistinct))
         .MethodReturn(select);
 }
示例#6
0
 /// <summary>
 ///     NOTE: Code-generation-invoked method, method name and parameter order matters
 /// </summary>
 /// <param name="streamNum">stream num</param>
 /// <param name="column">col</param>
 /// <param name="eventsPerStream">events</param>
 /// <param name="isNewData">new-data flow</param>
 /// <param name="ctx">context</param>
 /// <returns>value</returns>
 public static object TableColumnAggValue(
     int streamNum,
     int column,
     EventBean[] eventsPerStream,
     bool isNewData,
     ExprEvaluatorContext ctx)
 {
     var oa = (ObjectArrayBackedEventBean) eventsPerStream[streamNum];
     var row = ExprTableEvalStrategyUtil.GetRow(oa);
     return row.GetValue(column, eventsPerStream, isNewData, ctx);
 }
示例#7
0
        private AggregationState GetState(EventBean[] eventsPerStream)
        {
            EventBean @event = eventsPerStream[_streamNum];

            if (@event == null)
            {
                return(null);
            }
            AggregationRowPair row = ExprTableEvalStrategyUtil.GetRow((ObjectArrayBackedEventBean)@event);

            return(row.States[_tableAccessColumn.AccessAccessorSlotPair.Slot]);
        }
示例#8
0
        /// <summary>
        ///     NOTE: Code-generation-invoked method, method name and parameter order matters
        /// </summary>
        /// <param name="streamNum">stream number</param>
        /// <param name="reader">reader</param>
        /// <param name="aggColNum">agg col</param>
        /// <param name="eventsPerStream">events</param>
        /// <param name="isNewData">new-data flag</param>
        /// <param name="exprEvaluatorContext">expr ctx</param>
        /// <returns>value</returns>
        public static ICollection<object> EvaluateTableWithReaderCollectionScalar(
            int streamNum,
            AggregationMultiFunctionTableReader reader,
            int aggColNum,
            EventBean[] eventsPerStream,
            bool isNewData,
            ExprEvaluatorContext exprEvaluatorContext)
        {
            var @event = eventsPerStream[streamNum];
            if (@event == null) {
                return null;
            }

            var row = ExprTableEvalStrategyUtil.GetRow((ObjectArrayBackedEventBean) @event);
            return reader.GetValueCollectionScalar(aggColNum, row, eventsPerStream, isNewData, exprEvaluatorContext);
        }
        public EventBean GetEventBean(
            int column,
            EventBean[] eventsPerStream,
            bool isNewData,
            ExprEvaluatorContext context)
        {
            // acquire table-level write lock
            TableEvalLockUtil.ObtainLockUnless(tableInstance.TableLevelRWLock.WriteLock, context);

            var @event = tableInstance.EventUngrouped;
            if (@event == null) {
                return null;
            }

            var row = ExprTableEvalStrategyUtil.GetRow(@event);
            return row.GetEventBean(column, eventsPerStream, isNewData, context);
        }
 public void MakeMethod(
     CodegenMethod method,
     SAIFFInitializeSymbol symbols,
     CodegenClassScope classScope)
 {
     CodegenExpressionRef queryMethod = Ref("qm");
     method.Block
         .DeclareVar(TypeOfMethod(), queryMethod.Ref, NewInstance(TypeOfMethod()))
         .SetProperty(
             queryMethod,
             "Annotations",
             annotations == null
                 ? ConstantNull()
                 : LocalMethod(MakeAnnotations(typeof(Attribute[]), annotations, method, classScope)))
         .SetProperty(
             queryMethod, "Processor", processor.Make(method, symbols, classScope))
         .SetProperty(
             queryMethod,
             "QueryGraph",
             queryGraph == null ? ConstantNull() : queryGraph.Make(method, symbols, classScope))
         .SetProperty(
             queryMethod,
             "InternalEventRouteDest",
             ExprDotName(
                 symbols.GetAddInitSvc(method), EPStatementInitServicesConstants.INTERNALEVENTROUTEDEST))
         .SetProperty(
             queryMethod,
             "TableAccesses",
             ExprTableEvalStrategyUtil.CodegenInitMap(
                 tableAccessForges,
                 this.GetType(),
                 method,
                 symbols,
                 classScope))
         .SetProperty(
             queryMethod, "HasTableAccess", Constant(hasTableAccess))
         .SetProperty(
             queryMethod, "Subselects", SubSelectFactoryForge.CodegenInitMap(
                 _subselectForges, GetType(), method, symbols, classScope));
         
     MakeInlineSpecificSetter(queryMethod, method, symbols, classScope);
     method.Block.MethodReturn(queryMethod);
 }
示例#11
0
        public object GetValue(int column, int agentInstanceId, EvaluateParams evaluateParams)
        {
            // acquire table-level write lock
            ExprTableEvalLockUtil.ObtainLockUnless(_tableStateInstance.TableLevelRWLock.WriteLock, evaluateParams.ExprEvaluatorContext);

            var @event = _tableStateInstance.EventUngrouped;
            if (@event == null)
            {
                return null;
            }
            var row = ExprTableEvalStrategyUtil.GetRow(@event);
            var aggregators = row.Methods;
            if (column < aggregators.Length)
            {
                return aggregators[column].Value;
            }
            else
            {
                var pair = _accessors[column - aggregators.Length];
                return pair.Accessor.GetValue(row.States[pair.Slot], evaluateParams);
            }
        }
示例#12
0
        public void ClearResults(ExprEvaluatorContext exprEvaluatorContext)
        {
            // acquire table-level write lock
            ExprTableEvalLockUtil.ObtainLockUnless(_tableStateInstance.TableLevelRWLock.WriteLock, exprEvaluatorContext);

            var @event = _tableStateInstance.EventUngrouped;
            if (@event == null)
            {
                return;
            }
            var row = ExprTableEvalStrategyUtil.GetRow(@event);
            var aggregators = row.Methods;

            foreach (var state in row.States)
            {
                state.Clear();
            }
            foreach (var aggregator in aggregators)
            {
                aggregator.Clear();
            }
        }
示例#13
0
        public void ApplyLeave(
            EventBean[] eventsPerStream,
            object optionalGroupKeyPerRow,
            ExprEvaluatorContext exprEvaluatorContext)
        {
            // acquire table-level write lock
            TableEvalLockUtil.ObtainLockUnless(tableInstance.TableLevelRWLock.WriteLock, exprEvaluatorContext);

            var @event = tableInstance.GetCreateRowIntoTable(exprEvaluatorContext);
            var row = ExprTableEvalStrategyUtil.GetRow(@event);

            for (var i = 0; i < methodPairs.Length; i++) {
                var methodPair = methodPairs[i];
                var columnResult = methodPair.Evaluator.Evaluate(eventsPerStream, false, exprEvaluatorContext);
                row.LeaveAgg(methodPair.Column, columnResult);
            }

            for (var i = 0; i < accessAgents.Length; i++) {
                accessAgents[i].ApplyLeave(eventsPerStream, exprEvaluatorContext, row, accessColumnsZeroOffset[i]);
            }

            tableInstance.HandleRowUpdated(@event);
        }
示例#14
0
        public object[] ConvertToUnd(EventBean @event, EvaluateParams evalParams)
        {
            var bean = (ObjectArrayBackedEventBean)@event;
            var row  = ExprTableEvalStrategyUtil.GetRow(bean);
            var data = new object[_numColumns];

            foreach (var plain in _plains)
            {
                data[plain.Dest] = bean.Properties[plain.Source];
            }
            var count = 0;

            foreach (var access in _accessors)
            {
                data[access.Dest] = access.Accessor.GetValue(row.States[count++], evalParams);
            }
            count = 0;
            foreach (var method in _methods)
            {
                data[method.Dest] = row.Methods[count++].Value;
            }
            return(data);
        }
        public EventBean GetEventBean(int column, EventBean[] eventsPerStream, bool isNewData, ExprEvaluatorContext context)
        {
            // acquire table-level write lock
            ExprTableEvalLockUtil.ObtainLockUnless(_tableStateInstance.TableLevelRWLock.WriteLock, context);

            var @event = _tableStateInstance.EventReference.Get();

            if (@event == null)
            {
                return(null);
            }
            var row         = ExprTableEvalStrategyUtil.GetRow(@event);
            var aggregators = row.Methods;

            if (column < aggregators.Length)
            {
                return(null);
            }
            else
            {
                var pair = _accessors[column - aggregators.Length];
                return(pair.Accessor.GetEnumerableEvent(row.States[pair.Slot], eventsPerStream, isNewData, context));
            }
        }
        public CodegenMethod InitializeCodegen(
            CodegenClassScope classScope,
            CodegenMethodScope parent,
            SAIFFInitializeSymbol symbols)
        {
            var method = parent.MakeChild(typeof(StatementAgentInstanceFactorySelect), GetType(), classScope);
            method.Block
                .DeclareVar<StatementAgentInstanceFactorySelect>(
                    "saiff",
                    NewInstance(typeof(StatementAgentInstanceFactorySelect)));

            // stream names
            method.Block.SetProperty(Ref("saiff"), "StreamNames", Constant(_streamNames));

            // activators
            method.Block.DeclareVar<ViewableActivator[]>(
                "activators",
                NewArrayByLength(typeof(ViewableActivator), Constant(_viewableActivatorForges.Length)));
            for (var i = 0; i < _viewableActivatorForges.Length; i++) {
                method.Block.AssignArrayElement(
                    "activators",
                    Constant(i),
                    _viewableActivatorForges[i].MakeCodegen(method, symbols, classScope));
            }

            method.Block.SetProperty(Ref("saiff"), "ViewableActivators", Ref("activators"));

            // views
            method.Block.DeclareVar<ViewFactory[][]>(
                "viewFactories",
                NewArrayByLength(typeof(ViewFactory[]), Constant(_views.Length)));
            for (var i = 0; i < _views.Length; i++) {
                if (_views[i] != null) {
                    var array = ViewFactoryForgeUtil.CodegenForgesWInit(
                        _views[i],
                        i,
                        null,
                        method,
                        symbols,
                        classScope);
                    method.Block.AssignArrayElement("viewFactories", Constant(i), array);
                }
            }

            method.Block.SetProperty(Ref("saiff"), "ViewFactories", Ref("viewFactories"));

            // view delegate information ('prior' and 'prev')
            method.Block.DeclareVar<ViewResourceDelegateDesc[]>(
                "viewResourceDelegates",
                NewArrayByLength(typeof(ViewResourceDelegateDesc), Constant(_viewResourceDelegates.Length)));
            for (var i = 0; i < _viewResourceDelegates.Length; i++) {
                method.Block.AssignArrayElement(
                    "viewResourceDelegates",
                    Constant(i),
                    _viewResourceDelegates[i].ToExpression());
            }

            method.Block.SetProperty(Ref("saiff"), "ViewResourceDelegates", Ref("viewResourceDelegates"));

            // result set processor
            method.Block.DeclareVar(
                    _resultSetProcessorProviderClassName,
                    RSPFACTORYPROVIDER,
                    NewInstanceInner(_resultSetProcessorProviderClassName, 
                        symbols.GetAddInitSvc(method), 
                        Ref(StmtClassForgeableAIFactoryProviderBase.MEMBERNAME_STATEMENT_FIELDS)))
                .SetProperty(Ref("saiff"), "ResultSetProcessorFactoryProvider", Ref(RSPFACTORYPROVIDER));

            // where-clause evaluator
            if (_whereClauseForge != null) {
                var whereEval = CodegenEvaluator(_whereClauseForge, method, GetType(), classScope);
                method.Block.SetProperty(Ref("saiff"), "WhereClauseEvaluator", whereEval);
                if (classScope.IsInstrumented) {
                    method.Block.SetProperty(
                        Ref("saiff"),
                        "WhereClauseEvaluatorTextForAudit",
                        Constant(ExprNodeUtilityPrint.ToExpressionStringMinPrecedence(_whereClauseForge)));
                }
            }

            // joins
            if (_joinSetComposerPrototypeForge != null) {
                method.Block.SetProperty(
                    Ref("saiff"),
                    "JoinSetComposerPrototype",
                    _joinSetComposerPrototypeForge.Make(method, symbols, classScope));
            }

            // output process view
            method.Block.DeclareVar(
                    _outputProcessViewProviderClassName,
                    OPVFACTORYPROVIDER,
                    NewInstanceInner(_outputProcessViewProviderClassName, symbols.GetAddInitSvc(method), Ref("statementFields")))
                .SetProperty(Ref("saiff"), "OutputProcessViewFactoryProvider", Ref(OPVFACTORYPROVIDER));

            // subselects
            if (!_subselects.IsEmpty()) {
                method.Block.SetProperty(
                    Ref("saiff"),
                    "Subselects",
                    SubSelectFactoryForge.CodegenInitMap(_subselects, GetType(), method, symbols, classScope));
            }

            // table-access
            if (!_tableAccesses.IsEmpty()) {
                method.Block.SetProperty(
                    Ref("saiff"),
                    "TableAccesses",
                    ExprTableEvalStrategyUtil.CodegenInitMap(_tableAccesses, GetType(), method, symbols, classScope));
            }

            // order-by with no output-limit
            method.Block.SetProperty(
                Ref("saiff"),
                "OrderByWithoutOutputRateLimit",
                Constant(_orderByWithoutOutputRateLimit));

            // unidirectional join
            method.Block.SetProperty(Ref("saiff"), "IsUnidirectionalJoin", Constant(_unidirectionalJoin));
            method.Block.MethodReturn(Ref("saiff"));

            return method;
        }