def test_translation_with_call_of_a_function(): from xoutil.iterators import zip from xotl.ql.translation.py import naive_translation @thesefy class Universe(int): pass Universe.this_instances = [ Universe(i) for i in range(2, 10)] + ['invalid'] def gcd(a, b): while a % b != 0: a, b = b, a % b return b expected = set( (a, b) for a in range(2, 10) for b in range(2, 10) if a > b and gcd(a, b) == 1 ) assert expected == set([(3, 2), (4, 3), (5, 2), (5, 3), (5, 4), (6, 5), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6), (8, 3), (8, 5), (8, 7), (9, 2), (9, 4), (9, 5), (9, 7), (9, 8)]) query = get_query_object( (a, b) for a, b in zip(Universe, Universe) if a > b and gcd(a, b) == 1 ) plan = naive_translation(query) assert set(plan()) == set([(3, 2), (4, 3), (5, 2), (5, 3), (5, 4), (6, 5), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6), (8, 3), (8, 5), (8, 7), (9, 2), (9, 4), (9, 5), (9, 7), (9, 8)]) query = get_query_object( ((a, b) for a, b in zip(Universe, Universe) if a > b and gcd(a, b) == 1), offset=100 ) plan = naive_translation(query) assert len(list(plan())) == 0
def test_named_terms_matches_a_token(): ''' Ensures that all terms are named, and they are bound to a token that is in the query. ''' from xoutil.iterators import zip from xotl.ql.core import thesefy from xotl.ql.translation import cotraverse_expression @thesefy class Person(object): pass @thesefy class Partnership(object): pass query = these((person, partner) for person, partner in zip(Person, Person) for rel in Partnership if (rel.subject == person) & (rel.obj == partner) if person.age > 35) tokens = [tk.expression for tk in query.tokens] matches_token = lambda term: (term.name and ( term.binding.expression in tokens or matches_token(term.parent))) with context(UNPROXIFING_CONTEXT): assert all(matches_token(term) for term in cotraverse_expression(*query.filters))
def test_worst_case_must_have_3_filters_and_3_tokens(): from xoutil.iterators import zip query = these(person for person, partner in zip(this('person'), this('partner')) for rel in this('relation') if rel.type == 'partnership' if rel.subject == person if rel.object == partner if partner.age > 32) filters = list(query.filters) tokens = [tk.expression for tk in query.tokens] person, partner, rel = this('person'), this('partner'), this('relation') expected_rel_type_filter = rel.type == 'partnership' expected_rel_subject_filter = rel.subject == person expected_rel_obj_filter = rel.object == partner expected_partner_age = partner.age > 32 with context(UNPROXIFING_CONTEXT): assert len(filters) == 4 assert expected_rel_type_filter in filters assert expected_rel_subject_filter in filters assert expected_rel_obj_filter in filters assert expected_partner_age in filters assert len(tokens) == 3 assert person in tokens assert rel in tokens assert partner in tokens
def test_thesefy_doesnot_messup_identities(self): from xoutil.iterators import zip from xotl.ql.core import thesefy from xotl.ql.expressions import is_a @thesefy class Person(object): pass @thesefy class Partnership(object): pass query = these((person, partner) for person, partner in zip(Person, Person) for rel in Partnership if (rel.subject == person) & (rel.obj == partner)) filters = list(query.filters) person, partner = query.selection person_is_a_person = is_a(person, Person) partner_is_a_person = is_a(partner, Person) with context(UNPROXIFING_CONTEXT): self.assertNotEqual(person, partner) self.assertIn(person_is_a_person, filters) self.assertIn(partner_is_a_person, filters) filters.remove(person_is_a_person) filters.remove(partner_is_a_person)
def test_is_a_partnership_is_not_forgotten(): from xoutil.iterators import zip query = these((person, partner) for person, partner in zip(this('person'), this('partner')) for rel in this('relation') if rel.type == 'partnership' if (rel.subject == person) & (rel.object == partner)) filters = list(query.filters) expected_rel_type = this('relation').type == 'partnership' with context(UNPROXIFING_CONTEXT): assert expected_rel_type in filters assert len(filters) == 2
def test_theres_a_token_for_partnership(): from xoutil.iterators import zip query = these((person, partner) for person, partner in zip(this('person'), this('partner')) for rel in this('relation') if rel.type == 'partnership' if (rel.subject == person) & (rel.object == partner)) tokens = [tk.expression for tk in query.tokens] person, partner, rel = this('person'), this('partner'), this('relation') with context(UNPROXIFING_CONTEXT): assert len(tokens) == 3 assert rel in tokens assert person in tokens assert partner in tokens