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)
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)
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)
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)
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)
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)
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)
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))
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)
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)
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)])
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)
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)
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)
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)
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)
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)
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))
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)
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)
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)
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)
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)