[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