Beispiel #1
0
    def test_and_operator_triple(self):
        p1 = parse("eq(a,0)&eq(b,1)&eq(c,2)")
        p2 = parse("and(eq(a, 0), eq(b, 1), eq(c, 2))")

        p3 = {
            "name":
            "and",
            "args": [
                {
                    "name": "eq",
                    "args": ["a", 0]
                },
                {
                    "name": "eq",
                    "args": ["b", 1]
                },
                {
                    "name": "eq",
                    "args": ["c", 2]
                },
            ],
        }

        assert p1 == p2
        assert p1 == p3
Beispiel #2
0
    def test_unbalanced_parenthesis_11(self):
        parsed = parse(r"in(foo,(foo,bar))&sort(+foo)&eq(userid,user)")
        assert parsed == {'name': 'and', 'args': [
            {'name': 'in', 'args': ['foo', ('foo', 'bar')]},
            {'name': 'sort', 'args': [('+', 'foo')]},
            {'name': 'eq', 'args': ['userid', 'user']}
        ]}

        with pytest.raises(RQLSyntaxError) as exc:
            parse(r"in(foo,(foo,bar))&sort(+foo))&eq(userid,user)")

        assert exc.value.args[2] == "Expected end of text"
Beispiel #3
0
    def test_recurse_function(self):
        expr = "recurse(lero)"
        rep = {"name": "recurse", "args": ["lero"]}
        pd = parse(expr)

        assert rep == pd
        assert unparse(pd) == expr
Beispiel #4
0
    def test_limit_function(self):
        expr = "limit(10,0)"
        rep = {"name": "limit", "args": [10, 0]}

        pd = parse(expr)
        assert rep == pd
        assert unparse(pd) == expr
Beispiel #5
0
    def test_result_functions(self, func):
        expr = "%s()" % func
        rep = {"name": func, "args": []}

        pd = parse(expr)
        assert pd == rep
        assert unparse(pd) == expr
Beispiel #6
0
    def test_aggregate_functions(self, func):
        expr = "%s((a,b,c))" % func
        rep = {"name": func, "args": [("a", "b", "c")]}

        pd = parse(expr)
        assert pd == rep
        assert unparse(pd) == expr
Beispiel #7
0
    def test_bool_functions(self, func, args):
        expr = "%s(%s)" % (func, ",".join(args))
        rep = {"name": func, "args": args}

        pd = parse(expr)
        assert rep == pd
        assert unparse(pd) == expr
Beispiel #8
0
    def test_member_functions(self, func):
        expr = "%s(name,(a,b))" % func
        rep = {"name": func, "args": ["name", ("a", "b")]}

        pd = parse(expr)
        assert pd == rep
        assert unparse(pd) == expr
Beispiel #9
0
    def test_parenthesis(self):
        pd = parse("(state=Florida|state=Alabama)&gender=female")
        rep = {
            "name":
            "and",
            "args": [
                {
                    "name":
                    "or",
                    "args": [
                        {
                            "name": "eq",
                            "args": ["state", "Florida"]
                        },
                        {
                            "name": "eq",
                            "args": ["state", "Alabama"]
                        },
                    ],
                },
                {
                    "name": "eq",
                    "args": ["gender", "female"]
                },
            ],
        }

        assert pd == rep
Beispiel #10
0
    def test_unparser_error_4(self):
        expr = r"and(eq(accountId,(123456789)), eq(yyyy,(2020)), eq(mm,(10)))"
        rep = {
            "name": "and",
            "args": [
                {"name": "eq", "args": ["accountId", (123456789,)]},
                {"name": "eq", "args": ["yyyy", (2020,)]},
                {"name": "eq", "args": ["mm", (10,)]},
            ],
        }

        pd = parse(expr)
        upd = parse(unparse(pd))

        assert pd == rep
        assert upd == pd
Beispiel #11
0
    def rql(self, query, limit=None):
        if len(self._entities) > 1:
            raise NotImplementedError("Query must have a single entity")

        expr = query

        if not expr:
            self.rql_parsed = None
            self.rql_expr = ""

        else:
            self.rql_expr = expr

            try:
                self.rql_parsed = parse(expr)
            except RQLSyntaxError as exc:
                raise self._rql_error_cls("RQL Syntax error: %r" % (exc.args,))

        self._rql_select_clause = []
        self._rql_values_clause = None
        self._rql_scalar_clause = None
        self._rql_where_clause = None
        self._rql_order_by_clause = None
        self._rql_limit_clause = None
        self._rql_offset_clause = None
        self._rql_one_clause = None
        self._rql_distinct_clause = None
        self._rql_group_by_clause = None
        self._rql_joins = []

        self._rql_walk(self.rql_parsed)

        query = self

        for other in self._rql_joins:
            query = query.join(other)

        if self._rql_where_clause is not None:
            query = query.filter(self._rql_where_clause)

        if self._rql_order_by_clause is not None:
            query = query.order_by(*self._rql_order_by_clause)

        # limit priority is: default, method parameter, querystring parameter
        if self._rql_default_limit:
            query = query.limit(self._rql_default_limit)

        if limit is not None:
            query = query.limit(limit)

        if self._rql_limit_clause is not None:
            query = query.limit(self._rql_limit_clause)

        if self._rql_offset_clause is not None:
            query = query.offset(self._rql_offset_clause)

        if self._rql_distinct_clause is not None:
            query = query.distinct()

        return query
Beispiel #12
0
    def test_recurse_function(self):
        expr = 'recurse(lero)'
        rep = {'name': 'recurse', 'args': ['lero']}
        pd = parse(expr)

        assert rep == pd
        assert unparse(pd) == expr
Beispiel #13
0
    def test_result_functions(self, func):
        expr = '%s()' % func
        rep = {'name': func, 'args': []}

        pd = parse(expr)
        assert pd == rep
        assert unparse(pd) == expr
Beispiel #14
0
    def test_limit_function(self):
        expr = 'limit(10,0)'
        rep = {'name': 'limit', 'args': [10, 0]}

        pd = parse(expr)
        assert rep == pd
        assert unparse(pd) == expr
Beispiel #15
0
    def test_member_functions(self, func):
        expr = '%s(name,(a,b))' % func
        rep = {'name': func, 'args': ['name', ('a', 'b')]}

        pd = parse(expr)
        assert pd == rep
        assert unparse(pd) == expr
Beispiel #16
0
    def test_aggregate_functions(self, func):
        expr = '%s((a,b,c))' % func
        rep = {'name': func, 'args': [('a', 'b', 'c')]}

        pd = parse(expr)
        assert pd == rep
        assert unparse(pd) == expr
Beispiel #17
0
    def test_bool_functions(self, func, args):
        expr = '%s(%s)' % (func, ','.join(args))
        rep = {'name': func, 'args': args}

        pd = parse(expr)
        assert rep == pd
        assert unparse(pd) == expr
Beispiel #18
0
def test_explicit_types_symmetry(in_, out):
    parsed = {"name": "eq", "args": ["a", in_]}
    upd = unparse(parsed)
    pd = parse(upd)

    assert pd == parsed
    assert upd == "eq(a,%s)" % out
Beispiel #19
0
    def test_parenthesis(self):
        pd = parse('(state=Florida|state=Alabama)&gender=female')
        rep = {
            'name':
            'and',
            'args': [{
                'name':
                'or',
                'args': [
                    {
                        'name': 'eq',
                        'args': ['state', 'Florida']
                    },
                    {
                        'name': 'eq',
                        'args': ['state', 'Alabama']
                    },
                ]
            }, {
                'name': 'eq',
                'args': ['gender', 'female']
            }]
        }

        assert pd == rep
Beispiel #20
0
    def test_or_operator(self):
        p1 = parse('(f(1)|f(2))')
        p2 = parse('or(f(1),f(2))')

        p3 = {
            'name': 'or',
            'args': [{
                'name': 'f',
                'args': [1]
            }, {
                'name': 'f',
                'args': [2]
            }]
        }

        assert p1 == p2
        assert p1 == p3
Beispiel #21
0
    def test_or_operator(self):
        p1 = parse("(f(1)|f(2))")
        p2 = parse("or(f(1),f(2))")

        p3 = {
            "name": "or",
            "args": [{
                "name": "f",
                "args": [1]
            }, {
                "name": "f",
                "args": [2]
            }],
        }

        assert p1 == p2
        assert p1 == p3
Beispiel #22
0
    def test_and_operator_pair(self):
        p1 = parse('eq(a,0)&eq(b,1)')
        p2 = parse('and(eq(a, 0), eq(b, 1))')

        p3 = {
            'name':
            'and',
            'args': [{
                'name': 'eq',
                'args': ['a', 0]
            }, {
                'name': 'eq',
                'args': ['b', 1]
            }]
        }

        assert p1 == p2
        assert p1 == p3
Beispiel #23
0
    def test_rfc_aggregate_example(self):
        expr = "aggregate(departmentId,sum(sales))"
        rep = {
            "name": "aggregate",
            "args": ["departmentId", {"name": "sum", "args": ["sales"]}],
        }

        pd = parse(expr)
        assert pd == rep
Beispiel #24
0
    def test_string_starting_with_number(self):
        expr = 'uuid=27f1db1c029e4a428961b85433de25fd'
        rep = {
            'name': 'eq',
            'args': ['uuid', '27f1db1c029e4a428961b85433de25fd']
        }

        pd = parse(expr)
        assert pd == rep
Beispiel #25
0
    def test_query_functions(self, func):
        expr = "%s(username,password,(address,city))" % func
        rep = {
            "name": func,
            "args": ["username", "password", ("address", "city")]
        }

        pd = parse(expr)
        assert pd == rep
        assert unparse(pd) == expr
Beispiel #26
0
    def test_query_functions(self, func):
        expr = '%s(username,password,(address,city))' % func
        rep = {
            'name': func,
            'args': ['username', 'password', ('address', 'city')]
        }

        pd = parse(expr)
        assert pd == rep
        assert unparse(pd) == expr
Beispiel #27
0
    def test_and_operator(self, expr):
        rep = {
            "name": "and",
            "args": [
                {"name": "eq", "args": ["foo", 3]},
                {"name": "lt", "args": ["price", 10]},
            ],
        }

        assert parse(expr) == rep
Beispiel #28
0
    def test_rfc_aggregate_example(self):
        expr = 'aggregate(departmentId,sum(sales))'
        rep = {
            'name': 'aggregate',
            'args': ['departmentId', {
                'name': 'sum',
                'args': ['sales']
            }]
        }

        pd = parse(expr)
        assert pd == rep
Beispiel #29
0
    def test_rfc_nested_operators_example(self):
        expr = "or(eq(category,toy),eq(category,food))"
        rep = {
            "name": "or",
            "args": [
                {"name": "eq", "args": ["category", "toy"]},
                {"name": "eq", "args": ["category", "food"]},
            ],
        }

        pd = parse(expr)
        assert pd == rep
Beispiel #30
0
    def test_rfc_abstract_example(self):
        expr = "category=dates&sort(+price)"
        rep = {
            "name": "and",
            "args": [
                {"name": "eq", "args": ["category", "dates"]},
                {"name": "sort", "args": [("+", "price")]},
            ],
        }

        pd = parse(expr)
        assert pd == rep