protected virtual ISchemaGraphBuilder OnAdd(IEnumerable <ITableConfig> tables, IEnumerable <IIndexConfig> indexes, IEnumerable <IRelationConfig> relations, SchemaFlags flags) { var queries = new List <ISchemaGraphBuilder>(); if (flags.HasFlag(SchemaFlags.Table)) { queries.Add(this.OnAddTables(tables)); } if (flags.HasFlag(SchemaFlags.Index)) { queries.Add(this.OnAddIndexes(indexes)); } if (flags.HasFlag(SchemaFlags.Relation)) { queries.Add(this.OnAddRelations(relations)); } return(new AggregateSchemaGraphBuilder( this.Database, queries )); }
protected virtual void GetSchema(ITableConfig table, out HashSet <ITableConfig> tables, out HashSet <IIndexConfig> indexes, out HashSet <IRelationConfig> relations, SchemaFlags flags) { tables = new HashSet <ITableConfig>(); indexes = new HashSet <IIndexConfig>(); relations = new HashSet <IRelationConfig>(); if (flags.HasFlag(SchemaFlags.Recursive)) { var queue = new Queue <ITableConfig>(); queue.Enqueue(table); while (queue.Count > 0) { table = queue.Dequeue(); if (!tables.Add(table)) { continue; } foreach (var index in table.Indexes) { indexes.Add(index); } foreach (var relation in table.Relations) { relations.Add(relation); if (relation.MappingTable != null && !relation.MappingTable.Flags.HasFlag(TableFlags.Shared)) { queue.Enqueue(relation.MappingTable); } if (relation.RightTable != null && !relation.RightTable.Flags.HasFlag(TableFlags.Shared)) { queue.Enqueue(relation.RightTable); } } } } else { tables.Add(table); indexes.AddRange(table.Indexes); relations.AddRange(table.Relations); } }