Esempio n. 1
0
 public AggregationCodegenRowLevelDesc(
     AggregationCodegenRowDetailDesc optionalTopRow,
     AggregationCodegenRowDetailDesc[] optionalAdditionalRows)
 {
     OptionalTopRow = optionalTopRow;
     OptionalAdditionalRows = optionalAdditionalRows;
 }
Esempio n. 2
0
 private int GetRowFieldNum(
     AggregationLocalGroupByColumnForge col,
     AggregationCodegenRowDetailDesc levelDesc)
 {
     return col.IsMethodAgg
         ? col.MethodOffset
         : levelDesc.StateDesc.MethodFactories.Length + AccessorIndex(levelDesc.AccessAccessors, col.Pair);
 }
Esempio n. 3
0
 public static AggregationCodegenRowLevelDesc FromTopOnly(AggregationRowStateForgeDesc rowStateDesc)
 {
     var state = new AggregationCodegenRowDetailStateDesc(
         rowStateDesc.MethodForges,
         rowStateDesc.OptionalMethodFactories,
         rowStateDesc.AccessFactoriesForges);
     var top = new AggregationCodegenRowDetailDesc(state, rowStateDesc.AccessAccessorsForges);
     return new AggregationCodegenRowLevelDesc(top, null);
 }
Esempio n. 4
0
        public void ProviderCodegen(
            CodegenMethod method,
            CodegenClassScope classScope,
            AggregationClassNames classNames)
        {
            method.Block.DeclareVar<AggregationLocalGroupByLevel>("optionalTop", ConstantNull());
            if (localGroupByPlan.OptionalLevelTopForge != null) {
                method.Block.AssignRef(
                    "optionalTop",
                    localGroupByPlan.OptionalLevelTopForge.ToExpression(
                        classNames.RowFactoryTop,
                        classNames.RowSerdeTop,
                        ConstantNull(),
                        method,
                        classScope));
            }

            int numLevels = localGroupByPlan.AllLevelsForges.Length;
            method.Block.DeclareVar<AggregationLocalGroupByLevel[]>(
                "levels",
                NewArrayByLength(typeof(AggregationLocalGroupByLevel), Constant(numLevels)));
            for (var i = 0; i < numLevels; i++) {
                AggregationLocalGroupByLevelForge forge = localGroupByPlan.AllLevelsForges[i];
                CodegenExpression eval = MultiKeyCodegen.CodegenExprEvaluatorMayMultikey(
                    forge.PartitionForges,
                    null,
                    forge.PartitionMKClasses,
                    method,
                    classScope);
                method.Block.AssignArrayElement(
                    "levels",
                    Constant(i),
                    localGroupByPlan.AllLevelsForges[i]
                        .ToExpression(
                            classNames.GetRowFactoryPerLevel(i),
                            classNames.GetRowSerdePerLevel(i),
                            eval,
                            method,
                            classScope));
            }

            method.Block.DeclareVar<AggregationLocalGroupByColumn[]>(
                "columns",
                NewArrayByLength(
                    typeof(AggregationLocalGroupByColumn),
                    Constant(localGroupByPlan.ColumnsForges.Length)));
            var rowLevelDesc = RowLevelDesc;
            for (var i = 0; i < localGroupByPlan.ColumnsForges.Length; i++) {
                AggregationLocalGroupByColumnForge col = localGroupByPlan.ColumnsForges[i];
                int fieldNum;
                if (hasGroupBy && col.IsDefaultGroupLevel) {
                    AggregationCodegenRowDetailDesc levelDesc = rowLevelDesc.OptionalAdditionalRows[col.LevelNum];
                    fieldNum = GetRowFieldNum(col, levelDesc);
                }
                else if (col.LevelNum == -1) {
                    AggregationCodegenRowDetailDesc levelDesc = rowLevelDesc.OptionalTopRow;
                    fieldNum = GetRowFieldNum(col, levelDesc);
                }
                else {
                    AggregationCodegenRowDetailDesc levelDesc = rowLevelDesc.OptionalAdditionalRows[col.LevelNum];
                    fieldNum = GetRowFieldNum(col, levelDesc);
                }

                method.Block.AssignArrayElement(
                    "columns",
                    Constant(i),
                    localGroupByPlan.ColumnsForges[i].ToExpression(fieldNum));
            }

            method.Block
                .DeclareVar<AggregationServiceFactory>(
                    "svcFactory",
                    NewInstanceInner(classNames.ServiceFactory, Ref("this")))
                .MethodReturn(
                    ExprDotMethodChain(EPStatementInitServicesConstants.REF)
                        .Get(AGGREGATIONSERVICEFACTORYSERVICE)
                        .Add(
                            "GroupLocalGroupBy",
                            Ref("svcFactory"),
                            useFlags.ToExpression(),
                            Constant(hasGroupBy),
                            Ref("optionalTop"),
                            Ref("levels"),
                            Ref("columns")));
        }
Esempio n. 5
0
        private void GetterCodegen(
            string methodName,
            CodegenMethod method,
            CodegenClassScope classScope,
            CodegenNamedMethods namedMethods)
        {
            var rowLevelDesc = RowLevelDesc;

            var blocks = method.Block.SwitchBlockOfLength(
                AggregationServiceCodegenNames.REF_COLUMN,
                localGroupByPlan.ColumnsForges.Length,
                true);
            for (var i = 0; i < blocks.Length; i++) {
                AggregationLocalGroupByColumnForge col = localGroupByPlan.ColumnsForges[i];

                if (hasGroupBy && col.IsDefaultGroupLevel) {
                    AggregationCodegenRowDetailDesc levelDesc = rowLevelDesc.OptionalAdditionalRows[col.LevelNum];
                    var num = GetRowFieldNum(col, levelDesc);
                    blocks[i]
                        .BlockReturn(
                            ExprDotMethod(
                                MEMBER_CURRENTROW,
                                methodName,
                                Constant(num),
                                REF_EPS,
                                REF_ISNEWDATA,
                                REF_EXPREVALCONTEXT));
                }
                else if (col.LevelNum == -1) {
                    AggregationCodegenRowDetailDesc levelDesc = rowLevelDesc.OptionalTopRow;
                    var num = GetRowFieldNum(col, levelDesc);
                    blocks[i]
                        .BlockReturn(
                            ExprDotMethod(
                                MEMBER_AGGREGATORSTOPLEVEL,
                                methodName,
                                Constant(num),
                                REF_EPS,
                                REF_ISNEWDATA,
                                REF_EXPREVALCONTEXT));
                }
                else {
                    AggregationCodegenRowDetailDesc levelDesc = rowLevelDesc.OptionalAdditionalRows[col.LevelNum];
                    var num = GetRowFieldNum(col, levelDesc);
                    blocks[i]
                        .DeclareVar<object>(
                            "groupByKey",
                            LocalMethod(
                                AggregationServiceCodegenUtil.ComputeMultiKeyCodegen(
                                    col.LevelNum,
                                    col.PartitionForges,
                                    levelDesc.MultiKeyClassRef,
                                    classScope,
                                    namedMethods),
                                REF_EPS,
                                REF_ISNEWDATA,
                                REF_EXPREVALCONTEXT))
                        .DeclareVar<AggregationRow>(
                            "row",
                            Cast(
                                typeof(AggregationRow),
                                ExprDotMethod(
                                    ArrayAtIndex(MEMBER_AGGREGATORSPERLEVELANDGROUP, Constant(col.LevelNum)),
                                    "Get",
                                    Ref("groupByKey"))))
                        .BlockReturn(
                            ExprDotMethod(
                                Ref("row"),
                                methodName,
                                Constant(num),
                                REF_EPS,
                                REF_ISNEWDATA,
                                REF_EXPREVALCONTEXT));
                }
            }
        }