[Checkins] SVN: Sandbox/adamg/ocql/trunk/s merge of svn://svn.zope.org/repos/main/Sandbox/adamg/ocql/branches/dbprovider branch

Adam Groszer agroszer at gmail.com
Tue Jul 1 06:16:20 EDT 2008


Log message for revision 87878:
  merge of svn://svn.zope.org/repos/main/Sandbox/adamg/ocql/branches/dbprovider branch

Changed:
  U   Sandbox/adamg/ocql/trunk/setup.py
  A   Sandbox/adamg/ocql/trunk/src/ocql/database/index.py
  U   Sandbox/adamg/ocql/trunk/src/ocql/database/metadata.py
  A   Sandbox/adamg/ocql/trunk/src/ocql/database/tests.py
  U   Sandbox/adamg/ocql/trunk/src/ocql/parser/parser.txt
  U   Sandbox/adamg/ocql/trunk/src/ocql/parser/queryparser.py
  U   Sandbox/adamg/ocql/trunk/src/ocql/queryobject/queryobject.py
  U   Sandbox/adamg/ocql/trunk/src/ocql/testing/database.py
  A   Sandbox/adamg/ocql/trunk/src/ocql/testing/sample/
  A   Sandbox/adamg/ocql/trunk/src/ocql/testing/utils.py
  A   Sandbox/adamg/ocql/trunk/src/ocql/tests/test_old.py
  A   Sandbox/adamg/ocql/trunk/src/ocql/tests/test_utils.py
  A   Sandbox/adamg/ocql/trunk/src/ocql/tests/test_zope.py

-=-
Modified: Sandbox/adamg/ocql/trunk/setup.py
===================================================================
--- Sandbox/adamg/ocql/trunk/setup.py	2008-07-01 10:06:08 UTC (rev 87877)
+++ Sandbox/adamg/ocql/trunk/setup.py	2008-07-01 10:16:19 UTC (rev 87878)
@@ -32,6 +32,9 @@
         test = [
             'zope.testing',
             'zope.schema',
+
+            'zope.app.catalog',
+            'zope.index',
             ],
         ),
     install_requires = [

Copied: Sandbox/adamg/ocql/trunk/src/ocql/database/index.py (from rev 87876, Sandbox/adamg/ocql/branches/dbprovider/src/ocql/database/index.py)
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/database/index.py	                        (rev 0)
+++ Sandbox/adamg/ocql/trunk/src/ocql/database/index.py	2008-07-01 10:16:19 UTC (rev 87878)
@@ -0,0 +1,137 @@
+# -*- coding: UTF-8 -*-
+
+"""Special index to collect all objects providing an interface
+
+$Id$
+"""
+
+#TODO: not optimal, uses FieldIndex with a value of always 1
+
+import zope.index.field
+import zope.interface
+import zope.schema
+
+from zope.i18nmessageid import ZopeMessageFactory as _
+
+import zope.app.container.contained
+import zope.app.catalog.attribute
+import zope.app.catalog.interfaces
+
+class IAllIndex(zope.interface.Interface):
+    """I index objects by first adapting them to an interface, then
+       retrieving a field on the adapted object.
+    """
+
+    interface = zope.schema.Choice(
+        title=_(u"Interface"),
+        description=_(u"Objects will be adapted to this interface"),
+        vocabulary="Interfaces",
+        required=False,
+        )
+
+
+class IAllMixinIndex(IAllIndex,
+                  zope.app.catalog.interfaces.ICatalogIndex):
+    """Interface-based catalog index
+    """
+
+class AllMixinIndex(object):
+    """Index interface-defined attributes
+
+       Mixin for indexing all objects providing a particular interface.
+
+       The class is meant to be mixed with a base class that defines an
+       index_doc method:
+
+         >>> class BaseIndex(object):
+         ...     def __init__(self):
+         ...         self.data = []
+         ...     def index_doc(self, id, value):
+         ...         self.data.append((id, value))
+
+         >>> class Index(AllMixinIndex, BaseIndex):
+         ...     pass
+
+         Let's setup two interfaces with classes to test:
+
+         >>> from zope.interface import Interface
+         >>> from zope.interface import implements
+
+         >>> class I1(Interface):
+         ...     pass
+
+         >>> class I2(Interface):
+         ...     pass
+
+         >>> class Data1:
+         ...     implements(I1)
+         ...     def __init__(self, v):
+         ...         self.x = v
+
+         >>> class Data2:
+         ...     implements(I2)
+         ...     def __init__(self, v):
+         ...         self.x = v
+
+         >>> class Data3:
+         ...     implements(I1, I2)
+         ...     def __init__(self, v):
+         ...         self.x = v
+
+         Our index will index all objects providing I1:
+
+         >>> index1 = Index(interface=I1)
+
+         Those two provide it, they get indexed:
+
+         >>> index1.index_doc(11, Data1(1))
+         >>> index1.index_doc(22, Data1(2))
+         >>> index1.data
+         [(11, 1), (22, 1)]
+
+         Those two provide I2, they DONT get indexed:
+
+         >>> index1.index_doc(110, Data2(21))
+         >>> index1.index_doc(220, Data2(22))
+         >>> index1.data
+         [(11, 1), (22, 1)]
+
+         Those two provide also it, they get indexed:
+
+         >>> index1.index_doc(1100, Data3(21))
+         >>> index1.index_doc(2200, Data3(22))
+         >>> index1.data
+         [(11, 1), (22, 1), (1100, 1), (2200, 1)]
+
+
+       """
+
+    zope.interface.implements(IAllMixinIndex)
+
+    default_interface = None
+
+    def __init__(self, interface=None,
+                 *args, **kwargs):
+        #we don't care about field_name and field_callable
+        super(AllMixinIndex, self).__init__(*args, **kwargs)
+        if interface is None:
+            self.interface = self.default_interface
+        else:
+            self.interface = interface
+
+        if self.interface is None:
+            raise ValueError("Must pass an interface")
+
+    def index_doc(self, docid, object):
+        if not self.interface.providedBy(object):
+            return None
+
+        return super(AllMixinIndex, self).index_doc(docid, 1)
+
+
+
+class AllIndex(AllMixinIndex,
+                 zope.index.field.FieldIndex,
+                 zope.app.container.contained.Contained):
+
+    zope.interface.implements(IAllIndex)

Modified: Sandbox/adamg/ocql/trunk/src/ocql/database/metadata.py
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/database/metadata.py	2008-07-01 10:06:08 UTC (rev 87877)
+++ Sandbox/adamg/ocql/trunk/src/ocql/database/metadata.py	2008-07-01 10:16:19 UTC (rev 87878)
@@ -1,3 +1,16 @@
+
+from zope.interface import implements
+from zope.component import adapts
+from zope.component.interface import searchInterfaceUtilities
+from zope.component import getUtility
+from zope.component import getUtilitiesFor
+from zope.app.catalog.interfaces import ICatalog
+from zope.app.intid import IIntIds
+import zc.relation.interfaces
+
+from ocql.interfaces import IDB
+from ocql.database.index import AllIndex
+
 class MetaType:
     def get_property(self, name):
         """
@@ -20,9 +33,68 @@
     def get_size(self):
         """Returns the size of the collection or class if known"""
 
+
+class MClass(MetaType):
+    #interface suspect thing
+    def __init__(self, klass):
+        self.klass = klass
+
+    def is_collection(self):
+        return True
+
+    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 Metadata:
-    def __init__(self):
-        pass
+    implements(IDB)
+    adapts(None)
 
-    def get_class(self, classname):
-        """Returns a MetaType instance for the class."""
\ No newline at end of file
+    classes = None
+
+    def __init__(self,context=None):
+        #interfaces can be retrieved from the registry
+        #as they are unusual to change
+        self.classes = {}
+        items = list(searchInterfaceUtilities(None))
+        for name, iface in items:
+            self.classes[iface.__name__] = MClass(iface)
+
+        #catalogs = getUtilitiesFor(zc.relation.interfaces.ICatalog)
+        #for name, catalog in catalogs:
+        #    for index in catalog:
+        #        results = catalog.iterValueIndexInfo()
+        #        for result in results:
+        #            continue
+        #            #need to continue if this is required
+
+    def getAll(self, klassname):
+        #objects have to be retrieved always on call
+        #as they are subject to change
+
+        catalogs = getUtilitiesFor(ICatalog)
+        intids = getUtility(IIntIds)
+        for name, catalog in catalogs:
+            for iname, index in catalog.items():
+                if isinstance(index, AllIndex):
+                    if index.interface.__name__ == klassname:
+                        interface = index.interface
+                        results = catalog.apply({iname:(1,1)})
+                        obj_list = [intids.getObject(result) for result in results]
+                        return obj_list
+
+        return None
+
+    def get_class(self, klassname):
+        """Returns a MetaType instance for the class."""
+        return self.classes[klassname]

Copied: Sandbox/adamg/ocql/trunk/src/ocql/database/tests.py (from rev 87876, Sandbox/adamg/ocql/branches/dbprovider/src/ocql/database/tests.py)
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/database/tests.py	                        (rev 0)
+++ Sandbox/adamg/ocql/trunk/src/ocql/database/tests.py	2008-07-01 10:16:19 UTC (rev 87878)
@@ -0,0 +1,13 @@
+import unittest
+import doctest
+from zope.testing.doctestunit import DocTestSuite,DocFileSuite
+
+def test_suite():
+    flags =  doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS
+    return unittest.TestSuite((
+        DocTestSuite('ocql.database.index')
+        ))
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')

Modified: Sandbox/adamg/ocql/trunk/src/ocql/parser/parser.txt
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/parser/parser.txt	2008-07-01 10:06:08 UTC (rev 87877)
+++ Sandbox/adamg/ocql/trunk/src/ocql/parser/parser.txt	2008-07-01 10:16:19 UTC (rev 87878)
@@ -5,15 +5,15 @@
 
 
     #FAILS, why?
-    #>>> QueryParser("set [ ]")(None)
-    #Query(<type 'set'>, , Constant(1))
+    >>> QueryParser("set [ ]")(None)
+    Query(<type 'set'>, , None)
 
     >>> QueryParser("set [ | 1 ]")(None)
     Query(<type 'set'>, , Constant(1))
 
     #FAILS, why?
-    #>>> QueryParser("list [ | 1 ]")(None)
-    #Query(<type 'set'>, , Constant(1))
+    >>> QueryParser("list [ | 1 ]")(None)
+    Query(<type 'list'>, , Constant(1))
 
     >>> QueryParser("set [ | 1 ] union set [|2]")(None)
     Union(Query(<type 'set'>, , Constant(1)), Query(<type 'set'>, , Constant(2)))
@@ -32,5 +32,5 @@
 
     #>>> QueryParser("set [ c in ICourse; c.credits>3 | c.code ]")(None)
 
-    >>> QueryParser("set [ c in ICourse | c.code ]")(None)
-    Query(<type 'set'>, In(Identifier(c), Identifier(ICourse)), Property(Identifier(c), Identifier(code)))
\ No newline at end of file
+    #>>> QueryParser("set [ c in ICourse | c.code ]")(None)
+    #Query(<type 'set'>, In(Identifier(c), Identifier(ICourse)), Property(Identifier(c), Identifier(code)))
\ No newline at end of file

Modified: Sandbox/adamg/ocql/trunk/src/ocql/parser/queryparser.py
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/parser/queryparser.py	2008-07-01 10:06:08 UTC (rev 87877)
+++ Sandbox/adamg/ocql/trunk/src/ocql/parser/queryparser.py	2008-07-01 10:16:19 UTC (rev 87878)
@@ -34,20 +34,15 @@
         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]
 
+#further expand COND_OP, MODIFIER, QUANTOR
 tokens = ('TYPE', 'UNION', 'DIFFER', 'AND', 'OR', 'NOT', 'ELLIPSIS', 'IN',
-        'AS', 'SIZE', 'COND_OP', 'MODIFIER', 'QUANTOR', 'CONSTANT',
+        'AS', 'SIZE', 'EQ','NE','LT','GT','LE','GE', 'ATLEAST','ATMOST','JUST','EVERY','SOME', 'CONSTANT',
         'IDENTIFIER', 'PLUS', 'MINUS', 'MUL', 'DIV', 'BRACEL', 'BRACER',
         'SQUAREL', 'SQUARER', 'CURLYL', 'CURLYR',
         'PIPE', 'DOT', 'SEMICOL', 'COMMA'
@@ -62,7 +57,12 @@
     ('left', 'AND'),
     ('left', 'OR'),
     ('right', 'NOT'),
-    ('left', 'COND_OP'),
+    ('left', 'EQ'),
+    ('left', 'NE'),
+    ('left', 'LT'),
+    ('left', 'GT'),
+    ('left', 'LE'),
+    ('left', 'GE'),
     ('left', 'PLUS', 'MINUS'),
     ('left', 'MUL', 'DIV'),
 #   ('token', 'IDENTIFIER'),
@@ -96,7 +96,7 @@
 
     # Tokens
     def t_TYPE(self, t):
-        r'(set|bag|map)'
+        r'(set|bag|map|list)'
         return t
 
     def t_UNION(self, t):
@@ -135,18 +135,62 @@
         r'size'
         return t
 
-    def t_COND_OP(self, t):
-        r'(<|>|<=|>=|==|!=)'
+    #def t_COND_OP(self, t):
+    #    r'(<|>|<=|>=|==|!=)'
+    #    return t
+
+    def t_LT(self, t):
+        r'<'
         return t
+    
+    def t_GT(self, t):
+        r'>'
+        return t
+    
+    def t_LE(self, t):
+        r'<='
+        return t
+    
+    def t_GE(self, t):
+        r'>='
+        return t
+    
+    def t_EQ(self, t):
+        r'=='
+        return t
+    
+    def t_NE(self, t):
+        r'!='
+        return t 
+    
+    #def t_MODIFIER(self, t):
+    #    r'(atleast|atmost|just)'
+    #    return t
 
-    def t_MODIFIER(self, t):
-        r'(atleast|atmost|just)'
+    def t_ATLEAST(self, t):
+        r'atleast'
         return t
+    
+    def t_ATMOST(self, t):
+        r'atmost'
+        return t
+    
+    def t_JUST(self, t):
+        r'just'
+        return t
+    
+    #def t_QUANTOR(self, t):
+    #    r'(every|some)'
+    #    return t
 
-    def t_QUANTOR(self, t):
-        r'(every|some)'
+    def t_EVERY(self, t):
+        r'every'
         return t
-
+    
+    def t_SOME(self, t):
+        r'some'
+        return t
+    
     def t_CONSTANT(self, t):
         r'(\'(\\.|[^\'])*\'|"(\\.|[^"])*"|[0-9]+)'
         return t
@@ -227,91 +271,145 @@
     def p_error(self, t):
         print "Syntax error at '%s' (%s)" % (t.value, t.lexpos)
 
-    def p_expr_cond(self, t):
-        r'''expr : modifier nexpr COND_OP omodifier nexpr
-                 | expr COND_OP omodifier nexpr'''
-        raise "Help"
+    #expr COND_OP modifier nexpr seems to be wrong logically
+    #def p_expr_cond(self, t):
+    #    r'''expr : modifier nexpr COND_OP modifier nexpr
+    #             | modifier expr COND_OP modifier nexpr'''
+    #    raise "Help"
 
+    def p_expr_atleast(self, t):
+        r'''expr : ATLEAST expr 
+        '''
+        t[0] = Atleast(self.metadata, self.symbols, t[2])
+        
+    def p_expr_atmost(self, t):
+        r'''expr : ATMOST expr 
+        '''
+        t[0] = Atmost(self.metadata, self.symbols, t[2])
+        
+    def p_expr_just(self, t):
+        r'''expr : JUST expr 
+        '''
+        t[0] = Just(self.metadata, self.symbols, t[2])
+
+    def p_expr_every(self, t):
+        r'''expr : EVERY expr 
+        '''
+        t[0] = Every(self.metadata, self.symbols, t[2])
+                
+    def p_expr_some(self, t):
+        r'''quented : expr
+                    | SOME expr 
+        '''
+        if len(t)==2:
+            t[0] = t[1]
+        else:
+            t[0] = Some(self.metadata, self.symbols, t[2])
+        
+    def p_expr_eq(self, t):
+        r'''expr : quented EQ expr
+        '''
+        t[0] = Eq(self.metadata, self.symbols, t[1], t[3])
+        
+    def p_expr_ne(self, t):
+        r'''expr : expr NE expr
+        '''
+        t[0] = Ne(self.metadata, self.symbols, t[1], t[3])
+
+    def p_expr_lt(self, t):
+        r'''expr : expr LT expr
+        '''
+        t[0] = Lt(self.metadata, self.symbols, t[1], t[3])
+
+    def p_expr_gt(self, t):
+        r'''expr : expr GT expr
+        '''
+        t[0] = Gt(self.metadata, self.symbols, t[1], t[3])
+        
+    def p_expr_le(self, t):
+        r'''expr : expr LE expr
+        '''
+        t[0] = Le(self.metadata, self.symbols, t[1], t[3])
+        
+    def p_expr_ge(self, t):
+        r'''expr : expr GE expr
+        '''
+        t[0] = Ge(self.metadata, self.symbols, t[1], t[3])
+        
     def p_expr_union(self, t):
         r'''expr : expr UNION expr
-            nexpr : nexpr UNION nexpr
         '''
         t[0] = Union(self.metadata, self.symbols, t[1], t[3])
         if DEBUG: print t[0]
 
     def p_expr_differ(self, t):
         r'''expr : expr DIFFER expr
-            nexpr : nexpr DIFFER nexpr
         '''
         t[0] = Differ(self.metadata, self.symbols, t[1], t[3])
         if DEBUG: print t[0]
 
+    def p_expr_equery(self, t):
+        r'''expr : TYPE SQUAREL xprs SQUARER
+        '''
+        #I also change the expected query in parser.txt
+        t[0] = Query(self.metadata, self.symbols, self.types[t[1]],t[3],None)
+        
     def p_expr_query(self, t):
         r'''expr : TYPE SQUAREL xprs PIPE expr SQUARER
-            nexpr : TYPE SQUAREL xprs PIPE expr SQUARER
         '''
         t[0] = Query(self.metadata, self.symbols, self.types[t[1]], t[3], t[5])
         if DEBUG: print "p_expr_query", t[0]
 
     def p_expr_and(self, t):
         r'''expr : expr AND expr
-            nexpr : nexpr AND nexpr
         '''
         t[0] = And(self.metadata, self.symbols, t[1], t[3])
         if DEBUG: print t[0]
 
     def p_expr_or(self, t):
         r'''expr : expr OR expr
-            nexpr : nexpr OR nexpr
         '''
         t[0] = Or(self.metadata, self.symbols, t[1], t[3])
         if DEBUG: print t[0]
 
     def p_expr_plus(self, t):
         r'''expr : expr PLUS expr
-            nexpr : nexpr PLUS nexpr
         '''
         t[0] = Add(self.metadata, self.symbols, t[1], t[3])
         if DEBUG: print t[0]
 
     def p_expr_minus(self, t):
         r'''expr : expr MINUS expr
-            nexpr : nexpr MINUS nexpr
         '''
         t[0] = Sub(self.metadata, self.symbols, t[1], t[3])
         if DEBUG: print t[0]
 
     def p_expr_mul(self, t):
         r'''expr : expr MUL expr
-            nexpr : nexpr MUL nexpr
         '''
         t[0] = Mul(self.metadata, self.symbols, t[1], t[3])
         if DEBUG: print t[0]
 
     def p_expr_div(self, t):
         r'''expr : expr DIV expr
-            nexpr : nexpr DIV nexpr
         '''
         t[0] = Div(self.metadata, self.symbols, t[1], t[3])
         if DEBUG: print t[0]
 
     def p_expr_not(self, t):
         r'''expr : NOT expr
-            nexpr : NOT nexpr
         '''
         t[0] = Not(self.metadata, self.symbols, t[2])
         if DEBUG: print t[0]
 
     def p_expr_dot(self, t):
         r'''expr : expr DOT expr
-            nexpr : nexpr DOT expr
         '''
         t[0] = Property(self.metadata, self.symbols, t[1], t[3])
         if DEBUG: print t[0]
 
     def p_expr_id(self, t):
         r'''expr : IDENTIFIER
-           nexpr : IDENTIFIER
         '''
         t[0] = Identifier(self.metadata, self.symbols, t[1])
         if DEBUG: print "p_expr_id", t[0]
@@ -319,62 +417,55 @@
 
     def p_expr_call(self, t):
         r'''expr : IDENTIFIER BRACEL exprs BRACER
-            nexpr : IDENTIFIER BRACEL exprs BRACER
         '''
         raise NotImplementedError("Function call")
-
+    
     def p_expr_const(self, t):
         r'''expr : CONSTANT
-            nexpr : CONSTANT
         '''
         t[0] = Constant(self.metadata, self.symbols, t[1])
         if DEBUG: print t[0]
 
     def p_expr_array(self, t):
         r'''expr : TYPE '{' exprs '}'
-            nexpr : TYPE '{' exprs '}'
         '''
         raise NotImplementedError("array")
 
     def p_expr_range(self, t):
         r'''expr : TYPE CURLYL expr ELLIPSIS expr CURLYR
-            nexpr : TYPE CURLYL expr ELLIPSIS expr CURLYR
         '''
         raise NotImplementedError("range")
 
 
     def p_expr_index(self, t):
         r'''expr : expr DOT SQUAREL expr SQUARER
-            nexpr : nexpr DOT SQUAREL expr SQUARER
         '''
         t[0] = Index(self.metadata, self.symbols, t[1], t[4])
         if DEBUG: print t[0]
 
     def p_expr_size(self, t):
         r'''expr : SIZE expr
-            nexpr : SIZE expr
         '''
         t[0] = Count(self.metadata, self.symbols, t[2])
         if DEBUG: print t[0]
 
     def p_expr_bracket(self, t):
         r'''expr : BRACEL expr BRACER
-            nexpr : BRACEL expr BRACEL
         '''
         t[0] = t[2]
         if DEBUG: print t[0]
 
-    def p_omodifier(self, t):
-        r'''omodifier : QUANTOR
-                      | MODIFIER
-        '''
-        if DEBUG: print t[0]
+    #def p_omodifier(self, t):
+    #    r'''omodifier : QUANTOR
+    #                  | MODIFIER
+    #    '''
+    #    if DEBUG: print t[0]
 
-    def p_modifier(self, t):
-        r'''modifier : QUANTOR
-                     | MODIFIER
-        '''
-        if DEBUG: print t[0]
+    #def p_modifier(self, t):
+    #    r'''modifier : QUANTOR
+    #                 | MODIFIER
+    #    '''
+    #    if DEBUG: print t[0]
 
     def p_exprs(self, t):
         r'''exprs : expr
@@ -407,7 +498,7 @@
         elif len(t)==2:
             t[0] = [ t[1] ]
         else:
-            t[3].insert(t[0], 0)
+            t[3].insert(0,t[1])
             t[0] = t[3]
         if DEBUG: print "p_xprs", t[0]
 

Modified: Sandbox/adamg/ocql/trunk/src/ocql/queryobject/queryobject.py
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/queryobject/queryobject.py	2008-07-01 10:06:08 UTC (rev 87877)
+++ Sandbox/adamg/ocql/trunk/src/ocql/queryobject/queryobject.py	2008-07-01 10:16:19 UTC (rev 87878)
@@ -182,9 +182,11 @@
             elif isinstance(firstTerm, Alias):
                 rv = Query(
                     self.metadata,
+                    self.symbols,
                     self.collection_type,
                     [In(
                         self.metadata,
+                        self.symbols,
                         firstTerm.identifier,
                         firstTerm.expression
                         )]+self.terms[1:],
@@ -194,6 +196,7 @@
                     firstTerm.rewrite(algebra),
                     Query(
                         self.metadata,
+                        self.symbols,
                         self.collection_type,
                         self.terms[1:],
                         self.target).rewrite(algebra),
@@ -400,6 +403,16 @@
 # Conditional
 #
 class Quantor(QueryObject):
+    def __init__(self, metadata, symbols, expr):
+        self.metadata = metadata
+        self.symbols = symbols
+        self.expr = expr
+        
+    def __repr__(self):
+        return "(%s)" % (
+            self.__class__.__name__
+            )
+        
     def rewrite(self, algebra, expression, quanter, operator):
         raise NotImplementedError()
 
@@ -427,8 +440,10 @@
             algebra.Lambda('i',
                 operator.__class__(
                     self.metadata,
+                    self.symbols,
                     Identifier(
                         self.metadata,
+                        self.symbols,
                         'i'),
                     expression
                 ).rewrite(algebra)
@@ -446,7 +461,8 @@
             algebra.Lambda('i',
                 operator.__class__(
                     self.metadata,
-                    Identifier(self.metadata, 'i'),
+                    self.symbols,
+                    Identifier(self.metadata, self.symbols,'i'),
                     expression
                 ).rewrite(algebra)
             ),
@@ -455,31 +471,34 @@
         )
 
 class Atmost(Quantor):
-    expr = None
+    pass
+    #expr = None
 
-    def __init__(self, metadata, symbols, expr):
-        raise NotImplementedError(self)
-        self.metadata = metadata
-        self.symbols = symbols
-        self.expr = expr
+    #def __init__(self, metadata, symbols, expr):
+    #    raise NotImplementedError(self)
+    #    self.metadata = metadata
+    #    self.symbols = symbols
+    #    self.expr = expr
 
 class Atleast(Quantor):
-    expr = None
+    pass
+    #expr = None
 
-    def __init__(self, metadata, symbols, expr):
-        raise NotImplementedError(self)
-        self.metadata = metadata
-        self.symbols = symbols
-        self.expr = expr
+    #def __init__(self, metadata, symbols, expr):
+    #    raise NotImplementedError(self)
+    #    self.metadata = metadata
+    #    self.symbols = symbols
+    #    self.expr = expr
 
 class Just(Quantor):
-    expr = None
+    pass
+    #expr = None
 
-    def __init__(self, metadata, symbols, expr):
-        raise NotImplementedError(self)
-        self.metadata = metadata
-        self.symbols = symbols
-        self.expr = expr
+    #def __init__(self, metadata, symbols, expr):
+    #    raise NotImplementedError(self)
+    #    self.metadata = metadata
+    #    self.symbols = symbols
+    #   self.expr = expr
 
 # Logical operators
 class Condition(Expression):

Modified: Sandbox/adamg/ocql/trunk/src/ocql/testing/database.py
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/testing/database.py	2008-07-01 10:06:08 UTC (rev 87877)
+++ Sandbox/adamg/ocql/trunk/src/ocql/testing/database.py	2008-07-01 10:16:19 UTC (rev 87878)
@@ -6,7 +6,7 @@
 from zope.schema import TextLine, Set, Choice, Int, List
 
 from ocql.interfaces import IDB
-from ocql.database import metadata
+from ocql.database.metadata import MClass,Metadata,MetaType
 
 # schema
 class ICourse(Interface):
@@ -36,28 +36,30 @@
         required=True
         )
 
-class MClass(metadata.MetaType):
+#I moved these classes to metadata, is it ok?
+
+#class MClass(metadata.MetaType):
     #interface suspect thing
-    def __init__(self, klass):
-        self.klass = klass
+#    def __init__(self, klass):
+#        self.klass = klass
 
-    def is_collection(self):
-        return True
+    #def is_collection(self):
+     #   return True
 
-    def get_collection_type(self):
-        return set
+#    def get_collection_type(self):
+#        return set
 
-    def get_contained(self):
-        return self.klass
+#    def get_contained(self):
+#        return self.klass
 
-    def __getitem__(self, name):
-        x = self.klass[name]._type
-        try:
-            return x[-1]
-        except TypeError:
-            return x
+#    def __getitem__(self, name):
+#        x = self.klass[name]._type
+#        try:
+#            return x[-1]
+#        except TypeError:
+#            return x
 
-class MType(metadata.MetaType):
+class MType(MetaType):
     def __init__(self, klass, collection_type=None):
         self.klass = klass
         self.collection_type = collection_type
@@ -107,7 +109,7 @@
 
 
 # metadata
-class TestMetadata(metadata.Metadata):
+class TestMetadata(Metadata):
     implements(IDB)
     adapts(None)
 
@@ -130,7 +132,7 @@
     def get_class(self, 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
+    #def get_collection_type(self, name):
+    #    klass = self.get_class(name)
+    #    rv = klass.get_collection_type()
+    #    return rv
\ No newline at end of file

Copied: Sandbox/adamg/ocql/trunk/src/ocql/testing/sample (from rev 87876, Sandbox/adamg/ocql/branches/dbprovider/src/ocql/testing/sample)

Copied: Sandbox/adamg/ocql/trunk/src/ocql/testing/utils.py (from rev 87876, Sandbox/adamg/ocql/branches/dbprovider/src/ocql/testing/utils.py)
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/testing/utils.py	                        (rev 0)
+++ Sandbox/adamg/ocql/trunk/src/ocql/testing/utils.py	2008-07-01 10:16:19 UTC (rev 87878)
@@ -0,0 +1,146 @@
+# -*- coding: UTF-8 -*-
+
+"""Utilities for testing support
+
+$Id$
+"""
+
+from zope import interface, component
+from zope.component.interface import provideInterface
+
+from zope.app.catalog.catalog import Catalog
+from zope.app.catalog.interfaces import ICatalog
+from zope.app.catalog.field import FieldIndex
+from ocql.database.index import AllIndex
+
+from zope.app.intid import IntIds
+from zope.app.intid.interfaces import IIntIds
+
+from zope.app.keyreference.testing import SimpleKeyReference
+
+from ocql.testing.sample.interfaces import IOrganization
+from ocql.testing.sample.interfaces import IProject
+from ocql.testing.sample.interfaces import IStudent
+from ocql.testing.sample.interfaces import IMentor
+
+from ocql.testing.sample.mentor import Mentor
+from ocql.testing.sample.project import Project
+from ocql.testing.sample.student import Student
+from ocql.testing.sample.organization import Organization
+        
+import zc.relation.catalog
+import zc.relation.interfaces
+import zc.relation.queryfactory
+import BTrees
+
+#_obj = {}
+#_relation = {}
+
+def setupInterfaces(test):
+    provideInterface('', IOrganization)
+    provideInterface('', IProject)
+    provideInterface('', IStudent)
+    provideInterface('', IMentor)
+
+#def dumpObj(obj, catalog, cache):
+#    if _obj.setdefault(obj.name,obj) is not obj:
+#        raise ValueError('mentor can only take one project')
+#    return obj
+#
+#def loadObj(token, catalog, cache):
+#    return _obj[token]
+#
+#def dumpRelation(obj, catalog, cache):
+#    if _relation.setdefault(id(obj),obj) is not obj:
+#        raise ValueError('same relation')
+#    return id(obj)
+#
+#def loadRelation(token, catalog, cache):
+#    return _relation[token]
+
+def setupCatalog(test):
+    intids = IntIds()
+    component.provideUtility(intids, IIntIds)
+    component.provideAdapter(SimpleKeyReference)
+    cat = Catalog()
+
+    cat['org_name'] = FieldIndex('name', IOrganization)
+
+    cat['proj_name'] = FieldIndex('name', IProject)
+    cat['proj_descr'] = FieldIndex('description', IProject)
+
+    cat['student_name'] = FieldIndex('name', IStudent)
+
+    cat['mentor_name'] = FieldIndex('name', IMentor)
+
+    cat['all_students'] = AllIndex(IStudent)
+    cat['all_mentors'] = AllIndex(IMentor)
+    cat['all_projects'] = AllIndex(IProject)
+    cat['all_orgs'] = AllIndex(IOrganization)
+
+    m1 = Mentor()
+    m1.name = u"John Doe"
+    id = intids.register(m1)
+    cat.index_doc(id, m1)
+
+    p1 = Project()
+    p1.name = u"Save the world"
+    p1.description = u"test"
+    id = intids.register(p1)
+    cat.index_doc(id, p1)
+
+    s1 = Student()
+    s1.name = u"Charith"
+    id = intids.register(s1)
+    cat.index_doc(id, s1)
+
+    s2 = Student()
+    s2.name = u"Jane"
+    id = intids.register(s2)
+    cat.index_doc(id, s2)
+
+    s3 = Student()
+    s3.name = u"Ann"
+    id = intids.register(s3)
+    cat.index_doc(id, s3)
+
+    o1 = Organization()
+    o1.name = u"Zope.org"
+    id = intids.register(o1)
+    cat.index_doc(id, o1)
+    
+#    cat2 = zc.relation.catalog.Catalog(dumpRelation, loadRelation)
+#    cat2.addValueIndex(IProjectRelation['project'], dumpObj, loadObj, btree=BTrees.family32.OO)
+#    cat2.addValueIndex(IProjectRelation['mentor'], dumpObj, loadObj, btree=BTrees.family32.OO)
+#    cat2.addDefaultQueryFactory(zc.relation.queryfactory.TransposingTransitive('project','mentor'))
+#
+#    rel = ProjectRelation(m1, p1)
+#    cat2.index(rel)
+#    component.provideUtility(cat2, zc.relation.interfaces.ICatalog, name='rel-catalog')
+    component.provideUtility(cat, ICatalog, name='foo-catalog')
+
+def queryCatalog():
+    cat = component.getUtility(ICatalog, name='foo-catalog')
+#    cat2 = component.getUtility(zc.relation.interfaces.ICatalog, name='rel-catalog')
+#    query = cat2.tokenizeQuery
+    intids = component.getUtility(IIntIds)
+
+    results = cat.apply({'student_name':('Charith','Charith')})
+
+    for r in results:
+        obj = intids.getObject(r)
+        print obj
+
+    results = cat.apply({'all_students':(1,1)})
+
+    for r in results:
+        obj = intids.getObject(r)
+        print obj
+        
+#    rel_mentor = cat.apply({'all_mentors':(1,1)})
+#    
+#    for r in rel_mentor:
+#        obj = intids.getObject(r)     
+#        for p in cat2.findValueTokens('project',query(mentor=obj)):
+#            print p.name
+#    
\ No newline at end of file

Copied: Sandbox/adamg/ocql/trunk/src/ocql/tests/test_old.py (from rev 87876, Sandbox/adamg/ocql/branches/dbprovider/src/ocql/tests/test_old.py)
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/tests/test_old.py	                        (rev 0)
+++ Sandbox/adamg/ocql/trunk/src/ocql/tests/test_old.py	2008-07-01 10:16:19 UTC (rev 87878)
@@ -0,0 +1,518 @@
+# -*- coding: UTF-8 -*-
+
+"""OLD tests taken over
+
+$Id$
+"""
+
+import unittest
+import doctest
+from zope.testing.doctestunit import DocTestSuite,DocFileSuite
+
+from zope.component import adapts
+from zope.component import provideAdapter
+from zope.interface import implements
+
+from ocql.queryobject.queryobject import *
+from ocql.parser.queryparser import SymbolContainer
+from ocql.rewriter import algebra
+from ocql.engine import OCQLEngine
+from ocql.compiler.runnablequery import RunnableQuery
+
+from ocql.parser.queryparser import QueryParser
+from ocql.qoptimizer.qoptimizer import QueryOptimizer
+from ocql.rewriter.rewriter import Rewriter
+from ocql.aoptimizer.aoptimizer import AlgebraOptimizer
+from ocql.compiler.compiler import AlgebraCompiler
+from ocql.testing.database import TestMetadata
+
+from ocql.testing.database import C1, C2, C3
+from ocql.testing.database import D1, D2, D3
+
+from ocql.interfaces import IDB
+from ocql.interfaces import IQueryParser
+from ocql.interfaces import IObjectQuery
+
+
+class QueryNullParser(object):
+    implements(IQueryParser)
+    adapts(IObjectQuery)
+
+    def __init__(self, context):
+        self.context = context
+        #self.db = db
+
+    def __call__(self, metadata):
+        return self.context
+
+
+class testOLD(unittest.TestCase):
+    def setUp(self):
+        provideAdapter(QueryParser)
+        provideAdapter(QueryNullParser)
+        provideAdapter(QueryOptimizer)
+        provideAdapter(Rewriter)
+        provideAdapter(AlgebraOptimizer)
+        provideAdapter(AlgebraCompiler)
+        provideAdapter(TestMetadata)
+
+        self.engine = OCQLEngine()
+
+    def doone(self, query, qo, expected):
+        print "==============="
+        print "query:",query
+
+        algebra_=qo.rewrite(algebra)
+
+        print "algebra:",algebra_
+
+        code=algebra_.compile();
+        compile(code,'<string>','eval')
+        q = RunnableQuery(engine,algebra_,code)
+
+        print "code:",code
+        print "---------------"
+        print "got:     ", q.execute()
+        print "expected:", expected
+
+    def doit(self, query, qo, expected):
+        run = self.engine.compile(qo)
+        result = run.execute()
+
+        self.assertEqual(expected, result)
+
+
+    def test_old(self):
+        metadata = IDB(None)
+        symbols = SymbolContainer()
+
+        #
+        # Simple empty query
+        #
+        # set [ ]
+        #
+        query = "set [ ]"
+        qo=Query(metadata, symbols,
+                 set,
+                 [] ,
+                 Identifier(metadata, symbols,
+                            '') )
+
+        self.doit(query, qo, set([]))
+
+
+        symbols = SymbolContainer()
+        #
+        # Simple SELECT ALL
+        #
+        # set [ c in ICourse | c ]
+        #
+        query = "[ c in ICourse | c ]"
+        qo=Query(
+            metadata, symbols,
+            set,
+            [
+                In(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'c'),
+                    Identifier(metadata, symbols,'ICourse')),
+            ] ,Identifier(metadata, symbols,'c') )
+
+        #caution, these here are object references
+        self.doit(query, qo, set([ C1 , C2, C3 ]))
+
+
+        symbols = SymbolContainer()
+        #
+        # Selecting a property
+        #
+        # set [ c in ICourse | c.code ]
+        #
+        query = "[ c in ICourse | c.code ]"
+        qo=Query(
+            metadata, symbols,
+            set,
+            [
+                In(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'c'),
+                    Identifier(metadata, symbols,'ICourse')),
+            ] ,Identifier(metadata, symbols,'c.code') )
+
+        self.doit(query, qo, set([ "C1" , "C2", "C3"  ]))
+
+
+        symbols = SymbolContainer()
+        #
+        # Filtering -- empty result
+        #
+        # set [ c in ICourse , c.credits>3 | c.code ]
+        #
+        query = "[ c in ICourse, c.credits>3 | c.code ]"
+        qo=Query(
+            metadata, symbols,
+            set,
+            [
+                In(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'c'),
+                    Identifier(metadata, symbols,'ICourse')),
+                Gt(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'c.credits'),
+                    Constant(metadata, symbols,'3')),
+            ] ,Identifier(metadata, symbols, 'c.code') )
+
+        self.doit(query, qo, set([]))
+
+
+        symbols = SymbolContainer()
+        #
+        # Filtering -- full result
+        #
+        # set [ c in ICourse , c.credits<=3 | c.code ]
+        #
+        query = "[ c in ICourse, c.credits<=3 | c.code ]"
+        qo=Query(
+            metadata, symbols,
+            set, [
+                In(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'c'),
+                    Identifier(metadata, symbols,'ICourse')),
+                Le(metadata, symbols,
+                    Identifier(metadata, symbols,'c.credits'),
+                    Constant(metadata, symbols,'3')),
+            ] ,Identifier(metadata, symbols,'c.code'))
+
+        self.doit(query, qo, set([ "C1" , "C2", "C3" ]))
+
+
+        symbols = SymbolContainer()
+        #
+        # Filtering -- one result
+        #
+        # set [ c in ICourse , c.credits=3 | c.code ]
+        #
+        query = "[ c in ICourse, c.credits=3 | c.code ]"
+        qo=Query(
+            metadata, symbols,
+            set,
+            [
+                In(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'c'),
+                    Identifier(metadata, symbols,'ICourse')),
+                Eq(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'c.credits'),
+                    Constant(metadata, symbols,'3')),
+            ] ,Identifier(metadata, symbols,'c.code'))
+
+        self.doit(query, qo, set([ "C2", "C3" ]))
+
+
+        symbols = SymbolContainer()
+        #
+        # Two filters -- full results
+        #
+        # set [ c in ICourse , c.credits<5, c.credits >=1  | c.code ]
+        #
+        query = "[ c in ICourse, c.credits<3, c.credits>=1 | c.code ]"
+        qo=Query(
+            metadata, symbols,
+            set,
+            [
+                In(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'c'),
+                    Identifier(metadata, symbols,'ICourse')),
+                Lt(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'c.credits'),
+                    Constant(metadata, symbols,'5')),
+                Ge(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'c.credits'),
+                    Constant(metadata, symbols,'1')),
+            ] ,Identifier(metadata, symbols, 'c.code'))
+
+        self.doit(query, qo, set([ "C1", "C2", "C3" ]))
+
+
+        symbols = SymbolContainer()
+        #
+        # Two filters -- one result
+        #
+        # set [ c in ICourse , c.credits<=2, 2<=c.credits  | c.code ]
+        #
+        query = "[ c in ICourse, c.credits<=2, 2<=c.credits | c.code ]"
+        qo=Query(
+            metadata, symbols,
+            set, [
+                In(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'c'),
+                    Identifier(metadata, symbols,'ICourse')),
+                Le(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'c.credits'),
+                    Constant(metadata, symbols,'2')),
+                Le(
+                    metadata, symbols,
+                    Constant(metadata, symbols,'2'),
+                    Identifier(metadata, symbols,'c.credits')),
+            ] ,Identifier(metadata, symbols,'c.code'))
+
+        self.doit(query, qo, set([ "C1" ]))
+
+
+        symbols = SymbolContainer()
+        #
+        # Two filters -- one result
+        #
+        # set [ c in ICourse , c.credits>=2, 2>=c.credits  | c.code ]
+        #
+        query = "[ c in ICourse, c.credits>=2, 2>=c.credits | c.code ]"
+        qo=Query(
+            metadata, symbols,
+            set, [
+                In(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'c'),
+                    Identifier(metadata, symbols,'ICourse')),
+                Ge(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'c.credits'),
+                    Constant(metadata, symbols,'2')),
+                Ge(
+                    metadata, symbols,
+                    Constant(metadata, symbols,'2'),
+                    Identifier(metadata, symbols,'c.credits')),
+            ] ,Identifier(metadata, symbols,'c.code'))
+
+        self.doit(query, qo, set([ "C1" ]))
+
+
+        symbols = SymbolContainer()
+        #
+        # Two filters -- no result
+        #
+        # set [ c in ICourse , c.credits=3, c.credits!=3  | c.code ]
+        #
+        query = "[ c in ICourse, c.credits=3, c.credits!=3 | c.code ]"
+        qo=Query(
+            metadata, symbols,
+            set, [
+                In(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'c'),
+                    Identifier(metadata, symbols,'ICourse')),
+                Eq(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'c.credits'),
+                    Constant(metadata, symbols,'3')),
+                Ne(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'c.credits'),
+                    Constant(metadata, symbols,'3')),
+            ] ,Identifier(metadata, symbols,'c.code'))
+
+        self.doit(query, qo, set([]))
+
+
+        symbols = SymbolContainer()
+        #
+        # join -- Departments running curses
+        #
+        # set [ c in ICourse d, in IDepartments ,
+        # some c.runBy = d  | d.name ]
+        #
+        query = "[ c in ICourse, d in IDepartments, d = some c.runBy | d.name  ]"
+        qo=Query(
+            metadata, symbols,
+            set, [
+                In(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'c'),
+                    Identifier(metadata, symbols,'ICourse')),
+                In(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'d'),
+                    Identifier(metadata, symbols,'IDepartments')),
+                Eq(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'d'),
+                    Quanted(metadata, symbols,
+                            Some(metadata, symbols, ''),
+                            Property(metadata, symbols,
+                                    Identifier(metadata, symbols, 'c'),
+                                    Identifier(metadata, symbols, 'runBy'))
+                                )),
+            ] ,Identifier(metadata, symbols,'d.name'))
+
+        self.doit(query, qo, set(['Other department', 'Computing Science']))
+
+
+        symbols = SymbolContainer()
+        #
+        # join -- Departments running some 3 credits curses
+        #
+        # set [ d in ICourse, c in ICourse, c.credits=3, some c.runBy = d | d.name ]
+        #
+        query = "[ c in ICourse, d in IDepartments, c.credits=3, d = some c.runBy | d.name  ]"
+        qo=Query(
+            metadata, symbols,
+            set,
+            [
+                In(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'c'),
+                    Identifier(metadata, symbols,'ICourse')),
+                In(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'d'),
+                    Identifier(metadata, symbols,'IDepartments')),
+                Eq(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'c.credits'),
+                    Constant(metadata, symbols,'3')),
+                Eq(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'d'),
+                    Quanted(
+                        metadata, symbols,
+                        Some(metadata, symbols, ''),
+                        Property(metadata, symbols,
+                                    Identifier(metadata, symbols, 'c'),
+                                    Identifier(metadata, symbols, 'runBy'))
+                                )),
+            ] ,Identifier(metadata, symbols, 'd.name'))
+
+        self.doit(query, qo, set(['Computing Science']))
+
+
+        symbols = SymbolContainer()
+        # join -- Departments running some not 3 credits curses
+        #
+        # [ d in IDepartments, c in ICourse, some c.runBy = d, some c.credits != 3| d.name ]
+        #
+        query = """[ d in IDepartments,
+        c in ICourse,
+        some c.runBy = d, c.credits != 3| d.name ]"""
+        qo=Query(
+            metadata, symbols,
+            set,
+            [
+                In(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'d'),
+                    Identifier(metadata, symbols,'IDepartments')),
+                In(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'c'),
+                    Identifier(metadata, symbols,'ICourse')),
+                Eq(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'d'),
+                    Quanted(
+                        metadata, symbols,
+                        Some(metadata, symbols, ''),
+                        Property(metadata, symbols,
+                                    Identifier(metadata, symbols, 'c'),
+                                    Identifier(metadata, symbols, 'runBy'))
+                                )),
+                Ne(
+                    metadata, symbols,
+                    Constant(metadata, symbols,'3'),
+                    Identifier(metadata, symbols,'c.credits')),
+            ] ,Identifier(metadata, symbols,'d.name'))
+
+        self.doit(query, qo, set(['Other department','Computing Science']))
+
+
+        symbols = SymbolContainer()
+        #
+        #
+        # join -- Departments running just 2 credits curses
+        #
+        # set [ d in IDepartments, every set [ c in ICourse, some c.runBy = d | c.credits ] = 3  | d.name ]
+        #
+        query = """set [ d in IDepartments,
+            every
+            set [ c in ICourse, some c.runBy = d | c.credits ] = 2
+            | d.name ]"""
+        qo=Query(
+            metadata, symbols,
+            set,
+            [
+                In(
+                    metadata, symbols,
+                    Identifier(metadata, symbols,'d'),
+                    Identifier(metadata, symbols,'IDepartments')),
+                Eq(
+                    metadata, symbols,
+                    Quanted(
+                        metadata, symbols,
+                        Every(metadata, symbols, ''),
+                        Query(
+                            metadata, symbols,
+                            set,
+                            [
+                                In(
+                                    metadata, symbols,
+                                    Identifier(metadata, symbols,'c'),
+                                    Identifier(metadata, symbols,'ICourse')),
+                                Eq(
+                                    metadata, symbols,
+                                    Identifier(metadata, symbols,'d'),
+                                    Quanted(
+                                        metadata, symbols,
+                                        Some(metadata, symbols, ''),
+                                        Property(metadata, symbols,
+                                            Identifier(metadata, symbols, 'c'),
+                                            Identifier(metadata, symbols, 'runBy'))
+                                        )),
+                            ], Identifier(metadata, symbols, 'c.credits')
+                            )
+                    ),Constant(metadata, symbols,'2')),
+            ] ,Identifier(metadata, symbols,'d.name'))
+
+        self.doit(query, qo, set(['Other department']))
+
+
+        #symbols = SymbolContainer()
+        ##
+        ##
+        ## alias
+        ##
+        ## set [ c in ICourse, a as c.code  | a ]
+        ##
+        #query = """set [ c in ICourse, a as c.code  | a ]"""
+        #
+        #qo=Query(
+        #    metadata, symbols,
+        #    set,
+        #    [
+        #        In(
+        #            metadata, symbols,
+        #            Identifier(metadata, symbols,'c'),
+        #            Identifier(metadata, symbols,'ICourse')),
+        #        Alias(
+        #            metadata, symbols,
+        #            Identifier(metadata, symbols,'a'),
+        #            Property(metadata, symbols,
+        #                 Identifier(metadata, symbols, 'c'),
+        #                 Identifier(metadata, symbols, 'code')))
+        #    ] ,Identifier(metadata, symbols,'c') )
+        #
+        #self.doit(query, qo, set(['C1','C2','C3']))
+
+def test_suite():
+    flags =  doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS
+    return unittest.TestSuite((
+        unittest.makeSuite(testOLD),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')
\ No newline at end of file

Copied: Sandbox/adamg/ocql/trunk/src/ocql/tests/test_utils.py (from rev 87876, Sandbox/adamg/ocql/branches/dbprovider/src/ocql/tests/test_utils.py)
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/tests/test_utils.py	                        (rev 0)
+++ Sandbox/adamg/ocql/trunk/src/ocql/tests/test_utils.py	2008-07-01 10:16:19 UTC (rev 87878)
@@ -0,0 +1,28 @@
+# -*- coding: UTF-8 -*-
+
+"""Main
+
+$Id$
+"""
+
+import unittest
+import doctest
+from zope.testing.doctestunit import DocTestSuite,DocFileSuite
+
+from ocql.testing.utils import *
+
+class testUtils(unittest.TestCase):
+    def testCatalog(self):
+        setupInterfaces(None)
+        setupCatalog(None)
+        queryCatalog()
+
+
+def test_suite():
+    flags =  doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS
+    return unittest.TestSuite((
+        unittest.makeSuite(testUtils),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')
\ No newline at end of file

Copied: Sandbox/adamg/ocql/trunk/src/ocql/tests/test_zope.py (from rev 87876, Sandbox/adamg/ocql/branches/dbprovider/src/ocql/tests/test_zope.py)
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/tests/test_zope.py	                        (rev 0)
+++ Sandbox/adamg/ocql/trunk/src/ocql/tests/test_zope.py	2008-07-01 10:16:19 UTC (rev 87878)
@@ -0,0 +1,156 @@
+import unittest
+import doctest
+
+from zope.interface import implements
+from zope.component import adapts, getUtility, provideAdapter
+from zope.interface import Interface
+
+from ocql.aoptimizer.aoptimizer import AlgebraOptimizer
+from ocql.compiler.compiler import AlgebraCompiler
+from ocql.database import metadata
+from ocql.database.metadata import Metadata
+from ocql.engine import OCQLEngine
+from ocql.interfaces import IDB
+from ocql.parser.queryparser import QueryParser, SymbolContainer
+from ocql.qoptimizer.qoptimizer import QueryOptimizer
+from ocql.queryobject.queryobject import *
+from ocql.rewriter.rewriter import Rewriter
+from ocql.testing.utils import setupInterfaces, setupCatalog
+from ocql.tests.test_old import QueryNullParser
+from ocql.testing.sample.student import Student
+
+
+db = {}
+
+classes = {}
+
+class testZope(unittest.TestCase):
+    def setUp(self):
+        provideAdapter(QueryParser)
+        provideAdapter(QueryNullParser)
+        provideAdapter(QueryOptimizer)
+        provideAdapter(Rewriter)
+        provideAdapter(AlgebraOptimizer)
+        provideAdapter(AlgebraCompiler)
+        provideAdapter(Metadata)
+
+        setupInterfaces(self)
+        setupCatalog(self)
+
+        self.engine = OCQLEngine()
+
+    #just copy following methods from test_old
+    def doone(self, query, qo, expected):
+        print "==============="
+        print "query:",query
+
+        algebra_=qo.rewrite(algebra)
+
+        print "algebra:",algebra_
+
+        code=algebra_.compile();
+        compile(code,'<string>','eval')
+        q = RunnableQuery(engine,algebra_,code)
+
+        print "code:",code
+        print "---------------"
+        print "got:     ", q.execute()
+        print "expected:", expected
+
+    def doit(self, query, qo, expected):
+        run = self.engine.compile(qo)
+        result = run.execute()
+
+        self.assertEqual(expected, result)
+
+
+    def test_gsoc(self):
+        metadata = IDB(None)
+        symbols = SymbolContainer()
+
+        #
+        # Simple empty query
+        #
+        # set [ ]
+        #
+        query = "set [ ]"
+        qo=Query(metadata, symbols,
+                 set,
+                 [] ,
+                 Identifier(metadata, symbols,
+                            '') )
+
+        self.doit(query, qo, set([]))
+
+
+        symbols = SymbolContainer()
+        #
+        # Simple SELECT ALL
+        #
+        # set [ c in IStudent | c ]
+        #
+        query = "[c in IStudent | c]"
+        qo = Query(
+                metadata, symbols,
+                set,
+                [
+                    In(
+                       metadata, symbols,
+                       Identifier(metadata,symbols,'c'),
+                       Identifier(metadata,symbols,'IStudent'))
+                ], Identifier(metadata,symbols,'c'))
+
+        self.doit(query, qo, set(metadata.getAll('IStudent')))
+
+
+        symbols = SymbolContainer()
+        #
+        # Selecting a property
+        #
+        # set [ c in IStudent | c.name ]
+        #
+        query = "[c in IStudent | c.name]"
+        qo = Query(
+                   metadata, symbols,
+                   set,
+                   [
+                        In(
+                           metadata, symbols,
+                           Identifier(metadata, symbols,'c'),
+                           Identifier(metadata, symbols, 'IStudent'))
+                    ],Identifier(metadata, symbols, 'c.name'))
+        self.doit(query, qo, set(["Charith", "Jane", "Ann"]))
+
+
+        symbols = SymbolContainer()
+        #
+        # Filtering --one result
+        #
+        # set [ c in IProject , c.description="test" | c.name]
+        #
+        query = "[c in IProject , c.description=test | c.name]"
+        qo = Query(
+                   metadata, symbols,
+                   set,
+                   [
+                        In(
+                           metadata, symbols,
+                           Identifier(metadata,symbols,'c'),
+                           Identifier(metadata,symbols, 'IProject')),
+                        Eq(
+                           metadata,symbols,
+                           Identifier(metadata, symbols, 'c.description'),
+                           Identifier(metadata, symbols, '"test"'))
+                   ], Identifier(metadata, symbols, 'c.name'))
+
+        self.doit(query, qo, set(["Save the world"]))
+
+
+def test_suite():
+    flags =  doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS
+    return unittest.TestSuite((
+                               unittest.makeSuite(testZope),
+                               ))
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')



More information about the Checkins mailing list