Example #1
0
        public AIRegistryTableAccess AllocateTableAccess(ExprTableAccessNode tableNode)
        {
            AIRegistryTableAccess service = AllocateAIRegistryTableAccess();

            _tableAccess.Put(tableNode, service);
            return(service);
        }
Example #2
0
 /// <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);
 }
Example #3
0
        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);
        }
Example #4
0
 public AIRegistryTableAccess GetTableAccessServices(ExprTableAccessNode key)
 {
     return(_tableAccess.Get(key));
 }
Example #5
0
        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);
        }