def test_cache_labels(self): """Does caching labels work?""" from amcat.models.language import Language lang = Language.objects.get(pk=1) codes = set( amcattest.create_test_code(label=l, language=lang) for l in "abcdef") morecodes = set( amcattest.create_test_code(label=l, language=lang) for l in "abcdef") h = amcattest.create_test_code(label="hidden", language=lang) B = amcattest.create_test_codebook(name="B") map(B.add_code, morecodes) A = amcattest.create_test_codebook(name="A") map(A.add_code, codes) A.add_code(h, hide=True) C = amcattest.create_test_codebook(name="C") A.add_base(C) C.add_base(B) n_bases = 3 clear_cache(Code) maxq = n_bases * 2 + 1 # base + codebookcodes per base, codes with self.checkMaxQueries(maxq, "Cache Codes"): self.assertEqual(set(A.get_codes(include_hidden=True)), codes | set([h]) | morecodes) with self.checkMaxQueries(1, "Cache labels"): # labels A.cache_labels(lang) with self.checkMaxQueries(0, "Cache labels again"): A.cache_labels(lang) A._cache_labels_languages = set() clear_cache(Code) with self.checkMaxQueries(2, "Cache labels directly"): # codes, labels A.cache_labels(lang) with self.checkMaxQueries(0, "Print labels"): for c in codes: c.get_label(lang) str(c) unicode(c) repr(c) with self.checkMaxQueries(0, "Print labels via hierarchy"): for c, _p in A.get_hierarchy(include_hidden=True): c.get_label(lang) str(c) unicode(c)
def test_object_cache(self): from amcat.models.project import Project pid = amcattest.create_test_project().id with self.checkMaxQueries(1, "Get project"): p = get_object(Project, pid) with self.checkMaxQueries(1, "Get cached project"): p2 = get_object(Project, pid) self.assertIs(p, p2) clear_cache(Project) with self.checkMaxQueries(1, "Get cleared project"): p3 = get_object(Project, pid) self.assertIsNot(p, p3) self.assertEqual(p, p3)
def test_get_codes(self): """Does get_codes work without using too many queries?""" codes = [amcattest.create_test_code(label=l) for l in "abcdef"] hiddencodes = [amcattest.create_test_code(label=l) for l in "abcdef"] B = amcattest.create_test_codebook(name="A") map(B.add_code, codes) B.add_code(hiddencodes[0]) A = amcattest.create_test_codebook(name="A") [A.add_code(c, hide=True) for c in hiddencodes] A.add_base(B) clear_cache(Code) with self.checkMaxQueries(2, "Bases for codebooks"): list(A.bases) list(B.bases) with self.checkMaxQueries(2, "Get Code ids"): self.assertEqual(set(A.get_code_ids()), set(c.id for c in codes)) clear_cache(Code) with self.checkMaxQueries(2, "Get Codes"): self.assertEqual(set(A.get_codes()), set(codes)) clear_cache(Code) with self.checkMaxQueries(2, "Hidden Codes"): self.assertEqual(set(A.get_codes(include_hidden=True)), set(codes) | set(hiddencodes)) with self.checkMaxQueries(0, "Cached codes per codebook"): self.assertEqual(set(A.get_codes(include_hidden=True)), set(codes) | set(hiddencodes))
def todo_test_nqueries(self): from amcat.models.coding.code import Code from amcat.tools.caching import clear_cache from amcat.models import Language l = Language.objects.create(id=13, label="query") A = amcattest.create_test_codebook(name="A") codes = [] N = 20 for i in range(N): code = amcattest.create_test_code(label="test") A.add_code(code) code.add_label(l, "query") codes.append(code) clear_cache(Code) with self.checkMaxQueries(7): # 3 for language, 2 for codes, 1 for bases, 1 for codebook t = GetQueries(codebook=A.id).run() result = set(tuple(row) for row in t) code = codes[3] self.assertIn((code.id, "test", "query"), result) self.assertEqual(len(result), N)
def test_nqueries(self): from amcat.models.coding.code import Code from amcat.tools.caching import clear_cache from amcat.models import Language l = Language.objects.create(id=13, label='query') A = amcattest.create_test_codebook(name="A") codes = [] N = 20 for i in range(N): code = amcattest.create_test_code(label="test") A.add_code(code) code.add_label(l, "query") codes.append(code) clear_cache(Code) with self.checkMaxQueries( 7): # 3 for language, 2 for codes, 1 for bases, 1 for codebook t = GetQueries(codebook=A.id).run() result = set(tuple(row) for row in t) code = codes[3] self.assertIn((code.id, "test", "query"), result) self.assertEqual(len(result), N)
def clear_codebook_cache(): """Clear the local codebook cache manually, ie in between test runs""" clear_cache(Codebook)