[Checkins] SVN: Sandbox/ocql-foliage/src/ ocql Reduce bug fixed

Attila Gobi attila.gobi at gmail.com
Mon Sep 24 16:56:35 EDT 2007


Log message for revision 79907:
  ocql Reduce bug fixed

Changed:
  U   Sandbox/ocql-foliage/src/ocql/engine/queryobject.py
  U   Sandbox/ocql-foliage/src/ocql/engine/runnablequery.py
  U   Sandbox/ocql-foliage/src/temp.py
  U   Sandbox/ocql-foliage/src/test.py
  U   Sandbox/ocql-foliage/src/testalgebra.py

-=-
Modified: Sandbox/ocql-foliage/src/ocql/engine/queryobject.py
===================================================================
--- Sandbox/ocql-foliage/src/ocql/engine/queryobject.py	2007-09-24 20:55:15 UTC (rev 79906)
+++ Sandbox/ocql-foliage/src/ocql/engine/queryobject.py	2007-09-24 20:56:35 UTC (rev 79907)
@@ -198,16 +198,16 @@
 # Conditional
 #
 class Quantor:
-    def rewrite(self, algebra, expression):
+    def rewrite(self, algebra, expression, quanter, operator):
         raise NotImplemented()
 
-class Quanted(QueryObject):
+class Quanted:
     def __init__(self, quantor, expression):
         self.quantor = quantor
         self.expression = expression
     
-    def rewrite(self, algebra):
-        return self.quantor.rewrite(algebra,self.expression)
+    def rewrite(self, algebra, expression, operator):
+        return self.quantor.rewrite(algebra, expression, self.expression, operator)
 
 class Condition(Expression):
     def __init__(self, left, right):
@@ -215,25 +215,30 @@
         self.right = right
 
     def rewrite(self, algebra):
-        return algebra.Binary(self.left.rewrite(algebra),self.get_operator(algebra),self.right.rewrite(algebra))
+        if isinstance(self.left,Quanted):
+            return self.left.rewrite(algebra, self.right, self)
+        if isinstance(self.right,Quanted):
+            return self.right.rewrite(algebra, self.left, self)
+        else:
+            return algebra.Binary(self.left.rewrite(algebra),self.get_operator(algebra),self.right.rewrite(algebra))
 
 # Quantors
 class Every(Quantor):
     pass
 
 class Some(Quantor):
-    def rewrite(self, algebra, expression):
+    def rewrite(self, algebra, expression, quanted, operator):
         return algebra.Reduce(
             set, # FIXME ?set?
             algebra.Identifier('False'),
             algebra.Lambda('i',
-                expression.__class__(
+                operator.__class__(
                     Identifier('i'),
-                    expression.right
+                    expression
                 ).rewrite(algebra)
             ),
             algebra.Operator('or'),
-            expression.left.rewrite(algebra)
+            quanted.rewrite(algebra)
         )
 
 class Atmost(Quantor):
@@ -273,4 +278,4 @@
     def get_operator(self,algebra):
         return algebra.Operator('>=')
 
-# TODO: missing xi{Es} xi{E1..E2} I(Es) K ==, ~==
\ No newline at end of file
+# TODO: missing xi{Es} xi{E1..E2} I(Es) K ==, ~==

Modified: Sandbox/ocql-foliage/src/ocql/engine/runnablequery.py
===================================================================
--- Sandbox/ocql-foliage/src/ocql/engine/runnablequery.py	2007-09-24 20:55:15 UTC (rev 79906)
+++ Sandbox/ocql-foliage/src/ocql/engine/runnablequery.py	2007-09-24 20:56:35 UTC (rev 79907)
@@ -22,8 +22,9 @@
         #return reduce(set.union, map(lambda c: reduce(set.union, map(lambda d: ((d.name=="Computing Science") and (((d==set(filter(lambda i: i.runBy,c))) and (((c.credits<=3) and (((1<=c.credits) and (set([c])) or (set()))) or (set()))) or (set()))) or (set())),set(metadata.getAll("IDepartments"))) , set()),set(metadata.getAll("ICurses"))) , set())
         
         #TODO: why is the metadata not working in locals?
+        import operator
         return eval(self.code,
-                    {'metadata': self.engine.metadata},
-                    {'metadata': self.engine.metadata})
+                    {'metadata': self.engine.metadata, 'operator': operator},
+                    {'metadata': self.engine.metadata, 'operator': operator})
         
         #return eval(self.code)

Modified: Sandbox/ocql-foliage/src/temp.py
===================================================================
--- Sandbox/ocql-foliage/src/temp.py	2007-09-24 20:55:15 UTC (rev 79906)
+++ Sandbox/ocql-foliage/src/temp.py	2007-09-24 20:56:35 UTC (rev 79907)
@@ -1,6 +1,7 @@
 # -*- coding: UTF-8 -*-
 
 from testdb import TestMetadata
+import operator
 
 metadata = TestMetadata(None)
 
@@ -42,42 +43,48 @@
 #        set()),set(metadata.getAll("ICurses"))) ,
 #    set())
 
-x=reduce(set.union,
-    map(lambda c: reduce(set.union,
-        map(lambda d: (
-            (d.name=="Computing Science") and
-            (((d==set(filter(lambda i: i.runBy,[c]))) and
-                (
-                    (
-                        (c.credits<=3)
-                        and (
-                                (
-                                    (1<=c.credits)
-                                    and
-                                    (set([c]))
-                                    or (set())
-                                )
-                            ) or (set())
-                    )
-                ) or
-                (set()))) or (set())),
-            set(metadata.getAll("IDepartments"))) ,
-        set()),set(metadata.getAll("ICurses"))) ,
-    set())
+#x=reduce(set.union,
+#    map(lambda c: reduce(set.union,
+#        map(lambda d: (
+#            (d.name=="Computing Science") and
+#            (((d==set(filter(lambda i: i.runBy,[c]))) and
+#                (
+#                    (
+#                        (c.credits<=3)
+#                        and (
+#                                (
+#                                    (1<=c.credits)
+#                                    and
+#                                    (set([c]))
+#                                    or (set())
+#                                )
+#                            ) or (set())
+#                    )
+#                ) or
+#                (set()))) or (set())),
+#            set(metadata.getAll("IDepartments"))) ,
+#        set()),set(metadata.getAll("ICurses"))) ,
+#    set())
+#
+#
+#x = reduce(set.union,
+#    map(lambda c: reduce(set.union,
+#        map(lambda d: (
+#            (d.name=="Computing Science") and
+#            ((((reduce(operator.or_, map(lambda i: i==d, c.runBy), False))) and
+#                ((((
+#                    (set([c])) or (set()))) or (set()))) or
+#                (set()))) or (set())),
+#            set(metadata.getAll("IDepartments"))) ,
+#        set()),set(metadata.getAll("ICurses"))) ,
+#    set())
 
+x = reduce(set.union, map(lambda c: reduce(set.union, map(lambda d:
+    ((d.name=="Computing Science") and (((reduce(operator.or_,map(lambda i:
+        i==d,c.runBy),False)) and (((c.credits<=3) and (((1<=c.credits) and
+            (set([c])) or (set()))) or (set()))) or (set()))) or
+        (set())),set(metadata.getAll("IDepartments"))) ,
+    set()),set(metadata.getAll("ICurses"))) , set())
 
-x = reduce(set.union,
-    map(lambda c: reduce(set.union,
-        map(lambda d: (
-            (d.name=="Computing Science") and
-            (((d==set(filter(lambda i: i.runBy,[c]))) and
-                ((((
-                    (set([c])) or (set()))) or (set()))) or
-                (set()))) or (set())),
-            set(metadata.getAll("IDepartments"))) ,
-        set()),set(metadata.getAll("ICurses"))) ,
-    set())
-
-
 for i in x:
-    print i.name
\ No newline at end of file
+    print i.name

Modified: Sandbox/ocql-foliage/src/test.py
===================================================================
--- Sandbox/ocql-foliage/src/test.py	2007-09-24 20:55:15 UTC (rev 79906)
+++ Sandbox/ocql-foliage/src/test.py	2007-09-24 20:56:35 UTC (rev 79907)
@@ -1,5 +1,6 @@
 from ocql import OCQLEngine
 engine = OCQLEngine()
+
 query = engine.compile("""set [ c in ICurses; d in IDepartments; d.name="Computing Science"; d = some c.runBy; 1<=c.credits; c.credits <= 3 | c ]""") 
 print query.execute() 
 

Modified: Sandbox/ocql-foliage/src/testalgebra.py
===================================================================
--- Sandbox/ocql-foliage/src/testalgebra.py	2007-09-24 20:55:15 UTC (rev 79906)
+++ Sandbox/ocql-foliage/src/testalgebra.py	2007-09-24 20:56:35 UTC (rev 79907)
@@ -154,10 +154,9 @@
 
     def compile(self):
         if self.klass == set:
-            #adi: [] needed, otherwise iteration over non-seq
-            return 'set(filter(%s,[%s]))' % (self.func.compile(),self.coll.compile())
+            return 'reduce(%s,map(%s,%s),%s)' % (self.aggreg.compile(),self.func.compile(),self.coll.compile(),self.expr.compile())
         if self.klass == list:
-            return 'filter(%s,[%s])' % (self.func.compile(),self.coll.compile())
+            return 'reduce(%s,map(%s,%s),%s)' % (self.aggreg.compile(),self.func.compile(),self.coll.compile(),self.expr.compile())
 
     def __repr__(self):
         return "Reduce(%s,%s,%s,%s,%s)"%(self.klass,self.expr,self.func,self.aggreg,self.coll)
@@ -312,10 +311,10 @@
         self.right = right
 
     def compile(self):
-        return '%s%s%s' % (self.left.compile(),self.op.compile(),self.right.compile())
+        return '%s%s%s' % (self.left.compile(),self.op.op,self.right.compile())
 
     def __repr__(self):
-        return "%s%s%s" % (self.left,self.op.compile(),self.right)
+        return "%s%s%s" % (self.left,self.op.op,self.right)
 
     def walk(self):
         yield self
@@ -325,11 +324,20 @@
             yield t
     
 class Operator(BaseAlgebra):
+    ops = { 
+            'or': 'operator.or_', 'and': 'operator.and_',  'not':
+            'operator.not_',
+            '+': 'operator.add', '-': 'operator.sub',
+            '*': 'operator.mul', '/': 'operator.div',
+            '<': 'operator.lt', '>': 'operator.gt',
+            '<=': 'operator.le', '>=': 'operator.ge',
+            '==': 'operator.eq', '~=': 'operator.ne',
+            }
     def __init__(self,op):
         self.op = op
         
     def compile(self):
-        return self.op
+        return self.ops[self.op]
     
     def __repr__(self):
         return self.op



More information about the Checkins mailing list