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); }