private static void ProcessOutputLimitedLastAllNonBufferedCodegen(
     ResultSetProcessorSimpleForge forge,
     string methodName,
     CodegenClassScope classScope,
     CodegenMethod method,
     CodegenInstanceAux instance)
 {
     var factory = classScope.AddOrGetDefaultFieldSharable(ResultSetProcessorHelperFactoryField.INSTANCE);
     CodegenExpression eventTypes = classScope.AddDefaultFieldUnshared(
         true,
         typeof(EventType[]),
         EventTypeUtility.ResolveTypeArrayCodegen(forge.EventTypes, EPStatementInitServicesConstants.REF));
     if (forge.IsOutputAll) {
         instance.AddMember(NAME_OUTPUTALLHELPER, typeof(ResultSetProcessorSimpleOutputAllHelper));
         instance.ServiceCtor.Block.AssignRef(
             NAME_OUTPUTALLHELPER,
             ExprDotMethod(factory, "MakeRSSimpleOutputAll", Ref("this"), MEMBER_AGENTINSTANCECONTEXT, eventTypes));
         method.Block.ExprDotMethod(Member(NAME_OUTPUTALLHELPER), methodName, REF_NEWDATA, REF_OLDDATA);
     }
     else if (forge.IsOutputLast) {
         instance.AddMember(NAME_OUTPUTLASTHELPER, typeof(ResultSetProcessorSimpleOutputLastHelper));
         instance.ServiceCtor.Block.AssignRef(
             NAME_OUTPUTLASTHELPER,
             ExprDotMethod(
                 factory,
                 "MakeRSSimpleOutputLast",
                 Ref("this"),
                 MEMBER_AGENTINSTANCECONTEXT,
                 eventTypes));
         method.Block.ExprDotMethod(Member(NAME_OUTPUTLASTHELPER), methodName, REF_NEWDATA, REF_OLDDATA);
     }
 }
 public static void ProcessOutputLimitedLastAllNonBufferedJoinCodegen(
     ResultSetProcessorSimpleForge forge,
     CodegenClassScope classScope,
     CodegenMethod method,
     CodegenInstanceAux instance)
 {
     ProcessOutputLimitedLastAllNonBufferedCodegen(forge, "ProcessJoin", classScope, method, instance);
 }
 public static void ContinueOutputLimitedLastAllNonBufferedJoinCodegen(
     ResultSetProcessorSimpleForge forge,
     CodegenClassScope classScope,
     CodegenMethod method,
     CodegenInstanceAux instance)
 {
     if (forge.IsOutputAll) {
         method.Block.MethodReturn(ExprDotMethod(Member(NAME_OUTPUTALLHELPER), "OutputJoin", REF_ISSYNTHESIZE));
     }
     else if (forge.IsOutputLast) {
         method.Block.MethodReturn(ExprDotMethod(Member(NAME_OUTPUTLASTHELPER), "OutputJoin", REF_ISSYNTHESIZE));
     }
     else {
         method.Block.MethodReturn(ConstantNull());
     }
 }
 public static void ProcessJoinResultCodegen(
     ResultSetProcessorSimpleForge forge,
     CodegenClassScope classScope,
     CodegenMethod method,
     CodegenInstanceAux instance)
 {
     method.Block.DeclareVar<EventBean[]>("selectOldEvents", ConstantNull())
         .DeclareVarNoInit(typeof(EventBean[]), "selectNewEvents");
     ResultSetProcessorUtil.ProcessJoinResultCodegen(
         method,
         classScope,
         instance,
         forge.OptionalHavingNode != null,
         forge.IsSelectRStream,
         forge.IsSorting,
         false);
 }
 public static void GetEnumeratorJoinCodegen(
     ResultSetProcessorSimpleForge forge,
     CodegenClassScope classScope,
     CodegenMethod method,
     CodegenInstanceAux instance)
 {
     method.Block.DeclareVar<UniformPair<EventBean[]>>(
             "result",
             ExprDotMethod(
                 Ref("this"),
                 "ProcessJoinResult",
                 REF_JOINSET,
                 StaticMethod(typeof(Collections), "GetEmptySet", new[] {typeof(MultiKeyArrayOfKeys<EventBean>)}),
                 ConstantTrue()))
         .IfRefNull("result")
         .BlockReturn(
             StaticMethod(typeof(Collections), "GetEmptyEnumerator", new[] {typeof(EventBean)}))
         .MethodReturn(
             ExprDotMethod(
                 StaticMethod(typeof(Arrays), "Enumerate", GetProperty(Ref("result"), "First")),
                 "GetEnumerator"));
 }
        public static void ProcessOutputLimitedViewCodegen(
            ResultSetProcessorSimpleForge forge,
            CodegenMethod method)
        {
            if (!forge.IsOutputLast) {
                method.Block.DeclareVar<UniformPair<EventBean[]>>(
                        "pair",
                        StaticMethod(
                            typeof(EventBeanUtility),
                            EventBeanUtility.METHOD_FLATTENBATCHSTREAM,
                            REF_VIEWEVENTSLIST))
                    .MethodReturn(
                        ExprDotMethod(
                            Ref("this"),
                            "ProcessViewResult",
                            GetProperty(Ref("pair"), "First"),
                            GetProperty(Ref("pair"), "Second"),
                            REF_ISSYNTHESIZE));
                return;
            }

            method.Block.MethodThrowUnsupported();
        }
        public static void ProcessOutputLimitedJoinCodegen(
            ResultSetProcessorSimpleForge forge,
            CodegenMethod method)
        {
            if (!forge.IsOutputLast) {
                method.Block.DeclareVar<UniformPair<ISet<MultiKeyArrayOfKeys<EventBean>>>>(
                        "pair",
                        StaticMethod(
                            typeof(EventBeanUtility),
                            EventBeanUtility.METHOD_FLATTENBATCHJOIN,
                            REF_JOINEVENTSSET))
                    .MethodReturn(
                        ExprDotMethod(
                            Ref("this"),
                            "ProcessJoinResult",
                            GetProperty(Ref("pair"), "First"),
                            GetProperty(Ref("pair"), "Second"),
                            REF_ISSYNTHESIZE));
                return;
            }

            method.Block.MethodThrowUnsupported();
        }
        public static void GetEnumeratorViewCodegen(
            ResultSetProcessorSimpleForge forge,
            CodegenClassScope classScope,
            CodegenMethod method,
            CodegenInstanceAux instance)
        {
            if (!forge.IsSorting) {
                // Return an iterator that gives row-by-row a result
                method.Block.MethodReturn(
                    NewInstance<TransformEventEnumerator>(
                        ExprDotMethod(REF_VIEWABLE, "GetEnumerator"),
                        NewInstance<ResultSetProcessorHandtruTransform>(Ref("this"))
                    ));
                return;
            }

            // Pull all events, generate order keys
            method.Block
                .DeclareVar<EventBean[]>("eventsPerStream", NewArrayByLength(typeof(EventBean), Constant(1)))
                .DeclareVar<IList<EventBean>>("events", NewInstance(typeof(List<EventBean>)))
                .DeclareVar<IList<object>>("orderKeys", NewInstance(typeof(List<object>)))
                .DeclareVar<IEnumerator<EventBean>>("parentIterator", ExprDotMethod(REF_VIEWABLE, "GetEnumerator"))
                .IfCondition(EqualsNull(Ref("parentIterator")))
                .BlockReturn(PublicConstValue(typeof(CollectionUtil), "NULL_EVENT_ITERATOR"));

            {
                var loop = method.Block.ForEach(typeof(EventBean), "aParent", REF_VIEWABLE);
                loop.AssignArrayElement("eventsPerStream", Constant(0), Ref("aParent"))
                    .DeclareVar<object>(
                        "orderKey",
                        ExprDotMethod(
                            REF_ORDERBYPROCESSOR,
                            "GetSortKey",
                            Ref("eventsPerStream"),
                            ConstantTrue(),
                            MEMBER_AGENTINSTANCECONTEXT));

                if (forge.OptionalHavingNode == null) {
                    loop.DeclareVar<EventBean[]>(
                        "result",
                        StaticMethod(
                            typeof(ResultSetProcessorUtil),
                            ResultSetProcessorUtil.METHOD_GETSELECTEVENTSNOHAVING,
                            MEMBER_SELECTEXPRPROCESSOR,
                            Ref("eventsPerStream"),
                            ConstantTrue(),
                            ConstantTrue(),
                            MEMBER_AGENTINSTANCECONTEXT));
                }
                else {
                    var select = ResultSetProcessorUtil.GetSelectEventsHavingCodegen(classScope, instance);
                    loop.DeclareVar<EventBean[]>(
                        "result",
                        LocalMethod(
                            select,
                            MEMBER_SELECTEXPRNONMEMBER,
                            Ref("eventsPerStream"),
                            ConstantTrue(),
                            ConstantTrue(),
                            MEMBER_AGENTINSTANCECONTEXT));
                }

                loop.IfCondition(
                        And(NotEqualsNull(Ref("result")), Not(EqualsIdentity(ArrayLength(Ref("result")), Constant(0)))))
                    .ExprDotMethod(Ref("events"), "Add", ArrayAtIndex(Ref("result"), Constant(0)))
                    .ExprDotMethod(Ref("orderKeys"), "Add", Ref("orderKey"));
            }

            method.Block.DeclareVar<EventBean[]>(
                    "outgoingEvents",
                    StaticMethod(typeof(CollectionUtil), CollectionUtil.METHOD_TOARRAYEVENTS, Ref("events")))
                .DeclareVar<object[]>(
                    "orderKeysArr",
                    StaticMethod(typeof(CollectionUtil), CollectionUtil.METHOD_TOARRAYOBJECTS, Ref("orderKeys")))
                .DeclareVar<EventBean[]>(
                    "orderedEvents",
                    ExprDotMethod(
                        REF_ORDERBYPROCESSOR,
                        "SortWOrderKeys",
                        Ref("outgoingEvents"),
                        Ref("orderKeysArr"),
                        MEMBER_AGENTINSTANCECONTEXT))
                .MethodReturn(
                    ExprDotMethod(
                        StaticMethod(typeof(Arrays), "Enumerate", Ref("orderedEvents")),
                        "GetEnumerator"));
        }