示例#1
0
        public QueryExpression MakeQueryExpression(GlazeConnection cnn,
                                                   string sourceCommandText)
        {
            // not allowing multiple SELECT clauses (does anybody need them?),
            // but shouldn't be that difficult to generalize...
            MacroScopeParser parser = Factory.CreateParser(sourceCommandText);

            return(parser.queryExpression());
        }
示例#2
0
        public void TestSelectOrderBy()
        {
            CheckSelect("select * from area order by area_id ASC",
                        "SELECT *\r\nFROM area\r\nORDER BY area_id");

            StringBuilder expected = new StringBuilder();

            expected.Append("SELECT area.area_id, province.province_id, ");
            expected.Append("district.district_id, city.city_id\r\n");
            expected.Append("FROM area ");
            expected.Append("INNER JOIN province ON area.area_id = province.area_id ");
            expected.Append("INNER JOIN district ON province.province_id = district.province_id ");
            expected.Append("INNER JOIN city ON district.city_id = city.city_id\r\n");
            expected.Append("ORDER BY area.area_id, province.province_id, ");
            expected.Append("district.district_id, city.city_id");

            CheckSelect(@"select area.area_id, province.province_id, district.district_id, city.city_id
from area
join province on area.area_id=province.area_id
join district on province.province_id=district.province_id
join city on district.city_id=city.city_id
order by area.area_id,province.province_id,district.district_id,city.city_id",
                        expected.ToString());

            SelectStatement statement = Factory.CreateStatement(
                "select area.* from area") as SelectStatement;

            Assert.IsNotNull(statement);

            QueryExpression queryExpression = statement.SingleQueryExpression;

            Assert.IsNotNull(queryExpression);
            Assert.IsNull(queryExpression.OrderBy);

            MacroScopeParser parser     = Factory.CreateParser("area.area_id");
            IExpression      expression = parser.expression();

            Assert.IsNotNull(expression);

            OrderExpression orderExpression = new OrderExpression(expression);

            queryExpression.OrderBy = orderExpression;

            string sql = TestUtil.Stringify(statement);

            Assert.AreEqual("SELECT area.*\r\nFROM area\r\nORDER BY area.area_id",
                            sql);

            CheckSelect("SELECT * FROM fact ORDER BY subject, predicate desc, [object]",
                        "SELECT *\r\nFROM fact\r\nORDER BY subject, predicate DESC, [object]");
            CheckSelect(@"SELECT *
FROM fact
ORDER BY
subject ASC, predicate DESC, [object] ASC",
                        "SELECT *\r\nFROM fact\r\nORDER BY subject, predicate DESC, [object]");
        }
示例#3
0
        public void TestSearchCondition()
        {
            MacroScopeParser parser     = Factory.CreateParser("a != b");
            Expression       expression = parser.searchCondition() as Expression;

            Assert.IsNotNull(expression);
            Assert.AreEqual("a <> b", TestUtil.Stringify(expression));

            parser     = Factory.CreateParser("a + b > c");
            expression = parser.searchCondition() as Expression;
            Assert.IsNotNull(expression);
            Assert.AreEqual("(a + b) > c", TestUtil.Stringify(expression));

            parser = Factory.CreateParser("m != all (select n from x)");
            PredicateExpression predicateExpression = parser.searchCondition()
                                                      as PredicateExpression;

            Assert.IsNotNull(predicateExpression);
            Assert.AreEqual("m <> ALL ( SELECT n\r\nFROM x )",
                            TestUtil.Stringify(predicateExpression));

            parser     = Factory.CreateParser("c is not null");
            expression = parser.searchCondition() as Expression;
            Assert.IsNotNull(expression);
            Assert.AreEqual("c IS NOT NULL", TestUtil.Stringify(expression));

            parser     = Factory.CreateParser("1<>1 and 1<>1 or 1=1");
            expression = parser.searchCondition() as Expression;
            Assert.IsNotNull(expression);
            Assert.AreEqual("((1 <> 1) AND (1 <> 1)) OR (1 = 1)",
                            TestUtil.Stringify(expression));

            parser     = Factory.CreateParser("1 = 1 or 1 <> 1 and 1 <> 1");
            expression = parser.searchCondition() as Expression;
            Assert.IsNotNull(expression);
            Assert.AreEqual("(1 = 1) OR ((1 <> 1) AND (1 <> 1))",
                            TestUtil.Stringify(expression));

            CheckSearchCondition("(1 = 1)", "1 = 1");

            CheckSearchCondition("NULL IS NULL");

            StringBuilder expected = new StringBuilder();

            expected.Append("((address.building_id = ");
            expected.Append("building.building_id) ");
            expected.Append("AND (building.settlement_id = settlement.settlement_id)) ");
            expected.Append("AND (settlement.village_id = village.village_id)");
            CheckSearchCondition(expected.ToString());

            CheckSearchCondition("updated >= 1");
            CheckSearchCondition("updated >= @threshold");
            CheckSearchCondition("updated >= :threshold");
            CheckSearchCondition("updated >= DATE()");
        }
示例#4
0
        public void TestSelectItem()
        {
            MacroScopeParser parser     = Factory.CreateParser("*");
            AliasedItem      selectItem = parser.selectItem();

            Assert.IsInstanceOfType(typeof(Wildcard), selectItem.Item);

            parser     = Factory.CreateParser("Author = Originator");
            selectItem = parser.selectItem();
            Assert.IsNotNull(selectItem);
            Identifier alias = selectItem.Alias;

            Assert.IsNotNull(alias);
            Assert.AreEqual("Author", alias.ID);
            Assert.AreEqual("Originator", TestUtil.Stringify(selectItem.Item));

            parser     = Factory.CreateParser("x = 1 + 2");
            selectItem = parser.selectItem();
            INode core = selectItem.Item;

            Assert.IsInstanceOfType(typeof(Expression), core);
            Assert.AreEqual("1 + 2", TestUtil.Stringify(core));

            parser     = Factory.CreateParser("x = y + z");
            selectItem = parser.selectItem();
            Assert.IsNotNull(selectItem);
            alias = selectItem.Alias;
            Assert.IsNotNull(alias);
            Assert.AreEqual("x", alias.ID);
            core = selectItem.Item;
            Assert.IsInstanceOfType(typeof(Expression), core);
            Assert.AreEqual("y + z", TestUtil.Stringify(core));

            parser     = Factory.CreateParser("address.*");
            selectItem = parser.selectItem();
            core       = selectItem.Item;
            Assert.IsInstanceOfType(typeof(TableWildcard), core);
            Assert.AreEqual("address.*", TestUtil.Stringify(core));

            parser     = Factory.CreateParser("1 + 2 * 3");
            selectItem = parser.selectItem();
            Assert.IsNotNull(selectItem);
            Assert.IsNull(selectItem.Alias);
            core = selectItem.Item;
            Assert.IsInstanceOfType(typeof(Expression), core);
            Assert.AreEqual("1 + (2 * 3)", TestUtil.Stringify(core));
        }
示例#5
0
        void CheckSearchCondition(string from, string to)
        {
            if (from == null)
            {
                throw new ArgumentNullException("from");
            }

            if (to == null)
            {
                throw new ArgumentNullException("to");
            }

            MacroScopeParser parser     = Factory.CreateParser(from);
            IExpression      expression = parser.searchCondition();

            Assert.IsNotNull(expression);
            Assert.AreEqual(to, TestUtil.Stringify(expression));
        }
示例#6
0
        string TailorName(string name)
        {
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }

            MacroScopeParser parser   = Factory.CreateParser(name);
            Variable         variable = parser.variableReference();

            IVisitor tailor = Factory.CreateTailor(m_owner.DatabaseProvider);

            variable.Traverse(tailor);

            Stringifier stringifier = new Stringifier();

            variable.Traverse(stringifier);
            return(stringifier.ToSql());
        }
示例#7
0
        void CheckFunction(string from, string to)
        {
            if (from == null)
            {
                throw new ArgumentNullException("from");
            }

            if (to == null)
            {
                throw new ArgumentNullException("to");
            }

            MacroScopeParser parser       = Factory.CreateParser(from);
            IExpression      functionCall = parser.function();

            Assert.IsNotNull(functionCall);

            Assert.AreEqual(to, TestUtil.Stringify(functionCall));
        }
示例#8
0
        void CheckJoinedTable(string from, string to)
        {
            if (from == null)
            {
                throw new ArgumentNullException("from");
            }

            if (to == null)
            {
                throw new ArgumentNullException("to");
            }

            MacroScopeParser parser = Factory.CreateParser(from);
            Table            table  = parser.joinedTable();

            Assert.IsNotNull(table);

            Assert.AreEqual(to, TestUtil.Stringify(table));
        }
示例#9
0
        /// <summary>
        /// Parses the argument as a SQL statement and returns its tree.
        /// </summary>
        /// <param name="commandText">
        /// The SQL. Must not be null.
        /// </param>
        /// <returns>
        /// A statement instance (never null).
        /// </returns>
        public static IStatement CreateStatement(string commandText)
        {
            MacroScopeParser parser = CreateParser(commandText);

            return(parser.statement());
        }
示例#10
0
        public void TestPredicate()
        {
            MacroScopeParser parser     = Factory.CreateParser("a >= b");
            Expression       expression = parser.predicate() as Expression;

            Assert.IsNotNull(expression);
            Assert.AreEqual("a", TestUtil.Stringify(expression.Left));
            Assert.AreSame(ExpressionOperator.GreaterOrEqual,
                           expression.Operator);
            Assert.AreEqual("b", TestUtil.Stringify(expression.Right));

            parser     = Factory.CreateParser("c is null");
            expression = parser.predicate() as Expression;
            Assert.IsNotNull(expression);
            Assert.AreEqual("c", TestUtil.Stringify(expression.Left));
            Assert.AreSame(ExpressionOperator.IsNull,
                           expression.Operator);
            Assert.IsNull(expression.Right);

            CheckPredicate("c IS NOT NULL");

            parser     = Factory.CreateParser("d like 'Smith%'");
            expression = parser.predicate() as Expression;
            Assert.IsNotNull(expression);
            Assert.AreEqual("d", TestUtil.Stringify(expression.Left));
            Assert.AreSame(ExpressionOperator.Like,
                           expression.Operator);

            PatternExpression patternExpression = expression.Right as PatternExpression;

            Assert.IsNotNull(patternExpression);
            Assert.AreEqual("'Smith%'", TestUtil.Stringify(patternExpression.Expression));
            Assert.IsNull(patternExpression.Escape);

            parser     = Factory.CreateParser("comment LIKE '%30!%%' ESCAPE '!'");
            expression = parser.predicate() as Expression;
            Assert.IsNotNull(expression);

            patternExpression = expression.Right as PatternExpression;
            Assert.IsNotNull(patternExpression);
            Assert.AreEqual("'%30!%%'", TestUtil.Stringify(patternExpression.Expression));
            Assert.AreEqual("'!'", TestUtil.Stringify(patternExpression.Escape));

            parser     = Factory.CreateParser("e between 1 and 10");
            expression = parser.predicate() as Expression;
            Assert.IsNotNull(expression);
            Assert.AreSame(ExpressionOperator.Between, expression.Operator);
            Assert.AreEqual("e BETWEEN 1 AND 10", TestUtil.Stringify(expression));

            parser     = Factory.CreateParser("f in(+2, +3, +5, +7)");
            expression = parser.predicate() as Expression;
            Assert.IsNotNull(expression);
            Assert.AreEqual("f IN (2, 3, 5, 7)", TestUtil.Stringify(expression));

            string idempotent = "g1 NOT IN (SELECT name\r\nFROM week)";

            parser     = Factory.CreateParser(idempotent);
            expression = parser.predicate() as Expression;
            Assert.IsNotNull(expression);
            Assert.AreEqual(idempotent, TestUtil.Stringify(expression));

            CheckPredicate("EXISTS (SELECT *\r\nFROM warehouse)");
        }