internal TableAccessAnalysisResult(TableStateRowFactory stateRowFactory, IDictionary <String, TableMetadataColumn> tableColumns, int numberMethodAggregations, ObjectArrayEventType internalEventType, ObjectArrayEventType publicEventType, TableMetadataInternalEventToPublic eventToPublic) { StateRowFactory = stateRowFactory; TableColumns = tableColumns; NumberMethodAggregations = numberMethodAggregations; InternalEventType = internalEventType; PublicEventType = publicEventType; EventToPublic = eventToPublic; }
/// <summary> /// NOTE: Code-generation-invoked method, method name and parameter order matters /// </summary> /// <param name="streamNum">stream</param> /// <param name="eventToPublic">conversion</param> /// <param name="eventsPerStream">events</param> /// <param name="isNewData">flag</param> /// <param name="context">context</param> /// <returns>event</returns> public static object[] EvaluateConvertTableEventToUnd( int streamNum, TableMetadataInternalEventToPublic eventToPublic, EventBean[] eventsPerStream, bool isNewData, ExprEvaluatorContext context) { EventBean @event = eventsPerStream[streamNum]; if (@event == null) { return null; } return eventToPublic.ConvertToUnd(@event, eventsPerStream, isNewData, context); }
/// <summary> /// NOTE: Code-generation-invoked method, method name and parameter order matters /// </summary> /// <param name="target">target</param> /// <param name="eventToPublic">conversion</param> /// <param name="eventsPerStream">events</param> /// <param name="isNewData">new data flow</param> /// <param name="exprEvaluatorContext">context</param> /// <returns>events</returns> public static ICollection<object[]> ConvertToTableUnderling( object target, TableMetadataInternalEventToPublic eventToPublic, EventBean[] eventsPerStream, bool isNewData, ExprEvaluatorContext exprEvaluatorContext) { if (target == null) { return null; } var events = ((FlexCollection) target).EventBeanCollection; var underlyings = new ArrayDeque<object[]>(events.Count); foreach (var @event in events) { underlyings.Add(eventToPublic.ConvertToUnd(@event, eventsPerStream, isNewData, exprEvaluatorContext)); } return underlyings; }
private TableAccessAnalysisResult AnalyzePlanAggregations( string tableName, StatementContext statementContext, IList <TableColumnDesc> columns, EPServicesContext services, string internalTypeName, string publicTypeName) { // once upfront: obtains aggregation factories for each aggregation // we do this once as a factory may be a heavier object IDictionary <TableColumnDesc, AggregationMethodFactory> aggregationFactories = new Dictionary <TableColumnDesc, AggregationMethodFactory>(); foreach (var column in columns) { if (column is TableColumnDescAgg) { var agg = (TableColumnDescAgg)column; var factory = agg.Aggregation.Factory; aggregationFactories.Put(column, factory); } } // sort into these categories: // plain / method-agg / access-agg // compile all-column public types IList <TableColumnDescTyped> plainColumns = new List <TableColumnDescTyped>(); IList <TableColumnDescAgg> methodAggColumns = new List <TableColumnDescAgg>(); IList <TableColumnDescAgg> accessAggColumns = new List <TableColumnDescAgg>(); IDictionary <string, object> allColumnsPublicTypes = new LinkedHashMap <string, object>(); foreach (var column in columns) { // handle plain types if (column is TableColumnDescTyped) { var typed = (TableColumnDescTyped)column; plainColumns.Add(typed); allColumnsPublicTypes.Put(column.ColumnName, typed.UnresolvedType); continue; } // handle aggs var agg = (TableColumnDescAgg)column; var aggFactory = aggregationFactories.Get(agg); if (aggFactory.IsAccessAggregation) { accessAggColumns.Add(agg); } else { methodAggColumns.Add(agg); } allColumnsPublicTypes.Put(column.ColumnName, agg.Aggregation.ReturnType); } // determine column metadata // IDictionary <string, TableMetadataColumn> columnMetadata = new LinkedHashMap <string, TableMetadataColumn>(); // handle typed columns IDictionary <string, object> allColumnsInternalTypes = new LinkedHashMap <string, object>(); allColumnsInternalTypes.Put(TableServiceConstants.INTERNAL_RESERVED_PROPERTY, typeof(object)); var indexPlain = 1; IList <int> groupKeyIndexes = new List <int>(); var assignPairsPlain = new TableMetadataColumnPairPlainCol[plainColumns.Count]; foreach (var typedColumn in plainColumns) { allColumnsInternalTypes.Put(typedColumn.ColumnName, typedColumn.UnresolvedType); columnMetadata.Put(typedColumn.ColumnName, new TableMetadataColumnPlain(typedColumn.ColumnName, typedColumn.IsKey, indexPlain)); if (typedColumn.IsKey) { groupKeyIndexes.Add(indexPlain); } assignPairsPlain[indexPlain - 1] = new TableMetadataColumnPairPlainCol(typedColumn.PositionInDeclaration, indexPlain); indexPlain++; } // determine internally-used event type // for use by indexes and lookups ObjectArrayEventType internalEventType; ObjectArrayEventType publicEventType; try { internalEventType = (ObjectArrayEventType)services.EventAdapterService.AddNestableObjectArrayType(internalTypeName, allColumnsInternalTypes, null, false, false, false, false, false, true, tableName); publicEventType = (ObjectArrayEventType)services.EventAdapterService.AddNestableObjectArrayType(publicTypeName, allColumnsPublicTypes, null, false, false, false, false, false, false, null); } catch (EPException ex) { throw new ExprValidationException("Invalid type information: " + ex.Message, ex); } services.StatementEventTypeRefService.AddReferences(statementContext.StatementName, new string[] { internalTypeName, publicTypeName }); // handle aggregation-methods single-func first. var methodFactories = new AggregationMethodFactory[methodAggColumns.Count]; var index = 0; var assignPairsMethod = new TableMetadataColumnPairAggMethod[methodAggColumns.Count]; foreach (var column in methodAggColumns) { var factory = aggregationFactories.Get(column); var optionalEnumerationType = EPTypeHelper.OptionalFromEnumerationExpr(statementContext.StatementId, statementContext.EventAdapterService, column.Aggregation); methodFactories[index] = factory; columnMetadata.Put(column.ColumnName, new TableMetadataColumnAggregation(column.ColumnName, factory, index, null, optionalEnumerationType, column.OptionalAssociatedType)); assignPairsMethod[index] = new TableMetadataColumnPairAggMethod(column.PositionInDeclaration); index++; } // handle access-aggregation (sharable, multi-value) aggregations var stateFactories = new AggregationStateFactory[accessAggColumns.Count]; var assignPairsAccess = new TableMetadataColumnPairAggAccess[accessAggColumns.Count]; index = 0; foreach (var column in accessAggColumns) { var factory = aggregationFactories.Get(column); stateFactories[index] = factory.GetAggregationStateFactory(false); var pair = new AggregationAccessorSlotPair(index, factory.Accessor); var optionalEnumerationType = EPTypeHelper.OptionalFromEnumerationExpr(statementContext.StatementId, statementContext.EventAdapterService, column.Aggregation); columnMetadata.Put(column.ColumnName, new TableMetadataColumnAggregation(column.ColumnName, factory, -1, pair, optionalEnumerationType, column.OptionalAssociatedType)); assignPairsAccess[index] = new TableMetadataColumnPairAggAccess(column.PositionInDeclaration, factory.Accessor); index++; } // create state factory var groupKeyIndexesArr = CollectionUtil.IntArray(groupKeyIndexes); var stateRowFactory = new TableStateRowFactory( internalEventType, statementContext.EngineImportService, methodFactories, stateFactories, groupKeyIndexesArr, services.EventAdapterService); // create public event provision var eventToPublic = new TableMetadataInternalEventToPublic(publicEventType, assignPairsPlain, assignPairsMethod, assignPairsAccess, services.EventAdapterService); return(new TableAccessAnalysisResult(stateRowFactory, columnMetadata, methodAggColumns.Count, internalEventType, publicEventType, eventToPublic)); }