--- a/test/unittest_rqlrewrite.py Wed Jun 22 18:24:56 2011 +0200
+++ b/test/unittest_rqlrewrite.py Fri Jun 24 14:02:29 2011 +0200
@@ -33,7 +33,8 @@
config.bootstrap_cubes()
schema = config.load_schema()
from yams.buildobjs import RelationDefinition
- schema.add_relation_def(RelationDefinition(subject='Card', name='in_state', object='State', cardinality='1*'))
+ schema.add_relation_def(RelationDefinition(subject='Card', name='in_state',
+ object='State', cardinality='1*'))
rqlhelper = RQLHelper(schema, special_relations={'eid': 'uid',
'has_text': 'fti'})
@@ -78,12 +79,21 @@
return rewriter.rewritten
def test_vrefs(node):
- vrefmap = {}
+ vrefmaps = {}
+ selects = []
for vref in node.iget_nodes(nodes.VariableRef):
- vrefmap.setdefault(vref.name, set()).add(vref)
- for var in node.defined_vars.itervalues():
- assert var.stinfo['references']
- assert not (var.stinfo['references'] ^ vrefmap[var.name]), (node.as_string(), var.stinfo['references'], vrefmap[var.name])
+ stmt = vref.stmt
+ try:
+ vrefmaps[stmt].setdefault(vref.name, set()).add(vref)
+ except KeyError:
+ vrefmaps[stmt] = {vref.name: set( (vref,) )}
+ selects.append(stmt)
+ assert node in selects
+ for stmt in selects:
+ for var in stmt.defined_vars.itervalues():
+ assert var.stinfo['references']
+ vrefmap = vrefmaps[stmt]
+ assert not (var.stinfo['references'] ^ vrefmap[var.name]), (node.as_string(), var, var.stinfo['references'], vrefmap[var.name])
class RQLRewriteTC(TestCase):
@@ -140,7 +150,7 @@
"EXISTS(2 in_state A, B in_group D, E require_state A, "
"E name 'read', E require_group D, A is State, D is CWGroup, E is CWPermission)")
- def test_optional_var_base_1(self):
+ def test_optional_var_1(self):
constraint = ('X in_state S, U in_group G, P require_state S,'
'P name "read", P require_group G')
rqlst = parse('Any A,C WHERE A documented_by C?')
@@ -151,7 +161,7 @@
"(Any C WHERE EXISTS(C in_state B, D in_group F, G require_state B, G name 'read', "
"G require_group F), D eid %(A)s, C is Card)")
- def test_optional_var_base_2(self):
+ def test_optional_var_2(self):
constraint = ('X in_state S, U in_group G, P require_state S,'
'P name "read", P require_group G')
rqlst = parse('Any A,C,T WHERE A documented_by C?, C title T')
@@ -163,7 +173,7 @@
"G require_state B, G name 'read', G require_group F), "
"D eid %(A)s, C is Card)")
- def test_optional_var_base_3(self):
+ def test_optional_var_3(self):
constraint1 = ('X in_state S, U in_group G, P require_state S,'
'P name "read", P require_group G')
constraint2 = 'X in_state S, S name "public"'
@@ -176,6 +186,21 @@
"D eid %(A)s, C is Card, "
"EXISTS(C in_state E, E name 'public'))")
+ def test_optional_var_4(self):
+ constraint1 = 'A created_by U, X documented_by A'
+ constraint2 = 'A created_by U, X concerne A'
+ constraint3 = 'X created_by U'
+ rqlst = parse('Any X,LA,Y WHERE LA? documented_by X, LA concerne Y')
+ rewrite(rqlst, {('LA', 'X'): (constraint1, constraint2),
+ ('X', 'X'): (constraint3,),
+ ('Y', 'X'): (constraint3,)}, {})
+ self.failUnlessEqual(rqlst.as_string(),
+ u'Any X,LA,Y WHERE LA? documented_by X, LA concerne Y, B eid %(C)s, '
+ 'EXISTS(X created_by B), EXISTS(Y created_by B), '
+ 'X is Card, Y is IN(Division, Note, Societe) '
+ 'WITH LA BEING (Any LA WHERE EXISTS(A created_by B, LA documented_by A), '
+ 'B eid %(D)s, LA is Affaire, EXISTS(E created_by B, LA concerne E))')
+
def test_optional_var_inlined(self):
c1 = ('X require_permission P')
c2 = ('X inlined_card O, O require_permission P')