[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