diff --git a/__init__.py b/__init__.py index e2b17c6ac2773f1e734d92a671d90b297064b372_X19pbml0X18ucHk=..06e9d7f2b790010dccc4f72802a4eb791785b145_X19pbml0X18ucHk= 100644 --- a/__init__.py +++ b/__init__.py @@ -94,7 +94,6 @@ from rql import nodes for select in rqlst.children: self._simplify(select) - return rqlst def _simplify(self, select): # recurse on subqueries first diff --git a/stmts.py b/stmts.py index e2b17c6ac2773f1e734d92a671d90b297064b372_c3RtdHMucHk=..06e9d7f2b790010dccc4f72802a4eb791785b145_c3RtdHMucHk= 100644 --- a/stmts.py +++ b/stmts.py @@ -184,5 +184,5 @@ s.append('OFFSET %s' % self.offset) return ' '.join(s) - def as_string(self, encoding=None, kwargs=None): + def as_string(self, encoding=None, kwargs=None, unsimplified=False): """return the tree as an encoded rql string""" @@ -188,5 +188,6 @@ """return the tree as an encoded rql string""" - s = [select.as_string(encoding, kwargs) for select in self.children] + s = [select.as_string(encoding, kwargs, unsimplified) + for select in self.children] s = [' UNION '.join(s)] if self.limit is not None: s.append('LIMIT %s' % self.limit) @@ -338,9 +339,10 @@ def __repr__(self): return self.as_string(userepr=True) - def as_string(self, encoding=None, kwargs=None, userepr=False): + def as_string(self, encoding=None, kwargs=None, unsimplified=False, + userepr=False): """return the tree as an encoded rql string""" if userepr: as_string = repr else: as_string = lambda x: x.as_string(encoding, kwargs) @@ -342,8 +344,16 @@ """return the tree as an encoded rql string""" if userepr: as_string = repr else: as_string = lambda x: x.as_string(encoding, kwargs) + restriction = [] + if unsimplified and self.stinfo['rewritten']: + vvalues = {} + for vname, consts in self.stinfo['rewritten'].iteritems(): + vvalues[vname] = consts[0].value + restriction.append('%s eid %s' % (vname, consts[0].value)) + for const in consts: + const.value = vname s = [','.join(as_string(term) for term in self.selection)] if self.groupby: s.append('GROUPBY ' + ','.join(as_string(term) @@ -351,8 +361,10 @@ if self.orderby: s.append('ORDERBY ' + ','.join(as_string(term) for term in self.orderby)) - if self.where: - s.append('WHERE ' + as_string(self.where)) + if self.where is not None: + restriction.append(as_string(self.where)) + if restriction: + s.append('WHERE ' + ', '.join(restriction)) if self.having: s.append('HAVING ' + ','.join(as_string(term) for term in self.having)) @@ -361,6 +373,11 @@ for term in self.with_)) if self.distinct: return 'DISTINCT Any ' + ' '.join(s) + # restore rewritten constant values + if unsimplified and self.stinfo['rewritten']: + for vname, consts in self.stinfo['rewritten'].iteritems(): + for const in consts: + const.value = vvalues[vname] return 'Any ' + ' '.join(s) def copy(self, copy_solutions=True, solutions=None): @@ -712,7 +729,7 @@ result.append(repr(self.where)) return ' '.join(result) - def as_string(self, encoding=None, kwargs=None): + def as_string(self, encoding=None, kwargs=None, unsimplified=False): """return the tree as an encoded rql string""" result = ['DELETE'] if self.main_variables: @@ -796,7 +813,7 @@ result.append('WHERE ' + repr(self.where)) return ' '.join(result) - def as_string(self, encoding=None, kwargs=None): + def as_string(self, encoding=None, kwargs=None, unsimplified=False): """return the tree as an encoded rql string""" result = ['INSERT'] result.append(', '.join(['%s %s' % (etype, var) @@ -856,7 +873,7 @@ result.append('WHERE ' + repr(self.where)) return ' '.join(result) - def as_string(self, encoding=None, kwargs=None): + def as_string(self, encoding=None, kwargs=None, unsimplified=False): """return the tree as an encoded rql string""" result = ['SET'] result.append(', '.join(rel.as_string(encoding, kwargs) diff --git a/test/unittest_nodes.py b/test/unittest_nodes.py index e2b17c6ac2773f1e734d92a671d90b297064b372_dGVzdC91bml0dGVzdF9ub2Rlcy5weQ==..06e9d7f2b790010dccc4f72802a4eb791785b145_dGVzdC91bml0dGVzdF9ub2Rlcy5weQ== 100644 --- a/test/unittest_nodes.py +++ b/test/unittest_nodes.py @@ -29,6 +29,7 @@ self.assertEquals(nodes.etype_from_pyobj('hop'), 'String') self.assertEquals(nodes.etype_from_pyobj(u'hop'), 'String') + class NodesTest(TestCase): def _parse(self, rql, normrql=None): tree = parse(rql + ';') diff --git a/test/unittest_stcheck.py b/test/unittest_stcheck.py index e2b17c6ac2773f1e734d92a671d90b297064b372_dGVzdC91bml0dGVzdF9zdGNoZWNrLnB5..06e9d7f2b790010dccc4f72802a4eb791785b145_dGVzdC91bml0dGVzdF9zdGNoZWNrLnB5 100644 --- a/test/unittest_stcheck.py +++ b/test/unittest_stcheck.py @@ -62,8 +62,9 @@ yield self.parse, rql def _test_rewrite(self, rql, expected): - self.assertEquals(self.simplify(self.parse(rql)).as_string(), - expected) + rqlst = self.parse(rql) + self.simplify(rqlst) + self.assertEquals(rqlst.as_string(), expected) def test_rewrite(self): for rql, expected in ( @@ -134,6 +135,13 @@ ## self.annotate(rqlst) ## self.assertEquals(rqlst.as_string(), 'Any X WHERE X eid 12') + def test_simplified_as_string(self): + rqlst = self.parse('Any X WHERE X eid 12') + self.simplify(rqlst) + self.assertEquals(rqlst.as_string(), 'Any 12') + self.assertEquals(rqlst.as_string(unsimplified=True), 'Any X WHERE X eid 12') + self.assertEquals(rqlst.as_string(), 'Any 12') + class CopyTest(TestCase): def setUp(self): @@ -173,7 +181,6 @@ def setUp(self): helper = RQLHelper(DummySchema(), None, {'eid': 'uid'}) self.parse = helper.parse - self.simplify = helper.simplify # def test_simplified(self): # rqlst = self.parse('Any L WHERE 5 name L')