public EnumGroupByKeyValueSelectorScalarLambdaForgeEval( EnumGroupByKeyValueSelectorScalarLambdaForge forge, ExprEvaluator innerExpression, ExprEvaluator secondExpression) { _forge = forge; _innerExpression = innerExpression; _secondExpression = secondExpression; }
public static CodegenExpression Codegen( EnumGroupByKeyValueSelectorScalarLambdaForge forge, EnumForgeCodegenParams args, CodegenMethodScope codegenMethodScope, CodegenClassScope codegenClassScope) { var resultTypeMember = codegenClassScope.AddDefaultFieldUnshared( true, typeof(ObjectArrayEventType), Cast( typeof(ObjectArrayEventType), EventTypeUtility.ResolveTypeCodegen(forge.resultEventType, EPStatementInitServicesConstants.REF))); var paramTypes = EnumForgeCodegenNames.PARAMS; var scope = new ExprForgeCodegenSymbol(false, null); var methodNode = codegenMethodScope.MakeChildWithScope( typeof(IDictionary<object, object>), typeof(EnumGroupByKeyValueSelectorScalarLambdaForgeEval), scope, codegenClassScope) .AddParam(paramTypes); var block = methodNode.Block .IfCondition(ExprDotMethod(EnumForgeCodegenNames.REF_ENUMCOLL, "IsEmpty")) .BlockReturn(StaticMethod(typeof(Collections), "GetEmptyMap", new[] { typeof(object), typeof(object) })) .DeclareVar<IDictionary<object, object>>("result", NewInstance(typeof(LinkedHashMap<object, object>))) .DeclareVar<ObjectArrayEventBean>( "resultEvent", NewInstance<ObjectArrayEventBean>(NewArrayByLength(typeof(object), Constant(1)), resultTypeMember)) .AssignArrayElement(EnumForgeCodegenNames.REF_EPS, Constant(forge.StreamNumLambda), Ref("resultEvent")) .DeclareVar<object[]>("props", ExprDotName(Ref("resultEvent"), "Properties")); block.ForEach(typeof(object), "next", EnumForgeCodegenNames.REF_ENUMCOLL) .AssignArrayElement("props", Constant(0), Ref("next")) .DeclareVar<object>( "key", forge.InnerExpression.EvaluateCodegen(typeof(object), methodNode, scope, codegenClassScope)) .DeclareVar<object>( "entry", forge.secondExpression.EvaluateCodegen(typeof(object), methodNode, scope, codegenClassScope)) .DeclareVar<ICollection<object>>( "value", Cast(typeof(ICollection<object>), ExprDotMethod(Ref("result"), "Get", Ref("key")))) .IfRefNull("value") .AssignRef("value", NewInstance(typeof(List<object>))) .Expression(ExprDotMethod(Ref("result"), "Put", Ref("key"), Ref("value"))) .BlockEnd() .Expression(ExprDotMethod(Ref("value"), "Add", Ref("entry"))); block.MethodReturn(Ref("result")); return LocalMethod(methodNode, args.Eps, args.Enumcoll, args.IsNewData, args.ExprCtx); }