[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