[Checkins]
SVN: Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/
iterate through the algebra tree to search class property has
a index
Charith Paranaliyanage
paranaliyanage at gmail.com
Tue Jul 15 23:17:41 EDT 2008
Log message for revision 88394:
iterate through the algebra tree to search class property has a index
Changed:
U Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/aoptimizer/aoptimizer.py
U Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/compiler/compiler.py
U Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/compiler/compiler.txt
U Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/compiler/runnablequery.py
U Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/engine.py
U Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/queryobject/queryobject.py
U Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/rewriter/algebra.py
U Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/rewriter/interfaces.py
U Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/testing/stubs.py
-=-
Modified: Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/aoptimizer/aoptimizer.py
===================================================================
--- Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/aoptimizer/aoptimizer.py 2008-07-16 00:09:58 UTC (rev 88393)
+++ Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/aoptimizer/aoptimizer.py 2008-07-16 03:17:39 UTC (rev 88394)
@@ -15,19 +15,35 @@
from ocql.interfaces import IAlgebraObjectHead
from ocql.interfaces import IOptimizedAlgebraObject
-from ocql.rewriter.algebra import BaseAlgebra
+from ocql.rewriter.algebra import BaseAlgebra, If, Single, Make, Binary
def addMarkerIF(obj, marker):
#obj = removeSecurityProxy(obj)
if not marker.providedBy(obj):
directlyProvides(obj, directlyProvidedBy(obj), marker)
-def visit(algebra):
- #print str(algebra)
- if isinstance(algebra , BaseAlgebra):
- for child in algebra.children:
- visit(child)
+#only for single filter, improve later
+class Finder(object):
+ def __init__(self, metadata):
+ #self.algebra = algebra
+ self.metadata = metadata
+ self.condition = None
+ self.expression = None
+ def visit(self, algebra):
+ if isinstance(algebra , BaseAlgebra):
+ for child in algebra.children:
+ if isinstance(child, If):
+ if isinstance(child.cond, Binary):
+ self.condition = child.cond.left
+ if isinstance(child, Make):
+ self.expression = child.expr1
+ self.visit(child)
+
+ def hasIndex(self):
+ if (self.condition and self.expression) is not None:
+ return self.metadata.hasPropertyIndex(self.expression, self.condition)
+
class AlgebraOptimizer(object):
implements(IAlgebraOptimizer)
adapts(IAlgebraObjectHead)
@@ -36,7 +52,9 @@
self.context = context
#self.db = db
- def __call__(self):
+ def __call__(self, metadata):
addMarkerIF(self.context, IOptimizedAlgebraObject)
- visit(self.context.tree)
+ finder = Finder(metadata)
+ finder.visit(self.context.tree)
+ finder.hasIndex()
return self.context
Modified: Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/compiler/compiler.py
===================================================================
--- Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/compiler/compiler.py 2008-07-16 00:09:58 UTC (rev 88393)
+++ Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/compiler/compiler.py 2008-07-16 03:17:39 UTC (rev 88394)
@@ -161,7 +161,7 @@
def __call__(self):
return '%s(metadata.getAll("%s"))' % (
self.context.coll1.__name__,
- IAlgebraCompiler(self.context.expr)())
+ IAlgebraCompiler(self.context.expr1)())
class IfCompiler(BaseCompiler):
Modified: Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/compiler/compiler.txt
===================================================================
--- Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/compiler/compiler.txt 2008-07-16 00:09:58 UTC (rev 88393)
+++ Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/compiler/compiler.txt 2008-07-16 03:17:39 UTC (rev 88394)
@@ -18,7 +18,7 @@
>>> qo = QueryParser("set [ | 1 ]")(metadata)
>>> opt = QueryOptimizer(qo)()
>>> alg = Rewriter(opt)()
- >>> aopt = AlgebraOptimizer(alg)()
+ >>> aopt = AlgebraOptimizer(alg)(metadata)
>>> run = AlgebraCompiler(aopt)(metadata, alg)
>>> print str(run)
RunnableQuery: set([1])
@@ -28,7 +28,7 @@
>>> qo = QueryParser("set [ | 1 ] union set [|2]")(TestMetadata())
>>> opt = QueryOptimizer(qo)()
>>> alg = Rewriter(opt)()
- >>> aopt = AlgebraOptimizer(alg)()
+ >>> aopt = AlgebraOptimizer(alg)(metadata)
>>> run = AlgebraCompiler(aopt)(metadata, alg)
>>> print str(run)
RunnableQuery: set.union(set([1]), set([2]))
@@ -47,7 +47,7 @@
>>> qo = QueryParser("set [ i in ICourse | i ]")(TestMetadata())
>>> opt = QueryOptimizer(qo)()
>>> alg = Rewriter(opt)()
- >>> aopt = AlgebraOptimizer(alg)()
+ >>> aopt = AlgebraOptimizer(alg)(metadata)
>>> run = AlgebraCompiler(aopt)(metadata, alg)
>>> print str(run)
RunnableQuery: reduce(set.union, map(lambda i: set([i]), set(metadata.getAll("ICourse"))), set())
@@ -64,7 +64,7 @@
>>> qo = QueryParser("set [ c in ICourse | c.code ]")(TestMetadata())
>>> opt = QueryOptimizer(qo)()
>>> alg = Rewriter(opt)()
- >>> aopt = AlgebraOptimizer(alg)()
+ >>> aopt = AlgebraOptimizer(alg)(metadata)
>>> run = AlgebraCompiler(aopt)(metadata, alg)
>>> print str(run)
RunnableQuery: reduce(set.union, map(lambda c: set([c.code]), set(metadata.getAll("ICourse"))), set())
\ No newline at end of file
Modified: Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/compiler/runnablequery.py
===================================================================
--- Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/compiler/runnablequery.py 2008-07-16 00:09:58 UTC (rev 88393)
+++ Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/compiler/runnablequery.py 2008-07-16 03:17:39 UTC (rev 88394)
@@ -60,7 +60,7 @@
self.code)
def reanalyze(self):
- optimizedalgebra = IAlgebraOptimizer(self.alg)()
+ optimizedalgebra = IAlgebraOptimizer(self.alg)(self.metadata)
runnable = IAlgebraCompiler(optimizedalgebra)(self.metadata, self.alg)
return runnable
Modified: Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/engine.py
===================================================================
--- Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/engine.py 2008-07-16 00:09:58 UTC (rev 88393)
+++ Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/engine.py 2008-07-16 03:17:39 UTC (rev 88394)
@@ -40,7 +40,7 @@
optimizedoq = IQueryOptimizer(objectquery)()
algebra = IRewriter(optimizedoq)()
- optimizedalgebra = IAlgebraOptimizer(algebra)()
+ optimizedalgebra = IAlgebraOptimizer(algebra)(metadata)
runnable = IAlgebraCompiler(optimizedalgebra)(metadata, algebra)
return runnable
\ No newline at end of file
Modified: Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/queryobject/queryobject.py
===================================================================
--- Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/queryobject/queryobject.py 2008-07-16 00:09:58 UTC (rev 88393)
+++ Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/queryobject/queryobject.py 2008-07-16 03:17:39 UTC (rev 88394)
@@ -176,7 +176,8 @@
), algebra.Make(
self.collection_type,
ctype,
- firstTerm.expression.rewrite(algebra)
+ firstTerm.expression.rewrite(algebra),
+ self.target
) # FIXME: ?set? must be determined by type(firstTerm.expression)
)
elif isinstance(firstTerm, Alias):
Modified: Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/rewriter/algebra.py
===================================================================
--- Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/rewriter/algebra.py 2008-07-16 00:09:58 UTC (rev 88393)
+++ Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/rewriter/algebra.py 2008-07-16 03:17:39 UTC (rev 88394)
@@ -171,14 +171,15 @@
implements(IMake)
- def __init__(self, coll1, coll2, expr):
+ def __init__(self, coll1, coll2, expr1, expr2):
BaseAlgebra.__init__(self)
- self.setProp('expr', expr)
+ self.setProp('expr1', expr1)
+ self.setProp('expr2', expr2)
self.setProp('coll1', coll1)
self.setProp('coll2', coll2)
def __repr__(self):
- return "Make(%s, %s, %s)" %(self.coll1, self.coll2, self.expr)
+ return "Make(%s, %s, %s)" %(self.coll1, self.coll2, self.expr1)
#class And:
Modified: Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/rewriter/interfaces.py
===================================================================
--- Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/rewriter/interfaces.py 2008-07-16 00:09:58 UTC (rev 88393)
+++ Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/rewriter/interfaces.py 2008-07-16 03:17:39 UTC (rev 88394)
@@ -75,7 +75,8 @@
"""Objects providing this interface represent the
Make Algebra object
"""
- expr = Attribute('expression')
+ expr1 = Attribute('expression1')
+ expr2 = Attribute('expression2')
coll1 = Attribute('first collection')
coll2 = Attribute('second collection')
Modified: Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/testing/stubs.py
===================================================================
--- Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/testing/stubs.py 2008-07-16 00:09:58 UTC (rev 88393)
+++ Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/testing/stubs.py 2008-07-16 03:17:39 UTC (rev 88394)
@@ -77,7 +77,7 @@
self.context = context
#self.db = db
- def __call__(self):
+ def __call__(self, metadata):
return AlgebraOptimized()
class AlgebraCompiler(object):
More information about the Checkins
mailing list