예제 #1
0
    def test_recursive_traversal_on_same_model_from_multiple_objects(self):
        blog = Blog(name='Weird CS Terms')
        blog.save()
        headlines = ('Foo', 'Bar', 'Baz', 'Faz')
        entries = [
            Entry(headline=headline, blog=blog) for headline in headlines
        ]
        for entry in entries:
            entry.save()
        entries[1].response_to = entries[0]
        entries[1].save()
        entries[2].response_to = entries[1]
        entries[2].save()
        entries[3].response_to = entries[2]
        entries[3].save()

        qs = 'Entry(id__in=[%s,%s]) Entry.responses*' % (self.entries[0].id,
                                                         entries[0].id)
        query = Query(qs)
        result = query()
        self.assertEquals(result[0][0][1], -1)
        assertQueryResultsEqual(self, result[0][0][0], [
            (self.entries[0], None),
            (self.entries[1], None),
            (self.entries[2], None),
            (self.entries[3], None),
            (entries[0], None),
            (entries[1], None),
            (entries[2], None),
            (entries[3], None),
        ])
        self.assertEquals(result[1], Entry)
예제 #2
0
    def test_recursive_traversal_does_not_get_stuck_in_loop(self):
        blog = Blog(name='Weird CS Terms')
        blog.save()
        headlines = ('Foo', 'Bar', 'Baz', 'Faz')
        entries = [
            Entry(headline=headline, blog=blog) for headline in headlines
        ]
        for entry in entries:
            entry.save()
        entries[1].response_to = entries[0]
        entries[1].save()
        entries[2].response_to = entries[1]
        entries[2].save()
        entries[3].response_to = entries[2]
        entries[3].save()
        entries[0].response_to = entries[3]
        entries[0].save()

        qs = 'Entry(id__in=[%s]) Entry.responses*' % (entries[0].id, )
        query = Query(qs)
        result = query()
        self.assertEquals(result[0][0][1], -1)
        assertQueryResultsEqual(self, result[0][0][0], [
            (entries[0], None),
            (entries[1], None),
            (entries[2], None),
            (entries[3], None),
        ])
        self.assertEquals(result[1], Entry)
예제 #3
0
    def test_sub_query_results_map_to_next_results_correctly(self):
        qs = 'Blog(%s) Blog.entry_set (Entry.authors) Entry.comment_set' % self.blogs[
            0].pk
        query = Query(qs)
        result = query()

        self.assertEquals(result[0][0][1], -1)
        assertQueryResultsEqual(self, result[0][0][0],
                                [(self.entries[0], None),
                                 (self.entries[1], None),
                                 (self.entries[2], None)])

        self.assertEquals(result[0][1][1], 0)
        assertQueryResultsEqual(self, result[0][1][0], [
            (self.authors[0], self.entries[0].pk),
            (self.authors[1], self.entries[0].pk),
            (self.authors[1], self.entries[1].pk),
            (self.authors[2], self.entries[1].pk),
            (self.authors[2], self.entries[2].pk),
            (self.authors[0], self.entries[2].pk),
        ])

        self.assertEquals(result[0][2][1], 0)
        assertQueryResultsEqual(self, result[0][2][0],
                                [(self.comments[0], self.entries[0].pk),
                                 (self.comments[1], self.entries[1].pk),
                                 (self.comments[2], self.entries[2].pk)])

        self.assertEquals(len(result[0]), 3)
        self.assertEquals(result[1], Comment)
예제 #4
0
 def test_recursive_search_with_filter_does_not_return_starting_node_if_it_does_not_pass_filter(
         self):
     qs = 'Blog(%s) Blog.entry_set(headline__icontains="MySQL") \
       Entry.responses(headline__icontains="graph")*' % self.blog.pk
     query = Query(qs)
     result = query()
     self.assertEquals(result, ([([], -1, [])], None))
    def test_join_m2m_relationship(self):
        # M2M relationship defined is symmetrical, which means if A is friend of B,
        # B is also friend of A. Below asserts check this assumption.
        self.assertItemsEqual(self.authors[0].friends.all(),
                              [self.authors[1], self.authors[2]])
        self.assertItemsEqual(self.authors[1].friends.all(),
                              [self.authors[0], self.authors[2]])
        self.assertItemsEqual(self.authors[2].friends.all(),
                              [self.authors[0], self.authors[1]])

        qs = 'Blog(%s) Blog.entry_set Entry.authors, Author.friends' % self.blogs[
            0].pk
        query = Query(qs)
        result = query()
        self.assertEquals(result[0][0][1], -1)
        assertQueryResultsEqual(self, result[0][0][0], [
            (self.authors[0], None),
            (self.authors[1], None),
            (self.authors[2], None),
        ])
        self.assertEquals(result[0][1][1], 0)
        assertQueryResultsEqual(self, result[0][1][0], [
            (self.authors[1], self.authors[0].pk),
            (self.authors[2], self.authors[0].pk),
            (self.authors[0], self.authors[1].pk),
            (self.authors[2], self.authors[1].pk),
            (self.authors[0], self.authors[2].pk),
            (self.authors[1], self.authors[2].pk),
        ])
        self.assertEquals(result[1], Author)
 def test_query_traversing_to_fk_object(self):
     qs = 'Entry(%s) Entry.blog' % self.entries[0].pk
     query = Query(qs)
     result = query()
     self.assertEquals(result[0][0][1], -1)
     assertQueryResultsEqual(self, result[0][0][0], [(self.blogs[0], None)])
     self.assertEquals(result[1], Blog)
예제 #7
0
 def test_reverse_lookup_in_one(self):
     qs = 'Blog(id={}), Blog.entry_set ?(Entry.related_blog_)'.format(
         self.blog.pk)
     query = Query(qs)
     result = query()
     self.assertEqual(len(connection.queries) - self.query_count, 4)
     self.assertEqual(len(result[0][1][0]), self.N)
예제 #8
0
    def test_left_join_with_no_left_join_results(self):
        qs = 'Blog(%s) Blog.entry_set ?(Entry.authors(name__icontains="Potter")) Entry.blog' \
               % self.blogs[0].pk
        query = Query(qs)
        result = query()

        self.assertEquals(result[0][0][1], -1)
        assertQueryResultsEqual(self, result[0][0][0],
                                [(self.entries[0], None),
                                 (self.entries[1], None),
                                 (self.entries[2], None)])

        self.assertEquals(result[0][1][1], 0)
        assertQueryResultsEqual(self, result[0][1][0],
                                [(None, self.entries[0].pk),
                                 (None, self.entries[1].pk),
                                 (None, self.entries[2].pk)])

        self.assertEquals(result[0][2][1], 0)
        assertQueryResultsEqual(self, result[0][2][0],
                                [(self.blogs[0], self.entries[0].pk),
                                 (self.blogs[0], self.entries[1].pk),
                                 (self.blogs[0], self.entries[2].pk)])

        self.assertEquals(len(result[0]), 3)
        self.assertEquals(result[1], Blog)
예제 #9
0
 def test_recursive_search_for_last_nodes_of_relationship(self):
     qs = 'Blog(%s) Blog.entry_set(headline__icontains="MySQL") Entry.responses$' % self.blog.pk
     query = Query(qs)
     result = query()
     self.assertEquals(result[0][0][1], -1)
     assertQueryResultsEqual(self, result[0][0][0],
                             [(self.entries[3], None)])
     self.assertEquals(result[1], Entry)
예제 #10
0
    def test_explicit_count_and_filter(self):
        qs = 'Blog(%s) Blog.entry_set.count(authors).filter(authors__count=2)' % self.blogs[
            0].pk
        query = Query(qs)
        result = query()
        self.assertEquals(result[0][0][1], -1)
        assertQueryResultsEqual(self, result[0][0][0],
                                [(self.entries[0], None),
                                 (self.entries[1], None),
                                 (self.entries[2], None)])
        self.assertEquals(result[1], Entry)

        qs = 'Blog(%s) Blog.entry_set.count(authors).filter(authors__count=1)' % self.blogs[
            0].pk
        query = Query(qs)
        result = query()
        self.assertEquals(result, ([([], -1, None)], None))
예제 #11
0
 def test_query_starting_with_id(self):
   qs = 'Blog(%s)' % self.blog.pk
   query = Query(qs)
   result = query()
   self.assertEquals(len(result[0]), 1)
   self.assertEquals(result[0][0][1], -1)
   assertQueryResultsEqual(self, result[0][0][0], [(self.blog, None)])
   self.assertEquals(result[1], Blog)
 def test_query_starting_with_filter(self):
     qs = 'Entry(id=%s)' % self.entries[0].pk
     query = Query(qs)
     result = query()
     self.assertEquals(result[0][0][1], -1)
     assertQueryResultsEqual(self, result[0][0][0],
                             [(self.entries[0], None)])
     self.assertEquals(result[1], Entry)
예제 #13
0
 def test_implicit_filter(self):
     qs = 'Blog(%s) Blog.authors(name__icontains="Smith")' % self.blogs[0].pk
     query = Query(qs)
     result = query()
     self.assertEquals(result[0][0][1], -1)
     assertQueryResultsEqual(self, result[0][0][0],
                             [(self.authors[0], None)])
     self.assertEquals(result[1], Author)
예제 #14
0
 def test_page_then_get_related(self):
     qs = 'Blog(id__isnull=False).order(name).first(2), Blog.entry_set'
     query = Query(qs)
     result = query()
     assertQueryResultsEqual(self, result[0][0][0], [(self.blogs[0], None),
                                                     (self.blogs[2], None)])
     assertQueryResultsEqual(self, result[0][1][0], [(self.entries[0], 1),
                                                     (self.entries[2], 3)])
예제 #15
0
 def test_recursive_search_for_first_node_matching_filter(self):
     qs = 'Blog(%s) Blog.entry_set(headline__icontains="MySQL") \
       Entry.responses(headline__icontains="graph")?' % self.blog.pk
     query = Query(qs)
     result = query()
     self.assertEquals(result[0][0][1], -1)
     assertQueryResultsEqual(self, result[0][0][0],
                             [(self.entries[2], None)])
     self.assertEquals(result[1], Entry)
예제 #16
0
 def test_explicit_chained_filters(self):
     qs = 'Blog(%s) Blog.authors.filter(name__icontains="Jo").exclude(name__icontains="Smith")' % self.blogs[
         0].pk
     query = Query(qs)
     result = query()
     self.assertEquals(result[0][0][1], -1)
     assertQueryResultsEqual(self, result[0][0][0],
                             [(self.authors[2], None)])
     self.assertEquals(result[1], Author)
예제 #17
0
 def test_recursive_search_with_filter_finds_starting_node(self):
     qs = 'Blog(%s) Blog.entry_set(headline__icontains="MySQL") \
       Entry.responses(headline__icontains="MySQL")*' % self.blog.pk
     query = Query(qs)
     result = query()
     self.assertEquals(result[0][0][1], -1)
     assertQueryResultsEqual(self, result[0][0][0],
                             [(self.entries[0], None)])
     self.assertEquals(result[1], Entry)
예제 #18
0
    def test_query_traversing_to_one_to_one_object(self):
        person = Person(gender='unknown')
        person.save()

        author = Author(name='Al', age=99, person=person)
        author.save()

        qs = 'Author(name="Al") Author.person'
        query = Query(qs)
        result = query()
        assertQueryResultsEqual(self, result[0][0][0], [(person, None)])
        self.assertEquals(result[1], Person)

        # go back
        qs = 'Person(gender="unknown") Person.author'
        query = Query(qs)
        result = query()
        assertQueryResultsEqual(self, result[0][0][0], [(author, None)])
        self.assertEquals(result[1], Author)
 def test_query_traversing_with_filters(self):
     qs = 'Blog(%s) Blog.authors(name__icontains="Smith") Author.entry_set' % self.blogs[
         0].pk
     query = Query(qs)
     result = query()
     self.assertEquals(result[0][0][1], -1)
     assertQueryResultsEqual(self, result[0][0][0],
                             [(self.entries[0], None),
                              (self.entries[2], None)])
     self.assertEquals(result[1], Entry)
 def test_query_traversing_with_function_and_from_M2M_objects(self):
     qs = 'Blog(%s) Blog.authors Author.entry_set' % self.blogs[0].pk
     query = Query(qs)
     result = query()
     self.assertEquals(result[0][0][1], -1)
     assertQueryResultsEqual(self, result[0][0][0],
                             [(self.entries[0], None),
                              (self.entries[1], None),
                              (self.entries[2], None)])
     self.assertEquals(result[1], Entry)
예제 #21
0
 def test_recursive_search_with_filter_stops_traversal_after_mismatch(self):
     qs = 'Blog(%s) Blog.entry_set(headline__icontains="MySQL") \
       Entry.responses(headline__icontains="relational")*' % self.blog.pk
     query = Query(qs)
     result = query()
     self.assertEquals(result[0][0][1], -1)
     assertQueryResultsEqual(self, result[0][0][0],
                             [(self.entries[0], None),
                              (self.entries[1], None)])
     self.assertEquals(result[1], Entry)
예제 #22
0
 def test_explicit_avg_and_filter(self):
     qs = 'Blog(%s) Blog.entry_set.avg(authors__age).filter(authors__age__avg__gt=25)' % self.blogs[
         0].pk
     query = Query(qs)
     result = query()
     self.assertEquals(result[0][0][1], -1)
     assertQueryResultsEqual(self, result[0][0][0],
                             [(self.entries[1], None),
                              (self.entries[2], None)])
     self.assertEquals(result[1], Entry)
 def test_query_traversing_to_M2M_objects(self):
     qs = 'Blog(%s) Blog.entry_set Entry.authors' % self.blogs[0].pk
     query = Query(qs)
     result = query()
     self.assertEquals(result[0][0][1], -1)
     assertQueryResultsEqual(self, result[0][0][0],
                             [(self.authors[0], None),
                              (self.authors[1], None),
                              (self.authors[2], None)])
     self.assertEquals(result[1], Author)
예제 #24
0
    def test_or_queries_matching_nothing(self):
        qs = 'Blog(%s), ' % self.blogs[0].pk +\
             '(Blog.entry_set(headline__icontains="Foo")) | (Blog.entry_set(headline__icontains="Bar")), '+\
             'Entry.authors'
        query = Query(qs)
        result = query()
        self.assertEquals(len(result[0]), 3)

        assertQueryResultsEqual(self, result[0][0][0], [(self.blogs[0], None)])
        self.assertEquals(result[0][1], ([], 0, None))
        self.assertEquals(result[0][2], ([], 1, None))
예제 #25
0
 def test_filtering_queries_without_join(self):
     qs = 'Blog(%s) +(Blog.entry_set) Blog.entry_set' % self.blogs[0].pk
     query = Query(qs)
     result = query()
     self.assertEquals(result[0][0][1], -1)
     assertQueryResultsEqual(self, result[0][0][0],
                             [(self.entries[0], None),
                              (self.entries[1], None),
                              (self.entries[2], None)])
     self.assertEquals(len(result[0]), 1)
     self.assertEquals(result[1], Entry)
 def test_query_with_m2m_relationship(self):
     qs = 'Blog(%s) Blog.entry_set Entry.authors Author.friends' % self.blogs[
         0].pk
     query = Query(qs)
     result = query()
     self.assertEquals(result[0][0][1], -1)
     assertQueryResultsEqual(self, result[0][0][0], [
         (self.authors[1], None),
         (self.authors[2], None),
         (self.authors[0], None),
     ])
     self.assertEquals(result[1], Author)
예제 #27
0
 def test_first_set_of_results_are_unique_and_not_separated_by_objects_from_first_relation(
         self):
     qs = 'Blog(name__icontains="Databases") Blog.entry_set Entry.authors'
     query = Query(qs)
     result = query()
     self.assertEquals(result[0][0][1], -1)
     assertQueryResultsEqual(self, result[0][0][0],
                             [(self.authors[0], None),
                              (self.authors[1], None),
                              (self.authors[2], None)])
     self.assertEquals(len(result[0]), 1)
     self.assertEquals(result[1], Author)
예제 #28
0
 def test_recursive_traversal_with_filter_does_not_return_starting_node_if_it_does_not_pass_filter(
         self):
     qs = 'Blog(%s) Blog.entry_set(headline__icontains="MySQL") \
       Entry.responses(headline__icontains="graph")**' % self.blog.pk
     query = Query(qs)
     result = query()
     self.assertEquals(result[0][0][1], -1)
     assertQueryResultsEqual(self, result[0][0][0], [
         (self.entries[2], None),
         (self.entries[3], None),
     ])
     self.assertEquals(result[1], Entry)
예제 #29
0
 def test_recursive_traversal_from_same_model(self):
     qs = 'Entry(%s) Entry.responses*' % self.entries[0].id
     query = Query(qs)
     result = query()
     self.assertEquals(result[0][0][1], -1)
     assertQueryResultsEqual(self, result[0][0][0], [
         (self.entries[0], None),
         (self.entries[1], None),
         (self.entries[2], None),
         (self.entries[3], None),
     ])
     self.assertEquals(result[1], Entry)
예제 #30
0
 def test_recursive_search_with_no_criteria(self):
     qs = 'Blog(%s) Blog.entry_set(headline__icontains="MySQL") Entry.responses*' % self.blog.pk
     query = Query(qs)
     result = query()
     self.assertEquals(result[0][0][1], -1)
     assertQueryResultsEqual(self, result[0][0][0], [
         (self.entries[0], None),
         (self.entries[1], None),
         (self.entries[2], None),
         (self.entries[3], None),
     ])
     self.assertEquals(result[1], Entry)