[Checkins] SVN: Sandbox/adamg/ocql/trunk/src/ocql/q improving docs, cleaning up

Adam Groszer agroszer at gmail.com
Tue Aug 26 03:57:59 EDT 2008


Log message for revision 90263:
  improving docs, cleaning up

Changed:
  U   Sandbox/adamg/ocql/trunk/src/ocql/qoptimizer/qoptimizer.txt
  U   Sandbox/adamg/ocql/trunk/src/ocql/queryobject/queryobject.py
  U   Sandbox/adamg/ocql/trunk/src/ocql/queryobject/queryobject.txt
  A   Sandbox/adamg/ocql/trunk/src/ocql/queryobject/queryobject_checks.txt
  U   Sandbox/adamg/ocql/trunk/src/ocql/queryobject/tests.py

-=-
Modified: Sandbox/adamg/ocql/trunk/src/ocql/qoptimizer/qoptimizer.txt
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/qoptimizer/qoptimizer.txt	2008-08-26 07:56:39 UTC (rev 90262)
+++ Sandbox/adamg/ocql/trunk/src/ocql/qoptimizer/qoptimizer.txt	2008-08-26 07:57:58 UTC (rev 90263)
@@ -2,6 +2,16 @@
 Queryobject optimizer
 =====================
 
+Input: Queryobject tree
+Output: Queryobject tree
+
+The task of the Queryobject optimizer is to do optimizations on the queryobject
+tree.
+Some basic optimizations can be done based on equivalence.
+Those decisions can be based on static properties of the database.
+Like which class is derived from which one. See the 1994 paper.
+Definitely no dynamic properties can be taken into account, like objects in an index.
+
     >>> from ocql.qoptimizer.qoptimizer import QueryOptimizer
     >>> from ocql.interfaces import IOptimizedObjectQuery
 
@@ -24,6 +34,4 @@
     'foo-bar'
 
     >>> IOptimizedObjectQuery.providedBy(out)
-    True
-
-There are some options to optimize the queryobject tree.
+    True
\ No newline at end of file

Modified: Sandbox/adamg/ocql/trunk/src/ocql/queryobject/queryobject.py
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/queryobject/queryobject.py	2008-08-26 07:56:39 UTC (rev 90262)
+++ Sandbox/adamg/ocql/trunk/src/ocql/queryobject/queryobject.py	2008-08-26 07:57:58 UTC (rev 90263)
@@ -26,7 +26,7 @@
 class Head(Location):
     implements(IObjectQueryHead)
     def __init__(self, tree):
-        self.name = 'head'
+        self.__name__ = 'head'
         self.tree = tree
         locate(tree, self, 'tree')
 
@@ -49,12 +49,10 @@
         setattr(self, name, value)
         for term in value:
             if ILocation.providedBy(term):
-                locate(term, self, 'term')
+                locate(term, self, name)
         self.children.extend(value)
 
 class QueryObject(Child):
-    #TODO: this is dirty here, at the end we'll need to have a tree of
-    #QueryObject's whose topmost element will only get this IF
     implements(IObjectQuery)
 
     metadata = None
@@ -124,7 +122,6 @@
 
 
 class hasClassWith(Expression):
-    #NotImplementedError
     implements(IhasClassWith)
 
     expression = None

Modified: Sandbox/adamg/ocql/trunk/src/ocql/queryobject/queryobject.txt
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/queryobject/queryobject.txt	2008-08-26 07:56:39 UTC (rev 90262)
+++ Sandbox/adamg/ocql/trunk/src/ocql/queryobject/queryobject.txt	2008-08-26 07:57:58 UTC (rev 90263)
@@ -1,238 +1,61 @@
 
-Checks here make sure that Interfaces are properly implemented
+Queryobject
+===========
 
-#TODO: extend for all Interfaces and classes
+Where is it used:
+* output of the parser
+* input of the queryoptimizer
+* output of the queryoptimizer
+* input of the rewriter
 
-    >>> from ocql.interfaces import IObjectQuery
-    >>> from ocql.interfaces import IObjectQueryHead
-    >>> from ocql.queryobject.interfaces import *
+These classes make up the representation of the query.
+Instances of the classes are placed in a tree.
+This tree organization is needed in first place for the optimization.
+It is a lot easier to look for a pattern is a sub-tree and replace that subtree.
 
-    >>> from ocql.queryobject.queryobject import *
-    >>> from ocql.testing.database import TestMetadata
-    >>> from ocql.parser.queryparser import SymbolContainer
+To make life easier we'll use the parser to produce our sample queryobject
+trees:
 
-    >>> from zope.interface.verify import verifyClass, verifyObject
+    >>> from ocql.parser.queryparser import QueryParser
 
-    >>> child = Child()
-    >>> metadata = TestMetadata()
-    >>> symbols = SymbolContainer()
+Let's take a fairly simple one:
 
-    >>> verifyClass(IObjectQueryHead, Head)
-    True
-    >>> verifyObject(IObjectQueryHead, Head(child))
-    True
+    >>> head = QueryParser("set [ c in ICourse; c.credits <= 3 | c.code ]")(None)
+    >>> head
+    Head(Query(<type 'set'>,
+    In(Identifier(c), Identifier(ICourse));
+    Le(Property(Identifier(c), Identifier(credits)),
+    Constant(3)), Property(Identifier(c), Identifier(code))))
 
-    >>> verifyClass(IObjectQueryChild, Child)
-    True
-    >>> verifyObject(IObjectQueryChild, child)
-    True
+There is always a Head element, which contains the complete tree:
 
-    >>> verifyClass(IObjectQuery, QueryObject)
-    True
-    >>> verifyObject(IObjectQuery, QueryObject(metadata, symbols))
-    True
+    >>> head.tree
+    Query(<type 'set'>,
+    In(Identifier(c), Identifier(ICourse));
+    Le(...), Property(...))
 
-    >>> verifyClass(ITerm, Term)
-    True
-    >>> verifyObject(ITerm, Term(metadata, symbols, child, child))
-    True
+All tree elements know about their child elements:
 
-    >>> verifyClass(IExpression, Expression)
-    True
-    >>> verifyObject(IExpression, Expression(metadata, symbols, child, child))
-    True
+    >>> head.tree.children
+    [In(Identifier(c), Identifier(ICourse)), Le(...), Property(...)]
 
-    >>> verifyClass(IIsinstance, Isinstance)
-    True
-    >>> verifyObject(IIsinstance, Isinstance(metadata, symbols, child, Child))
-    True
+And all child elements know about their parents:
 
-    >>> verifyClass(IhasClassWith, hasClassWith)
-    True
-    >>> verifyObject(IhasClassWith, hasClassWith(metadata, symbols, child, set, child))
-    True
+    >>> head.tree.__parent__
+    Head(...)
 
-    >>> verifyClass(IIdentifier, Identifier)
-    True
-    >>> verifyObject(IIdentifier, Identifier(metadata, symbols, child))
-    True
+They also know their 'name' or 'role':
 
-    >>> verifyClass(IConstant, Constant)
-    True
-    >>> verifyObject(IConstant, Constant(metadata, symbols, child))
-    True
+    >>> head.tree.__name__
+    'tree'
 
-    >>> verifyClass(IQuery, Query)
-    True
-    >>> verifyObject(IQuery, Query(metadata, symbols, set, [child], child))
-    True
+Though built-in types don't get into the tree:
+(as you might noticed, this is also not in children list)
 
-    >>> verifyClass(IIn, In)
-    True
-    >>> verifyObject(IIn, In(metadata, symbols, child, child))
-    True
+    >>> head.tree.collection_type
+    <type 'set'>
 
-    >>> verifyClass(IAlias, Alias)
-    True
-    >>> verifyObject(IAlias, Alias(metadata, symbols, child, child))
-    True
-
-    >>> verifyClass(IBinary, Binary)
-    True
-    >>> verifyObject(IBinary, Binary(metadata, symbols, child, child))
-    True
-
-    >>> verifyClass(IUnion, Union)
-    True
-    >>> verifyObject(IUnion, Union(metadata, symbols, child, child))
-    True
-
-    >>> verifyClass(IDiffer, Differ)
-    True
-    >>> verifyObject(IDiffer, Differ(metadata, symbols, child, child))
-    True
-
-    >>> verifyClass(IAnd, And)
-    True
-    >>> verifyObject(IAnd, And(metadata, symbols, child, child))
-    True
-
-    >>> verifyClass(IOr, Or)
-    True
-    >>> verifyObject(IOr, Or(metadata, symbols, child, child))
-    True
-
-    >>> verifyClass(IProperty, Property)
-    True
-    >>> verifyObject(IProperty, Property(metadata, symbols, child, child))
-    True
-
-    >>> verifyClass(IIndex, Index)
-    True
-    >>> verifyObject(IIndex, Index(metadata, symbols, child, child))
-    True
-
-    >>> verifyClass(IArithmetic, Arithmetic)
-    True
-    >>> verifyObject(IArithmetic, Arithmetic(metadata, symbols, child, child))
-    True
-
-    >>> verifyClass(IAdd, Add)
-    True
-    >>> verifyObject(IAdd, Add(metadata, symbols, child, child))
-    True
-
-    >>> verifyClass(IMul, Mul)
-    True
-    >>> verifyObject(IMul, Mul(metadata, symbols, child, child))
-    True
-
-    >>> verifyClass(ISub, Sub)
-    True
-    >>> verifyObject(ISub, Sub(metadata, symbols, child, child))
-    True
-
-    >>> verifyClass(IDiv, Div)
-    True
-    >>> verifyObject(IDiv, Div(metadata, symbols, child, child))
-    True
-
-    >>> verifyClass(IUnary, Unary)
-    True
-    >>> verifyObject(IUnary, Unary(metadata, symbols, child))
-    True
-
-    >>> verifyClass(INot, Not)
-    True
-    >>> verifyObject(INot , Not(metadata, symbols, child))
-    True
-
-    >>> verifyClass(IAggregate, Aggregate)
-    True
-    >>> verifyObject(IAggregate, Aggregate(metadata, symbols, child))
-    True
-
-    >>> verifyClass(ICount, Count)
-    True
-    >>> verifyObject(ICount, Count(metadata, symbols, child))
-    True
-
-    >>> verifyClass(ISum, Sum)
-    True
-    >>> verifyObject(ISum, Sum(metadata, symbols, child))
-    True
-
-    >>> verifyClass(IQuantor, Quantor)
-    True
-    >>> verifyObject(IQuantor, Quantor(metadata, symbols, child))
-    True
-
-    >>> verifyClass(INumericalQuantor, NumericalQuantor)
-    True
-    >>> verifyObject(INumericalQuantor, NumericalQuantor(metadata, symbols, 2, child))
-    True
-
-    >>> verifyClass(IQuanted, Quanted)
-    True
-    >>> verifyObject(IQuanted, Quanted(metadata, symbols, child, child))
-    True
-
-    >>> verifyClass(IEvery, Every)
-    True
-    >>> verifyObject(IEvery, Every(metadata, symbols, child))
-    True
-
-    >>> verifyClass(ISome, Some)
-    True
-    >>> verifyObject(ISome, Some(metadata, symbols, child))
-    True
-
-    >>> verifyClass(IAtmost, Atmost)
-    True
-    >>> verifyObject(IAtmost, Atmost(metadata, symbols, 2, child))
-    True
-
-    >>> verifyClass(IAtleast, Atleast)
-    True
-    >>> verifyObject(IAtleast, Atleast(metadata, symbols, 2, child))
-    True
-
-    >>> verifyClass(IJust, Just)
-    True
-    >>> verifyObject(IJust, Just(metadata, symbols, 2, child))
-    True
-
-    >>> verifyClass(ICondition, Condition)
-    True
-    >>> verifyObject(ICondition, Condition(metadata, symbols, child, child))
-    True
-
-    >>> verifyClass(IEq, Eq)
-    True
-    >>> verifyObject(IEq, Eq(metadata, symbols, child, child))
-    True
-
-    >>> verifyClass(INe, Ne)
-    True
-    >>> verifyObject(INe, Ne(metadata, symbols, child, child))
-    True
-
-    >>> verifyClass(ILt, Lt)
-    True
-    >>> verifyObject(ILt, Lt(metadata, symbols, child, child))
-    True
-
-    >>> verifyClass(IGt, Gt)
-    True
-    >>> verifyObject(IGt, Gt(metadata, symbols, child, child))
-    True
-
-    >>> verifyClass(ILe, Le)
-    True
-    >>> verifyObject(ILe, Le(metadata, symbols, child, child))
-    True
-
-    >>> verifyClass(IGe, Ge)
-    True
-    >>> verifyObject(IGe, Ge(metadata, symbols, child, child))
-    True
+    >>> head.tree.collection_type.__parent__
+    Traceback (most recent call last):
+    ...
+    AttributeError: type object 'set' has no attribute '__parent__'

Added: Sandbox/adamg/ocql/trunk/src/ocql/queryobject/queryobject_checks.txt
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/queryobject/queryobject_checks.txt	                        (rev 0)
+++ Sandbox/adamg/ocql/trunk/src/ocql/queryobject/queryobject_checks.txt	2008-08-26 07:57:58 UTC (rev 90263)
@@ -0,0 +1,238 @@
+
+Checks here make sure that Interfaces are properly implemented
+
+#TODO: extend for all Interfaces and classes
+
+    >>> from ocql.interfaces import IObjectQuery
+    >>> from ocql.interfaces import IObjectQueryHead
+    >>> from ocql.queryobject.interfaces import *
+
+    >>> from ocql.queryobject.queryobject import *
+    >>> from ocql.testing.database import TestMetadata
+    >>> from ocql.parser.queryparser import SymbolContainer
+
+    >>> from zope.interface.verify import verifyClass, verifyObject
+
+    >>> child = Child()
+    >>> metadata = TestMetadata()
+    >>> symbols = SymbolContainer()
+
+    >>> verifyClass(IObjectQueryHead, Head)
+    True
+    >>> verifyObject(IObjectQueryHead, Head(child))
+    True
+
+    >>> verifyClass(IObjectQueryChild, Child)
+    True
+    >>> verifyObject(IObjectQueryChild, child)
+    True
+
+    >>> verifyClass(IObjectQuery, QueryObject)
+    True
+    >>> verifyObject(IObjectQuery, QueryObject(metadata, symbols))
+    True
+
+    >>> verifyClass(ITerm, Term)
+    True
+    >>> verifyObject(ITerm, Term(metadata, symbols, child, child))
+    True
+
+    >>> verifyClass(IExpression, Expression)
+    True
+    >>> verifyObject(IExpression, Expression(metadata, symbols, child, child))
+    True
+
+    >>> verifyClass(IIsinstance, Isinstance)
+    True
+    >>> verifyObject(IIsinstance, Isinstance(metadata, symbols, child, Child))
+    True
+
+    >>> verifyClass(IhasClassWith, hasClassWith)
+    True
+    >>> verifyObject(IhasClassWith, hasClassWith(metadata, symbols, child, set, child))
+    True
+
+    >>> verifyClass(IIdentifier, Identifier)
+    True
+    >>> verifyObject(IIdentifier, Identifier(metadata, symbols, child))
+    True
+
+    >>> verifyClass(IConstant, Constant)
+    True
+    >>> verifyObject(IConstant, Constant(metadata, symbols, child))
+    True
+
+    >>> verifyClass(IQuery, Query)
+    True
+    >>> verifyObject(IQuery, Query(metadata, symbols, set, [child], child))
+    True
+
+    >>> verifyClass(IIn, In)
+    True
+    >>> verifyObject(IIn, In(metadata, symbols, child, child))
+    True
+
+    >>> verifyClass(IAlias, Alias)
+    True
+    >>> verifyObject(IAlias, Alias(metadata, symbols, child, child))
+    True
+
+    >>> verifyClass(IBinary, Binary)
+    True
+    >>> verifyObject(IBinary, Binary(metadata, symbols, child, child))
+    True
+
+    >>> verifyClass(IUnion, Union)
+    True
+    >>> verifyObject(IUnion, Union(metadata, symbols, child, child))
+    True
+
+    >>> verifyClass(IDiffer, Differ)
+    True
+    >>> verifyObject(IDiffer, Differ(metadata, symbols, child, child))
+    True
+
+    >>> verifyClass(IAnd, And)
+    True
+    >>> verifyObject(IAnd, And(metadata, symbols, child, child))
+    True
+
+    >>> verifyClass(IOr, Or)
+    True
+    >>> verifyObject(IOr, Or(metadata, symbols, child, child))
+    True
+
+    >>> verifyClass(IProperty, Property)
+    True
+    >>> verifyObject(IProperty, Property(metadata, symbols, child, child))
+    True
+
+    >>> verifyClass(IIndex, Index)
+    True
+    >>> verifyObject(IIndex, Index(metadata, symbols, child, child))
+    True
+
+    >>> verifyClass(IArithmetic, Arithmetic)
+    True
+    >>> verifyObject(IArithmetic, Arithmetic(metadata, symbols, child, child))
+    True
+
+    >>> verifyClass(IAdd, Add)
+    True
+    >>> verifyObject(IAdd, Add(metadata, symbols, child, child))
+    True
+
+    >>> verifyClass(IMul, Mul)
+    True
+    >>> verifyObject(IMul, Mul(metadata, symbols, child, child))
+    True
+
+    >>> verifyClass(ISub, Sub)
+    True
+    >>> verifyObject(ISub, Sub(metadata, symbols, child, child))
+    True
+
+    >>> verifyClass(IDiv, Div)
+    True
+    >>> verifyObject(IDiv, Div(metadata, symbols, child, child))
+    True
+
+    >>> verifyClass(IUnary, Unary)
+    True
+    >>> verifyObject(IUnary, Unary(metadata, symbols, child))
+    True
+
+    >>> verifyClass(INot, Not)
+    True
+    >>> verifyObject(INot , Not(metadata, symbols, child))
+    True
+
+    >>> verifyClass(IAggregate, Aggregate)
+    True
+    >>> verifyObject(IAggregate, Aggregate(metadata, symbols, child))
+    True
+
+    >>> verifyClass(ICount, Count)
+    True
+    >>> verifyObject(ICount, Count(metadata, symbols, child))
+    True
+
+    >>> verifyClass(ISum, Sum)
+    True
+    >>> verifyObject(ISum, Sum(metadata, symbols, child))
+    True
+
+    >>> verifyClass(IQuantor, Quantor)
+    True
+    >>> verifyObject(IQuantor, Quantor(metadata, symbols, child))
+    True
+
+    >>> verifyClass(INumericalQuantor, NumericalQuantor)
+    True
+    >>> verifyObject(INumericalQuantor, NumericalQuantor(metadata, symbols, 2, child))
+    True
+
+    >>> verifyClass(IQuanted, Quanted)
+    True
+    >>> verifyObject(IQuanted, Quanted(metadata, symbols, child, child))
+    True
+
+    >>> verifyClass(IEvery, Every)
+    True
+    >>> verifyObject(IEvery, Every(metadata, symbols, child))
+    True
+
+    >>> verifyClass(ISome, Some)
+    True
+    >>> verifyObject(ISome, Some(metadata, symbols, child))
+    True
+
+    >>> verifyClass(IAtmost, Atmost)
+    True
+    >>> verifyObject(IAtmost, Atmost(metadata, symbols, 2, child))
+    True
+
+    >>> verifyClass(IAtleast, Atleast)
+    True
+    >>> verifyObject(IAtleast, Atleast(metadata, symbols, 2, child))
+    True
+
+    >>> verifyClass(IJust, Just)
+    True
+    >>> verifyObject(IJust, Just(metadata, symbols, 2, child))
+    True
+
+    >>> verifyClass(ICondition, Condition)
+    True
+    >>> verifyObject(ICondition, Condition(metadata, symbols, child, child))
+    True
+
+    >>> verifyClass(IEq, Eq)
+    True
+    >>> verifyObject(IEq, Eq(metadata, symbols, child, child))
+    True
+
+    >>> verifyClass(INe, Ne)
+    True
+    >>> verifyObject(INe, Ne(metadata, symbols, child, child))
+    True
+
+    >>> verifyClass(ILt, Lt)
+    True
+    >>> verifyObject(ILt, Lt(metadata, symbols, child, child))
+    True
+
+    >>> verifyClass(IGt, Gt)
+    True
+    >>> verifyObject(IGt, Gt(metadata, symbols, child, child))
+    True
+
+    >>> verifyClass(ILe, Le)
+    True
+    >>> verifyObject(ILe, Le(metadata, symbols, child, child))
+    True
+
+    >>> verifyClass(IGe, Ge)
+    True
+    >>> verifyObject(IGe, Ge(metadata, symbols, child, child))
+    True

Modified: Sandbox/adamg/ocql/trunk/src/ocql/queryobject/tests.py
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/queryobject/tests.py	2008-08-26 07:56:39 UTC (rev 90262)
+++ Sandbox/adamg/ocql/trunk/src/ocql/queryobject/tests.py	2008-08-26 07:57:58 UTC (rev 90263)
@@ -5,6 +5,8 @@
 def test_suite():
     flags =  doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS
     return unittest.TestSuite((
+        DocFileSuite('queryobject_checks.txt',
+            optionflags=flags),
         DocFileSuite('queryobject.txt',
             optionflags=flags),
         ))



More information about the Checkins mailing list