public ExprDotNodeForgeStream( ExprDotNodeImpl parent, FilterExprAnalyzerAffector filterExprAnalyzerAffector, int streamNumber, EventType eventType, ExprDotForge[] evaluators, bool method) { this.parent = parent; FilterExprAnalyzerAffector = filterExprAnalyzerAffector; StreamNumber = streamNumber; EventType = eventType; Evaluators = evaluators; this.method = method; var last = evaluators[evaluators.Length - 1]; if (!method) { if (last.TypeInfo is ClassMultiValuedEPType) { EvaluationType = EPTypeHelper.GetClassMultiValuedContainer(last.TypeInfo).GetBoxedType(); } else { EvaluationType = EPTypeHelper.GetClassSingleValued(last.TypeInfo).GetBoxedType(); } } else { EvaluationType = EPTypeHelper.GetNormalizedClass(last.TypeInfo).GetBoxedType(); } }
public AggregationTableReadDesc ValidateAggregationTableRead( ExprValidationContext validationContext, TableMetadataColumnAggregation tableAccessColumn, TableMetaData table) { // child node validation ExprNodeUtilityValidate.GetValidatedSubtree(ExprNodeOrigin.AGGPARAM, ChildNodes, validationContext); // portable validation var validation = tableAccessColumn.AggregationPortableValidation; if (!(validation is AggregationPortableValidationPluginMultiFunc)) { throw new ExprValidationException("Invalid aggregation column type"); } // obtain handler var ctx = new AggregationMultiFunctionValidationContext( functionName, validationContext.StreamTypeService.EventTypes, positionalParams, validationContext.StatementName, validationContext, config, null, ChildNodes, optionalFilter); var handler = aggregationMultiFunctionForge.ValidateGetHandler(ctx); // set of reader var epType = handler.ReturnType; Type returnType = EPTypeHelper.GetNormalizedClass(epType); var forge = new AggregationTableAccessAggReaderForgePlugIn( returnType, (AggregationMultiFunctionTableReaderModeManaged) handler.TableReaderMode); EventType eventTypeCollection = EPTypeHelper.OptionalIsEventTypeColl(epType); EventType eventTypeSingle = EPTypeHelper.OptionalIsEventTypeSingle(epType); Type componentTypeCollection = EPTypeHelper.OptionalIsComponentTypeColl(epType); return new AggregationTableReadDesc(forge, eventTypeCollection, componentTypeCollection, eventTypeSingle); }
public DTLocalForge GetForge( IList<CalendarForge> calendarForges, TimeAbacus timeAbacus, Type inputType, EventType inputEventType, ReformatForge reformatForge, IntervalForge intervalForge) { if (inputEventType == null) { var inputTypeBoxed = inputType.GetBoxedType(); if (reformatForge != null) { if (TypeHelper.IsSubclassOrImplementsInterface(inputType, typeof(DateTimeEx))) { if (calendarForges.IsEmpty()) { return new DTLocalDtxReformatForge(reformatForge); } return new DTLocalDtxOpsReformatForge(calendarForges, reformatForge); } if (inputTypeBoxed == typeof(long?)) { if (calendarForges.IsEmpty()) { return new DTLocalLongReformatForge(reformatForge); } return new DTLocalLongOpsReformatForge(calendarForges, reformatForge, timeAbacus); } if (inputTypeBoxed == typeof(DateTimeOffset?)) { if (calendarForges.IsEmpty()) { return new DTLocalDtoReformatForge(reformatForge); } return new DTLocalDtoOpsReformatForge(calendarForges, reformatForge); } if (inputTypeBoxed == typeof(DateTime?)) { if (calendarForges.IsEmpty()) { return new DTLocalDateTimeReformatForge(reformatForge); } return new DTLocalDateTimeOpsReformatForge(calendarForges, reformatForge); } } else if (intervalForge != null) { if (TypeHelper.IsSubclassOrImplementsInterface(inputType, typeof(DateTimeEx))) { if (calendarForges.IsEmpty()) { return new DTLocalDtxIntervalForge(intervalForge); } return new DTLocalDtxOpsIntervalForge(calendarForges, intervalForge); } if (inputTypeBoxed == typeof(long?)) { if (calendarForges.IsEmpty()) { return new DTLocalLongIntervalForge(intervalForge); } return new DTLocalLongOpsIntervalForge(calendarForges, intervalForge, timeAbacus); } if (inputTypeBoxed == typeof(DateTimeOffset?)) { if (calendarForges.IsEmpty()) { return new DTLocalDtoIntervalForge(intervalForge); } return new DTLocalDtoOpsIntervalForge(calendarForges, intervalForge); } if (inputTypeBoxed == typeof(DateTime?)) { if (calendarForges.IsEmpty()) { return new DTLocalDateTimeIntervalForge(intervalForge); } return new DTLocalDateTimeOpsIntervalForge(calendarForges, intervalForge); } } else { // only calendar op, nothing else if (TypeHelper.IsSubclassOrImplementsInterface(inputType, typeof(DateTimeEx))) { return new DTLocalDtxOpsDtxForge(calendarForges); } if (inputTypeBoxed == typeof(long?)) { return new DTLocalDtxOpsLongForge(calendarForges, timeAbacus); } if (inputTypeBoxed == typeof(DateTimeOffset?)) { return new DTLocalDtxOpsDtoForge(calendarForges); } if (inputTypeBoxed == typeof(DateTime?)) { return new DTLocalDtxOpsDtzForge(calendarForges); } } throw new ArgumentException("Invalid input type '" + inputTypeBoxed + "'"); } var getter = ((EventTypeSPI) inputEventType).GetGetterSPI(inputEventType.StartTimestampPropertyName); var getterResultType = inputEventType.GetPropertyType(inputEventType.StartTimestampPropertyName); if (reformatForge != null) { var inner = GetForge(calendarForges, timeAbacus, getterResultType, null, reformatForge, null); return new DTLocalBeanReformatForge(getter, getterResultType, inner, reformatForge.ReturnType); } if (intervalForge == null) { // only calendar op var inner = GetForge(calendarForges, timeAbacus, getterResultType, null, null, null); return new DTLocalBeanCalOpsForge( getter, getterResultType, inner, EPTypeHelper.GetNormalizedClass(TypeInfo)); } // have interval op but no end timestamp if (inputEventType.EndTimestampPropertyName == null) { var inner = GetForge(calendarForges, timeAbacus, getterResultType, null, null, intervalForge); return new DTLocalBeanIntervalNoEndTSForge( getter, getterResultType, inner, EPTypeHelper.GetNormalizedClass(TypeInfo)); } // interval op and have end timestamp var getterEndTimestamp = ((EventTypeSPI) inputEventType).GetGetterSPI(inputEventType.EndTimestampPropertyName); var getterEndType = inputEventType.GetPropertyType(inputEventType.EndTimestampPropertyName); var innerX = (DTLocalForgeIntervalComp) GetForge( calendarForges, timeAbacus, getterResultType, null, null, intervalForge); return new DTLocalBeanIntervalWithEndForge( getter, getterResultType, getterEndTimestamp, getterEndType, innerX); }