[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