/// <summary> /// Visits the given <paramref name="addIndexNode"/>. /// </summary> /// <param name="addIndexNode"></param> public override void Visit(IAddIndexNode addIndexNode) { if(string.IsNullOrEmpty(addIndexNode.Name)) addIndexNode.Name = Environment.GetAnonymousIdentifier(); base.Visit(addIndexNode); }
/// <summary> /// Visits the given <paramref name="addIndexNode"/>. /// </summary> /// <param name="addIndexNode"></param> public override void Visit(IAddIndexNode addIndexNode) { if(!Environment.IsAnonymousIdentifier(addIndexNode.Name)) return; var table = Environment.Schema.GetTable(addIndexNode.Table); if(table == null) throw new MdlCompilerException(string.Format("Could not resolve table '{0}' (at {1})", addIndexNode.Table, addIndexNode.Location)); var index = table.GetIndex(addIndexNode.Name); if(index == null) throw new MdlCompilerException(string.Format("Could not resolve index '{0}' for table '{1}' (at {2})", addIndexNode.Name, addIndexNode.Table, addIndexNode.Location)); // // Remove index... table.RemoveIndex(addIndexNode.Name); // // Rename addIndexNode.Name = index.Name = namingStrategy.GetIndexName(addIndexNode); // // And readd to the table table.AddIndex(index); }
/// <summary> /// Visits the given <paramref name="addIndexNode"/>. /// </summary> /// <param name="addIndexNode"></param> public override void Visit(IAddIndexNode addIndexNode) { if(IsImmediateChildOf<IColumnNode>(addIndexNode)) MoveNodeTo(addIndexNode, addIndexNode.Parent.Parent.Parent); else if(IsImmediateChildOf<IAddTableNode>(addIndexNode) || IsImmediateChildOf<IAlterTableNode>(addIndexNode)) MoveNodeTo(addIndexNode, addIndexNode.Parent.Parent); }
public override void Visit(IAddIndexNode addIndexNode) { if(string.IsNullOrWhiteSpace(addIndexNode.Where)) base.Visit(addIndexNode); else { var createIndexBuilder = new StringBuilder("create "); if(addIndexNode.Unique ?? false) createIndexBuilder.Append("unique "); if(Platform.Capabilities.IsSupported(DbPlatformCapabilities.SupportsClusteredIndexes)) if(addIndexNode.Clustered ?? false) createIndexBuilder.Append("clustered "); else createIndexBuilder.Append("nonclustered "); createIndexBuilder.AppendFormat("index {0} on {1} ({2}) where {3};", Platform.Dialect.EscapeIdentifier(addIndexNode.Name), Platform.Dialect.EscapeIdentifier(addIndexNode.Table), Join(", ", GetIndexColumnsDefinitions(addIndexNode.Columns)), addIndexNode.Where); TextWriter.WriteLine(createIndexBuilder.ToString()); } }
private static void ResolveAddIndexColumn(IAddIndexNode addIndexNode) { if(!(addIndexNode.Parent is IAddColumnNode)) throw new MdlParserException(); IAddColumnNode addColumnNode = (IAddColumnNode)addIndexNode.Parent; addIndexNode.Properties.AddProperty(AstNodePropertyUtil.AsString(MdlSyntax.Column, addColumnNode.Name)); }
/// <summary> /// Visits the given <paramref name="addIndexNode"/>. /// </summary> /// <param name="addIndexNode"></param> public override void Visit(IAddIndexNode addIndexNode) { if(addIndexNode.Properties[MdlSyntax.Column] == null && addIndexNode.Properties[MdlSyntax.Columns] == null) ResolveAddIndexColumn(addIndexNode); if(addIndexNode.Properties[MdlSyntax.Table] == null) ResolveAddIndexTable(addIndexNode); }
private static void ResolveAddIndexTable(IAddIndexNode addIndexNode) { ITableNode tableNode = null; if(addIndexNode.Parent is IAddColumnNode) tableNode = (ITableNode)addIndexNode.Parent.Parent; else if(addIndexNode.Parent is ITableNode) tableNode = (ITableNode)addIndexNode.Parent; else throw new MdlParserException(); addIndexNode.Properties.AddProperty(AstNodePropertyUtil.AsString(MdlSyntax.Table, tableNode.Name)); }
/*public override void Visit(IAddTableNode addTableNode) { TextWriter.WriteLine("create table {0} (", Platform.Dialect.EscapeIdentifier(addTableNode.Name)); List<string> columnDefinitions = new List<string>(); foreach (IAddColumnNode addColumnNode in (Filter<IAddColumnNode>(addTableNode.ChildNodes))) { string columnDefinition = GetColumnDefinition(addColumnNode); columnDefinitions.Add(columnDefinition); } // foreach TextWriter.WriteLine(string.Join("," + System.Environment.NewLine, columnDefinitions.ToArray())); TextWriter.WriteLine(");"); }*/ /// <summary> /// Visits the given <paramref name="addIndexNode"/>. /// </summary> /// <param name="addIndexNode"></param> public override void Visit(IAddIndexNode addIndexNode) { StringBuilder createIndexBuilder = new StringBuilder("create "); if(addIndexNode.Unique ?? false) createIndexBuilder.Append("unique "); // // Clusteded keys are not supported on SQL CE createIndexBuilder.AppendFormat("index {0} on {1} ({2});", Platform.Dialect.EscapeIdentifier(addIndexNode.Name), Platform.Dialect.EscapeIdentifier(addIndexNode.Table), Join(", ", GetIndexColumnsDefinitions(addIndexNode.Columns))); TextWriter.WriteLine(createIndexBuilder.ToString()); }
/// <summary> /// Visits the given <paramref name="addIndexNode"/>. /// </summary> /// <param name="addIndexNode"></param> public override void Visit(IAddIndexNode addIndexNode) { Visit(addIndexNode.ChildNodes); }
/// <summary> /// Visits the given <paramref name="addIndexNode" />. /// </summary> /// <param name="addIndexNode"></param> public override void Visit(IAddIndexNode addIndexNode) { textWriter.Write("add index {0}", GetIdentifier(addIndexNode.Name)); WriteProperties(addIndexNode); VisitBlock(addIndexNode); }
private static void BindIndexProperties(IAddIndexNode addIndexNode, IIndexDefinition indexDefinition) { if(addIndexNode.Properties[MdlSyntax.Unique] != null) addIndexNode.Unique = indexDefinition.Unique = Convert.ToBoolean(((IStringAstNodePropertyValue)addIndexNode.Properties[MdlSyntax.Unique].Value).Value); if(addIndexNode.Properties[MdlSyntax.Clustered] != null) addIndexNode.Clustered = indexDefinition.Clustered = Convert.ToBoolean(((IStringAstNodePropertyValue)addIndexNode.Properties[MdlSyntax.Clustered].Value).Value); if(addIndexNode.Properties["where"] != null) addIndexNode.Where = indexDefinition.Where = AstNodePropertyUtil.AsString(addIndexNode.Properties["where"].Value); }
/// <summary> /// Visits the given <paramref name="addIndexNode"/>. /// </summary> /// <param name="addIndexNode"></param> public override void Visit(IAddIndexNode addIndexNode) { IndexDefinition indexDefinition = new IndexDefinition(addIndexNode.Name); // // If we have a "table" attribute, use it as a table name. if(addIndexNode.Properties[MdlSyntax.Table] != null) { indexDefinition.Table = addIndexNode.Table = AstNodePropertyUtil.AsString(addIndexNode.Properties[MdlSyntax.Table].Value); } // if else if(addIndexNode.Parent is IAddColumnNode || addIndexNode.Parent is IAlterColumnNode) { indexDefinition.Table = addIndexNode.Table = ((ITableNode)addIndexNode.Parent.Parent).Name; } // else if else if(addIndexNode.Parent is IAddTableNode || addIndexNode.Parent is IAlterTableNode) { indexDefinition.Table = addIndexNode.Table = ((ITableNode)addIndexNode.Parent).Name; } // else if else throw CreateMdlCompilerException(MdlCompilerResources.CouldNotResolveTableForAddIndex, addIndexNode.Name); ITableDefinition table = Environment.Schema.GetTable(indexDefinition.Table); table.AddIndex(indexDefinition); // // If our parent is IAddColumn or IAlterColumn, use it as indexed column if(addIndexNode.Parent is IAddColumnNode || addIndexNode.Parent is IAlterColumnNode) { string indexColumnName = ((IColumnNode)addIndexNode.Parent).Name; IndexColumnDefinition indexColumnDefinition = new IndexColumnDefinition(indexColumnName); indexDefinition.Columns.Add(indexColumnDefinition); addIndexNode.Columns.Add(indexColumnDefinition); } // if else if(addIndexNode.Properties[MdlSyntax.Column] != null) { IndexColumnDefinition indexColumnDefinition = GetIndexColumnDefinition(addIndexNode.Properties[MdlSyntax.Column].Value); indexDefinition.Columns.Add(indexColumnDefinition); addIndexNode.Columns.Add(indexColumnDefinition); } // else if else if(addIndexNode.Properties[MdlSyntax.Columns] != null) { IListAstNodePropertyValue list = (IListAstNodePropertyValue)addIndexNode.Properties[MdlSyntax.Columns].Value; foreach(IAstNodePropertyValue value in list.Items) { IndexColumnDefinition indexColumnDefinition = GetIndexColumnDefinition(value); indexDefinition.Columns.Add(indexColumnDefinition); addIndexNode.Columns.Add(indexColumnDefinition); } // foreach } // else if BindIndexProperties(addIndexNode, indexDefinition); }
private static void CopyProperties(IIndexDefinition index, IAddIndexNode addIndexNode) { if(!string.IsNullOrEmpty(index.Table)) AddProperty(addIndexNode, MdlSyntax.Table, index.Table); if(index.Clustered.GetValueOrDefault(false)) AddProperty(addIndexNode, MdlSyntax.Clustered, "true"); if(index.Unique.GetValueOrDefault(false)) AddProperty(addIndexNode, MdlSyntax.Unique, "true"); if(index.Columns.Count == 1) { IAstNodePropertyValue value = GetIndexColumnPropertyValue(index.Columns[0]); AddProperty(addIndexNode, MdlSyntax.Column, value); } // if else AddListProperty(addIndexNode, MdlSyntax.Columns, new List<IIndexColumnDefinition>(index.Columns).ConvertAll<IAstNodePropertyValue>( delegate(IIndexColumnDefinition icd) { return GetIndexColumnPropertyValue(icd); })); }