class TestUnionGroup(unittest.TestCase): def setUp(self): self.store = TripleStore() self.store.add_triples(('a', 'name', 'name-a'), ('b', 'name', 'name-b'), ('a', 'weight', 'weight-a'), ('b', 'size', 'size-b')) self.p = UnionGroup(Pattern(self.store, VariableExpression('id'), LiteralExpression('name'), VariableExpression('name')), Pattern(self.store, VariableExpression('id'), LiteralExpression('weight'), VariableExpression('weight'))) def test_match_empty_solution(self): self.assertEqual( [dict(id='a', name='name-a'), dict(id='b', name='name-b'), dict(id='a', weight='weight-a')], list(self.p.match({})) ) def test_match_with_constraining_solution(self): self.assertEqual( [dict(id='a', name='name-a'), dict(id='a', weight='weight-a')], list(self.p.match({'id': 'a'})) ) self.assertEqual( [dict(id='b', name='name-b'), dict(id='a', weight='weight-a', name='name-b')], list(self.p.match({'name': 'name-b'})) ) self.assertEqual( [], list(self.p.match({'id': 'c'})) )
class TestParsing(unittest.TestCase): def setUp(self): self.store = TripleStore() def test_parse_query_select(self): p = self.store.parse_query("""SELECT ?title WHERE { <http://example.org/book/book1> <http://purl.org/dc/elements/1.1/title> ?title . }""") self.assertTrue(hasattr(p, 'query')) _, variables, pattern = p.query self.assertEqual(1, len(variables)) self.assertTrue(isinstance(variables[0], VariableExpression)) self.assertEquals('title', variables[0].name) self.assertTrue(isinstance(pattern, Pattern)) triple = pattern.pattern self.assertEqual(3, len(triple)) self.assertEqual('http://example.org/book/book1', triple[0].value) self.assertEqual('http://purl.org/dc/elements/1.1/title', triple[1].value) self.assertEqual('title', triple[2].name) def test_parse_query_select_with_prefix(self): p = self.store.parse_query("""PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?x ?name WHERE { ?x foaf:name ?name }""") self.assertTrue(hasattr(p, 'prologue')) self.assertTrue(hasattr(p.prologue, 'prefixes')) prefixes = p.prologue.prefixes self.assertEqual(1, len(prefixes)) prefix = prefixes[0] self.assertTrue(hasattr(prefix, 'name')) self.assertEqual('foaf:', prefix.name) self.assertTrue(hasattr(prefix, 'value')) self.assertEqual('http://xmlns.com/foaf/0.1/', prefix.value) name, variables, pattern = p.query self.assertEqual(2, len(variables)) self.assertTrue(isinstance(variables[0], VariableExpression)) self.assertEquals('x', variables[0].name) self.assertTrue(isinstance(variables[1], VariableExpression)) self.assertEquals('name', variables[1].name) self.assertTrue(isinstance(pattern, Pattern)) triple = pattern.pattern self.assertTrue(isinstance(triple[0], VariableExpression)) self.assertEquals('x', triple[0].name) self.assertEqual('http://xmlns.com/foaf/0.1/name', triple[1].value) self.assertTrue(isinstance(triple[2], VariableExpression)) self.assertEqual('name', triple[2].name)
def setUp(self): self.store = TripleStore()
def setUp(self): self.store = TripleStore() self.store.add_triples(('a', 'name', 'name-a'), ('b', 'name', 'name-b'), ('a', 'weight', 'weight-a'), ('b', 'size', 'size-b'), ('a', 'height', 100))
class TestQuery(unittest.TestCase): def setUp(self): self.store = TripleStore() self.store.add_triples(('a', 'name', 'name-a'), ('b', 'name', 'name-b'), ('a', 'weight', 'weight-a'), ('b', 'size', 'size-b'), ('a', 'height', 100)) def test_query_simple(self): self.assertEqual( [('a', 'name-a'), ('b', 'name-b')], list(self.store.query('SELECT ?id ?name WHERE { ?id name ?name }')) ) def test_query_join(self): self.assertEqual( [('a', 'name-a', 'weight-a')], list(self.store.query('SELECT ?id ?name ?weight WHERE { ?id name ?name . ?id weight ?weight }')) ) def test_query_join_unmatchable(self): self.assertEqual( [], list(self.store.query('SELECT ?id ?weight WHERE { ?id name ?name . ?name weight ?weight }')) ) def test_query_union(self): self.assertEqual( [('a', 'name-a', None), ('b', 'name-b', None), ('a', None, 'weight-a')], list(self.store.query('SELECT ?id ?name ?weight WHERE { { ?id name ?name} UNION {?id weight ?weight} }')) ) def test_single_optional(self): self.assertEqual( [('a', 'name-a', 'weight-a'), ('b', 'name-b', None)], list(self.store.query('SELECT ?id ?value ?weight WHERE { ?id name ?value OPTIONAL {?id weight ?weight} }')) ) self.assertEqual( [('b', 'name-b', None)], list(self.store.query('SELECT ?id ?value ?weight WHERE { ?id name ?value OPTIONAL {?id weight ?weight} ?id size ?size }')) ) def test_multiple_optional(self): self.assertEqual( [('a', 'name-a', 'weight-a', None), ('b', 'name-b', None, 'size-b')], list(self.store.query('''SELECT ?id ?value ?weight ?size WHERE { ?id name ?value OPTIONAL {?id weight ?weight} OPTIONAL {?id size ?size} }''')) ) def test_group_optional(self): self.assertEqual( [('a', 'name-a', None, None), ('b', 'name-b', None, None)], list(self.store.query('''SELECT ?id ?value ?weight ?size WHERE { ?id name ?value OPTIONAL {?id weight ?weight . ?id size ?size} }''')) ) def test_star_has_right_column_order(self): q = self.store.query('SELECT * WHERE { ?id name ?name }') self.assertEqual(('id', 'name'), tuple(v.name for v in q.variables)) q = self.store.query('SELECT * WHERE { { ?id name ?name} UNION {?id weight ?weight} }') self.assertEqual(('id', 'name', 'weight'), tuple(v.name for v in q.variables)) q = self.store.query('SELECT * WHERE { ?id name ?value OPTIONAL {?id weight ?weight} }') self.assertEqual(('id', 'value', 'weight'), tuple(v.name for v in q.variables)) def test_filter(self): self.assertEqual( [(100,)], list(self.store.query('SELECT ?height WHERE { ?id height ?height FILTER (?height > 99) }')) ) self.assertEqual( [], list(self.store.query('SELECT ?height WHERE { ?id height ?height FILTER (?height > 100) }')) ) self.assertEqual( [(100,)], list(self.store.query('SELECT ?height WHERE { ?id height ?height FILTER (?height >= 100) }')) ) self.assertEqual( [], list(self.store.query('SELECT ?height WHERE { ?id height ?height FILTER (?height >= 101) }')) ) self.assertEqual( [(100,)], list(self.store.query('SELECT ?height WHERE { ?id height ?height FILTER (?height < 101) }')) ) self.assertEqual( [], list(self.store.query('SELECT ?height WHERE { ?id height ?height FILTER (?height < 100) }')) ) self.assertEqual( [(100,)], list(self.store.query('SELECT ?height WHERE { ?id height ?height FILTER (?height <= 100) }')) ) self.assertEqual( [], list(self.store.query('SELECT ?height WHERE { ?id height ?height FILTER (?height <= 99) }')) ) self.assertEqual( [], list(self.store.query('SELECT ?height WHERE { ?id height ?height FILTER (?height != 100) }')) ) self.assertEqual( [(100,)], list(self.store.query('SELECT ?height WHERE { ?id height ?height FILTER (?height != 101) }')) ) self.assertEqual( [], list(self.store.query('SELECT ?height WHERE { ?id height ?height FILTER (?height = 101) }')) ) self.assertEqual( [(100,)], list(self.store.query('SELECT ?height WHERE { ?id height ?height FILTER (?height = 100) }')) ) self.assertEqual( [(100,)], list(self.store.query('SELECT ?height WHERE { ?id height ?height FILTER (?height = 2*50) }')) ) def test_complex_filter(self): self.assertEqual( [('b', 'name', 'name-b')], list(self.store.query('SELECT ?id ?property ?value WHERE { ?id ?property ?value FILTER (regex(?value, "^name-") && ?id != "a")}')) ) self.assertEqual( [(100,)], list(self.store.query('SELECT ?height WHERE { ?id height ?height FILTER ((2* -?height) = 2* -100) }')) ) def test_order_by(self): self.assertEqual( [('a', 'name-a'), ('b', 'name-b')], list(self.store.query('SELECT ?id ?name WHERE { ?id name ?name } ORDER BY ?name')) ) self.assertEqual( [('a', 'name-a'), ('b', 'name-b')], list(self.store.query('SELECT ?id ?name WHERE { ?id name ?name } ORDER BY ASC(?name)')) ) self.assertEqual( [('b', 'name-b'), ('a', 'name-a')], list(self.store.query('SELECT ?id ?name WHERE { ?id name ?name } ORDER BY DESC(?name)')) ) def test_limit(self): self.assertEqual( [('a', 'name-a')], list(self.store.query('SELECT ?id ?name WHERE { ?id name ?name } ORDER BY ?name LIMIT 1')) ) def test_order_by(self): self.assertEqual( [('b', 'name-b')], list(self.store.query('SELECT ?id ?name WHERE { ?id name ?name } ORDER BY ?name OFFSET 1')) ) def test_distinct(self): self.assertEqual( set([('a',), ('b',)]), set(self.store.query('SELECT DISTINCT ?id WHERE { { ?id name ?name} UNION {?id weight ?weight} }')) )
def setUp(self): self.store = TripleStore() self.store.add_triples(('a', 'name', 'name-a'), ('b', 'name', 'name-b'), ('a', 'weight', 'weight-a'), ('b', 'size', 'size-b')) self.p = UnionGroup(Pattern(self.store, VariableExpression('id'), LiteralExpression('name'), VariableExpression('name')), Pattern(self.store, VariableExpression('id'), LiteralExpression('weight'), VariableExpression('weight')))