예제 #1
0
        protected override void LoadIndexes()
        {
            if (!m_members.TableMembers.Contains(TableStructureMembers.Indexes))
            {
                return;
            }

            var data = m_conn.SystemConnection.LoadTableFromQuery("select * from pg_indexes where schemaname!='pg_catalog'");

            foreach (DataRow row in data.Rows)
            {
                string            sql    = row["indexdef"].SafeToString();
                PostgreSQLLexer   lexer  = new PostgreSQLLexer(new ANTLRReaderStream(new StringReader(sql)));
                CommonTokenStream tokens = new CommonTokenStream(lexer);
                PostgreSQLParser  parser = new PostgreSQLParser(tokens);
                IndexConstraint   index  = new IndexConstraint();
                parser.create_index(index);
                if (parser.Errors != null)
                {
                    throw new PostgreSqlParseCreateIndexError(parser.Errors, sql);
                }
                if (index.TableName.Schema == null)
                {
                    index.SetDummyTable(new NameWithSchema("public", index.TableName.Name));
                }
                if (!m_loadedIndexes.ContainsKey(index.TableName))
                {
                    m_loadedIndexes[index.TableName] = new List <IndexConstraint>();
                }
                m_loadedIndexes[index.TableName].Add(index);
            }

            base.LoadIndexes();
        }
예제 #2
0
 public static void ObjectIsValid(IndexConstraint obj, ObjectIsValidEventArgs e)
 {
     if (obj.Properties.Count == 0)
     {
         e.Errors.Add("Cannot have index without Properties.");
     }
 }
예제 #3
0
 public void AddIndexConstraint(string indexName, string columns, string indexType)
 {
     IndexConstraint ic = new IndexConstraint();
     ic.Name = indexName;
     ic.TargetColumns = columns;
     ic.IndexType = indexType;
     IndexCons.Add(ic);
 }
예제 #4
0
 public static void ObjectIsValid(IndexConstraint obj, ObjectIsValidEventArgs e)
 {
     if (obj.Properties.Count == 0)
     {
         e.IsValid = false;
         e.Errors.Add("Cannot have index without Properties.");
     }
 }
        public void OccurenceAndOrWithOrTrue()
        {
            var findBy = new IndexConstraint(2).And(Find.ByName("Y")).Or(Find.ByName("Z"));

            var mockAttributeBag      = new MockAttributeBag("name", "Z");
            ConstraintContext context = new ConstraintContext();

            Assert.IsTrue(findBy.Matches(mockAttributeBag, context));
        }
        public void Occurence0()
        {
            Constraint findBy = new IndexConstraint(0);

            var mockAttributeBag = new MockAttributeBag("name", "Z");

            ConstraintContext context = new ConstraintContext();

            Assert.IsTrue(findBy.Matches(mockAttributeBag, context));
            Assert.IsFalse(findBy.Matches(mockAttributeBag, context));
        }
예제 #7
0
        public void GetIndexesConstraintsForTableShouldBe()
        {
            var expectedIndexes = new IndexConstraint[]
            {
                new IndexConstraint("RESULTS", null, "sqlite_autoindex_RESULTS_1", true, new string[] { "RESULT_ID" }, true),
                new IndexConstraint("RESULTS", null, "RESULT_DAY_INDEX", false, new string[] { "DAY_ID" }, false),
                new IndexConstraint("RESULTS", null, "RESULT_GOALS_INDEX", false, new string[] { "GOALS_HOME_TEAM", "GOALS_VISITOR_TEAM" }, false)
            }.OrderBy(x => x.ConstraintName).ToArray();

            CreateIndexes().Wait();

            GetIndexesConstraintsForTableShouldBeCore(expectedIndexes, "RESULTS");
        }
예제 #8
0
파일: Cases.cs 프로젝트: daszat/zetbox
 public bool IsNewIndexConstraint(IndexConstraint uc)
 {
     var isFulltextConstraint = uc is FullTextIndexConstraint;
     return !isFulltextConstraint && uc.Constrained is ObjectClass && savedSchema.FindPersistenceObject<IndexConstraint>(uc.ExportGuid) == null;
 }
예제 #9
0
파일: Cases.cs 프로젝트: jrgcubano/zetbox
 public void DoNewIndexConstraint(IndexConstraint uc)
 {
     var objClass = (ObjectClass)uc.Constrained;
     var tblName = db.GetTableName(objClass.Module.SchemaName, objClass.TableName);
     var columns = GetUCColNames(uc);
     Log.InfoFormat("New Index Constraint: {0} on {1}({2})", uc.Reason, tblName, string.Join(", ", columns));
     if (db.CheckIndexPossible(tblName, Construct.IndexName(objClass.TableName, columns), uc.IsUnique, false, columns))
         db.CreateIndex(tblName, Construct.IndexName(objClass.TableName, columns), uc.IsUnique, false, columns);
     else
         Log.WarnFormat("Cannot create Index Constraint: {0} on {1}({2})", uc.Reason, tblName, string.Join(", ", columns));
 }
예제 #10
0
 private void WriteIndexConstraint(IndexConstraint c)
 {
     _fsSql.WriteLine("    {0}Index {1} ({2}){3}",
         String.IsNullOrEmpty(c.IndexType) ? "" : c.IndexType + " ", c.Name, c.TargetColumns, FKcons.Count == 0 ? String.Empty : ",");
 }
예제 #11
0
 private void WriteIndexConstraint(IndexConstraint c, string tableName)
 {
     if (FKcons.Count != 0)
     {
         _fsSql.WriteLine("");
         _fsSql.WriteLine("DROP INDEX IF EXISTS {0};", c.Name);
         _fsSql.WriteLine("");
         _fsSql.WriteLine("CREATE {0}INDEX {1} on {2}_Base ({3});",
             String.IsNullOrEmpty(c.IndexType) ? "" : c.IndexType + " ", c.Name, tableName, c.TargetColumns);
     }
 }
예제 #12
0
파일: Cases.cs 프로젝트: daszat/zetbox
        public bool IsChangeIndexConstraint(IndexConstraint uc)
        {
            var isFulltextConstraint = uc is FullTextIndexConstraint;
            if (isFulltextConstraint) return false;

            var saved = savedSchema.FindPersistenceObject<IndexConstraint>(uc.ExportGuid);
            if (saved == null) return false;

            if (uc.IsUnique != saved.IsUnique) return true;

            var newCols = Construct.GetUCColNames(uc);
            var savedCols = Construct.GetUCColNames(saved);
            if (newCols.Length != savedCols.Length) return true;
            foreach (var c in newCols)
            {
                if (!savedCols.Contains(c)) return true;
            }

            var objClass = (ObjectClass)uc.Constrained;
            var savedObjClass = (ObjectClass)saved.Constrained;

            if (Construct.IndexName(savedObjClass.TableName, savedCols) != Construct.IndexName(objClass.TableName, newCols)) return true;

            return false;
        }
예제 #13
0
 public static void NotifyDeleting(IndexConstraint obj)
 {
     obj.Properties.Clear();
 }
예제 #14
0
 public static void NotifyDeleting(IndexConstraint obj)
 {
     obj.Properties.Clear();
 }
예제 #15
0
    // $ANTLR start "index_column"
    // ..\\Plugin.postgre\\AntlrParser\\PostgreSQL.g:24:1: index_column[IndexConstraint index] : name= id (opsclass= id )? ;
    public PostgreSQLParser.index_column_return index_column(IndexConstraint index) // throws RecognitionException [1]
    {
        PostgreSQLParser.index_column_return retval = new PostgreSQLParser.index_column_return();
        retval.Start = input.LT(1);

        object root_0 = null;

        PostgreSQLParser.id_return name = default(PostgreSQLParser.id_return);

        PostgreSQLParser.id_return opsclass = default(PostgreSQLParser.id_return);



        try
        {
            // ..\\Plugin.postgre\\AntlrParser\\PostgreSQL.g:24:36: (name= id (opsclass= id )? )
            // ..\\Plugin.postgre\\AntlrParser\\PostgreSQL.g:25:5: name= id (opsclass= id )?
            {
                root_0 = (object)adaptor.GetNilNode();

                PushFollow(FOLLOW_id_in_index_column127);
                name = id();
                state.followingStackPointer--;

                adaptor.AddChild(root_0, name.Tree);
                index.Columns.Add(new ColumnReference(UnquoteName(((name != null) ? input.ToString((IToken)(name.Start), (IToken)(name.Stop)) : null))));
                // ..\\Plugin.postgre\\AntlrParser\\PostgreSQL.g:26:13: (opsclass= id )?
                int alt5  = 2;
                int LA5_0 = input.LA(1);

                if (((LA5_0 >= T_IDENT && LA5_0 <= T_QUOTED_IDENT)))
                {
                    alt5 = 1;
                }
                switch (alt5)
                {
                case 1:
                    // ..\\Plugin.postgre\\AntlrParser\\PostgreSQL.g:26:13: opsclass= id
                {
                    PushFollow(FOLLOW_id_in_index_column137);
                    opsclass = id();
                    state.followingStackPointer--;

                    adaptor.AddChild(root_0, opsclass.Tree);
                }
                break;
                }
            }

            retval.Stop = input.LT(-1);

            retval.Tree = (object)adaptor.RulePostProcessing(root_0);
            adaptor.SetTokenBoundaries(retval.Tree, (IToken)retval.Start, (IToken)retval.Stop);
        }
        catch (RecognitionException re)
        {
            ReportError(re);
            Recover(input, re);
            // Conversion of the second argument necessary, but harmless
            retval.Tree = (object)adaptor.ErrorNode(input, (IToken)retval.Start, input.LT(-1), re);
        }
        finally
        {
        }
        return(retval);
    }
예제 #16
0
 private void WriteInlineIndexConstraint(IndexConstraint c)
 {
     _consWritten += 1;
     _fsSql.WriteLine("    {0}Index {1} ({2}){3}",
     String.IsNullOrEmpty(c.IndexType) ? "" : c.IndexType + " ", c.Name, c.TargetColumns, _consWritten == _numCons ? String.Empty : ",");
 }
예제 #17
0
 public static void GetErrorText(IndexConstraint obj, MethodReturnEventArgs<string> e, IDataObject constrainedObject)
 {
     e.Result = "";
 }
예제 #18
0
파일: Cases.cs 프로젝트: jrgcubano/zetbox
 public void DoChangeIndexConstraint(IndexConstraint uc)
 {
     var saved = savedSchema.FindPersistenceObject<IndexConstraint>(uc.ExportGuid);
     DoDeleteIndexConstraint(saved);
     DoNewIndexConstraint(uc);
 }
예제 #19
0
 public static void GetErrorText(IndexConstraint obj, MethodReturnEventArgs <string> e, IDataObject constrainedObject)
 {
     e.Result = "";
 }
예제 #20
0
 public static void IsValid(IndexConstraint obj, MethodReturnEventArgs <bool> e, IDataObject constrainedObject)
 {
     e.Result = true; // enforced by database
 }
예제 #21
0
 public static void IsValid(IndexConstraint obj, MethodReturnEventArgs<bool> e, IDataObject constrainedObject)
 {
     e.Result = true; // enforced by database
 }
예제 #22
0
파일: Cases.cs 프로젝트: jrgcubano/zetbox
        public bool IsChangeIndexConstraint(IndexConstraint uc)
        {
            if (!(uc is IndexConstraint)) return false;
            var saved = savedSchema.FindPersistenceObject<IndexConstraint>(uc.ExportGuid);
            if (saved == null) return false;

            if (uc.IsUnique != saved.IsUnique) return true;

            var newCols = GetUCColNames(uc);
            var savedCols = GetUCColNames(saved);
            if (newCols.Length != savedCols.Length) return true;
            foreach (var c in newCols)
            {
                if (!savedCols.Contains(c)) return true;
            }
            return false;
        }
예제 #23
0
파일: Construct.cs 프로젝트: daszat/zetbox
        public static string[] GetUCColNames(IndexConstraint uc)
        {
            if (uc == null) throw new ArgumentNullException("uc");

            var vt_columns = uc.Properties.OfType<ValueTypeProperty>().Select(p => Construct.ColumnName(p, null)).ToArray();
            var columns = vt_columns.Union(uc.Properties.OfType<ObjectReferenceProperty>().Select(p => Construct.ForeignKeyColumnName(p.RelationEnd.Parent.GetOtherEnd(p.RelationEnd)))).OrderBy(n => n).ToArray();
            return columns;
        }
예제 #24
0
파일: Cases.cs 프로젝트: jrgcubano/zetbox
 public bool IsNewIndexConstraint(IndexConstraint uc)
 {
     return uc.Constrained is ObjectClass && savedSchema.FindPersistenceObject<IndexConstraint>(uc.ExportGuid) == null;
 }
예제 #25
0
    // $ANTLR start "create_index"
    // ..\\Plugin.postgre\\AntlrParser\\PostgreSQL.g:14:1: create_index[IndexConstraint index] : CREATE ( UNIQUE )? INDEX ( CONCURRENTLY )? name= index_name ON table_name ( USING id )? LPAREN index_column[index] ( COMMA index_column[index] )* RPAREN ;
    public PostgreSQLParser.create_index_return create_index(IndexConstraint index) // throws RecognitionException [1]
    {
        PostgreSQLParser.create_index_return retval = new PostgreSQLParser.create_index_return();
        retval.Start = input.LT(1);

        object root_0 = null;

        IToken CREATE1       = null;
        IToken UNIQUE2       = null;
        IToken INDEX3        = null;
        IToken CONCURRENTLY4 = null;
        IToken ON5           = null;
        IToken USING7        = null;
        IToken LPAREN9       = null;
        IToken COMMA11       = null;
        IToken RPAREN13      = null;

        PostgreSQLParser.index_name_return name = default(PostgreSQLParser.index_name_return);

        PostgreSQLParser.table_name_return table_name6 = default(PostgreSQLParser.table_name_return);

        PostgreSQLParser.id_return id8 = default(PostgreSQLParser.id_return);

        PostgreSQLParser.index_column_return index_column10 = default(PostgreSQLParser.index_column_return);

        PostgreSQLParser.index_column_return index_column12 = default(PostgreSQLParser.index_column_return);


        object CREATE1_tree       = null;
        object UNIQUE2_tree       = null;
        object INDEX3_tree        = null;
        object CONCURRENTLY4_tree = null;
        object ON5_tree           = null;
        object USING7_tree        = null;
        object LPAREN9_tree       = null;
        object COMMA11_tree       = null;
        object RPAREN13_tree      = null;

        try
        {
            // ..\\Plugin.postgre\\AntlrParser\\PostgreSQL.g:14:36: ( CREATE ( UNIQUE )? INDEX ( CONCURRENTLY )? name= index_name ON table_name ( USING id )? LPAREN index_column[index] ( COMMA index_column[index] )* RPAREN )
            // ..\\Plugin.postgre\\AntlrParser\\PostgreSQL.g:15:5: CREATE ( UNIQUE )? INDEX ( CONCURRENTLY )? name= index_name ON table_name ( USING id )? LPAREN index_column[index] ( COMMA index_column[index] )* RPAREN
            {
                root_0 = (object)adaptor.GetNilNode();

                CREATE1      = (IToken)Match(input, CREATE, FOLLOW_CREATE_in_create_index37);
                CREATE1_tree = (object)adaptor.Create(CREATE1);
                adaptor.AddChild(root_0, CREATE1_tree);

                // ..\\Plugin.postgre\\AntlrParser\\PostgreSQL.g:16:5: ( UNIQUE )?
                int alt1  = 2;
                int LA1_0 = input.LA(1);

                if ((LA1_0 == UNIQUE))
                {
                    alt1 = 1;
                }
                switch (alt1)
                {
                case 1:
                    // ..\\Plugin.postgre\\AntlrParser\\PostgreSQL.g:16:6: UNIQUE
                {
                    UNIQUE2      = (IToken)Match(input, UNIQUE, FOLLOW_UNIQUE_in_create_index44);
                    UNIQUE2_tree = (object)adaptor.Create(UNIQUE2);
                    adaptor.AddChild(root_0, UNIQUE2_tree);

                    index.IsUnique = true;
                }
                break;
                }

                INDEX3      = (IToken)Match(input, INDEX, FOLLOW_INDEX_in_create_index54);
                INDEX3_tree = (object)adaptor.Create(INDEX3);
                adaptor.AddChild(root_0, INDEX3_tree);

                // ..\\Plugin.postgre\\AntlrParser\\PostgreSQL.g:18:5: ( CONCURRENTLY )?
                int alt2  = 2;
                int LA2_0 = input.LA(1);

                if ((LA2_0 == CONCURRENTLY))
                {
                    alt2 = 1;
                }
                switch (alt2)
                {
                case 1:
                    // ..\\Plugin.postgre\\AntlrParser\\PostgreSQL.g:18:5: CONCURRENTLY
                {
                    CONCURRENTLY4      = (IToken)Match(input, CONCURRENTLY, FOLLOW_CONCURRENTLY_in_create_index60);
                    CONCURRENTLY4_tree = (object)adaptor.Create(CONCURRENTLY4);
                    adaptor.AddChild(root_0, CONCURRENTLY4_tree);
                }
                break;
                }

                PushFollow(FOLLOW_index_name_in_create_index70);
                name = index_name();
                state.followingStackPointer--;

                adaptor.AddChild(root_0, name.Tree);
                index.Name = UnquoteName(((name != null) ? input.ToString((IToken)(name.Start), (IToken)(name.Stop)) : null));
                ON5        = (IToken)Match(input, ON, FOLLOW_ON_in_create_index79);
                ON5_tree   = (object)adaptor.Create(ON5);
                adaptor.AddChild(root_0, ON5_tree);

                PushFollow(FOLLOW_table_name_in_create_index81);
                table_name6 = table_name();
                state.followingStackPointer--;

                adaptor.AddChild(root_0, table_name6.Tree);
                index.SetDummyTable(((table_name6 != null) ? table_name6.result : default(NameWithSchema)));
                // ..\\Plugin.postgre\\AntlrParser\\PostgreSQL.g:21:5: ( USING id )?
                int alt3  = 2;
                int LA3_0 = input.LA(1);

                if ((LA3_0 == USING))
                {
                    alt3 = 1;
                }
                switch (alt3)
                {
                case 1:
                    // ..\\Plugin.postgre\\AntlrParser\\PostgreSQL.g:21:6: USING id
                {
                    USING7      = (IToken)Match(input, USING, FOLLOW_USING_in_create_index90);
                    USING7_tree = (object)adaptor.Create(USING7);
                    adaptor.AddChild(root_0, USING7_tree);

                    PushFollow(FOLLOW_id_in_create_index92);
                    id8 = id();
                    state.followingStackPointer--;

                    adaptor.AddChild(root_0, id8.Tree);
                }
                break;
                }

                LPAREN9      = (IToken)Match(input, LPAREN, FOLLOW_LPAREN_in_create_index100);
                LPAREN9_tree = (object)adaptor.Create(LPAREN9);
                adaptor.AddChild(root_0, LPAREN9_tree);

                PushFollow(FOLLOW_index_column_in_create_index102);
                index_column10 = index_column(index);
                state.followingStackPointer--;

                adaptor.AddChild(root_0, index_column10.Tree);
                // ..\\Plugin.postgre\\AntlrParser\\PostgreSQL.g:22:32: ( COMMA index_column[index] )*
                do
                {
                    int alt4  = 2;
                    int LA4_0 = input.LA(1);

                    if ((LA4_0 == COMMA))
                    {
                        alt4 = 1;
                    }


                    switch (alt4)
                    {
                    case 1:
                        // ..\\Plugin.postgre\\AntlrParser\\PostgreSQL.g:22:33: COMMA index_column[index]
                    {
                        COMMA11      = (IToken)Match(input, COMMA, FOLLOW_COMMA_in_create_index106);
                        COMMA11_tree = (object)adaptor.Create(COMMA11);
                        adaptor.AddChild(root_0, COMMA11_tree);

                        PushFollow(FOLLOW_index_column_in_create_index108);
                        index_column12 = index_column(index);
                        state.followingStackPointer--;

                        adaptor.AddChild(root_0, index_column12.Tree);
                    }
                    break;

                    default:
                        goto loop4;
                    }
                } while (true);

loop4:
                ;               // Stops C# compiler whining that label 'loop4' has no statements

                RPAREN13      = (IToken)Match(input, RPAREN, FOLLOW_RPAREN_in_create_index113);
                RPAREN13_tree = (object)adaptor.Create(RPAREN13);
                adaptor.AddChild(root_0, RPAREN13_tree);
            }

            retval.Stop = input.LT(-1);

            retval.Tree = (object)adaptor.RulePostProcessing(root_0);
            adaptor.SetTokenBoundaries(retval.Tree, (IToken)retval.Start, (IToken)retval.Stop);
        }
        catch (RecognitionException re)
        {
            ReportError(re);
            Recover(input, re);
            // Conversion of the second argument necessary, but harmless
            retval.Tree = (object)adaptor.ErrorNode(input, (IToken)retval.Start, input.LT(-1), re);
        }
        finally
        {
        }
        return(retval);
    }
예제 #26
0
파일: Cases.cs 프로젝트: jrgcubano/zetbox
 internal static string[] GetUCColNames(IndexConstraint uc)
 {
     var vt_columns = uc.Properties.OfType<ValueTypeProperty>().Select(p => Construct.NestedColumnName(p, null)).ToArray();
     var columns = vt_columns.Union(uc.Properties.OfType<ObjectReferenceProperty>().Select(p => Construct.ForeignKeyColumnName(p.RelationEnd.Parent.GetOtherEnd(p.RelationEnd)))).OrderBy(n => n).ToArray();
     return columns;
 }
예제 #27
0
파일: Cases.cs 프로젝트: jrgcubano/zetbox
 public void DoDeleteIndexConstraint(IndexConstraint uc)
 {
     var objClass = (ObjectClass)uc.Constrained;
     var tblName = db.GetTableName(objClass.Module.SchemaName, objClass.TableName);
     var columns = GetUCColNames(uc);
     if (db.CheckIndexExists(tblName, Construct.IndexName(objClass.TableName, columns)))
     {
         Log.InfoFormat("Drop Index Constraint: {0} on {1}({2})", uc.Reason, objClass.TableName, string.Join(", ", columns));
         if (db.CheckIndexExists(tblName, Construct.IndexName(objClass.TableName, columns)))
             db.DropIndex(tblName, Construct.IndexName(objClass.TableName, columns));
     }
 }
예제 #28
0
파일: Cases.cs 프로젝트: daszat/zetbox
 public void DoNewIndexConstraint(IndexConstraint uc)
 {
     var objClass = (ObjectClass)uc.Constrained;
     var tblName = objClass.GetTableRef(db);
     var columns = Construct.GetUCColNames(uc);
     var log_idxName = string.Format("{0} on {1}({2})", uc.Reason, tblName, string.Join(", ", columns));
     Log.InfoFormat("New Index Constraint: {0}", log_idxName);
     var idxName = Construct.IndexName(objClass.TableName, columns);
     if (db.CheckIndexExists(tblName, idxName))
     {
         Log.WarnFormat("Cannot create Index Constraint, it already exists: {0}", log_idxName);
     }
     else if (db.CheckIndexPossible(tblName, idxName, uc.IsUnique, false, columns))
     {
         db.CreateIndex(tblName, idxName, uc.IsUnique, false, columns);
     }
     else
     {
         Log.WarnFormat("Cannot create Index Constraint, if a unique index should be created, the column(s) may contain non unique data: {0}", log_idxName);
     }
 }