[Checkins] SVN: Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/aoptimizer/aoptimizer.py tree pattern searching, target search for Iter, If and Make. Not very generic pattern maching

Charith Paranaliyanage paranaliyanage at gmail.com
Fri Jul 18 11:14:19 EDT 2008


Log message for revision 88524:
  tree pattern searching, target search for Iter, If and Make. Not very generic pattern maching

Changed:
  U   Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/aoptimizer/aoptimizer.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-18 15:12:29 UTC (rev 88523)
+++ Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/aoptimizer/aoptimizer.py	2008-07-18 15:14:18 UTC (rev 88524)
@@ -5,6 +5,7 @@
 
 $Id$
 """
+from collections import deque
 from zope.component import adapts
 from zope.interface import implements
 #from zope.security.proxy import removeSecurityProxy
@@ -15,35 +16,60 @@
 
 from ocql.interfaces import IAlgebraObjectHead
 from ocql.interfaces import IOptimizedAlgebraObject
-from ocql.rewriter.algebra import BaseAlgebra, If, Single, Make, Binary
+from ocql.rewriter.algebra import BaseAlgebra, If, Single, Make, Binary, Iter, Lambda
 
+class FindResults(object):
+    def __init__(self):
+        self.level = 0
+        self.parent = dict()
+
+def find(tree, algebra, startlevel=0):
+    results = FindResults()
+    bfs_list = deque()
+    bfs_list.append(tree.tree)
+    results.parent[algebra] = None
+    results.level = 0
+    
+    while len(bfs_list):
+        v = bfs_list.popleft()
+        if isinstance(v, algebra) and startlevel < results.level:
+            return results
+
+        for child in v.children:
+            if child not in results.parent:
+                results.parent[str(child.__class__)] = v
+                results.level += 1
+                bfs_list.append(child)
+    return None
+
+def findItrPattern(tree, algebra):
+#this has If and Make algebra objects
+    itr_reslts = find(tree, algebra)
+    if itr_reslts is not None:
+        #find for If and Make
+        for child in itr_reslts.parent.values():
+            if isinstance(child, Iter): 
+                r_iter = child
+                break
+
+        boolean_if = boolean_make = False
+        print r_iter
+        for i in r_iter.children:
+            if isinstance(i, Lambda):
+                boolean_lambda = True
+            if isinstance(i, Make):
+                boolean_make = True
+                
+        if boolean_lambda and boolean_make:
+            return r_iter
+
+    return  None
+
 def addMarkerIF(obj, marker):
     #obj = removeSecurityProxy(obj)
     if not marker.providedBy(obj):
         directlyProvides(obj, directlyProvidedBy(obj), marker)
 
-#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)
@@ -54,7 +80,7 @@
 
     def __call__(self, metadata):
         addMarkerIF(self.context, IOptimizedAlgebraObject)
-        finder = Finder(metadata)
-        finder.visit(self.context.tree)
-        finder.hasIndex()
+        results = findItrPattern(self.context, Iter)
+        if results is not None:
+            print results
         return self.context



More information about the Checkins mailing list