[Checkins] SVN: Sandbox/adamg/ocql/trunk/src/ocql/ sanitizing tests and docs

Adam Groszer agroszer at gmail.com
Mon Aug 18 12:28:37 EDT 2008


Log message for revision 89974:
  sanitizing tests and docs

Changed:
  U   Sandbox/adamg/ocql/trunk/src/ocql/OVERVIEW.txt
  U   Sandbox/adamg/ocql/trunk/src/ocql/aoptimizer/aoptimizer.txt
  A   Sandbox/adamg/ocql/trunk/src/ocql/aoptimizer/aoptimizer_all.txt
  D   Sandbox/adamg/ocql/trunk/src/ocql/aoptimizer/aoptimizer_new.txt
  U   Sandbox/adamg/ocql/trunk/src/ocql/aoptimizer/tests.py
  A   Sandbox/adamg/ocql/trunk/src/ocql/compiler/compiler_optimized.txt
  D   Sandbox/adamg/ocql/trunk/src/ocql/compiler/optimize_index.txt
  U   Sandbox/adamg/ocql/trunk/src/ocql/compiler/tests.py
  U   Sandbox/adamg/ocql/trunk/src/ocql/qoptimizer/qoptimizer.txt
  U   Sandbox/adamg/ocql/trunk/src/ocql/rewriter/algebra.py
  U   Sandbox/adamg/ocql/trunk/src/ocql/rewriter/rewriter.txt

-=-
Modified: Sandbox/adamg/ocql/trunk/src/ocql/OVERVIEW.txt
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/OVERVIEW.txt	2008-08-18 16:23:53 UTC (rev 89973)
+++ Sandbox/adamg/ocql/trunk/src/ocql/OVERVIEW.txt	2008-08-18 16:28:36 UTC (rev 89974)
@@ -4,8 +4,38 @@
 
 How parts of it fit together.
 
+Basic operation is like this:
 
+* OCQL query string is the starting point
+* query string is parsed by the parser
+* parsed query becomes a queryobject tree
+* queryobject tree is optimized by the query optimizer
+* becomes also a queryobject tree
+* queryobject tree is rewritten by the rewriter
+* rewritten queryobject becomes an algebra tree
+* algebra tree is optimized by the algebra optimizer
+* becomes also an algebra tree
+* algebra tree is compiled to python source by the compiler
+* compiled code is conained in the runnablequery
+* runnablequery can be executed, returns results
 
+Classes that hold the information are:
+
+* OCQL query string
+* queryobject tree
+* algebra tree
+* runnablequery
+
+Classes that do the work are:
+
+* query parser
+* queryobject optimizer
+* rewriter
+* algebra optimizer
+* compiler
+
+
+
 The following documents help understanding the inner life of the engine:
 
 *  Object Comprehension Query Language proposal

Modified: Sandbox/adamg/ocql/trunk/src/ocql/aoptimizer/aoptimizer.txt
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/aoptimizer/aoptimizer.txt	2008-08-18 16:23:53 UTC (rev 89973)
+++ Sandbox/adamg/ocql/trunk/src/ocql/aoptimizer/aoptimizer.txt	2008-08-18 16:28:36 UTC (rev 89974)
@@ -1,21 +1,23 @@
 
-    >>> from zope.interface.verify import verifyObject
+Algebra optimizer
+=================
 
+The Algebra optimizer's task is to optimize the inputted algebra tree the
+best it can. The output is also an algebra tree.
+
+    >>> from zope.interface.verify import verifyClass, verifyObject
+
     >>> from ocql.interfaces import IAlgebraOptimizer
     >>> from ocql.aoptimizer.aoptimizer import AlgebraOptimizer
     >>> from ocql.interfaces import IOptimizedAlgebraObject
     >>> from ocql.interfaces import IDB
 
-#Currently the optimizer is doing NOTHING, it just returns what it gets.
-#(And adds the interface IOptimizedAlgebraObject)
+    >>> from ocql.rewriter.algebra import Head
+    >>> from ocql.rewriter.algebra import Constant
 
-    >>> class Dummy(object):
-    ...     def __init__(self, tree):
-    ...          self.tree = tree
-
-    >>> in_=Dummy('foo-bar')
+    >>> in_ = Head(Constant('foo-bar'))
     >>> in_.tree
-    'foo-bar'
+    `foo-bar`
 
     >>> obj = AlgebraOptimizer(in_)
     >>> verifyObject(IAlgebraOptimizer, obj)
@@ -24,9 +26,122 @@
     >>> out = obj(None)
 
     >>> print out
-    <Dummy object at ...>
+    Head(`foo-bar`)
     >>> out.tree
-    'foo-bar'
+    `foo-bar`
 
     >>> IOptimizedAlgebraObject.providedBy(out)
-    True
\ No newline at end of file
+    True
+
+Currently the optimizer is doing a minimal optimization by using zope indexes
+where possible to retrieve objects on comparison. (=, <, >, <=, >=, <>)
+This is nowhere near a final status.
+
+We need some setup to demonstrate this:
+
+    >>> from ocql.interfaces import IDB
+    >>> from ocql.aoptimizer.aoptimizer import AlgebraOptimizer
+    >>> from ocql.interfaces import IOptimizedAlgebraObject
+    >>> from ocql.parser.queryparser import QueryParser
+    >>> from ocql.qoptimizer.qoptimizer import QueryOptimizer
+    >>> from ocql.rewriter.rewriter import Rewriter
+    >>> from ocql.compiler.compiler import AlgebraCompiler
+
+    >>> from ocql.testing.utils_opt import setupInterfaces
+    >>> setupInterfaces(None)
+    >>> from ocql.testing.utils_opt import setupCatalog
+    >>> setupCatalog(None)
+
+    >>> testmeta = IDB(None)
+
+Basic query
+-----------
+
+Here is a very basic query to show how the algebra looks like unoptimized.
+
+    >>> query = "set [ i in IUnOptimizedClass | i ]"
+
+    >>> optqo = QueryOptimizer(QueryParser(query)(testmeta))()
+    >>> alg = Rewriter(optqo)()
+    >>> algopt = AlgebraOptimizer(alg)(testmeta)
+
+(alg is always the unoptimized algebra tree)
+
+    >>> alg
+    Head(Iter(<type 'set'>,
+    Lambda i: Single(<type 'set'>, i),
+    Make(<type 'set'>, <type 'set'>, IUnOptimizedClass)))
+
+(algopt is always the optimized algebra tree)
+
+    >>> algopt
+    Head(Iter(<type 'set'>,
+    Lambda i: Single(<type 'set'>, i),
+    Make(<type 'set'>, <type 'set'>, IUnOptimizedClass)))
+
+Still no index
+--------------
+
+This one uses a comparison but still on the class that does not have an index.
+
+    >>> query = "set [ i in IUnOptimizedClass ; i.value == 5 | i.name ]"
+
+    >>> optqo = QueryOptimizer(QueryParser(query)(testmeta))()
+    >>> alg = Rewriter(optqo)()
+    >>> algopt = AlgebraOptimizer(alg)(testmeta)
+
+    >>> alg
+    Head(Iter(<type 'set'>,
+    Lambda i: If(i.value==`5`, Single(<type 'set'>, i.name), Empty(<type 'set'>)),
+    Make(<type 'set'>, <type 'set'>, IUnOptimizedClass)))
+
+    >>> algopt
+    Head(Iter(<type 'set'>,
+    Lambda i: If(i.value==`5`, Single(<type 'set'>, i.name), Empty(<type 'set'>)),
+    Make(<type 'set'>, <type 'set'>, IUnOptimizedClass)))
+
+With index
+----------
+
+Let's see what happens when we switch to the optimized class.
+
+    >>> query = "set [ i in IOptimizedClass ; i.value == 5 | i.name ]"
+
+    >>> optqo = QueryOptimizer(QueryParser(query)(testmeta))()
+    >>> alg = Rewriter(optqo)()
+    >>> algopt = AlgebraOptimizer(alg)(testmeta)
+
+    >>> alg
+    Head(Iter(<type 'set'>,
+    Lambda i: If(i.value==`5`, Single(<type 'set'>, i.name), Empty(<type 'set'>)),
+    Make(<type 'set'>, <type 'set'>, IOptimizedClass)))
+
+Here is the difference. The algebra gets a special object that uses the available
+zope index of the interface to retrieve object instances.
+
+    >>> algopt
+    Head(Iter(<type 'set'>,
+    Lambda i: Single(<type 'set'>, i.name),
+    MakeFromIndex(<type 'set'>, <type 'set'>, IOptimizedClass, value, 5)))
+
+
+
+
+
+Future
+~~~~~~
+
+There are plenty of optimization options as described in the papers.
+Also we can imagine a lot of optimization points when thinking about it.
+
+Most simplest idea is to use zope indexes and intIds fully.
+ZODB's slow point is the object load. That might be skipped by clever usage of
+indexes and intids returned by the indexes. Load any objects as late as possible,
+load the least amount of objects possible.
+
+We think that the most optimal optimizer will be a cost based optimizer.
+This cost based optimizer should take a lot of parameters into account.
+That means it should consult anticipated collection sizes, previous queries, etc.
+
+We also think that optimization will not be limited to the algebra optimizer,
+but will have sideeffect also in the compiler and the compiled code.
\ No newline at end of file

Added: Sandbox/adamg/ocql/trunk/src/ocql/aoptimizer/aoptimizer_all.txt
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/aoptimizer/aoptimizer_all.txt	                        (rev 0)
+++ Sandbox/adamg/ocql/trunk/src/ocql/aoptimizer/aoptimizer_all.txt	2008-08-18 16:28:36 UTC (rev 89974)
@@ -0,0 +1,48 @@
+
+Algebra optimizer
+=================
+
+This file is used to test all possible cases of the present optimization.
+
+Currently the optimizer is doing a minimal optimization by using zope indexes
+where possible to retrieve objects on comparison. (=, <, >, <=, >=, <>)
+
+We need some setup to demonstrate this:
+
+    >>> from ocql.interfaces import IDB
+    >>> from ocql.aoptimizer.aoptimizer import AlgebraOptimizer
+    >>> from ocql.interfaces import IOptimizedAlgebraObject
+    >>> from ocql.parser.queryparser import QueryParser
+    >>> from ocql.qoptimizer.qoptimizer import QueryOptimizer
+    >>> from ocql.rewriter.rewriter import Rewriter
+    >>> from ocql.compiler.compiler import AlgebraCompiler
+
+    >>> from ocql.testing.utils_opt import setupInterfaces
+    >>> setupInterfaces(None)
+    >>> from ocql.testing.utils_opt import setupCatalog
+    >>> setupCatalog(None)
+
+    >>> testmeta = IDB(None)
+
+Here is a very basic query to show how the algebra looks like unoptimized.
+
+    >>> query = "set [ i in IUnOptimizedClass | i ]"
+
+    >>> optqo = QueryOptimizer(QueryParser(query)(testmeta))()
+    >>> alg = Rewriter(optqo)()
+    >>> algopt = AlgebraOptimizer(alg)(testmeta)
+
+(alg is always the unoptimized algebra tree)
+
+    >>> alg
+    Head(Iter(<type 'set'>,
+    Lambda i: Single(<type 'set'>, i),
+    Make(<type 'set'>, <type 'set'>, IUnOptimizedClass)))
+
+(algopt is always the optimized algebra tree)
+
+    >>> algopt
+    Head(Iter(<type 'set'>,
+    Lambda i: Single(<type 'set'>, i),
+    Make(<type 'set'>, <type 'set'>, IUnOptimizedClass)))
+


Property changes on: Sandbox/adamg/ocql/trunk/src/ocql/aoptimizer/aoptimizer_all.txt
___________________________________________________________________
Name: svn:keywords
   + Date Author Id Revision
Name: svn:eol-style
   + native

Deleted: Sandbox/adamg/ocql/trunk/src/ocql/aoptimizer/aoptimizer_new.txt
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/aoptimizer/aoptimizer_new.txt	2008-08-18 16:23:53 UTC (rev 89973)
+++ Sandbox/adamg/ocql/trunk/src/ocql/aoptimizer/aoptimizer_new.txt	2008-08-18 16:28:36 UTC (rev 89974)
@@ -1,53 +0,0 @@
-
-Queries in the rewriter.txt are extended to AlgebraOptimization
-
-    >>> from ocql.aoptimizer.aoptimizer import AlgebraOptimizer
-    >>> from ocql.interfaces import IOptimizedAlgebraObject
-    >>> from ocql.parser.queryparser import QueryParser
-    >>> from ocql.qoptimizer.qoptimizer import QueryOptimizer
-    >>> from ocql.rewriter.rewriter import Rewriter
-
-    >>> from ocql.testing.database import TestMetadata
-
-
-    >>> qo = QueryParser("set [ | 1 ]")(TestMetadata())
-    >>> opt = QueryOptimizer(qo)()
-    >>> alg = Rewriter(opt)()
-    >>> out = AlgebraOptimizer(alg)(TestMetadata())
-    >>> print str(out)
-    Single(<type 'set'>, `1`)
-
-    >>> qo = QueryParser("set [ | 1 ] union set [|2]")(TestMetadata())
-    >>> opt = QueryOptimizer(qo)()
-    >>> alg = Rewriter(opt)()
-    >>> out = AlgebraOptimizer(alg)(TestMetadata())
-    >>> print str(out)
-    Union(<type 'set'>, Single(<type 'set'>, `1`), Single(<type 'set'>, `2`))
-
-    #Differ not implemented
-    #>>> qo = QueryParser("set [ | 1 ] differ set [|2]")(TestMetadata())
-    #>>> opt = QueryOptimizer(qo)()
-    #>>> alg = Rewriter(opt)()
-    #>>> print str(alg)
-    #Union(<type 'set'>, Single(<type 'set'>, `1`), Single(<type 'set'>, `2`))
-
-    >>> qo = QueryParser("set [ i in ICourse | i ]")(TestMetadata())
-    >>> opt = QueryOptimizer(qo)()
-    >>> alg = Rewriter(opt)()
-    >>> out = AlgebraOptimizer(alg)(TestMetadata())
-    >>> print str(out)
-    Iter(<type 'set'>, Lambda i: Single(<type 'set'>, i), Make(<type 'set'>, <type 'set'>, ICourse))
-
-    #>>> qo = QueryParser("set [ c in ICourse; c.credits>3 | c.code ]")(TestMetadata())
-    #>>> opt = QueryOptimizer(qo)()
-    #>>> alg = Rewriter(opt)()
-    #>>> out = AlgebraOptimizer(alg)(TestMetadata())
-    #>>> print str(out)
-    #Iter(<type 'set'>, Lambda c: If(c.credits>`3`, Single(<type 'set'>, c.code), Empty(<type 'set'>)), Make(<type 'set'>, <type 'set'>, ICourse))
-
-    #bag not implemented
-    #>>> qo = QueryParser("size set [ i in ICourse | i ]")(TestMetadata())
-    #>>> opt = QueryOptimizer(qo)()
-    #>>> alg = Rewriter(opt)()
-    #>>> print str(alg)
-    #Iter(<type 'set'>, Lambda i: Single(<type 'set'>, i), Make(<type 'set'>, <type 'set'>, ICourse))
\ No newline at end of file

Modified: Sandbox/adamg/ocql/trunk/src/ocql/aoptimizer/tests.py
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/aoptimizer/tests.py	2008-08-18 16:23:53 UTC (rev 89973)
+++ Sandbox/adamg/ocql/trunk/src/ocql/aoptimizer/tests.py	2008-08-18 16:28:36 UTC (rev 89974)
@@ -10,10 +10,11 @@
 # avoid this tests for convenient while adding new implementation to the algebra optimizer
 #need to add aoptimizer.txt
         DocFileSuite('aoptimizer.txt',
-            optionflags=flags),
-        DocFileSuite('aoptimizer_new.txt',
             optionflags=flags,
             setUp = utils.setupAdapters),
+        DocFileSuite('aoptimizer_all.txt',
+            optionflags=flags,
+            setUp = utils.setupAdapters),
         ))
 
 

Copied: Sandbox/adamg/ocql/trunk/src/ocql/compiler/compiler_optimized.txt (from rev 89952, Sandbox/adamg/ocql/trunk/src/ocql/compiler/optimize_index.txt)
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/compiler/compiler_optimized.txt	                        (rev 0)
+++ Sandbox/adamg/ocql/trunk/src/ocql/compiler/compiler_optimized.txt	2008-08-18 16:28:36 UTC (rev 89974)
@@ -0,0 +1,71 @@
+
+Checking here how an optimized algebra for zope indexes compiles into python code
+
+    >>> from ocql.engine import OCQLEngine
+
+    >>> from ocql.testing.utils_opt import setupInterfaces
+    >>> setupInterfaces(None)
+    >>> from ocql.testing.utils_opt import setupCatalog
+    >>> setupCatalog(None)
+
+We'll use the same queries as in aoptimizer.txt.
+Algebra trees get omitted as they are already tested over there.
+
+Let's use the IUnOptimizedClass:
+--------------------------------
+
+    >>> query = "set [ i in IUnOptimizedClass | i ]"
+
+    >>> run = OCQLEngine().compile(query)
+
+Here is the runnable code:
+
+    >>> run
+    RunnableQuery: reduce(set.union, map(lambda i: set([i]), set(metadata.getAll("IUnOptimizedClass"))), set())
+
+    >>> result = run.execute()
+    >>> sorted(list(result))
+    [UnOpt: 0, UnOpt: 2, UnOpt: 1, UnOpt: 4, UnOpt: 3, UnOpt: 6, UnOpt: 5, UnOpt: 7, UnOpt: 8, UnOpt: 9]
+    >>> type(result)
+    <type 'set'>
+
+IUnOptimizedClass with a filter condition:
+------------------------------------------
+
+    >>> query = "set [ i in IUnOptimizedClass ; i.value == 5 | i.name ]"
+
+    >>> run = OCQLEngine().compile(query)
+
+Here is the runnable code:
+
+    >>> run
+    RunnableQuery:
+    reduce(set.union,
+    map(lambda i: ((i.value==5) and (set([i.name])) or (set())),
+    set(metadata.getAll("IUnOptimizedClass"))), set())
+
+Results of the query:
+
+    >>> result = run.execute()
+    >>> result
+    set([u'5'])
+
+
+IOptimizedClass with a filter condition:
+----------------------------------------
+
+    >>> query = "set [ i in IOptimizedClass ; i.value == 5 | i.name ]"
+
+    >>> run = OCQLEngine().compile(query)
+
+Here is the runnable code:
+
+    >>> run
+    RunnableQuery:
+    reduce(set.union,
+    map(lambda i: set([i.name]),
+    set(metadata.getFromIndex("IOptimizedClass", "value", "==", 5))), set())
+
+    >>> result = run.execute()
+    >>> result
+    set([u'5'])
\ No newline at end of file

Deleted: Sandbox/adamg/ocql/trunk/src/ocql/compiler/optimize_index.txt
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/compiler/optimize_index.txt	2008-08-18 16:23:53 UTC (rev 89973)
+++ Sandbox/adamg/ocql/trunk/src/ocql/compiler/optimize_index.txt	2008-08-18 16:28:36 UTC (rev 89974)
@@ -1,131 +0,0 @@
-
-Checking here how a compiled query can be optimized for zope indexes
-
-    >>> from ocql.engine import OCQLEngine
-
-    >>> from ocql.testing.utils_opt import setupInterfaces
-    >>> setupInterfaces(None)
-    >>> from ocql.testing.utils_opt import setupCatalog
-    >>> setupCatalog(None)
-
-
-Simple thing:
-
-    #>>> engine = OCQLEngine()
-    #>>> run = engine.compile("set [ | 1 ]")
-    #>>> run
-    #RunnableQuery: set([1])
-    #
-    #>>> result = run.execute()
-    #>>> result
-    #set([1])
-
-
-Let's use the IUnOptimizedClass:
-
-#    >>> engine = OCQLEngine()
-#    >>> run = engine.compile("set [ i in IUnOptimizedClass | i ]")
-#    >>> run
-#    RunnableQuery: reduce(set.union, map(lambda i: set([i]), set(metadata.getAll("IUnOptimizedClass"))), set())
-#
-##    >>> result = run.execute()
-##    >>> result
-##    set([UnOpt: 0, UnOpt: 1, UnOpt: 3, UnOpt: 4, UnOpt: 5, UnOpt: 6, UnOpt: 7, UnOpt: 2, UnOpt: 8, UnOpt: 9])
-
-
-IUnOptimizedClass with a filter condition:
-(parser is not working, therefore the complicated query definition)
-
-    >>> from ocql.queryobject.queryobject import *
-    >>> from ocql.interfaces import IDB
-    >>> from ocql.parser.queryparser import SymbolContainer
-
-    >>> metadata = IDB(None)
-    >>> symbols = SymbolContainer()
-    >>> qo = Head(Query(
-    ...         metadata, symbols,
-    ...         set,
-    ...         [
-    ...              In(
-    ...                 metadata, symbols,
-    ...                 Identifier(metadata,symbols,'i'),
-    ...                 Identifier(metadata,symbols, 'IUnOptimizedClass')),
-    ...              Eq(
-    ...                 metadata,symbols,
-    ...                 Identifier(metadata, symbols, 'i.value'),
-    ...                 Identifier(metadata, symbols, '5'))
-    ...         ], Identifier(metadata, symbols, 'i.name')))
-
-
-    >>> engine = OCQLEngine()
-    >>> run = engine.compile(qo)
-    >>> run
-    RunnableQuery:
-    reduce(set.union,
-    map(lambda i: ((i.value==5) and (set([i.name])) or (set())),
-    set(metadata.getAll("IUnOptimizedClass"))), set())
-
-Here is the algebra tree:
-
-    >>> run.alg
-    Iter(<type 'set'>,
-    Lambda i: If(i.value==5, Single(<type 'set'>, i.name), Empty(<type 'set'>)),
-    Make(<type 'set'>, <type 'set'>, IUnOptimizedClass))
-
-Results of the query:
-
-    >>> result = run.execute()
-    >>> result
-    set([u'5'])
-
-
-
-IOptimizedClass with a filter condition:
-(parser is not working, therefore the complicated query definition)
-
-    >>> from ocql.queryobject.queryobject import *
-    >>> from ocql.interfaces import IDB
-    >>> from ocql.parser.queryparser import SymbolContainer
-
-    >>> metadata = IDB(None)
-    >>> symbols = SymbolContainer()
-    >>> qo = Head(Query(
-    ...         metadata, symbols,
-    ...         set,
-    ...         [
-    ...              In(
-    ...                 metadata, symbols,
-    ...                 Identifier(metadata,symbols,'i'),
-    ...                 Identifier(metadata,symbols, 'IOptimizedClass')),
-    ...              Eq(
-    ...                 metadata,symbols,
-    ...                 Identifier(metadata, symbols, 'i.value'),
-    ...                 Identifier(metadata, symbols, '5'))
-    ...         ], Identifier(metadata, symbols, 'i.name')))
-
-
-    >>> engine = OCQLEngine()
-    >>> run = engine.compile(qo)
-    >>> run
-    RunnableQuery:
-    reduce(set.union,
-    map(lambda i: set([i.name]),
-    set(metadata.getFromIndex("IOptimizedClass", "value", "==", 5))), set())
-
-
-
-    >>> result = run.execute()
-    >>> result
-    set([u'5'])
-
-
-
-
-    #>>> engine = OCQLEngine()
-    #>>> run = engine.compile("set [ i in IUnOptimizedClass; i.value==5 | i.name ]")
-    #>>> run
-    #RunnableQuery: reduce(set.union, map(lambda i: set([i]),set(metadata.getAll("IUnOptimizedClass"))), set())
-
-#    >>> result = run.execute()
-#    >>> result
-#    set([UnOpt: 0, UnOpt: 1, UnOpt: 3, UnOpt: 4, UnOpt: 5, UnOpt: 6, UnOpt: 7, UnOpt: 2, UnOpt: 8, UnOpt: 9])

Modified: Sandbox/adamg/ocql/trunk/src/ocql/compiler/tests.py
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/compiler/tests.py	2008-08-18 16:23:53 UTC (rev 89973)
+++ Sandbox/adamg/ocql/trunk/src/ocql/compiler/tests.py	2008-08-18 16:28:36 UTC (rev 89974)
@@ -7,10 +7,10 @@
 def test_suite():
     flags =  doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS
     return unittest.TestSuite((
-        DocFileSuite('optimize_index.txt',
+        DocFileSuite('compiler.txt',
             optionflags=flags,
             setUp = utils.setupAdapters),
-        DocFileSuite('compiler.txt',
+        DocFileSuite('compiler_optimized.txt',
             optionflags=flags,
             setUp = utils.setupAdapters),
         ))

Modified: Sandbox/adamg/ocql/trunk/src/ocql/qoptimizer/qoptimizer.txt
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/qoptimizer/qoptimizer.txt	2008-08-18 16:23:53 UTC (rev 89973)
+++ Sandbox/adamg/ocql/trunk/src/ocql/qoptimizer/qoptimizer.txt	2008-08-18 16:28:36 UTC (rev 89974)
@@ -1,4 +1,6 @@
 
+Queryobject optimizer
+=====================
 
     >>> from ocql.qoptimizer.qoptimizer import QueryOptimizer
     >>> from ocql.interfaces import IOptimizedObjectQuery
@@ -22,4 +24,6 @@
     'foo-bar'
 
     >>> IOptimizedObjectQuery.providedBy(out)
-    True
\ No newline at end of file
+    True
+
+There are some options to optimize the queryobject tree.

Modified: Sandbox/adamg/ocql/trunk/src/ocql/rewriter/algebra.py
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/rewriter/algebra.py	2008-08-18 16:23:53 UTC (rev 89973)
+++ Sandbox/adamg/ocql/trunk/src/ocql/rewriter/algebra.py	2008-08-18 16:28:36 UTC (rev 89974)
@@ -30,7 +30,7 @@
         return self.tree.walk()
 
     def __repr__(self):
-        return ('%s') % (self.tree)
+        return ('Head(%s)') % (self.tree)
 
 class BaseAlgebra(Location):
     implements(IAlgebraObject)

Modified: Sandbox/adamg/ocql/trunk/src/ocql/rewriter/rewriter.txt
===================================================================
--- Sandbox/adamg/ocql/trunk/src/ocql/rewriter/rewriter.txt	2008-08-18 16:23:53 UTC (rev 89973)
+++ Sandbox/adamg/ocql/trunk/src/ocql/rewriter/rewriter.txt	2008-08-18 16:28:36 UTC (rev 89974)
@@ -17,19 +17,19 @@
     >>> opt = QueryOptimizer(qo)()
     >>> alg = Rewriter(opt)()
     >>> print str(alg)
-    Single(<type 'set'>, `1`)
+    Head(Single(<type 'set'>, `1`))
 
     >>> qo = QueryParser("list [ | 1 ]")(TestMetadata())
     >>> opt = QueryOptimizer(qo)()
     >>> alg = Rewriter(opt)()
     >>> print str(alg)
-    Single(<type 'list'>, `1`)
+    Head(Single(<type 'list'>, `1`))
 
     >>> qo = QueryParser("set [ | 1 ] union set [|2]")(TestMetadata())
     >>> opt = QueryOptimizer(qo)()
     >>> alg = Rewriter(opt)()
     >>> print str(alg)
-    Union(<type 'set'>, Single(<type 'set'>, `1`), Single(<type 'set'>, `2`))
+    Head(Union(<type 'set'>, Single(<type 'set'>, `1`), Single(<type 'set'>, `2`)))
 
     >>> for i in alg.walk():
     ...     print i
@@ -43,46 +43,46 @@
     >>> opt = QueryOptimizer(qo)()
     >>> alg = Rewriter(opt)()
     >>> print str(alg)
-    Union(<type 'list'>, Single(<type 'list'>, `1`), Single(<type 'list'>, `2`))
+    Head(Union(<type 'list'>, Single(<type 'list'>, `1`), Single(<type 'list'>, `2`)))
 
     >>> qo = QueryParser("set [ | 1 ] differ set [|2]")(TestMetadata())
     >>> opt = QueryOptimizer(qo)()
     >>> alg = Rewriter(opt)()
     >>> print str(alg)
-    Differ(<type 'set'>, Single(<type 'set'>, `1`), Single(<type 'set'>, `2`))
+    Head(Differ(<type 'set'>, Single(<type 'set'>, `1`), Single(<type 'set'>, `2`)))
 
     >>> qo = QueryParser("list [ | 1 ] differ list [|2]")(TestMetadata())
     >>> opt = QueryOptimizer(qo)()
     >>> alg = Rewriter(opt)()
     >>> print str(alg)
-    Differ(<type 'list'>, Single(<type 'list'>, `1`), Single(<type 'list'>, `2`))
+    Head(Differ(<type 'list'>, Single(<type 'list'>, `1`), Single(<type 'list'>, `2`)))
 
     >>> qo = QueryParser("set [ i in ICourse | i ]")(TestMetadata())
     >>> opt = QueryOptimizer(qo)()
     >>> alg = Rewriter(opt)()
     >>> print str(alg)
-    Iter(<type 'set'>, Lambda i: Single(<type 'set'>, i), Make(<type 'set'>, <type 'set'>, ICourse))
+    Head(Iter(<type 'set'>, Lambda i: Single(<type 'set'>, i), Make(<type 'set'>, <type 'set'>, ICourse)))
 
     >>> qo = QueryParser("list [ i in ICourse | i ]")(TestMetadata())
     >>> opt = QueryOptimizer(qo)()
     >>> alg = Rewriter(opt)()
     >>> print str(alg)
-    Iter(<type 'list'>, Lambda i: Single(<type 'list'>, i), Make(<type 'list'>, <type 'set'>, ICourse))
+    Head(Iter(<type 'list'>, Lambda i: Single(<type 'list'>, i), Make(<type 'list'>, <type 'set'>, ICourse)))
 
     >>> qo = QueryParser("len(set [ i in ICourse | i ])")(TestMetadata())
     >>> opt = QueryOptimizer(qo)()
     >>> alg = Rewriter(opt)()
     >>> print str(alg)
-    Reduce(<type 'set'>, `0`, Lambda i: `1`, +, Iter(<type 'set'>, Lambda i: Single(<type 'set'>, i), Make(<type 'set'>, <type 'set'>, ICourse)))
+    Head(Reduce(<type 'set'>, `0`, Lambda i: `1`, +, Iter(<type 'set'>, Lambda i: Single(<type 'set'>, i), Make(<type 'set'>, <type 'set'>, ICourse))))
 
     >>> qo = QueryParser("len(list [ i in ICourse | i ])")(TestMetadata())
     >>> opt = QueryOptimizer(qo)()
     >>> alg = Rewriter(opt)()
     >>> print str(alg)
-    Reduce(<type 'list'>, `0`, Lambda i: `1`, +, Iter(<type 'list'>, Lambda i: Single(<type 'list'>, i), Make(<type 'list'>, <type 'set'>, ICourse)))
+    Head(Reduce(<type 'list'>, `0`, Lambda i: `1`, +, Iter(<type 'list'>, Lambda i: Single(<type 'list'>, i), Make(<type 'list'>, <type 'set'>, ICourse))))
 
     >>> qo = QueryParser("set [ c in ICourse; c.credits>3 | c.code ]")(TestMetadata())
     >>> opt = QueryOptimizer(qo)()
     >>> alg = Rewriter(opt)()
     >>> print str(alg)
-    Iter(<type 'set'>, Lambda c: If(c.credits>`3`, Single(<type 'set'>, c.code), Empty(<type 'set'>)), Make(<type 'set'>, <type 'set'>, ICourse))
+    Head(Iter(<type 'set'>, Lambda c: If(c.credits>`3`, Single(<type 'set'>, c.code), Empty(<type 'set'>)), Make(<type 'set'>, <type 'set'>, ICourse)))



More information about the Checkins mailing list