public CodegenExpression Make( CodegenMethodScope parent, CodegenClassScope classScope) { var method = parent.MakeChild(typeof(QueryPlanIndexItem), GetType(), classScope); var propertyGetters = EventTypeUtility.GetGetters(eventType, HashProps); var propertyTypes = EventTypeUtility.GetPropertyTypes(eventType, HashProps); var valueGetter = MultiKeyCodegen.CodegenGetterMayMultiKey( eventType, propertyGetters, propertyTypes, HashTypes, HashMultiKeyClasses, method, classScope); CodegenExpression rangeGetters; if (RangeProps.Length == 0) { rangeGetters = NewArrayByLength(typeof(EventPropertyValueGetter), Constant(0)); } else { var makeMethod = parent.MakeChild(typeof(EventPropertyValueGetter[]), GetType(), classScope); makeMethod.Block.DeclareVar<EventPropertyValueGetter[]>( "getters", NewArrayByLength(typeof(EventPropertyValueGetter), Constant(RangeProps.Length))); for (var i = 0; i < RangeProps.Length; i++) { var getter = ((EventTypeSPI) eventType).GetGetterSPI(RangeProps[i]); var getterType = eventType.GetPropertyType(RangeProps[i]); var coercionType = RangeTypes == null ? null : RangeTypes[i]; var eval = EventTypeUtility.CodegenGetterWCoerce( getter, getterType, coercionType, method, GetType(), classScope); makeMethod.Block.AssignArrayElement(Ref("getters"), Constant(i), eval); } makeMethod.Block.MethodReturn(Ref("getters")); rangeGetters = LocalMethod(makeMethod); } CodegenExpression multiKeyTransform = MultiKeyCodegen.CodegenMultiKeyFromArrayTransform( HashMultiKeyClasses, method, classScope); method.Block.MethodReturn( NewInstance<QueryPlanIndexItem>( Constant(HashProps), Constant(HashTypes), valueGetter, multiKeyTransform, HashMultiKeyClasses != null ? HashMultiKeyClasses.GetExprMKSerde(method, classScope) : ConstantNull(), Constant(RangeProps), Constant(RangeTypes), rangeGetters, DataInputOutputSerdeForgeExtensions.CodegenArray(RangeSerdes, method, classScope, null), Constant(IsUnique), AdvancedIndexProvisionDesc == null ? ConstantNull() : AdvancedIndexProvisionDesc.CodegenMake(method, classScope))); return LocalMethod(method); }
public QueryPlanIndexItem ToRuntime() { if (AdvancedIndexProvisionDesc == null) { return null; } return new QueryPlanIndexItem( HashProps, HashTypes, null, null, null, RangeProps, RangeTypes, null, null, IsUnique, AdvancedIndexProvisionDesc.ToRuntime()); }