[Checkins] SVN: Sandbox/ocql-foliage/trunk/src/ pushed metadata
into qObj
Adam Groszer
agroszer at gmail.com
Wed Sep 26 19:41:51 EDT 2007
Log message for revision 80171:
pushed metadata into qObj
started building a symbol table
trying to get set/bag/list from symbol/metadata
testdb got a little IF, Curses name->CODE
Changed:
U Sandbox/ocql-foliage/trunk/src/ocql/engine/algebracompiler.py
U Sandbox/ocql-foliage/trunk/src/ocql/engine/metadata.py
U Sandbox/ocql-foliage/trunk/src/ocql/engine/queryobject.py
U Sandbox/ocql-foliage/trunk/src/ocql/engine/queryparser.py
U Sandbox/ocql-foliage/trunk/src/test.py
U Sandbox/ocql-foliage/trunk/src/test2.py
U Sandbox/ocql-foliage/trunk/src/testalgebra.py
U Sandbox/ocql-foliage/trunk/src/testdb.py
-=-
Modified: Sandbox/ocql-foliage/trunk/src/ocql/engine/algebracompiler.py
===================================================================
--- Sandbox/ocql-foliage/trunk/src/ocql/engine/algebracompiler.py 2007-09-26 23:36:31 UTC (rev 80170)
+++ Sandbox/ocql-foliage/trunk/src/ocql/engine/algebracompiler.py 2007-09-26 23:41:50 UTC (rev 80171)
@@ -11,6 +11,7 @@
def compile(self, alg):
#print alg
+ #print
code = alg.compile()
#print code
return compile(code,'<string>','eval')
\ No newline at end of file
Modified: Sandbox/ocql-foliage/trunk/src/ocql/engine/metadata.py
===================================================================
--- Sandbox/ocql-foliage/trunk/src/ocql/engine/metadata.py 2007-09-26 23:36:31 UTC (rev 80170)
+++ Sandbox/ocql-foliage/trunk/src/ocql/engine/metadata.py 2007-09-26 23:41:50 UTC (rev 80171)
@@ -8,7 +8,7 @@
def is_collection(self):
"""Returns True if the represented type is a collection."""
- def get_type(self):
+ def get_collection_type(self):
"""Returns the represented type"""
def get_contained(self):
Modified: Sandbox/ocql-foliage/trunk/src/ocql/engine/queryobject.py
===================================================================
--- Sandbox/ocql-foliage/trunk/src/ocql/engine/queryobject.py 2007-09-26 23:36:31 UTC (rev 80170)
+++ Sandbox/ocql-foliage/trunk/src/ocql/engine/queryobject.py 2007-09-26 23:41:50 UTC (rev 80171)
@@ -6,6 +6,35 @@
pass
class QueryObject:
+ metadata = None
+
+ def __init__(self, metadata):
+ self.metadata = metadata
+
+ def addSymbol(self):
+ pass
+
+ def get_class(self):
+ s = self.metadata.symbols.current()
+ try:
+ return s[self.name]
+ except KeyError:
+ return self.metadata.get_class(self.name)
+ except AttributeError:
+ from pub.dbgpclient import brk; brk()
+
+
+ def get_collection_type(self, klass=None):
+ if klass is None:
+ klass = self.get_class()
+
+ if klass is None:
+ from pub.dbgpclient import brk; brk()
+
+ rv = klass.get_collection_type()
+ print self.name,rv
+ return rv
+
def rewrite(self, algebra):
raise NotImplemented(self)
@@ -24,7 +53,8 @@
klass = None
conditional = None
- def __init__(self, expr, klass, conditional):
+ def __init__(self, metadata, expr, klass, conditional):
+ self.metadata = metadata
self.expression = expression
self.klass = klass
self.conditional = conditional
@@ -32,7 +62,8 @@
class Identifier(Expression):
name = None
- def __init__(self, name):
+ def __init__(self, metadata, name):
+ self.metadata = metadata
self.name = name
def rewrite(self, algebra):
@@ -42,7 +73,8 @@
#this shall be abstract?
value = None
- def __init__(self, value):
+ def __init__(self, metadata, value):
+ self.metadata = metadata
self.value=value
def rewrite(self, algebra):
@@ -58,70 +90,120 @@
class BooleanConstant(Constant):
#TODO: convert value to string?
pass
+
+class CollectionConstant(Constant):
+ pass
class Query(Expression):
collection_type = None
terms = None
target = None
- def __init__(self, collection_type, terms, target):
+ def __init__(self, metadata, collection_type, terms, target):
+ self.metadata = metadata
self.collection_type = collection_type
self.terms = terms
self.target = target
+ def get_collection_type(self, klass=None):
+ return self.collection_type
+
def rewrite(self, algebra):
+ self.metadata.symbols.addlevel()
+ rv=None
+
if len(self.terms):
+ for t in self.terms:
+ t.addSymbol()
+
firstTerm = self.terms[0]
if isinstance(firstTerm, In):
- return algebra.Iter(
+
+ ctype = firstTerm.get_collection_type()
+
+ rv = algebra.Iter(
self.collection_type,
algebra.Lambda(
firstTerm.identifier.name,
Query(
+ self.metadata,
self.collection_type,
self.terms[1:],
self.target
).rewrite(algebra)
), algebra.Make(
self.collection_type,
- set,
+ ctype,
firstTerm.expression.rewrite(algebra)
) # FIXME: ?set? must be determined by type(firstTerm.expression)
)
elif isinstance(firstTerm,Alias):
- return Query(
+ rv = Query(
+ self.metadata,
self.collection_type,
- [In(firstTerm.identifier,firstTerm.expression)]+self.terms[1:],
+ [In(
+ self.metadata,
+ firstTerm.identifier,
+ firstTerm.expression
+ )]+self.terms[1:],
self.target).rewrite(algebra)
else:
- return algebra.If(
+ rv = algebra.If(
firstTerm.rewrite(algebra),
Query(
+ self.metadata,
self.collection_type,
self.terms[1:],
self.target).rewrite(algebra),
algebra.Empty(self.collection_type, None)
)
else:
- return algebra.Single(
+ rv = algebra.Single(
self.collection_type,
self.target.rewrite(algebra))
+
+ self.metadata.symbols.dellevel()
+ return rv
class In(Term):
identifier = None
expression = None
- def __init__(self, identifier, expression):
+ def __init__(self, metadata, identifier, expression):
+ self.metadata = metadata
self.identifier = identifier
self.expression = expression
+
+ def addSymbol(self):
+ s = self.metadata.symbols.current()
+ #s[self.identifier.name] = self.metadata.get_class(
+ # self.expression.name)
+ s[self.identifier.name] = self.expression.get_class()
+
+ def get_collection_type(self):
+ rv = self.expression.get_collection_type()
+ return rv
class Alias(Term):
identifier = None
expression = None
- def __init__(self, identifier, expression):
+ def __init__(self, metadata, identifier, expression):
+ self.metadata = metadata
self.identifier = identifier
self.expression = expression
+
+ def addSymbol(self):
+ s = self.metadata.symbols.current()
+ #TODO: that's not really good
+ r = self.expression.get_collection_type()
+
+ s[self.identifier.name] = r
+
+ def get_collection_type(self):
+ rv = self.expression.get_collection_type()
+ print self.expression.name,rv
+ return rv
#
# Binary operators
@@ -130,7 +212,8 @@
left = None
right = None
- def __init__(self, left, right):
+ def __init__(self, metadata, left, right):
+ self.metadata = metadata
self.left = left
self.right = right
@@ -165,7 +248,23 @@
def rewrite(self, algebra): # FIXME: Ezt gondold at...
return algebra.Identifier(
'.'.join([self.left.name, self.right.name]))
+
+ def get_class(self):
+ t = self.left.get_class()
+
+ return t
+
+ def get_collection_type(self):
+ t = self.left.get_class()
+ try:
+ r = t[self.right.name]
+ except:
+ from pub.dbgpclient import brk; brk()
+ print self.left.name+'.'+self.right.name,r
+
+ return r
+
class Index(Binary):
#NotImplemented
pass
@@ -197,7 +296,8 @@
class Unary(Expression):
expression = None
- def __init__(self, expression):
+ def __init__(self, metadata, expression):
+ self.metadata = metadata
self.expression = expression
class Not(Unary):
@@ -225,7 +325,7 @@
#
# Conditional
#
-class Quantor:
+class Quantor(QueryObject):
def rewrite(self, algebra, expression, quanter, operator):
raise NotImplemented()
@@ -233,7 +333,8 @@
quantor = None
expression = None
- def __init__(self, quantor, expression):
+ def __init__(self, metadata, quantor, expression):
+ self.metadata = metadata
self.quantor = quantor
self.expression = expression
@@ -243,12 +344,17 @@
# Quantors
class Every(Quantor):
def rewrite(self, algebra, expression, quanted, operator):
+ ctype = quanted.get_collection_type()
+
return algebra.Reduce(
- set, # FIXME ?set? but which type() to take? quanted.expression?
+ ctype, # FIXME ?set? but which type() to take? quanted.expression?
algebra.Identifier('True'),
algebra.Lambda('i',
operator.__class__(
- Identifier('i'),
+ self.metadata,
+ Identifier(
+ self.metadata,
+ 'i'),
expression
).rewrite(algebra)
),
@@ -258,12 +364,14 @@
class Some(Quantor):
def rewrite(self, algebra, expression, quanted, operator):
+ ctype = quanted.get_collection_type()
return algebra.Reduce(
- set, # FIXME ?set? but which type() to take? quanted.expression?
+ ctype, # FIXME ?set? but which type() to take? quanted.expression?
algebra.Identifier('False'),
algebra.Lambda('i',
operator.__class__(
- Identifier('i'),
+ self.metadata,
+ Identifier(self.metadata, 'i'),
expression
).rewrite(algebra)
),
@@ -274,22 +382,25 @@
class Atmost(Quantor):
expr = None
- def __init__(self, expr):
- raise NotImplemented(self)
+ def __init__(self, metadata, expr):
+ raise NotImplemented(self)
+ self.metadata = metadata
self.expr = expr
class Atleast(Quantor):
expr = None
- def __init__(self, expr):
- raise NotImplemented(self)
+ def __init__(self, metadata, expr):
+ raise NotImplemented(self)
+ self.metadata = metadata
self.expr = expr
class Just(Quantor):
expr = None
- def __init__(self, expr):
- raise NotImplemented(self)
+ def __init__(self, metadata, expr):
+ raise NotImplemented(self)
+ self.metadata = metadata
self.expr = expr
# Logical operators
@@ -297,15 +408,22 @@
left = None
right = None
- def __init__(self, left, right):
+ def __init__(self, metadata, left, right):
+ self.metadata = metadata
self.left = left
self.right = right
def rewrite(self, algebra):
if isinstance(self.left,Quanted):
- return self.left.rewrite(algebra, self.right, self)
+ return self.left.rewrite(
+ algebra,
+ self.right,
+ self)
if isinstance(self.right,Quanted):
- return self.right.rewrite(algebra, self.left, self)
+ return self.right.rewrite(
+ algebra,
+ self.left,
+ self)
else:
return algebra.Binary(self.left.rewrite(algebra),self.get_operator(algebra),self.right.rewrite(algebra))
Modified: Sandbox/ocql-foliage/trunk/src/ocql/engine/queryparser.py
===================================================================
--- Sandbox/ocql-foliage/trunk/src/ocql/engine/queryparser.py 2007-09-26 23:36:31 UTC (rev 80170)
+++ Sandbox/ocql-foliage/trunk/src/ocql/engine/queryparser.py 2007-09-26 23:41:50 UTC (rev 80171)
@@ -5,6 +5,8 @@
# at the moment this returns a fixed Query object
#
+import copy
+from collections import deque
from ocql.engine.queryobject import *
#this is the wired query:
@@ -19,33 +21,27 @@
| c ]
"""
-WIRED = Query(
- set,
- [
- In(Identifier('c'),Identifier('ICurses')),
- In(Identifier('d'),Identifier('IDepartments')),
- Eq(
- Property(Identifier('d'),Identifier('name')),
- StringConstant('"Computing Science"')
- ),
- Eq(
- Identifier('d'),
- Quanted(
- Some(),
- Property(Identifier('c'),Identifier('runBy'))
- )
- ),
- Le(
- NumericConstant('1'),
- Property(Identifier('c'),Identifier('credits'))
- ),
- Le(
- Property(Identifier('c'),Identifier('credits')),
- NumericConstant('3')
- ),
- ],
- Identifier('c')
-)
+class SymbolContainer:
+ def __init__(self):
+ self.stack = deque()
+ self.stack.append(dict())
+
+ def addlevel(self):
+ top = self.current()
+ new = dict(top)
+ self.stack.append(new)
+
+ #print 'add'
+ #print self.stack
+
+ def dellevel(self):
+ self.stack.pop()
+
+ #print 'del'
+ #print self.stack
+
+ def current(self):
+ return self.stack[-1]
class QueryParser:
def __init__(self, engine):
@@ -61,6 +57,59 @@
return True
def compile(self, query):
+ metadata = self.metadata
+ #TODO: f-ing wrong place for this
+ metadata.symbols = SymbolContainer()
+
+ WIRED = Query(
+ metadata,
+ set,
+ [
+ In(
+ metadata,
+ Identifier(metadata,'c'),
+ Identifier(metadata,'ICurses')
+ ),
+ In(
+ metadata,
+ Identifier(metadata,'d'),
+ Identifier(metadata,'IDepartments')
+ ),
+ Eq(
+ metadata,
+ Property(metadata,
+ Identifier(metadata,'d'),
+ Identifier(metadata,'name')),
+ StringConstant(metadata,'"Computing Science"')
+ ),
+ Eq(
+ metadata,
+ Identifier(metadata,'d'),
+ Quanted(
+ metadata,
+ Some(metadata),
+ Property(metadata,
+ Identifier(metadata, 'c'),
+ Identifier(metadata, 'runBy'))
+ )
+ ),
+ Le(
+ metadata,
+ NumericConstant(metadata, '1'),
+ Property(metadata,
+ Identifier(metadata, 'c'),
+ Identifier(metadata, 'credits'))
+ ),
+ Le(
+ metadata,
+ Property(metadata,
+ Identifier(metadata, 'c'),
+ Identifier(metadata, 'credits')),
+ NumericConstant(metadata, '3')
+ ),
+ ],
+ Identifier(metadata, 'c')
+ )
x = WIRED
#x.setMetadata(self.metadata)
return x
\ No newline at end of file
Modified: Sandbox/ocql-foliage/trunk/src/test.py
===================================================================
--- Sandbox/ocql-foliage/trunk/src/test.py 2007-09-26 23:36:31 UTC (rev 80170)
+++ Sandbox/ocql-foliage/trunk/src/test.py 2007-09-26 23:41:50 UTC (rev 80171)
@@ -5,7 +5,7 @@
res = query.execute()
for i in res:
- print i.name
+ print i.code
#q=Iter(set, Lambda('d',
# If(Eq(Identifier('d.name'),Identifier('"Computing Science"')),
Modified: Sandbox/ocql-foliage/trunk/src/test2.py
===================================================================
--- Sandbox/ocql-foliage/trunk/src/test2.py 2007-09-26 23:36:31 UTC (rev 80170)
+++ Sandbox/ocql-foliage/trunk/src/test2.py 2007-09-26 23:41:50 UTC (rev 80171)
@@ -1,11 +1,31 @@
import testdb
from ocql.engine.queryobject import *
+from ocql.engine.queryparser import SymbolContainer
import operator
import testalgebra
from ocql.ocqlengine import OCQLEngine
from ocql.engine.runnablequery import RunnableQuery
+def doone(qo, expected):
+ print
+ print "query:",query
+
+ algebra=qo.rewrite(testalgebra)
+
+ print "algebra:",algebra
+
+ code=algebra.compile();
+ compile(code,'<string>','eval')
+ q = RunnableQuery(engine,algebra,code)
+
+ print code
+ print "got: ", q.execute()
+ print "expected:", expected
+
+
engine = OCQLEngine()
+metadata = engine.metadata
+metadata.symbols = SymbolContainer()
#
# Simple empty query
@@ -13,312 +33,569 @@
# set [ ]
#
query = "set [ ]"
-qo=Query(set, [] , Identifier('') )
-algebra=qo.rewrite(testalgebra)
-code=algebra.compile();
-compile(code,'<string>','eval')
-q = RunnableQuery(engine,algebra,code)
+qo=Query(metadata,
+ set,
+ [] ,
+ Identifier(metadata,
+ '') )
-print
-print query
-print algebra
-print code
-print "got: ", q.execute()
-print "expected:", set([])
+doone(qo, set([]))
+
+#algebra=qo.rewrite(testalgebra)
+#code=algebra.compile();
+#compile(code,'<string>','eval')
+#q = RunnableQuery(engine,algebra,code)
+#
+#print
+#print query
+#print algebra
+#print code
+#print "got: ", q.execute()
+#print "expected:", set([])
+metadata.symbols = SymbolContainer()
#
# Simple SELECT ALL
#
# set [ c in ICurses | c ]
#
query = "[ c in ICurses | c ]"
-qo=Query(set, [
- In(Identifier('c'),Identifier('ICurses')),
- ] ,Identifier('c'))
-algebra=qo.rewrite(testalgebra)
-code=algebra.compile();
-compile(code,'<string>','eval')
-q = RunnableQuery(engine,algebra,code)
+qo=Query(
+ metadata,
+ set,
+ [
+ In(
+ metadata,
+ Identifier(metadata,'c'),
+ Identifier(metadata,'ICurses')),
+ ] ,Identifier(metadata,'c') )
-print
-print query
-print algebra
-print code
-print "got: ", set([ i.name for i in q.execute() ])
-print "expected:", set([ "C1" , "C2", "C3" ])
+doone(qo, set([ "C1" , "C2", "C3" ]))
+#algebra=qo.rewrite(testalgebra)
+#code=algebra.compile();
+#compile(code,'<string>','eval')
+#q = RunnableQuery(engine,algebra,code)
#
+#print
+#print query
+#print algebra
+#print code
+#print "got: ", set([ i.name for i in q.execute() ])
+#print "expected:", set([ "C1" , "C2", "C3" ])
+
+metadata.symbols = SymbolContainer()
+#
# Selecting a property
#
-# set [ c in ICurses | c.name ]
+# set [ c in ICurses | c.code ]
#
-query = "[ c in ICurses | c.name ]"
-qo=Query(set, [
- In(Identifier('c'),Identifier('ICurses')),
- ] ,Identifier('c.name'))
-algebra=qo.rewrite(testalgebra)
-code=algebra.compile();
-compile(code,'<string>','eval')
-q = RunnableQuery(engine,algebra,code)
+query = "[ c in ICurses | c.code ]"
+qo=Query(
+ metadata,
+ set,
+ [
+ In(
+ metadata,
+ Identifier(metadata,'c'),
+ Identifier(metadata,'ICurses')),
+ ] ,Identifier(metadata,'c.code') )
-print
-print query
-print algebra
-print code
-print "got: ",q.execute()
-print "expected:",set([ "C1" , "C2", "C3" ])
+doone(qo, set([ "C1" , "C2", "C3" ]))
+#algebra=qo.rewrite(testalgebra)
+#code=algebra.compile();
+#compile(code,'<string>','eval')
+#q = RunnableQuery(engine,algebra,code)
#
+#print
+#print query
+#print algebra
+#print code
+#print "got: ",q.execute()
+#print "expected:",set([ "C1" , "C2", "C3" ])
+
+metadata.symbols = SymbolContainer()
+#
# Filtering -- empty result
#
-# set [ c in ICurses , c.credits>3 | c.name ]
+# set [ c in ICurses , c.credits>3 | c.code ]
#
-query = "[ c in ICurses, c.credits>3 | c.name ]"
-qo=Query(set, [
- In(Identifier('c'),Identifier('ICurses')),
- Gt(Identifier('c.credits'),Constant('3')),
- ] ,Identifier('c.name'))
-algebra=qo.rewrite(testalgebra)
-code=algebra.compile();
-compile(code,'<string>','eval')
-q = RunnableQuery(engine,algebra,code)
+query = "[ c in ICurses, c.credits>3 | c.code ]"
+qo=Query(
+ metadata,
+ set,
+ [
+ In(
+ metadata,
+ Identifier(metadata,'c'),
+ Identifier(metadata,'ICurses')),
+ Gt(
+ metadata,
+ Identifier(metadata,'c.credits'),
+ Constant(metadata,'3')),
+ ] ,Identifier(metadata, 'c.code') )
-print
-print query
-print algebra
-print code
-print "got: ",q.execute()
-print "expecter:",set([])
+doone(qo, set([]))
+#algebra=qo.rewrite(testalgebra)
+#code=algebra.compile();
+#compile(code,'<string>','eval')
+#q = RunnableQuery(engine,algebra,code)
#
+#print
+#print query
+#print algebra
+#print code
+#print "got: ",q.execute()
+#print "expecter:",set([])
+
+metadata.symbols = SymbolContainer()
+#
# Filtering -- full result
#
-# set [ c in ICurses , c.credits<=3 | c.name ]
+# set [ c in ICurses , c.credits<=3 | c.code ]
#
-query = "[ c in ICurses, c.credits<=3 | c.name ]"
-qo=Query(set, [
- In(Identifier('c'),Identifier('ICurses')),
- Le(Identifier('c.credits'),Constant('3')),
- ] ,Identifier('c.name'))
-algebra=qo.rewrite(testalgebra)
-code=algebra.compile();
-compile(code,'<string>','eval')
-q = RunnableQuery(engine,algebra,code)
+query = "[ c in ICurses, c.credits<=3 | c.code ]"
+qo=Query(
+ metadata,
+ set, [
+ In(
+ metadata,
+ Identifier(metadata,'c'),
+ Identifier(metadata,'ICurses')),
+ Le(metadata,
+ Identifier(metadata,'c.credits'),
+ Constant(metadata,'3')),
+ ] ,Identifier(metadata,'c.code'))
-print
-print query
-print algebra
-print code
-print "got: ",q.execute()
-print "expected:",set([ "C1" , "C2", "C3" ])
+doone(qo, set([ "C1" , "C2", "C3" ]))
+#algebra=qo.rewrite(testalgebra)
+#code=algebra.compile();
+#compile(code,'<string>','eval')
+#q = RunnableQuery(engine,algebra,code)
#
+#print
+#print query
+#print algebra
+#print code
+#print "got: ",q.execute()
+#print "expected:",set([ "C1" , "C2", "C3" ])
+
+metadata.symbols = SymbolContainer()
+#
# Filtering -- one result
#
-# set [ c in ICurses , c.credits=3 | c.name ]
+# set [ c in ICurses , c.credits=3 | c.code ]
#
-query = "[ c in ICurses, c.credits=3 | c.name ]"
-qo=Query(set, [
- In(Identifier('c'),Identifier('ICurses')),
- Eq(Identifier('c.credits'),Constant('3')),
- ] ,Identifier('c.name'))
-algebra=qo.rewrite(testalgebra)
-code=algebra.compile();
-compile(code,'<string>','eval')
-q = RunnableQuery(engine,algebra,code)
+query = "[ c in ICurses, c.credits=3 | c.code ]"
+qo=Query(
+ metadata,
+ set,
+ [
+ In(
+ metadata,
+ Identifier(metadata,'c'),
+ Identifier(metadata,'ICurses')),
+ Eq(
+ metadata,
+ Identifier(metadata,'c.credits'),
+ Constant(metadata,'3')),
+ ] ,Identifier(metadata,'c.code'))
-print
-print query
-print algebra
-print code
-print "got: ",q.execute()
-print "expected:",set([ "C2", "C3" ])
+doone(qo, set([ "C2", "C3" ]))
+#algebra=qo.rewrite(testalgebra)
+#code=algebra.compile();
+#compile(code,'<string>','eval')
+#q = RunnableQuery(engine,algebra,code)
#
+#print
+#print query
+#print algebra
+#print code
+#print "got: ",q.execute()
+#print "expected:",set([ "C2", "C3" ])
+
+metadata.symbols = SymbolContainer()
+#
# Two filters -- full results
#
-# set [ c in ICurses , c.credits<5, c.credits >=1 | c.name ]
+# set [ c in ICurses , c.credits<5, c.credits >=1 | c.code ]
#
-query = "[ c in ICurses, c.credits<3, c.credits>=1 | c.name ]"
-qo=Query(set, [
- In(Identifier('c'),Identifier('ICurses')),
- Lt(Identifier('c.credits'),Constant('5')),
- Ge(Identifier('c.credits'),Constant('1')),
- ] ,Identifier('c.name'))
-algebra=qo.rewrite(testalgebra)
-code=algebra.compile();
-compile(code,'<string>','eval')
-q = RunnableQuery(engine,algebra,code)
+query = "[ c in ICurses, c.credits<3, c.credits>=1 | c.code ]"
+qo=Query(
+ metadata,
+ set,
+ [
+ In(
+ metadata,
+ Identifier(metadata,'c'),
+ Identifier(metadata,'ICurses')),
+ Lt(
+ metadata,
+ Identifier(metadata,'c.credits'),
+ Constant(metadata,'5')),
+ Ge(
+ metadata,
+ Identifier(metadata,'c.credits'),
+ Constant(metadata,'1')),
+ ] ,Identifier(metadata, 'c.code'))
-print
-print query
-print algebra
-print code
-print "got: ",q.execute()
-print "expected:",set([ "C1", "C2", "C3" ])
+doone(qo, set([ "C1", "C2", "C3" ]))
+#algebra=qo.rewrite(testalgebra)
+#code=algebra.compile();
+#compile(code,'<string>','eval')
+#q = RunnableQuery(engine,algebra,code)
#
+#print
+#print query
+#print algebra
+#print code
+#print "got: ",q.execute()
+#print "expected:",set([ "C1", "C2", "C3" ])
+
+metadata.symbols = SymbolContainer()
+#
# Two filters -- one result
#
-# set [ c in ICurses , c.credits<=2, 2<=c.credits | c.name ]
+# set [ c in ICurses , c.credits<=2, 2<=c.credits | c.code ]
#
-query = "[ c in ICurses, c.credits<=2, 2<=c.credits | c.name ]"
-qo=Query(set, [
- In(Identifier('c'),Identifier('ICurses')),
- Le(Identifier('c.credits'),Constant('2')),
- Le(Constant('2'),Identifier('c.credits')),
- ] ,Identifier('c.name'))
-algebra=qo.rewrite(testalgebra)
-code=algebra.compile();
-compile(code,'<string>','eval')
-q = RunnableQuery(engine,algebra,code)
+query = "[ c in ICurses, c.credits<=2, 2<=c.credits | c.code ]"
+qo=Query(
+ metadata,
+ set, [
+ In(
+ metadata,
+ Identifier(metadata,'c'),
+ Identifier(metadata,'ICurses')),
+ Le(
+ metadata,
+ Identifier(metadata,'c.credits'),
+ Constant(metadata,'2')),
+ Le(
+ metadata,
+ Constant(metadata,'2'),
+ Identifier(metadata,'c.credits')),
+ ] ,Identifier(metadata,'c.code'))
-print
-print query
-print algebra
-print code
-print "got: ",q.execute()
-print "expected:",set([ "C1" ])
+doone(qo, set([ "C1" ]))
+#algebra=qo.rewrite(testalgebra)
+#code=algebra.compile();
+#compile(code,'<string>','eval')
+#q = RunnableQuery(engine,algebra,code)
#
+#print
+#print query
+#print algebra
+#print code
+#print "got: ",q.execute()
+#print "expected:",set([ "C1" ])
+
+metadata.symbols = SymbolContainer()
+#
# Two filters -- one result
#
-# set [ c in ICurses , c.credits>=2, 2>=c.credits | c.name ]
+# set [ c in ICurses , c.credits>=2, 2>=c.credits | c.code ]
#
-query = "[ c in ICurses, c.credits>=2, 2>=c.credits | c.name ]"
-qo=Query(set, [
- In(Identifier('c'),Identifier('ICurses')),
- Ge(Identifier('c.credits'),Constant('2')),
- Ge(Constant('2'),Identifier('c.credits')),
- ] ,Identifier('c.name'))
-algebra=qo.rewrite(testalgebra)
-code=algebra.compile();
-compile(code,'<string>','eval')
-q = RunnableQuery(engine,algebra,code)
+query = "[ c in ICurses, c.credits>=2, 2>=c.credits | c.code ]"
+qo=Query(
+ metadata,
+ set, [
+ In(
+ metadata,
+ Identifier(metadata,'c'),
+ Identifier(metadata,'ICurses')),
+ Ge(
+ metadata,
+ Identifier(metadata,'c.credits'),
+ Constant(metadata,'2')),
+ Ge(
+ metadata,
+ Constant(metadata,'2'),
+ Identifier(metadata,'c.credits')),
+ ] ,Identifier(metadata,'c.code'))
-print
-print query
-print algebra
-print code
-print "got: ",q.execute()
-print "expected:",set([ "C1" ])
+doone(qo, set([ "C1" ]))
+#algebra=qo.rewrite(testalgebra)
+#code=algebra.compile();
+#compile(code,'<string>','eval')
+#q = RunnableQuery(engine,algebra,code)
#
+#print
+#print query
+#print algebra
+#print code
+#print "got: ",q.execute()
+#print "expected:",set([ "C1" ])
+
+metadata.symbols = SymbolContainer()
+#
# Two filters -- no result
#
-# set [ c in ICurses , c.credits=3, c.credits!=3 | c.name ]
+# set [ c in ICurses , c.credits=3, c.credits!=3 | c.code ]
#
-query = "[ c in ICurses, c.credits=3, c.credits!=3 | c.name ]"
-qo=Query(set, [
- In(Identifier('c'),Identifier('ICurses')),
- Eq(Identifier('c.credits'),Constant('3')),
- Ne(Identifier('c.credits'),Constant('3')),
- ] ,Identifier('c.name'))
-algebra=qo.rewrite(testalgebra)
-code=algebra.compile();
-compile(code,'<string>','eval')
-q = RunnableQuery(engine,algebra,code)
+query = "[ c in ICurses, c.credits=3, c.credits!=3 | c.code ]"
+qo=Query(
+ metadata,
+ set, [
+ In(
+ metadata,
+ Identifier(metadata,'c'),
+ Identifier(metadata,'ICurses')),
+ Eq(
+ metadata,
+ Identifier(metadata,'c.credits'),
+ Constant(metadata,'3')),
+ Ne(
+ metadata,
+ Identifier(metadata,'c.credits'),
+ Constant(metadata,'3')),
+ ] ,Identifier(metadata,'c.code'))
-print
-print query
-print algebra
-print code
-print "got: ",q.execute()
-print "expected:",set([])
+doone(qo, set([]))
+#algebra=qo.rewrite(testalgebra)
+#code=algebra.compile();
+#compile(code,'<string>','eval')
+#q = RunnableQuery(engine,algebra,code)
#
+#print
+#print query
+#print algebra
+#print code
+#print "got: ",q.execute()
+#print "expected:",set([])
+
+metadata.symbols = SymbolContainer()
+#
# join -- Departments running curses
#
-# set [ c in ICurses d, in IDepartments , some c.runBy = d | d.name ]
+# set [ c in ICurses d, in IDepartments ,
+# some c.runBy = d | d.name ]
#
query = "[ c in ICurses, d in IDepartments, d = some c.runBy | d.name ]"
-qo=Query(set, [
- In(Identifier('c'),Identifier('ICurses')),
- In(Identifier('d'),Identifier('IDepartments')),
- Eq(Identifier('d'),Quanted(Some(),Identifier('c.runBy'))),
- ] ,Identifier('d.name'))
-algebra=qo.rewrite(testalgebra)
-code=algebra.compile();
-compile(code,'<string>','eval')
-q = RunnableQuery(engine,algebra,code)
+qo=Query(
+ metadata,
+ set, [
+ In(
+ metadata,
+ Identifier(metadata,'c'),
+ Identifier(metadata,'ICurses')),
+ In(
+ metadata,
+ Identifier(metadata,'d'),
+ Identifier(metadata,'IDepartments')),
+ Eq(
+ metadata,
+ Identifier(metadata,'d'),
+ Quanted(metadata,
+ Some(metadata),
+ Property(metadata,
+ Identifier(metadata, 'c'),
+ Identifier(metadata, 'runBy'))
+ )),
+ ] ,Identifier(metadata,'d.name'))
-print
-print query
-print algebra
-print code
-print "got: ",q.execute()
-print "expected:",set(['Computing Science', 'Other Department'])
+doone(qo, set(['Computing Science', 'Other Department']))
+#algebra=qo.rewrite(testalgebra)
+#code=algebra.compile();
+#compile(code,'<string>','eval')
+#q = RunnableQuery(engine,algebra,code)
#
+#print
+#print query
+#print algebra
+#print code
+#print "got: ",q.execute()
+#print "expected:",set(['Computing Science', 'Other Department'])
+
+metadata.symbols = SymbolContainer()
+#
# join -- Departments running some 3 credits curses
#
# set [ d in ICurses, c in ICurses, c.credits=3, some c.runBy = d | d.name ]
#
query = "[ c in ICurses, d in IDepartments, c.credits=3, d = some c.runBy | d.name ]"
-qo=Query(set, [
- In(Identifier('c'),Identifier('ICurses')),
- In(Identifier('d'),Identifier('IDepartments')),
- Eq(Identifier('c.credits'),Constant('3')),
- Eq(Identifier('d'),Quanted(Some(),Identifier('c.runBy'))),
- ] ,Identifier('d.name'))
-algebra=qo.rewrite(testalgebra)
-code=algebra.compile();
-compile(code,'<string>','eval')
-q = RunnableQuery(engine,algebra,code)
+qo=Query(
+ metadata,
+ set,
+ [
+ In(
+ metadata,
+ Identifier(metadata,'c'),
+ Identifier(metadata,'ICurses')),
+ In(
+ metadata,
+ Identifier(metadata,'d'),
+ Identifier(metadata,'IDepartments')),
+ Eq(
+ metadata,
+ Identifier(metadata,'c.credits'),
+ Constant(metadata,'3')),
+ Eq(
+ metadata,
+ Identifier(metadata,'d'),
+ Quanted(
+ metadata,
+ Some(metadata),
+ Property(metadata,
+ Identifier(metadata, 'c'),
+ Identifier(metadata, 'runBy'))
+ )),
+ ] ,Identifier(metadata, 'd.name'))
-print
-print query
-print algebra
-print code
-print "got: ",q.execute()
-print "expected:",set(['Computing Science'])
+doone(qo, set(['Computing Science']))
+#algebra=qo.rewrite(testalgebra)
+#code=algebra.compile();
+#compile(code,'<string>','eval')
+#q = RunnableQuery(engine,algebra,code)
+#
+#print
+#print query
+#print algebra
+#print code
+#print "got: ",q.execute()
+#print "expected:",set(['Computing Science'])
+
+metadata.symbols = SymbolContainer()
# join -- Departments running some not 3 credits curses
#
# [ d in IDepartments, c in ICurses, some c.runBy = d, some c.credits != 3| d.name ]
#
-#query = "[ d in IDepartments, cr as set [ c in ICurses, some c.runBy = d | c.credits ], some cr != 3| d.name ]"
-query = "[ d in IDepartments, c in ICurses, some c.runBy = d, c.credits != 3| d.name ]"
-qo=Query(set, [
- In(Identifier('d'),Identifier('IDepartments')),
- In(Identifier('c'),Identifier('ICurses')),
- Eq(Identifier('d'),Quanted(Some(),Identifier('c.runBy'))),
- Ne(Constant('3'),Identifier('c.credits')),
- ] ,Identifier('d.name'))
-algebra=qo.rewrite(testalgebra)
-code=algebra.compile();
-compile(code,'<string>','eval')
-q = RunnableQuery(engine,algebra,code)
+query = """[ d in IDepartments,
+c in ICurses,
+some c.runBy = d, c.credits != 3| d.name ]"""
+qo=Query(
+ metadata,
+ set,
+ [
+ In(
+ metadata,
+ Identifier(metadata,'d'),
+ Identifier(metadata,'IDepartments')),
+ In(
+ metadata,
+ Identifier(metadata,'c'),
+ Identifier(metadata,'ICurses')),
+ Eq(
+ metadata,
+ Identifier(metadata,'d'),
+ Quanted(
+ metadata,
+ Some(metadata),
+ Property(metadata,
+ Identifier(metadata, 'c'),
+ Identifier(metadata, 'runBy'))
+ )),
+ Ne(
+ metadata,
+ Constant(metadata,'3'),
+ Identifier(metadata,'c.credits')),
+ ] ,Identifier(metadata,'d.name'))
-print
-print query
-print algebra
-print code
-print "got: ",q.execute()
-print "expected:",set(['Other department','Computing Science'])
+doone(qo, set(['Other department','Computing Science']))
+
+#algebra=qo.rewrite(testalgebra)
+#code=algebra.compile();
+#compile(code,'<string>','eval')
+#q = RunnableQuery(engine,algebra,code)
#
+#print
+#print query
+#print algebra
+#print code
+#print "got: ",q.execute()
+#print "expected:",set(['Other department','Computing Science'])
+
+metadata.symbols = SymbolContainer()
#
-# join -- Departments running just 3 credits curses
#
-# set [ d in ICurses, all set [ c in ICurses, some c.runBy = d | c.credits ] = 3 | d.name ]
+# join -- Departments running just 2 credits curses
#
-query = "set [ d in IDepartments, every set [ c in ICurses, some c.runBy = d | c.credits ] = 2 | d.name ]"
-qo=Query(set,
+# set [ d in IDepartments, every set [ c in ICurses, some c.runBy = d | c.credits ] = 3 | d.name ]
+#
+query = """set [ d in IDepartments,
+ every
+ set [ c in ICurses, some c.runBy = d | c.credits ] = 2
+ | d.name ]"""
+qo=Query(
+ metadata,
+ set,
[
- In(Identifier('d'),Identifier('IDepartments')),
- Eq(Quanted(Every(),Query(set,[
- In(Identifier('c'),Identifier('ICurses')),
- Eq(Identifier('d'),Quanted(Some(),Identifier('c.runBy'))),
- ], Identifier('c.credits'))),Constant('2')),
- ] ,Identifier('d.name'))
-algebra=qo.rewrite(testalgebra)
-code=algebra.compile();
-compile(code,'<string>','eval')
-q = RunnableQuery(engine,algebra,code)
+ In(
+ metadata,
+ Identifier(metadata,'d'),
+ Identifier(metadata,'IDepartments')),
+ Eq(
+ metadata,
+ Quanted(
+ metadata,
+ Every(metadata),
+ Query(
+ metadata,
+ set,
+ [
+ In(
+ metadata,
+ Identifier(metadata,'c'),
+ Identifier(metadata,'ICurses')),
+ Eq(
+ metadata,
+ Identifier(metadata,'d'),
+ Quanted(
+ metadata,
+ Some(metadata),
+ Property(metadata,
+ Identifier(metadata, 'c'),
+ Identifier(metadata, 'runBy'))
+ )),
+ ], Identifier(metadata, 'c.credits'))),Constant(metadata,'2')),
+ ] ,Identifier(metadata,'d.name'))
-print
-print query
-print algebra
-print code
-print "got: ",q.execute()
-print "expected:",set(['Other department'])
+doone(qo, set(['Other department']))
+
+#algebra=qo.rewrite(testalgebra)
+#code=algebra.compile();
+#compile(code,'<string>','eval')
+#q = RunnableQuery(engine,algebra,code)
+#
+#print
+#print query
+#print algebra
+#print code
+#print "got: ",q.execute()
+#print "expected:",set(['Other department'])
+
+#metadata.symbols = SymbolContainer()
+##
+##
+## alias
+##
+## set [ c in ICurses, a as c.code | a ]
+##
+#query = """set [ c in ICurses, a as c.code | a ]"""
+#
+#qo=Query(
+# metadata,
+# set,
+# [
+# In(
+# metadata,
+# Identifier(metadata,'c'),
+# Identifier(metadata,'ICurses')),
+# Alias(
+# metadata,
+# Identifier(metadata,'a'),
+# Property(metadata,
+# Identifier(metadata, 'c'),
+# Identifier(metadata, 'code')))
+# ] ,Identifier(metadata,'c') )
+#
+#doone(qo, set(['C1','C2','C3']))
\ No newline at end of file
Modified: Sandbox/ocql-foliage/trunk/src/testalgebra.py
===================================================================
--- Sandbox/ocql-foliage/trunk/src/testalgebra.py 2007-09-26 23:36:31 UTC (rev 80170)
+++ Sandbox/ocql-foliage/trunk/src/testalgebra.py 2007-09-26 23:41:50 UTC (rev 80171)
@@ -245,6 +245,7 @@
self.coll2 = coll2
def compile(self):
+ #TODO: no conversion??? or you just didn't know the from-to?
return '%s(metadata.getAll("%s"))' % (
self.coll1.__name__,
self.expr.compile())
Modified: Sandbox/ocql-foliage/trunk/src/testdb.py
===================================================================
--- Sandbox/ocql-foliage/trunk/src/testdb.py 2007-09-26 23:36:31 UTC (rev 80170)
+++ Sandbox/ocql-foliage/trunk/src/testdb.py 2007-09-26 23:41:50 UTC (rev 80171)
@@ -1,25 +1,56 @@
+from zope.interface import Interface, implements
+from zope.schema import TextLine, Set, Choice, Int, List
from ocql.engine import metadata
# schema
-class ICurses:
- pass
+class ICurses(Interface):
+ code = TextLine(
+ title=u"Course code",
+ required=True
+ )
+ runBy = List(
+ title=u"Run by",
+ value_type = Choice(
+ title=u"Department",
+ vocabulary="vocab_of_IDepartment",
+ )
+ )
+ credits = Int(
+ title=u"Credits",
+ )
-class IDepartments:
- pass
+class IDepartments(Interface):
+ name = TextLine(
+ title=u"name",
+ required=True
+ )
+ address = Choice(
+ title=u"Street address",
+ vocabulary="vocab_of_IAddress",
+ required=True
+ )
class MClass(metadata.MetaType):
+ #interface suspect thing
def __init__(self, klass):
self.klass = klass
def is_collection(self):
return True
- def get_type(self):
+ def get_collection_type(self):
return set
def get_contained(self):
return self.klass
+ def __getitem__(self, name):
+ x = self.klass[name]._type
+ try:
+ return x[-1]
+ except TypeError:
+ return x
+
class MType(metadata.MetaType):
def __init__(self, klass, collection_type=None):
self.klass = klass
@@ -28,19 +59,23 @@
def is_collection(self):
return (self.collection_type is not None)
- def get_type(self):
+ def get_collection_type(self):
return self.collection_type
def get_contained(self):
return self.klass
class Department(object):
+ implements(IDepartments)
+
def __init__(self, name):
self.name = name
class Curses(object):
- def __init__(self, name, runBy, credits):
- self.name = name
+ implements(ICurses)
+
+ def __init__(self, code, runBy, credits):
+ self.code = code
self.runBy = runBy
self.credits = credits
@@ -52,6 +87,7 @@
C2 = Curses("C2", runBy = set(), credits=3)
C3 = Curses("C3", runBy = set([D1]), credits=3)
+
# metadata
class TestMetadata(metadata.Metadata):
db = {
@@ -59,20 +95,18 @@
'ICurses': [C1, C2, C3]
}
classes = {
- 'IDepartments': MClass(ICurses),
- 'ICurses': MClass(IDepartments),
+ 'IDepartments': MClass(IDepartments),
+ 'ICurses': MClass(ICurses),
}
- properties = {
- 'IDepartments': { 'name': str },
- 'ICurses': {
- 'runBy': MType(IDepartments,set),
- 'credits': MType(int)
- },
- }
def getAll(self, klass):
x=self.db[klass]
return x
def get_class(self, name):
- return classes[name]
+ return self.classes[name]
+
+ def get_collection_type(self, name):
+ klass = self.get_class(name)
+ rv = klass.get_collection_type()
+ return rv
\ No newline at end of file
More information about the Checkins
mailing list