[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