Пример #1
0
        protected internal virtual FullTextQuery term(QueryScanner scanner)
        {
            FullTextQuery q = null;

            switch (scanner.scan())
            {
            case QueryScanner.TKN_NOT:
                q = term(scanner);
                return((q != null) ? new FullTextQueryUnaryOp(FullTextQuery.Operator.Not, q) : null);

            case QueryScanner.TKN_LPAR:
                q = disjunction(scanner);
                break;

            case QueryScanner.TKN_WORD:
                q = new FullTextQueryMatchOp(scanner.inQuotes ? FullTextQuery.Operator.StrictMatch : FullTextQuery.Operator.Match, scanner.word, scanner.wordPos);
                break;

            case QueryScanner.TKN_EOQ:
                return(null);

            default:
                break;
            }
            scanner.scan();
            return(q);
        }
Пример #2
0
        public override string ToString()
        {
            StringBuilder result = new StringBuilder();

            result.Append(QueryScanner.WrapColumnName(this.ColumnName));
            result.Append(this.Operator.ToSyntaxString());
            result.Append("IN(");

            for (int i = 0; i < this.Values.Length; ++i)
            {
                if (i > 0)
                {
                    result.Append(", ");
                }

                if (i > 4)
                {
                    result.AppendFormat("... [{0:n0}]", this.Values.Length);
                    break;
                }

                result.Append(QueryScanner.WrapValue(this.Values.GetValue(i).ToString()));
            }

            result.Append(")");
            return(result.ToString());
        }
Пример #3
0
        public void EmptyQueriesShouldJustReturnEndOfInput(string q)
        {
            var qs = new QueryScanner();

            qs.Init(q);

            Assert.False(qs.Identifier());
        }
Пример #4
0
        public void ParseStringLiterals(string q, string escape)
        {
            var qs = new QueryScanner();

            qs.Init(q);

            Assert.True(qs.String(out var a));
            Assert.Equal(escape, a);
        }
Пример #5
0
        public void AlterTest()
        {
            Query        Q  = new Query("Alter Table Projects Add Year string;");
            QueryScanner QS = new QueryScanner(Q);

            Q = QS.Scan();
            QueryParser QP = new QueryParser(Q);
            QueryTree   QT = QP.Reorder();
        }
Пример #6
0
        public void InsertTest1()
        {
            Query        Q  = new Query("Insert Into Projects(ID,Name,Rating) Values(1,\"Database Architect\",99);");
            QueryScanner QS = new QueryScanner(Q);

            Q = QS.Scan();
            QueryParser QP = new QueryParser(Q);
            QueryTree   QT = QP.Reorder();
        }
Пример #7
0
        public void SELECTAndTree()
        {
            Query        Q  = new Query("SELECT PrName,Rating FROM Projects WHERE Rating=90 or Name=\"DatabaseArchitect\" and Rating>80;");
            QueryScanner QS = new QueryScanner(Q);

            Q = QS.Scan();
            QueryParser QP = new QueryParser(Q);
            QueryTree   QT = QP.Reorder();
        }
Пример #8
0
        public void ParseStringLiterals(string q, int escape)
        {
            var qs = new QueryScanner();

            qs.Init(q);

            Assert.True(qs.String());
            Assert.Equal(escape, qs.EscapeChars);
        }
Пример #9
0
        public void IdentifierShouldBeFound(string q, int start, int len)
        {
            var qs = new QueryScanner();

            qs.Init(q);

            Assert.True(qs.Identifier());
            Assert.Equal(start, qs.TokenStart);
            Assert.Equal(len, qs.TokenLength);
        }
Пример #10
0
        public void CanScanConsecutiveIdentifiers(string q, int start, int len)
        {
            var qs = new QueryScanner();

            qs.Init(q);

            Assert.True(qs.Identifier());
            Assert.True(qs.Identifier());
            Assert.Equal(start, qs.TokenStart);
            Assert.Equal(len, qs.TokenLength);
        }
Пример #11
0
        private static List <Token> Tokenize(string value)
        {
            QueryScanner scanner = new QueryScanner(new StringReader(value));

            List <Token> tokens = new List <Token>();

            while (scanner.Next())
            {
                tokens.Add(scanner.Current);
            }

            return(tokens);
        }
Пример #12
0
        public void ParseNumbers(string q, object expected)
        {
            var qs = new QueryScanner();

            qs.Init(q);

            var result = qs.TryNumber();

            Assert.NotNull(result);
            if (result == NumberToken.Double)
            {
                Assert.Equal((double)expected, double.Parse(q.Substring(qs.TokenStart, qs.TokenLength), CultureInfo.InvariantCulture));
            }
            else
            {
                Assert.Equal((long)expected, long.Parse(q.Substring(qs.TokenStart, qs.TokenLength), CultureInfo.InvariantCulture));
            }
        }
Пример #13
0
        public void SELECT1()
        {
            Database DB = new Database(@"C:\Users\Moataz\Workspace\Software\Database Architect\Active Code\DatabaseArchitect\Southwind\Database.db.txt");

            DB.Read();
            foreach (Table T in DB.Tables)
            {
                T.ReadRecords();
            }
            Query        Q  = new Query("SELECT Rating,Name,Rating FROM Projects WHERE Rating=90 or Name=\"Software Architect\" or Name=\"DatabaseArchitect\";");
            QueryScanner QS = new QueryScanner(Q);

            Q = QS.Scan();
            QueryParser      QP = new QueryParser(Q);
            QueryTree        QT = QP.Reorder();
            QueryExecutioner QE = new QueryExecutioner(QT, DB, null);
            Table            Ti = QE.ExecuteQuery();
        }
Пример #14
0
        public void RightJoinTest()
        {
            Database DB = new Database(@"C:\Users\Moataz\Workspace\Software\Database Architect\Active Code\DatabaseArchitect\Southwind\Database.db.txt");

            DB.Read();
            foreach (Table T in DB.Tables)
            {
                T.ReadRecords();
            }
            Query        Q  = new Query("SELECT * FROM Projects RIGHT JOIN Grades ON GradeID=ID;");
            QueryScanner QS = new QueryScanner(Q);

            Q = QS.Scan();
            QueryParser      QP = new QueryParser(Q);
            QueryTree        QT = QP.Reorder();
            QueryExecutioner QE = new QueryExecutioner(QT, DB, null);
            Table            Ti = QE.ExecuteQuery();
        }
Пример #15
0
        protected internal virtual FullTextQuery disjunction(QueryScanner scanner)
        {
            FullTextQuery left = conjunction(scanner);

            if (scanner.token == QueryScanner.TKN_OR)
            {
                FullTextQuery right = disjunction(scanner);
                if (left != null && right != null)
                {
                    return(new FullTextQueryBinaryOp(FullTextQuery.Operator.Or, left, right));
                }
                else if (right != null)
                {
                    return(right);
                }
            }
            return(left);
        }
Пример #16
0
        static object ProcessQuery(Request Qr)
        {
            if (!(Qr.Attachment is string))
            {
                return("Invalid Query");
            }
            string Qs = Qr.Attachment as string;
            Query  Q  = new Query(Qs);

            try
            {
                QueryScanner QS = new QueryScanner(Q);
                Q = QS.Scan();

                QueryParser QP = new QueryParser(Q);
                QueryTree   Qt = QP.Reorder();

                QueryExecutioner Qexec = new QueryExecutioner(Qt, Server.Database, ServerReaders.ReadRecords);

                Table Ti = Qexec.ExecuteQuery();
                if (Qexec.AfterEffect[0])
                {
                    Server.Database.Write();
                }
                if (Qexec.AfterEffect[1])
                {
                    Qexec.Tables.Last().Write();
                }
                if (Qexec.AfterEffect[2])
                {
                    Qexec.Tables.Last().WriteRecords();
                }

                if (Ti == null)
                {
                    return(Qexec.Result);
                }
                return(Ti);
            }
            catch (Exception Ex)
            {
                return(Ex.Message);
            }
        }
Пример #17
0
        public void UpdateTest()
        {
            Database DB = new Database(@"C:\Users\Moataz\Workspace\Software\Database Architect\Active Code\DatabaseArchitect\Southwind\Database.db.txt");

            DB.Read();
            foreach (Table T in DB.Tables)
            {
                T.ReadRecords();
            }
            Query        Q  = new Query("UPDATE Projects SET ID=1, Name=\"Database Architect\", Rating=100 WHERE ID=1;");
            QueryScanner QS = new QueryScanner(Q);

            Q = QS.Scan();
            QueryParser      QP = new QueryParser(Q);
            QueryTree        QT = QP.Reorder();
            QueryExecutioner QE = new QueryExecutioner(QT, DB, null);

            QE.ExecuteQuery();
        }
Пример #18
0
        public void DeleteTest()
        {
            TokenType[]  Tokens = { TokenType.DELETE_cmd, TokenType.FROM_KW,        TokenType.Identifier_Table,
                                    TokenType.WHERE_KW,    TokenType.Identifier_Key, TokenType.LessThan,        TokenType.Immediate_value, TokenType.SemiColon };
            Query        Q  = new Query("Delete FROM Projects WHERE Rating<50;");
            QueryScanner QS = new QueryScanner(Q);

            Q = QS.Scan();
            Assert.AreEqual(Q.QueryTokens.Count, Tokens.Count());
            for (int i = 0; i < Q.QueryTokens.Count; i++)
            {
                if (Q.QueryTokens[i].Type != Tokens[i])
                {
                    throw new Exception("Scanner logic failure, Expected " + Tokens[i].ToString() + "recieved " + Q.QueryTokens[i].Type.ToString());
                }
            }
            QueryParser QP = new QueryParser(Q);
            QueryTree   QT = QP.Reorder();
        }
Пример #19
0
        public void CreateTest2()
        {
            TokenType[]  Tokens = { TokenType.CREATE_cmd, TokenType.TABLE_KW, TokenType.Identifier_Table, TokenType.LBracket, TokenType.Identifier_Key,
                                    TokenType.DATATYPE,    TokenType.Comma,    TokenType.Identifier_Key,   TokenType.DATATYPE, TokenType.Comma,         TokenType.Identifier_Key,
                                    TokenType.DATATYPE,    TokenType.RBracket, TokenType.SemiColon };
            Query        Q  = new Query("CREATE TABLE Projects(ID int32,Name string,Rating int32);");
            QueryScanner QS = new QueryScanner(Q);

            Q = QS.Scan();
            Assert.AreEqual(Q.QueryTokens.Count, Tokens.Count());
            for (int i = 0; i < Q.QueryTokens.Count; i++)
            {
                if (Q.QueryTokens[i].Type != Tokens[i])
                {
                    throw new Exception("Scanner logic failure, Expected " + Tokens[i].ToString() + "recieved " + Q.QueryTokens[i].Type.ToString());
                }
            }
            QueryParser QP = new QueryParser(Q);
            QueryTree   QT = QP.Reorder();
        }
Пример #20
0
        public void UpdateTest2()
        {
            TokenType[]  Tokens = { TokenType.UPDATE_cmd,     TokenType.Identifier_Table, TokenType.SET_cmd,
                                    TokenType.Identifier_Key,  TokenType.Equal,            TokenType.Immediate_value,
                                    TokenType.Comma,           TokenType.Identifier_Key,   TokenType.Equal,
                                    TokenType.Immediate_value, TokenType.Comma,            TokenType.Identifier_Key,
                                    TokenType.Equal,           TokenType.Immediate_value,  TokenType.SemiColon };
            Query        Q  = new Query("UPDATE Projects SET ID=1, Name=\"Database Architect\", Rating=100;");
            QueryScanner QS = new QueryScanner(Q);

            Q = QS.Scan();
            Assert.AreEqual(Q.QueryTokens.Count, Tokens.Count());
            for (int i = 0; i < Q.QueryTokens.Count; i++)
            {
                if (Q.QueryTokens[i].Type != Tokens[i])
                {
                    throw new Exception("Scanner logic failure");
                }
            }
            QueryParser QP = new QueryParser(Q);
            QueryTree   QT = QP.Reorder();
        }
Пример #21
0
        protected internal virtual FullTextQuery conjunction(QueryScanner scanner)
        {
            FullTextQuery left = term(scanner);

            if (scanner.token == QueryScanner.TKN_WORD || scanner.token == QueryScanner.TKN_AND)
            {
                if (scanner.token == QueryScanner.TKN_WORD)
                {
                    scanner.unget = true;
                }
                FullTextQuery.Operator cop   = scanner.inQuotes ? FullTextQuery.Operator.Near : FullTextQuery.Operator.And;
                FullTextQuery          right = disjunction(scanner);
                if (left != null && right != null)
                {
                    return(new FullTextQueryBinaryOp(cop, left, right));
                }
                else if (right != null)
                {
                    return(right);
                }
            }
            return(left);
        }
        protected internal virtual FullTextQuery term(QueryScanner scanner)
        {
            FullTextQuery q = null;
            switch (scanner.scan())
            {
                
                case QueryScanner.TKN_NOT: 
                    q = term(scanner);
                    return (q != null) ? new FullTextQueryUnaryOp(FullTextQuery.Operator.Not, q) : null;
                
                case QueryScanner.TKN_LPAR: 
                    q = disjunction(scanner);
                    break;
                
                case QueryScanner.TKN_WORD: 
                    q = new FullTextQueryMatchOp(scanner.inQuotes ? FullTextQuery.Operator.StrictMatch : FullTextQuery.Operator.Match, scanner.word, scanner.wordPos);
                    break;
                
                case QueryScanner.TKN_EOQ: 
                    return null;

                default:
                    break;
            }
            scanner.scan();
            return q;
        }
 protected internal virtual FullTextQuery conjunction(QueryScanner scanner)
 {
     FullTextQuery left = term(scanner);
     if (scanner.token == QueryScanner.TKN_WORD || scanner.token == QueryScanner.TKN_AND)
     {
         if (scanner.token == QueryScanner.TKN_WORD)
         {
             scanner.unget = true;
         }
         FullTextQuery.Operator cop = scanner.inQuotes ? FullTextQuery.Operator.Near : FullTextQuery.Operator.And;
         FullTextQuery right = disjunction(scanner);
         if (left != null && right != null)
         {
             return new FullTextQueryBinaryOp(cop, left, right);
         }
         else if (right != null)
         {
             return right;
         }
     }
     return left;
 }
 protected internal virtual FullTextQuery disjunction(QueryScanner scanner)
 {
     FullTextQuery left = conjunction(scanner);
     if (scanner.token == QueryScanner.TKN_OR)
     {
         FullTextQuery right = disjunction(scanner);
         if (left != null && right != null)
         {
             return new FullTextQueryBinaryOp(FullTextQuery.Operator.Or, left, right);
         }
         else if (right != null)
         {
             return right;
         }
     }
     return left;
 }
Пример #25
0
 public override string ToString()
 {
     return(StringExtensions.Format("{0}{1}{2}", QueryScanner.WrapColumnName(this.ColumnName), this.Operator.ToSyntaxString(), QueryScanner.WrapValue(this.Value.ToString())));
 }