# HG changeset patch
# User Sylvain Thenault <sylvain.thenault@logilab.fr>
# Date 1209287960 -7200
#      Sun Apr 27 11:19:20 2008 +0200
# Node ID 06e9d7f2b790010dccc4f72802a4eb791785b145
# Parent  e2b17c6ac2773f1e734d92a671d90b297064b372
new unsimplified argument to as_string

diff --git a/__init__.py b/__init__.py
--- 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
--- a/stmts.py
+++ b/stmts.py
@@ -184,9 +184,10 @@
             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"""
-        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,12 +339,21 @@
     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)
+        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
--- 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
--- 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')