コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
 /// <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);
 }
コード例 #4
0
        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));

            
        }
コード例 #8
0
        /*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());
        }
コード例 #9
0
 /// <summary>
 /// Visits the given <paramref name="addIndexNode"/>.
 /// </summary>
 /// <param name="addIndexNode"></param>
 public override void Visit(IAddIndexNode addIndexNode)
 {
     Visit(addIndexNode.ChildNodes);
 }
コード例 #10
0
        /// <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);
        }
コード例 #11
0
        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);
        }
コード例 #12
0
        /// <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);
        }
コード例 #13
0
        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); }));
        }