Exemple #1
0
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
Exemple #2
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))
Exemple #3
0
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
Exemple #4
0
    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)
Exemple #5
0
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
Exemple #6
0
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