Ejemplo n.º 1
0
        public void TestCreateIndexUNIQUEAndMoreComplex()
        {
            const string createIndexStmt = "CREATE UNIQUE INDEX test1 ON test_table (column1 ASC, column2 COLLATE i, column3);";
            var          nodes           = SQLiteParseVisitor.ParseString <CreateIndexNode>(createIndexStmt);
            var          expected        = new CreateIndexNode
            {
                IndexName          = "test1",
                TableName          = "test_table",
                IsUnique           = true,
                IndexedColumnNodes = new[]
                {
                    new IndexedColumnNode {
                        Id = "column1", Order = SortOrder.Asc
                    },
                    new IndexedColumnNode {
                        Id = "column2", CollationId = "i"
                    },
                    new IndexedColumnNode {
                        Id = "column3"
                    }
                }
            }.ToExpectedObject().AddTreeNode();


            expected.ShouldMatch(nodes);


            var treeStringBuilder = new TreeStringOutputVisitor();
            var result            = nodes.Accept(treeStringBuilder);

            Assert.Equal(createIndexStmt, result.ToString());
        }
Ejemplo n.º 2
0
        private void IncorporateAlterationsInIndexNodes(IList <CreateIndexNode> indexes, string fullTableName,
                                                        IEnumerable <TableCommand> commands, IEnumerable <string> finalColumnNames)
        {
            //let's handle the commands first
            foreach (TableCommand command in commands)
            {
                if (command is DropIndexCommand)
                {
                    var             drop = command as DropIndexCommand;
                    CreateIndexNode node = indexes.FirstOrDefault(i => i.IndexName == drop.IndexName);
                    if (node == null)
                    {
                        throw new InvalidIndexException(string.Format("The index '{0}' on table '{1}' does not exist and cannot be dropped.",
                                                                      drop.IndexName, drop.TableName), drop);
                    }
                    indexes.Remove(node);
                }
                else if (command is AddIndexCommand)
                {
                    var add = command as AddIndexCommand;
                    indexes.Add(CreateIndexNodeFromAddColumnCommand(add, fullTableName));
                }
            }


            //we need to remove all indexes that have columns that aren't in finalColumnNames
            //hashset to speed this up a little
            var finalColumnHash = new HashSet <string>(finalColumnNames);

            RemoveAll(indexes, node => !node.IndexedColumnNodes.All(i => finalColumnHash.Contains(i.Id)));
        }
Ejemplo n.º 3
0
        public StringBuilder Visit(CreateIndexNode createIndexNode)
        {
            var sb = new StringBuilder();

            sb.Append("CREATE ");
            if (createIndexNode.IsUnique)
            {
                sb.Append("UNIQUE ");
            }
            sb.Append("INDEX ");
            if (createIndexNode.DatabaseName != null)
            {
                sb.Append(createIndexNode.DatabaseName).Append(".");
            }

            sb.Append(createIndexNode.IndexName);
            sb.Append(" ON ");
            sb.Append(createIndexNode.TableName);
            sb.Append(" (");

            sb.Append(string.Join(", ", createIndexNode.IndexedColumnNodes.Select(i => i.Accept(this))));
            sb.Append(")");
            if (createIndexNode.WhereExpr != null)
            {
                sb.Append(" WHERE ");
                sb.Append(createIndexNode.WhereExpr);
            }

            sb.Append(";");

            return(sb);
        }
Ejemplo n.º 4
0
        private CreateIndexNode CreateIndexNodeFromAddColumnCommand(AddIndexCommand command, string fullTableName)
        {
            var ret = new CreateIndexNode
            {
                TableName          = fullTableName,
                IndexName          = command.IndexName,
                IndexedColumnNodes = command.ColumnNames.Select(i => new IndexedColumnNode {
                    Id = i
                })
            };

            return(ret);
        }
Ejemplo n.º 5
0
        public override SQLiteParseTreeNode VisitCreate_index_stmt(SQLiteParserSimpleParser.Create_index_stmtContext context)
        {
            var ret = new CreateIndexNode(context)
            {
                TableName    = context.table_name().GetText(),
                IndexName    = context.index_name().GetText(),
                IsUnique     = context.UNIQUE() != null,
                IfNotExists  = context.EXISTS() != null,
                DatabaseName = context.database_name() != null?context.database_name().GetText() : null,
                                   WhereExpr = context.expr() != null?context.expr().GetText() : null,
                                                   IndexedColumnNodes = context.indexed_column().Select(CreateIndexedColumnNode).ToArray()
            };

            return(ret);
        }