Exemplo n.º 1
0
    def __init__(self, connection, query, keys_only=False):
        self.connection = connection
        self.namespace = connection.ops.connection.settings_dict.get("NAMESPACE")

        self.query = transform_query(connection, query)
        self.query.prepare()
        self.query = normalize_query(self.query)

        self.original_query = query
        self.keys_only = (keys_only or [x.field for x in query.select] == [ query.model._meta.pk ])

        # MultiQuery doesn't support keys_only
        if self.query.where and len(self.query.where.children) > 1:
            self.keys_only = False
Exemplo n.º 2
0
    def __init__(self, connection, query, keys_only=False):
        self.connection = connection

        self.query = transform_query(connection, query)
        self.query.prepare()
        self.query = normalize_query(self.query)

        self.original_query = query
        self.keys_only = keys_only or [x.field for x in query.select] == [query.model._meta.pk]

        # MultiQuery doesn't support keys_only
        if self.query.where and len(self.query.where.children) > 1:
            self.keys_only = False

        self.excluded_pks = self.query.excluded_pks
Exemplo n.º 3
0
    def __init__(self, connection, query, keys_only=False):
        self.connection = connection

        self.query = transform_query(connection, query)
        self.query.prepare()
        self.query = normalize_query(self.query)

        self.original_query = query
        self.keys_only = (keys_only or [x.field for x in query.select] == [ query.model._meta.pk ])

        # MultiQuery doesn't support keys_only
        if self.query.where and len(self.query.where.children) > 1:
            self.keys_only = False

        self.excluded_pks = self.query.excluded_pks
Exemplo n.º 4
0
    def test_and_with_child_or_promoted(self):
        from .test_connector import TestUser
        """
            Given the following tree:

                   AND
                  / | \
                 A  B OR
                      / \
                     C   D

             The OR should be promoted, so the resulting tree is

                      OR
                     /   \
                   AND   AND
                  / | \ / | \
                 A  B C A B D
        """


        query = Query(TestUser, "SELECT")
        query.where = WhereNode('default')
        query.where.children.append(WhereNode('default'))
        query.where.children[-1].column = "A"
        query.where.children[-1].operator = "="
        query.where.children.append(WhereNode('default'))
        query.where.children[-1].column = "B"
        query.where.children[-1].operator = "="
        query.where.children.append(WhereNode('default'))
        query.where.children[-1].connector = "OR"
        query.where.children[-1].children.append(WhereNode('default'))
        query.where.children[-1].children[-1].column = "C"
        query.where.children[-1].children[-1].operator = "="
        query.where.children[-1].children.append(WhereNode('default'))
        query.where.children[-1].children[-1].column = "D"
        query.where.children[-1].children[-1].operator = "="

        query = normalize_query(query)

        self.assertEqual(query.where.connector, "OR")
        self.assertEqual(2, len(query.where.children))
        self.assertFalse(query.where.children[0].is_leaf)
        self.assertFalse(query.where.children[1].is_leaf)
        self.assertEqual(query.where.children[0].connector, "AND")
        self.assertEqual(query.where.children[1].connector, "AND")
        self.assertEqual(3, len(query.where.children[0].children))
        self.assertEqual(3, len(query.where.children[1].children))
Exemplo n.º 5
0
    def test_and_with_child_or_promoted(self):
        from .test_connector import TestUser
        """
            Given the following tree:

                   AND
                  / | \
                 A  B OR
                      / \
                     C   D

             The OR should be promoted, so the resulting tree is

                      OR
                     /   \
                   AND   AND
                  / | \ / | \
                 A  B C A B D
        """


        query = Query(TestUser, "SELECT")
        query.where = WhereNode('default')
        query.where.children.append(WhereNode('default'))
        query.where.children[-1].column = "A"
        query.where.children[-1].operator = "="
        query.where.children.append(WhereNode('default'))
        query.where.children[-1].column = "B"
        query.where.children[-1].operator = "="
        query.where.children.append(WhereNode('default'))
        query.where.children[-1].connector = "OR"
        query.where.children[-1].children.append(WhereNode('default'))
        query.where.children[-1].children[-1].column = "C"
        query.where.children[-1].children[-1].operator = "="
        query.where.children[-1].children.append(WhereNode('default'))
        query.where.children[-1].children[-1].column = "D"
        query.where.children[-1].children[-1].operator = "="

        query = normalize_query(query)

        self.assertEqual(query.where.connector, "OR")
        self.assertEqual(2, len(query.where.children))
        self.assertFalse(query.where.children[0].is_leaf)
        self.assertFalse(query.where.children[1].is_leaf)
        self.assertEqual(query.where.children[0].connector, "AND")
        self.assertEqual(query.where.children[1].connector, "AND")
        self.assertEqual(3, len(query.where.children[0].children))
        self.assertEqual(3, len(query.where.children[1].children))
Exemplo n.º 6
0
    def __init__(self, connection, query, keys_only=False):
        self.connection = connection
        self.namespace = connection.ops.connection.settings_dict.get(
            "NAMESPACE")

        self.query = transform_query(connection, query)
        self.query.prepare()
        self.query = normalize_query(self.query)

        self.original_query = query
        self.keys_only = (keys_only
                          or [x.field
                              for x in query.select] == [query.model._meta.pk])

        # MultiQuery doesn't support keys_only
        if self.query.where and len(self.query.where.children) > 1:
            self.keys_only = False
Exemplo n.º 7
0
    def __init__(self, connection, query, keys_only=False):
        self.connection = connection
        self.namespace = connection.ops.connection.settings_dict.get("NAMESPACE")

        self.query = transform_query(connection, query)
        self.query.prepare()
        self.query = normalize_query(self.query)

        self.original_query = query

        # We enable keys only queries if they have been forced, or, if
        # someone did only("pk") or someone did values_list("pk") this is a little
        # inconsistent with other fields which aren't projected if just values(_list) is used
        self.keys_only = keys_only or (
            query.deferred_loading[1] is False and
            len(query.deferred_loading[0]) == 1 and query.model._meta.pk.column in query.deferred_loading[0]
        ) or (
            len(query.select) == 1 and query.select[0].field == query.model._meta.pk
        )

        # MultiQuery doesn't support keys_only
        if self.query.where and len(self.query.where.children) > 1:
            self.keys_only = False
Exemplo n.º 8
0
    def __init__(self, connection, query, keys_only=False):
        self.connection = connection
        self.namespace = connection.ops.connection.settings_dict.get("NAMESPACE")

        self.query = transform_query(connection, query)
        self.query.prepare()
        self.query = normalize_query(self.query)

        self.original_query = query

        # We enable keys only queries if they have been forced, or, if
        # someone did only("pk") or someone did values_list("pk") this is a little
        # inconsistent with other fields which aren't projected if just values(_list) is used
        self.keys_only = keys_only or (
            query.deferred_loading[1] is False and
            len(query.deferred_loading[0]) == 1 and query.model._meta.pk.column in query.deferred_loading[0]
        ) or (
            len(query.select) == 1 and query.select[0].field == query.model._meta.pk
        )

        # MultiQuery doesn't support keys_only
        if self.query.where and len(self.query.where.children) > 1:
            self.keys_only = False
Exemplo n.º 9
0
    def test_or_queries(self):
        from .test_connector import TestUser
        qs = TestUser.objects.filter(
            username="******").filter(
            Q(username__in=["ruby", "jruby"]) | (Q(username="******") & ~Q(username="******"))
        )

        query = normalize_query(transform_query(
            connections['default'],
            qs.query
        ))

        # After IN and != explosion, we have...
        # (AND: (username='******', OR: (username='******', username='******', AND: (username='******', AND: (username < 'perl', username > 'perl')))))

        # Working backwards,
        # AND: (username < 'perl', username > 'perl') can't be simplified
        # AND: (username='******', AND: (username < 'perl', username > 'perl')) can become (OR: (AND: username = '******', username < 'perl'), (AND: username='******', username > 'perl'))
        # OR: (username='******', username='******', (OR: (AND: username = '******', username < 'perl'), (AND: username='******', username > 'perl')) can't be simplified
        # (AND: (username='******', OR: (username='******', username='******', (OR: (AND: username = '******', username < 'perl'), (AND: username='******', username > 'perl'))
        # becomes...
        # (OR: (AND: username='******', username = '******'), (AND: username='******', username='******'), (AND: username='******', username='******', username < 'perl') \
        #      (AND: username='******', username='******', username > 'perl')

        self.assertTrue(4, len(query.where.children[0].children))

        self.assertEqual(query.where.children[0].connector, "AND")
        self.assertEqual(query.where.children[0].children[0].column, "username")
        self.assertEqual(query.where.children[0].children[0].operator, "=")
        self.assertEqual(query.where.children[0].children[0].value, "python")
        self.assertEqual(query.where.children[0].children[1].column, "username")
        self.assertEqual(query.where.children[0].children[1].operator, "=")
        self.assertEqual(query.where.children[0].children[1].value, "php")
        self.assertEqual(query.where.children[0].children[2].column, "username")
        self.assertEqual(query.where.children[0].children[2].operator, "<")
        self.assertEqual(query.where.children[0].children[2].value, "perl")

        self.assertEqual(query.where.children[1].connector, "AND")
        self.assertEqual(query.where.children[1].children[0].column, "username")
        self.assertEqual(query.where.children[1].children[0].operator, "=")
        self.assertEqual(query.where.children[1].children[0].value, "python")
        self.assertEqual(query.where.children[1].children[1].column, "username")
        self.assertEqual(query.where.children[1].children[1].operator, "=")
        self.assertEqual(query.where.children[1].children[1].value, "jruby")

        self.assertEqual(query.where.children[2].connector, "AND")
        self.assertEqual(query.where.children[2].children[0].column, "username")
        self.assertEqual(query.where.children[2].children[0].operator, "=")
        self.assertEqual(query.where.children[2].children[0].value, "python")
        self.assertEqual(query.where.children[2].children[1].column, "username")
        self.assertEqual(query.where.children[2].children[1].operator, "=")
        self.assertEqual(query.where.children[2].children[1].value, "php")
        self.assertEqual(query.where.children[2].children[2].column, "username")
        self.assertEqual(query.where.children[2].children[2].operator, ">")
        self.assertEqual(query.where.children[2].children[2].value, "perl")

        self.assertEqual(query.where.connector, "OR")
        self.assertEqual(query.where.children[3].connector, "AND")
        self.assertEqual(query.where.children[3].children[0].column, "username")
        self.assertEqual(query.where.children[3].children[0].operator, "=")
        self.assertEqual(query.where.children[3].children[0].value, "python")
        self.assertEqual(query.where.children[3].children[1].column, "username")
        self.assertEqual(query.where.children[3].children[1].operator, "=")
        self.assertEqual(query.where.children[3].children[1].value, "ruby")

        qs = TestUser.objects.filter(username="******") | TestUser.objects.filter(username="******")

        query = normalize_query(transform_query(
            connections['default'],
            qs.query
        ))

        self.assertEqual(query.where.connector, "OR")
        self.assertEqual(2, len(query.where.children))
        self.assertTrue(query.where.children[0].is_leaf)
        self.assertEqual("cheese", query.where.children[0].value)
        self.assertTrue(query.where.children[1].is_leaf)
        self.assertEqual("test", query.where.children[1].value)

        qs = TestUser.objects.using("default").filter(username__in=set()).values_list('email')

        with self.assertRaises(EmptyResultSet):
            query = normalize_query(transform_query(
                connections['default'],
                qs.query
            ))

        qs = TestUser.objects.filter(username__startswith='Hello') |  TestUser.objects.filter(username__startswith='Goodbye')

        query = normalize_query(transform_query(
            connections['default'],
            qs.query
        ))

        self.assertEqual(2, len(query.where.children))
        self.assertEqual("_idx_startswith_username", query.where.children[0].column)
        self.assertEqual(u"Goodbye", query.where.children[0].value)
        self.assertEqual("_idx_startswith_username", query.where.children[1].column)
        self.assertEqual(u"Hello", query.where.children[1].value)


        qs = TestUser.objects.filter(pk__in=[1, 2, 3])
        query = normalize_query(transform_query(
            connections['default'],
            qs.query
        ))

        self.assertEqual(3, len(query.where.children))
        self.assertEqual("__key__", query.where.children[0].column)
        self.assertEqual("__key__", query.where.children[1].column)
        self.assertEqual("__key__", query.where.children[2].column)
        self.assertEqual({
                datastore.Key.from_path(TestUser._meta.db_table, 1, namespace=DEFAULT_NAMESPACE),
                datastore.Key.from_path(TestUser._meta.db_table, 2, namespace=DEFAULT_NAMESPACE),
                datastore.Key.from_path(TestUser._meta.db_table, 3, namespace=DEFAULT_NAMESPACE),
            }, {
                query.where.children[0].value,
                query.where.children[1].value,
                query.where.children[2].value,
            }
        )

        qs = TestUser.objects.filter(pk__in=[1, 2, 3]).filter(username="******")
        query = normalize_query(transform_query(
            connections['default'],
            qs.query
        ))

        self.assertEqual(3, len(query.where.children))
        self.assertEqual("__key__", query.where.children[0].children[0].column)
        self.assertEqual("test", query.where.children[0].children[1].value)

        self.assertEqual("__key__", query.where.children[1].children[0].column)
        self.assertEqual("test", query.where.children[0].children[1].value)

        self.assertEqual("__key__", query.where.children[2].children[0].column)
        self.assertEqual("test", query.where.children[0].children[1].value)

        self.assertEqual({
                datastore.Key.from_path(TestUser._meta.db_table, 1, namespace=DEFAULT_NAMESPACE),
                datastore.Key.from_path(TestUser._meta.db_table, 2, namespace=DEFAULT_NAMESPACE),
                datastore.Key.from_path(TestUser._meta.db_table, 3, namespace=DEFAULT_NAMESPACE),
            }, {
                query.where.children[0].children[0].value,
                query.where.children[1].children[0].value,
                query.where.children[2].children[0].value,
            }
        )
Exemplo n.º 10
0
    def test_and_queries(self):
        from .test_connector import TestUser
        qs = TestUser.objects.filter(username="******").all()

        query = normalize_query(transform_query(
            connections['default'],
            qs.query
        ))

        self.assertTrue(1, len(query.where.children))
        self.assertEqual(query.where.children[0].children[0].column, "username")
        self.assertEqual(query.where.children[0].children[0].operator, "=")
        self.assertEqual(query.where.children[0].children[0].value, "test")

        qs = TestUser.objects.filter(username="******", email="*****@*****.**")

        query = normalize_query(transform_query(
            connections['default'],
            qs.query
        ))

        self.assertTrue(2, len(query.where.children[0].children))
        self.assertEqual(query.where.connector, "OR")
        self.assertEqual(query.where.children[0].connector, "AND")
        self.assertEqual(query.where.children[0].children[0].column, "username")
        self.assertEqual(query.where.children[0].children[0].operator, "=")
        self.assertEqual(query.where.children[0].children[0].value, "test")
        self.assertEqual(query.where.children[0].children[1].column, "email")
        self.assertEqual(query.where.children[0].children[1].operator, "=")
        self.assertEqual(query.where.children[0].children[1].value, "*****@*****.**")

        qs = TestUser.objects.filter(username="******").exclude(email="*****@*****.**")
        query = normalize_query(transform_query(
            connections['default'],
            qs.query
        ))


        self.assertTrue(2, len(query.where.children[0].children))
        self.assertEqual(query.where.connector, "OR")
        self.assertEqual(query.where.children[0].connector, "AND")
        self.assertEqual(query.where.children[0].children[0].column, "username")
        self.assertEqual(query.where.children[0].children[0].operator, "=")
        self.assertEqual(query.where.children[0].children[0].value, "test")
        self.assertEqual(query.where.children[0].children[1].column, "email")
        self.assertEqual(query.where.children[0].children[1].operator, "<")
        self.assertEqual(query.where.children[0].children[1].value, "*****@*****.**")
        self.assertEqual(query.where.children[1].children[0].column, "username")
        self.assertEqual(query.where.children[1].children[0].operator, "=")
        self.assertEqual(query.where.children[1].children[0].value, "test")
        self.assertEqual(query.where.children[1].children[1].column, "email")
        self.assertEqual(query.where.children[1].children[1].operator, ">")
        self.assertEqual(query.where.children[1].children[1].value, "*****@*****.**")


        instance = Relation(pk=1)
        qs = instance.related_set.filter(headline__startswith='Fir')

        query = normalize_query(transform_query(
            connections['default'],
            qs.query
        ))

        self.assertTrue(2, len(query.where.children[0].children))
        self.assertEqual(query.where.connector, "OR")
        self.assertEqual(query.where.children[0].connector, "AND")
        self.assertEqual(query.where.children[0].children[0].column, "relation_id")
        self.assertEqual(query.where.children[0].children[0].operator, "=")
        self.assertEqual(query.where.children[0].children[0].value, 1)
        self.assertEqual(query.where.children[0].children[1].column, "_idx_startswith_headline")
        self.assertEqual(query.where.children[0].children[1].operator, "=")
        self.assertEqual(query.where.children[0].children[1].value, u"Fir")
Exemplo n.º 11
0
    def test_or_queries(self):
        from .test_connector import TestUser
        qs = TestUser.objects.filter(
            username="******").filter(
            Q(username__in=["ruby", "jruby"]) | (Q(username="******") & ~Q(username="******"))
        )

        query = normalize_query(transform_query(
            connections['default'],
            qs.query
        ))

        # After IN and != explosion, we have...
        # (AND: (username='******', OR: (username='******', username='******', AND: (username='******', AND: (username < 'perl', username > 'perl')))))

        # Working backwards,
        # AND: (username < 'perl', username > 'perl') can't be simplified
        # AND: (username='******', AND: (username < 'perl', username > 'perl')) can become (OR: (AND: username = '******', username < 'perl'), (AND: username='******', username > 'perl'))
        # OR: (username='******', username='******', (OR: (AND: username = '******', username < 'perl'), (AND: username='******', username > 'perl')) can't be simplified
        # (AND: (username='******', OR: (username='******', username='******', (OR: (AND: username = '******', username < 'perl'), (AND: username='******', username > 'perl'))
        # becomes...
        # (OR: (AND: username='******', username = '******'), (AND: username='******', username='******'), (AND: username='******', username='******', username < 'perl') \
        #      (AND: username='******', username='******', username > 'perl')

        self.assertTrue(4, len(query.where.children[0].children))

        self.assertEqual(query.where.children[0].connector, "AND")
        self.assertEqual(query.where.children[0].children[0].column, "username")
        self.assertEqual(query.where.children[0].children[0].operator, "=")
        self.assertEqual(query.where.children[0].children[0].value, "python")
        self.assertEqual(query.where.children[0].children[1].column, "username")
        self.assertEqual(query.where.children[0].children[1].operator, "=")
        self.assertEqual(query.where.children[0].children[1].value, "php")
        self.assertEqual(query.where.children[0].children[2].column, "username")
        self.assertEqual(query.where.children[0].children[2].operator, "<")
        self.assertEqual(query.where.children[0].children[2].value, "perl")

        self.assertEqual(query.where.children[1].connector, "AND")
        self.assertEqual(query.where.children[1].children[0].column, "username")
        self.assertEqual(query.where.children[1].children[0].operator, "=")
        self.assertEqual(query.where.children[1].children[0].value, "python")
        self.assertEqual(query.where.children[1].children[1].column, "username")
        self.assertEqual(query.where.children[1].children[1].operator, "=")
        self.assertEqual(query.where.children[1].children[1].value, "jruby")

        self.assertEqual(query.where.children[2].connector, "AND")
        self.assertEqual(query.where.children[2].children[0].column, "username")
        self.assertEqual(query.where.children[2].children[0].operator, "=")
        self.assertEqual(query.where.children[2].children[0].value, "python")
        self.assertEqual(query.where.children[2].children[1].column, "username")
        self.assertEqual(query.where.children[2].children[1].operator, "=")
        self.assertEqual(query.where.children[2].children[1].value, "php")
        self.assertEqual(query.where.children[2].children[2].column, "username")
        self.assertEqual(query.where.children[2].children[2].operator, ">")
        self.assertEqual(query.where.children[2].children[2].value, "perl")

        self.assertEqual(query.where.connector, "OR")
        self.assertEqual(query.where.children[3].connector, "AND")
        self.assertEqual(query.where.children[3].children[0].column, "username")
        self.assertEqual(query.where.children[3].children[0].operator, "=")
        self.assertEqual(query.where.children[3].children[0].value, "python")
        self.assertEqual(query.where.children[3].children[1].column, "username")
        self.assertEqual(query.where.children[3].children[1].operator, "=")
        self.assertEqual(query.where.children[3].children[1].value, "ruby")

        qs = TestUser.objects.filter(username="******") | TestUser.objects.filter(username="******")

        query = normalize_query(transform_query(
            connections['default'],
            qs.query
        ))

        self.assertEqual(query.where.connector, "OR")
        self.assertEqual(2, len(query.where.children))
        self.assertTrue(query.where.children[0].is_leaf)
        self.assertEqual("cheese", query.where.children[0].value)
        self.assertTrue(query.where.children[1].is_leaf)
        self.assertEqual("test", query.where.children[1].value)

        qs = TestUser.objects.using("default").filter(username__in=set()).values_list('email')

        with self.assertRaises(EmptyResultSet):
            query = normalize_query(transform_query(
                connections['default'],
                qs.query
            ))

        qs = TestUser.objects.filter(username__startswith='Hello') |  TestUser.objects.filter(username__startswith='Goodbye')

        query = normalize_query(transform_query(
            connections['default'],
            qs.query
        ))

        self.assertEqual(2, len(query.where.children))
        self.assertEqual("_idx_startswith_username", query.where.children[0].column)
        self.assertEqual(u"Goodbye", query.where.children[0].value)
        self.assertEqual("_idx_startswith_username", query.where.children[1].column)
        self.assertEqual(u"Hello", query.where.children[1].value)


        qs = TestUser.objects.filter(pk__in=[1, 2, 3])
        query = normalize_query(transform_query(
            connections['default'],
            qs.query
        ))

        self.assertEqual(3, len(query.where.children))
        self.assertEqual("__key__", query.where.children[0].column)
        self.assertEqual("__key__", query.where.children[1].column)
        self.assertEqual("__key__", query.where.children[2].column)
        self.assertEqual({
                datastore.Key.from_path(TestUser._meta.db_table, 1, namespace=DEFAULT_NAMESPACE),
                datastore.Key.from_path(TestUser._meta.db_table, 2, namespace=DEFAULT_NAMESPACE),
                datastore.Key.from_path(TestUser._meta.db_table, 3, namespace=DEFAULT_NAMESPACE),
            }, {
                query.where.children[0].value,
                query.where.children[1].value,
                query.where.children[2].value,
            }
        )

        qs = TestUser.objects.filter(pk__in=[1, 2, 3]).filter(username="******")
        query = normalize_query(transform_query(
            connections['default'],
            qs.query
        ))

        self.assertEqual(3, len(query.where.children))
        self.assertEqual("__key__", query.where.children[0].children[0].column)
        self.assertEqual("test", query.where.children[0].children[1].value)

        self.assertEqual("__key__", query.where.children[1].children[0].column)
        self.assertEqual("test", query.where.children[0].children[1].value)

        self.assertEqual("__key__", query.where.children[2].children[0].column)
        self.assertEqual("test", query.where.children[0].children[1].value)

        self.assertEqual({
                datastore.Key.from_path(TestUser._meta.db_table, 1, namespace=DEFAULT_NAMESPACE),
                datastore.Key.from_path(TestUser._meta.db_table, 2, namespace=DEFAULT_NAMESPACE),
                datastore.Key.from_path(TestUser._meta.db_table, 3, namespace=DEFAULT_NAMESPACE),
            }, {
                query.where.children[0].children[0].value,
                query.where.children[1].children[0].value,
                query.where.children[2].children[0].value,
            }
        )
Exemplo n.º 12
0
    def test_and_queries(self):
        from .test_connector import TestUser
        qs = TestUser.objects.filter(username="******").all()

        query = normalize_query(transform_query(
            connections['default'],
            qs.query
        ))

        self.assertTrue(1, len(query.where.children))
        self.assertEqual(query.where.children[0].children[0].column, "username")
        self.assertEqual(query.where.children[0].children[0].operator, "=")
        self.assertEqual(query.where.children[0].children[0].value, "test")

        qs = TestUser.objects.filter(username="******", email="*****@*****.**")

        query = normalize_query(transform_query(
            connections['default'],
            qs.query
        ))

        self.assertTrue(2, len(query.where.children[0].children))
        self.assertEqual(query.where.connector, "OR")
        self.assertEqual(query.where.children[0].connector, "AND")
        self.assertEqual(query.where.children[0].children[0].column, "username")
        self.assertEqual(query.where.children[0].children[0].operator, "=")
        self.assertEqual(query.where.children[0].children[0].value, "test")
        self.assertEqual(query.where.children[0].children[1].column, "email")
        self.assertEqual(query.where.children[0].children[1].operator, "=")
        self.assertEqual(query.where.children[0].children[1].value, "*****@*****.**")

        qs = TestUser.objects.filter(username="******").exclude(email="*****@*****.**")
        query = normalize_query(transform_query(
            connections['default'],
            qs.query
        ))


        self.assertTrue(2, len(query.where.children[0].children))
        self.assertEqual(query.where.connector, "OR")
        self.assertEqual(query.where.children[0].connector, "AND")
        self.assertEqual(query.where.children[0].children[0].column, "username")
        self.assertEqual(query.where.children[0].children[0].operator, "=")
        self.assertEqual(query.where.children[0].children[0].value, "test")
        self.assertEqual(query.where.children[0].children[1].column, "email")
        self.assertEqual(query.where.children[0].children[1].operator, "<")
        self.assertEqual(query.where.children[0].children[1].value, "*****@*****.**")
        self.assertEqual(query.where.children[1].children[0].column, "username")
        self.assertEqual(query.where.children[1].children[0].operator, "=")
        self.assertEqual(query.where.children[1].children[0].value, "test")
        self.assertEqual(query.where.children[1].children[1].column, "email")
        self.assertEqual(query.where.children[1].children[1].operator, ">")
        self.assertEqual(query.where.children[1].children[1].value, "*****@*****.**")


        instance = Relation(pk=1)
        qs = instance.related_set.filter(headline__startswith='Fir')

        query = normalize_query(transform_query(
            connections['default'],
            qs.query
        ))

        self.assertTrue(2, len(query.where.children[0].children))
        self.assertEqual(query.where.connector, "OR")
        self.assertEqual(query.where.children[0].connector, "AND")
        self.assertEqual(query.where.children[0].children[0].column, "relation_id")
        self.assertEqual(query.where.children[0].children[0].operator, "=")
        self.assertEqual(query.where.children[0].children[0].value, 1)
        self.assertEqual(query.where.children[0].children[1].column, "_idx_startswith_headline")
        self.assertEqual(query.where.children[0].children[1].operator, "=")
        self.assertEqual(query.where.children[0].children[1].value, u"Fir")