public AggregationCodegenRowLevelDesc( AggregationCodegenRowDetailDesc optionalTopRow, AggregationCodegenRowDetailDesc[] optionalAdditionalRows) { OptionalTopRow = optionalTopRow; OptionalAdditionalRows = optionalAdditionalRows; }
private int GetRowFieldNum( AggregationLocalGroupByColumnForge col, AggregationCodegenRowDetailDesc levelDesc) { return col.IsMethodAgg ? col.MethodOffset : levelDesc.StateDesc.MethodFactories.Length + AccessorIndex(levelDesc.AccessAccessors, col.Pair); }
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); }
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"))); }
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)); } } }