diff -r 1df034d5b6ec -r 34e451da9b5d test/unittest_rqlrewrite.py --- a/test/unittest_rqlrewrite.py Wed Sep 23 18:21:37 2009 +0200 +++ b/test/unittest_rqlrewrite.py Wed Sep 23 18:23:45 2009 +0200 @@ -136,19 +136,72 @@ "(Any C,T WHERE C in_state B, D in_group F, G require_state B, G name 'read', " "G require_group F, C title T, D eid %(A)s, C is Card)") - def test_relation_optimization(self): + def test_relation_optimization_1_lhs(self): # since Card in_state State as monovalued cardinality, the in_state # relation used in the rql expression can be ignored and S replaced by # the variable from the incoming query - card_constraint = ('X in_state S, U in_group G, P require_state S,' - 'P name "read", P require_group G') + snippet = ('X in_state S, S name "hop"') rqlst = parse('Card C WHERE C in_state STATE') - rewrite(rqlst, {('C', 'X'): (card_constraint,)}, {}) + rewrite(rqlst, {('C', 'X'): (snippet,)}, {}) + self.failUnlessEqual(rqlst.as_string(), + "Any C WHERE C in_state STATE, C is Card, " + "EXISTS(STATE name 'hop'), STATE is State") + def test_relation_optimization_1_rhs(self): + snippet = ('TW subworkflow_exit X, TW name "hop"') + rqlst = parse('WorkflowTransition C WHERE C subworkflow_exit EXIT') + rewrite(rqlst, {('EXIT', 'X'): (snippet,)}, {}) + self.failUnlessEqual(rqlst.as_string(), + "Any C WHERE C subworkflow_exit EXIT, C is WorkflowTransition, " + "EXISTS(C name 'hop'), EXIT is SubWorkflowExitPoint") + + def test_relation_optimization_2_lhs(self): + # optional relation can be shared if also optional in the snippet + snippet = ('X in_state S?, S name "hop"') + rqlst = parse('Card C WHERE C in_state STATE?') + rewrite(rqlst, {('C', 'X'): (snippet,)}, {}) + self.failUnlessEqual(rqlst.as_string(), + "Any C WHERE C in_state STATE?, C is Card, " + "EXISTS(STATE name 'hop'), STATE is State") + def test_relation_optimization_2_rhs(self): + snippet = ('TW? subworkflow_exit X, TW name "hop"') + rqlst = parse('SubWorkflowExitPoint EXIT WHERE C? subworkflow_exit EXIT') + rewrite(rqlst, {('EXIT', 'X'): (snippet,)}, {}) self.failUnlessEqual(rqlst.as_string(), - u"Any C WHERE C in_state STATE, C is Card, A eid %(B)s, " - "EXISTS(A in_group D, E require_state STATE, " - "E name 'read', E require_group D, D is CWGroup, E is CWPermission), " - "STATE is State") + "Any EXIT WHERE C? subworkflow_exit EXIT, EXIT is SubWorkflowExitPoint, " + "EXISTS(C name 'hop'), C is WorkflowTransition") + + def test_relation_optimization_3_lhs(self): + # optional relation in the snippet but not in the orig tree can be shared + snippet = ('X in_state S?, S name "hop"') + rqlst = parse('Card C WHERE C in_state STATE') + rewrite(rqlst, {('C', 'X'): (snippet,)}, {}) + self.failUnlessEqual(rqlst.as_string(), + "Any C WHERE C in_state STATE, C is Card, " + "EXISTS(STATE name 'hop'), STATE is State") + def test_relation_optimization_3_rhs(self): + snippet = ('TW? subworkflow_exit X, TW name "hop"') + rqlst = parse('WorkflowTransition C WHERE C subworkflow_exit EXIT') + rewrite(rqlst, {('EXIT', 'X'): (snippet,)}, {}) + self.failUnlessEqual(rqlst.as_string(), + "Any C WHERE C subworkflow_exit EXIT, C is WorkflowTransition, " + "EXISTS(C name 'hop'), EXIT is SubWorkflowExitPoint") + + def test_relation_non_optimization_1_lhs(self): + # but optional relation in the orig tree but not in the snippet can't be shared + snippet = ('X in_state S, S name "hop"') + rqlst = parse('Card C WHERE C in_state STATE?') + rewrite(rqlst, {('C', 'X'): (snippet,)}, {}) + self.failUnlessEqual(rqlst.as_string(), + "Any C WHERE C in_state STATE?, C is Card, " + "EXISTS(C in_state A, A name 'hop', A is State), STATE is State") + def test_relation_non_optimization_1_rhs(self): + snippet = ('TW subworkflow_exit X, TW name "hop"') + rqlst = parse('SubWorkflowExitPoint EXIT WHERE C? subworkflow_exit EXIT') + rewrite(rqlst, {('EXIT', 'X'): (snippet,)}, {}) + self.failUnlessEqual(rqlst.as_string(), + "Any EXIT WHERE C? subworkflow_exit EXIT, EXIT is SubWorkflowExitPoint, " + "EXISTS(A subworkflow_exit EXIT, A name 'hop', A is WorkflowTransition), " + "C is WorkflowTransition") def test_unsupported_constraint_1(self): # CWUser doesn't have require_permission