def test_thesefy_doesnot_messup_identities(self): from itertools import izip 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 izip(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_cotraverse_expression(): from xoutil.compat import zip from xotl.ql.expressions import is_a 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)) filters = list(query.filters) person, partner = query.selection person_is_a_person = is_a(person, Person) partner_is_a_person = is_a(partner, Person) rel_token = query.tokens[-1] rel_subject = rel_token.expression.subject rel_obj = rel_token.expression.obj with context(UNPROXIFING_CONTEXT): assert person != partner assert person_is_a_person in filters assert partner_is_a_person in filters expected_terms_order = [person, partner, rel_token.expression, rel_subject, person, rel_obj, partner] assert expected_terms_order == list(cotraverse_expression(query)) assert UNPROXIFING_CONTEXT not in context
def test_cofind_tokens(self): from itertools import izip from xotl.ql.expressions import is_a from xotl.ql.translate import cofind_tokens @thesefy class Person(object): pass @thesefy class Partnership(object): pass query = these((person, partner) for person, partner in izip(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) # left filter are is_a(rel, Partnership) and the explicit we see in # the query expression self.assertIs(2, len(filters)) rel_is_a = next(f for f in filters if f.operation == is_a) filters.remove(rel_is_a) # there are 4 named instances in the left filter # (rel.subject == person) & (rel.obj == partner) self.assertIs(4, len(list(cofind_tokens(filters[0]))))