[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