[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