public AIRegistryTableAccess AllocateTableAccess(ExprTableAccessNode tableNode) { AIRegistryTableAccess service = AllocateAIRegistryTableAccess(); _tableAccess.Put(tableNode, service); return(service); }
/// <summary> /// Add reference to table to statement spec. /// </summary> public static void AddTableExpressionReference(StatementSpecRaw statementSpec, ExprTableAccessNode tableNode) { if (statementSpec.TableExpressions == null) { statementSpec.TableExpressions = new HashSet <ExprTableAccessNode>(); } statementSpec.TableExpressions.Add(tableNode); }
public static ExprTableAccessEvalStrategy GetTableAccessEvalStrategy( ExprTableAccessNode tableNode, TableAndLockProvider provider, TableMetadata tableMetadata) { var groupKeyEvals = tableNode.GroupKeyEvaluators; TableAndLockProviderUngrouped ungrouped; TableAndLockProviderGrouped grouped; if (provider is TableAndLockProviderUngrouped) { ungrouped = (TableAndLockProviderUngrouped)provider; grouped = null; } else { grouped = (TableAndLockProviderGrouped)provider; ungrouped = null; } // handle sub-property access if (tableNode is ExprTableAccessNodeSubprop) { var subprop = (ExprTableAccessNodeSubprop)tableNode; var column = tableMetadata.TableColumns.Get(subprop.SubpropName); return(GetTableAccessSubprop(subprop, column, ungrouped, grouped)); } // handle top-level access if (tableNode is ExprTableAccessNodeTopLevel) { if (ungrouped != null) { return(new ExprTableEvalStrategyUngroupedTopLevel(ungrouped, tableMetadata.TableColumns)); } if (tableNode.GroupKeyEvaluators.Length > 1) { return(new ExprTableEvalStrategyGroupByTopLevelMulti( grouped, tableMetadata.TableColumns, groupKeyEvals)); } return(new ExprTableEvalStrategyGroupByTopLevelSingle( grouped, tableMetadata.TableColumns, groupKeyEvals[0])); } // handle "keys" function access if (tableNode is ExprTableAccessNodeKeys) { return(new ExprTableEvalStrategyGroupByKeys(grouped)); } // handle access-aggregator accessors if (tableNode is ExprTableAccessNodeSubpropAccessor) { var accessorProvider = (ExprTableAccessNodeSubpropAccessor)tableNode; var column = (TableMetadataColumnAggregation)tableMetadata.TableColumns.Get(accessorProvider.SubpropName); if (ungrouped != null) { var pairX = column.AccessAccessorSlotPair; return(new ExprTableEvalStrategyUngroupedAccess(ungrouped, pairX.Slot, accessorProvider.Accessor)); } var pair = new AggregationAccessorSlotPair( column.AccessAccessorSlotPair.Slot, accessorProvider.Accessor); if (tableNode.GroupKeyEvaluators.Length > 1) { return(new ExprTableEvalStrategyGroupByAccessMulti(grouped, pair, groupKeyEvals)); } return(new ExprTableEvalStrategyGroupByAccessSingle(grouped, pair, groupKeyEvals[0])); } throw new IllegalStateException("Unrecognized table access node " + tableNode); }
public AIRegistryTableAccess GetTableAccessServices(ExprTableAccessNode key) { return(_tableAccess.Get(key)); }
public static ExprTableAccessEvalStrategy GetTableAccessEvalStrategy(bool writesToTables, ExprTableAccessNode tableNode, TableStateInstance state, TableMetadata tableMetadata) { var groupKeyEvals = tableNode.GroupKeyEvaluators; TableStateInstanceUngrouped ungrouped; TableStateInstanceGroupBy grouped; ILockable @lock; if (state is TableStateInstanceUngrouped) { ungrouped = (TableStateInstanceUngrouped)state; grouped = null; @lock = writesToTables ? ungrouped.TableLevelRWLock.WriteLock : ungrouped.TableLevelRWLock.ReadLock; } else { grouped = (TableStateInstanceGroupBy)state; ungrouped = null; @lock = writesToTables ? grouped.TableLevelRWLock.WriteLock : grouped.TableLevelRWLock.ReadLock; } // handle sub-property access if (tableNode is ExprTableAccessNodeSubprop) { var subprop = (ExprTableAccessNodeSubprop)tableNode; var column = tableMetadata.TableColumns.Get(subprop.SubpropName); return(GetTableAccessSubprop(@lock, subprop, column, grouped, ungrouped)); } // handle top-level access if (tableNode is ExprTableAccessNodeTopLevel) { if (ungrouped != null) { return(new ExprTableEvalStrategyUngroupedTopLevel(@lock, ungrouped.EventReference, tableMetadata.TableColumns)); } if (tableNode.GroupKeyEvaluators.Length > 1) { return(new ExprTableEvalStrategyGroupByTopLevelMulti(@lock, grouped.Rows, tableMetadata.TableColumns, groupKeyEvals)); } return(new ExprTableEvalStrategyGroupByTopLevelSingle(@lock, grouped.Rows, tableMetadata.TableColumns, groupKeyEvals[0])); } // handle "keys" function access if (tableNode is ExprTableAccessNodeKeys) { return(new ExprTableEvalStrategyGroupByKeys(@lock, grouped.Rows)); } // handle access-aggregator accessors if (tableNode is ExprTableAccessNodeSubpropAccessor) { var accessorProvider = (ExprTableAccessNodeSubpropAccessor)tableNode; var column = (TableMetadataColumnAggregation)tableMetadata.TableColumns.Get(accessorProvider.SubpropName); if (ungrouped != null) { var pairX = column.AccessAccessorSlotPair; return(new ExprTableEvalStrategyUngroupedAccess(@lock, ungrouped.EventReference, pairX.Slot, accessorProvider.Accessor)); } var pair = new AggregationAccessorSlotPair(column.AccessAccessorSlotPair.Slot, accessorProvider.Accessor); if (tableNode.GroupKeyEvaluators.Length > 1) { return(new ExprTableEvalStrategyGroupByAccessMulti(@lock, grouped.Rows, pair, groupKeyEvals)); } return(new ExprTableEvalStrategyGroupByAccessSingle(@lock, grouped.Rows, pair, groupKeyEvals[0])); } throw new IllegalStateException("Unrecognized table access node " + tableNode); }