[Checkins] SVN: Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/ start of tests for optimized compilation

Adam Groszer agroszer at gmail.com
Thu Jul 10 04:56:34 EDT 2008


Log message for revision 88159:
  start of tests for optimized compilation

Changed:
  U   Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/compiler/compiler.py
  A   Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/compiler/optimize_index.txt
  U   Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/compiler/tests.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
  A   Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/testing/utils_opt.py

-=-
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-10 08:29:00 UTC (rev 88158)
+++ Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/compiler/compiler.py	2008-07-10 08:56:34 UTC (rev 88159)
@@ -87,7 +87,7 @@
         self.context.expr is IfCompiler:
 
             if self.context.klass == set:
-                return 'reduce(set.union, map(%s,%s), set())' % (
+                return 'reduce(set.union, map(%s, %s), set())' % (
                     IAlgebraCompiler(self.context.func)(),
                     IAlgebraCompiler(self.context.coll)())
             if self.context.klass == list:
@@ -96,7 +96,7 @@
                     IAlgebraCompiler(self.context.coll)())
         else:
             if self.context.klass == set:
-                return 'reduce(set.union, map(%s,%s), set())' % (
+                return 'reduce(set.union, map(%s, %s), set())' % (
                     IAlgebraCompiler(self.context.func)(),
                     IAlgebraCompiler(self.context.coll)())
             if self.context.klass == list:

Added: Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/compiler/optimize_index.txt
===================================================================
--- Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/compiler/optimize_index.txt	                        (rev 0)
+++ Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/compiler/optimize_index.txt	2008-07-10 08:56:34 UTC (rev 88159)
@@ -0,0 +1,93 @@
+
+Checking here how a compiled query can be optimized for zope indexes
+
+    >>> from zope.component import provideAdapter
+
+    >>> from ocql.parser.queryparser import QueryParser
+    >>> from ocql.qoptimizer.qoptimizer import QueryOptimizer
+    >>> from ocql.rewriter.rewriter import Rewriter
+    >>> from ocql.aoptimizer.aoptimizer import AlgebraOptimizer
+    >>> from ocql.compiler.compiler import AlgebraCompiler
+    >>> from ocql.database.metadata import Metadata
+
+    >>> provideAdapter(QueryParser)
+    >>> provideAdapter(QueryOptimizer)
+    >>> provideAdapter(Rewriter)
+    >>> provideAdapter(AlgebraOptimizer)
+    >>> provideAdapter(AlgebraCompiler)
+    >>> provideAdapter(Metadata)
+
+    >>> from ocql.engine import OCQLEngine
+
+    >>> from ocql.compiler.compiler import registerAdapters
+    >>> registerAdapters()
+
+    >>> from ocql.testing.utils_opt import setupInterfaces
+    >>> setupInterfaces(None)
+    >>> from ocql.testing.utils_opt import setupCatalog
+    >>> setupCatalog(None)
+
+
+
+    #>>> engine = OCQLEngine()
+    #>>> run = engine.compile("set [ | 1 ]")
+    #>>> run
+    #RunnableQuery: set([1])
+    #
+    #>>> result = run.execute()
+    #>>> result
+    #set([1])
+
+
+
+    #>>> 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])
+
+    >>> from ocql.queryobject.queryobject import *
+    >>> from ocql.interfaces import IDB
+    >>> from ocql.parser.queryparser import SymbolContainer
+
+    >>> metadata = IDB(None)
+    >>> symbols = SymbolContainer()
+    >>> qo = 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())
+
+    >>> 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])


Property changes on: Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/compiler/optimize_index.txt
___________________________________________________________________
Name: svn:keywords
   + Date Author Id Revision
Name: svn:eol-style
   + native

Modified: Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/compiler/tests.py
===================================================================
--- Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/compiler/tests.py	2008-07-10 08:29:00 UTC (rev 88158)
+++ Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/compiler/tests.py	2008-07-10 08:56:34 UTC (rev 88159)
@@ -5,6 +5,8 @@
 def test_suite():
     flags =  doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS
     return unittest.TestSuite((
+        DocFileSuite('optimize_index.txt',
+            optionflags=flags),
         DocFileSuite('compiler.txt',
             optionflags=flags),
         ))

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-10 08:29:00 UTC (rev 88158)
+++ Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/engine.py	2008-07-10 08:56:34 UTC (rev 88159)
@@ -33,8 +33,12 @@
         #TODO: later use maybe named adapters
         metadata = IDB(None)
 
-        objectquery = IQueryParser(query)(metadata)
+        if IObjectQuery.providedBy(query):
+            objectquery = query
+        else:
+            objectquery = IQueryParser(query)(metadata)
         optimizedoq = IQueryOptimizer(objectquery)()
+
         algebra = IRewriter(optimizedoq)()
         optimizedalgebra = IAlgebraOptimizer(algebra)()
         runnable = IAlgebraCompiler(optimizedalgebra)(metadata, algebra)

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-10 08:29:00 UTC (rev 88158)
+++ Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/queryobject/queryobject.py	2008-07-10 08:56:34 UTC (rev 88159)
@@ -316,6 +316,8 @@
 
 class Property(Binary):
     def rewrite(self, algebra): # FIXME: Ezt gondold at...
+        from pub.dbgpclient import brk; brk('172.16.144.39')
+
         return algebra.Identifier(
             '.'.join([self.left.name, self.right.name]))
 
@@ -407,12 +409,12 @@
         self.metadata = metadata
         self.symbols = symbols
         self.expr = expr
-        
+
     def __repr__(self):
         return "(%s)" % (
             self.__class__.__name__
             )
-        
+
     def rewrite(self, algebra, expression, quanter, operator):
         raise NotImplementedError()
 

Added: Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/testing/utils_opt.py
===================================================================
--- Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/testing/utils_opt.py	                        (rev 0)
+++ Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/testing/utils_opt.py	2008-07-10 08:56:34 UTC (rev 88159)
@@ -0,0 +1,123 @@
+# -*- coding: UTF-8 -*-
+
+"""Utilities for testing support
+
+$Id$
+"""
+
+from zope import interface, component
+from zope.component.interface import provideInterface
+
+from zope.schema import Text, TextLine, Int
+
+from zope.app.catalog.catalog import Catalog
+from zope.app.catalog.interfaces import ICatalog
+from zope.app.catalog.field import FieldIndex
+from ocql.database.index import AllIndex
+
+from zope.app.intid import IntIds
+from zope.app.intid.interfaces import IIntIds
+
+from zope.app.keyreference.testing import SimpleKeyReference
+
+from ocql.testing.sample.interfaces import IOrganization
+from ocql.testing.sample.interfaces import IProject
+from ocql.testing.sample.interfaces import IStudent
+from ocql.testing.sample.interfaces import IMentor
+
+from ocql.testing.sample.mentor import Mentor
+from ocql.testing.sample.project import Project
+from ocql.testing.sample.student import Student
+from ocql.testing.sample.organization import Organization
+
+import zc.relation.catalog
+import zc.relation.interfaces
+import zc.relation.queryfactory
+import BTrees
+
+
+class IOptimizedClass(interface.Interface):
+    name = TextLine(title=u"Name")
+    value = Int(title=u"value")
+
+class IUnOptimizedClass(interface.Interface):
+    name = TextLine(title=u"Name")
+    value = Int(title=u"value")
+
+class IHalfOptimizedClass(interface.Interface):
+    name = TextLine(title=u"Name")
+    valueOpt = Int(title=u"value")
+    valueNoOpt = Int(title=u"value")
+
+class OptimizedClass(object):
+    interface.implements(IOptimizedClass)
+
+    name = u''
+    value = 0
+
+    def __repr__(self):
+        return "Opt: %s" % self.name
+
+class UnOptimizedClass(object):
+    interface.implements(IUnOptimizedClass)
+
+    name = u''
+    value = 0
+
+    def __repr__(self):
+        return "UnOpt: %s" % self.name
+
+class HalfOptimizedClass(object):
+    interface.implements(IHalfOptimizedClass)
+
+    name = u''
+    valueOpt = 0
+    valueNoOpt = 0
+
+    def __repr__(self):
+        return "HalfOpt: %s" % self.name
+
+def setupInterfaces(test):
+    provideInterface('', IOptimizedClass)
+    provideInterface('', IUnOptimizedClass)
+    provideInterface('', IHalfOptimizedClass)
+
+def setupCatalog(test, optCount=10, unoptCount=10, halfCount=10):
+    intids = IntIds()
+    component.provideUtility(intids, IIntIds)
+    component.provideAdapter(SimpleKeyReference)
+    cat = Catalog()
+
+    cat['opt_name'] = FieldIndex('name', IOptimizedClass)
+    cat['opt_value'] = FieldIndex('value', IOptimizedClass)
+
+    cat['half_name'] = FieldIndex('name', IHalfOptimizedClass)
+    cat['half_valueOpt'] = FieldIndex('value', IHalfOptimizedClass)
+
+    cat['all_opt'] = AllIndex(IOptimizedClass)
+    cat['all_unopt'] = AllIndex(IUnOptimizedClass)
+    cat['all_half'] = AllIndex(IHalfOptimizedClass)
+
+    for i in range(optCount):
+        o = OptimizedClass()
+        o.value = i
+        o.name = unicode(i)
+        id = intids.register(o)
+        cat.index_doc(id, o)
+
+    for i in range(unoptCount):
+        o = UnOptimizedClass()
+        o.value = i
+        o.name = unicode(i)
+        id = intids.register(o)
+        cat.index_doc(id, o)
+
+    for i in range(halfCount):
+        o = HalfOptimizedClass()
+        o.valueOpt = i
+        o.valueNoOpt = i
+        o.name = unicode(i)
+        id = intids.register(o)
+        cat.index_doc(id, o)
+
+    component.provideUtility(cat, ICatalog, name='foo-catalog')


Property changes on: Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/testing/utils_opt.py
___________________________________________________________________
Name: svn:keywords
   + Date Author Id Revision
Name: svn:eol-style
   + native



More information about the Checkins mailing list