protected virtual void VisitIndex(ICreateBuilder expression, IIndexBuilder index) { this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.CREATE); if (index.Index.Flags.HasFlag(IndexFlags.Unique)) { this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.UNIQUE); } this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.INDEX); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.Identifier(Conventions.IndexName(index.Index))); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.ON); this.Visit(index.Table); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.OPEN_PARENTHESES); this.Visit(index.Columns); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.CLOSE_PARENTHESES); if (index.Index.Expression != null && !index.Index.Expression.IsEmpty()) { this.Visitor.Visit( this, this.Graph, this.Fragment <IFilterBuilder>().With( filter => filter.Expressions.Add(index.Index.Expression) ) ); } }
protected virtual void VisitTable(ICreateBuilder expression, ITableBuilder table, IEnumerable <IColumnBuilder> columns) { this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.CREATE); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.TABLE); this.Visit(table); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.OPEN_PARENTHESES); this.Visit(columns); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.CLOSE_PARENTHESES); }
protected override void VisitIndex(ICreateBuilder expression, IIndexBuilder index) { this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.CREATE); if (index.Index.Flags.HasFlag(IndexFlags.Unique)) { this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.UNIQUE); } this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.INDEX); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.Identifier(Conventions.IndexName(index.Index))); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.ON); this.Visit(index.Table); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.OPEN_PARENTHESES); this.Visit(index.Columns); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.CLOSE_PARENTHESES); }
protected virtual void VisitRelation(ICreateBuilder expression, IRelationBuilder relation, ITableConfig leftTable, ITableConfig rightTable, IColumnConfig leftColumn, IColumnConfig rightColumn) { this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.ALTER); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.TABLE); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.Identifier(rightTable.TableName)); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.ADD); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.CONSTRAINT); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.Identifier(Conventions.RelationName(leftTable, rightTable))); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.FOREIGN_KEY); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.OPEN_PARENTHESES); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.Identifier(rightColumn.ColumnName)); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.CLOSE_PARENTHESES); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.REFERENCES); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.Identifier(leftTable.TableName)); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.OPEN_PARENTHESES); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.Identifier(leftColumn.ColumnName)); this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.CLOSE_PARENTHESES); }
protected virtual void VisitRelation(ICreateBuilder expression, IRelationBuilder relation) { var map = relation.Relation.Expression.GetColumnMap(); switch (relation.Relation.Flags.GetMultiplicity()) { case RelationFlags.OneToOne: case RelationFlags.OneToMany: { var leftColumn = map[relation.Relation.LeftTable].SingleOrDefault(); var rightColumn = map[relation.Relation.RightTable].SingleOrDefault(); this.VisitRelation(expression, relation, relation.Relation.LeftTable, relation.Relation.RightTable, leftColumn, rightColumn); } break; case RelationFlags.ManyToMany: { var leftColumn = map[relation.Relation.LeftTable].SingleOrDefault(); var rightColumn = relation.Relation.Expression.GetOppositeExpression <IColumnBuilder, IColumnBuilder>( column => object.ReferenceEquals(column.Column, leftColumn) ).Column; this.VisitRelation(expression, relation, relation.Relation.LeftTable, relation.Relation.MappingTable, leftColumn, rightColumn); } this.Builder.AppendFormat("{0} ", this.Database.QueryFactory.Dialect.BATCH); { var leftColumn = map[relation.Relation.RightTable].SingleOrDefault(); var rightColumn = relation.Relation.Expression.GetOppositeExpression <IColumnBuilder, IColumnBuilder>( column => object.ReferenceEquals(column.Column, leftColumn) ).Column; this.VisitRelation(expression, relation, relation.Relation.RightTable, relation.Relation.MappingTable, leftColumn, rightColumn); } break; default: throw new NotImplementedException(); } }
protected override void VisitCreate(IFragmentBuilder parent, IQueryGraphBuilder graph, ICreateBuilder expression) { this.Push(new SQLiteCreateWriter(parent, graph, this.Database, this, this.Parameters)); this.Peek.Write(expression); this.Pop(); }
protected override void VisitRelation(ICreateBuilder expression, IRelationBuilder relation) { //TODO: SQLite cannot ALTER TABLE ADD FOREIGN KEY which makes this kind of thing tricky. }
protected override void VisitCreate(IFragmentBuilder parent, IQueryGraphBuilder graph, ICreateBuilder expression) { //Nothing to do. }
protected abstract void VisitCreate(IFragmentBuilder parent, IQueryGraphBuilder graph, ICreateBuilder expression);