[Checkins] SVN: Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/ optimize search the database where it can provide class property for the searching.

Charith Paranaliyanage paranaliyanage at gmail.com
Thu Jul 10 04:29:00 EDT 2008


Log message for revision 88158:
  optimize search the database where it can provide class property for the searching. 

Changed:
  U   Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/database/metadata.py
  U   Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/testing/sample/interfaces.py
  U   Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/testing/sample/student.py
  U   Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/testing/utils.py
  U   Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/tests/test_zope.py

-=-
Modified: Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/database/metadata.py
===================================================================
--- Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/database/metadata.py	2008-07-10 08:27:25 UTC (rev 88157)
+++ Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/database/metadata.py	2008-07-10 08:29:00 UTC (rev 88158)
@@ -5,6 +5,7 @@
 from zope.component import getUtility
 from zope.component import getUtilitiesFor
 from zope.app.catalog.interfaces import ICatalog
+from zope.app.catalog.attribute import AttributeIndex
 from zope.app.intid import IIntIds
 import zc.relation.interfaces
 
@@ -88,13 +89,25 @@
             for iname, index in catalog.items():
                 if isinstance(index, AllIndex):
                     if index.interface.__name__ == klassname:
-                        interface = index.interface
                         results = catalog.apply({iname:(1,1)})
                         obj_list = [intids.getObject(result) for result in results]
                         return obj_list
 
         return None
 
+    def getFromIndex(self, klass, property, lowerbound='A', upperbound='Z'):
+        catalogs = getUtilitiesFor(ICatalog)
+        intids = getUtility(IIntIds)
+        for name, catalog in catalogs:
+            for iname, index in catalog.items():
+                if isinstance(index, AttributeIndex)and index.field_name == property and index.interface.__name__ == klass:
+                    results = catalog.apply({iname:(lowerbound, upperbound)})
+                    obj_list = [intids.getObject(result).name for result in results]
+                    return obj_list
+
+        return None
+          
+
     def get_class(self, klassname):
         """Returns a MetaType instance for the class."""
         return self.classes[klassname]

Modified: Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/testing/sample/interfaces.py
===================================================================
--- Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/testing/sample/interfaces.py	2008-07-10 08:27:25 UTC (rev 88157)
+++ Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/testing/sample/interfaces.py	2008-07-10 08:29:00 UTC (rev 88158)
@@ -36,8 +36,8 @@
     """A Student object"""
 
     name = TextLine(title=u"Student Name")
+    country = Attribute('student country')
 
-
 class IMentor(Interface):
     """A Mentor object"""
 

Modified: Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/testing/sample/student.py
===================================================================
--- Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/testing/sample/student.py	2008-07-10 08:27:25 UTC (rev 88157)
+++ Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/testing/sample/student.py	2008-07-10 08:29:00 UTC (rev 88158)
@@ -1,6 +1,6 @@
 # -*- coding: UTF-8 -*-
 from zope.interface import implements
-from zope.interface import Interface
+from zope.interface import Interface, Attribute
 import persistent
 
 from ocql.testing.sample.interfaces import IStudent
@@ -26,6 +26,7 @@
     implements(IStudent)
 
     name = u''
+    country = None
 
     def __repr__(self):
         return "%s <%s>" % (self.__class__.__name__, self.name)

Modified: Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/testing/utils.py
===================================================================
--- Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/testing/utils.py	2008-07-10 08:27:25 UTC (rev 88157)
+++ Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/testing/utils.py	2008-07-10 08:29:00 UTC (rev 88158)
@@ -11,6 +11,7 @@
 from zope.app.catalog.catalog import Catalog
 from zope.app.catalog.interfaces import ICatalog
 from zope.app.catalog.field import FieldIndex
+from zope.app.catalog.attribute import AttributeIndex
 from ocql.database.index import AllIndex
 
 from zope.app.intid import IntIds
@@ -70,6 +71,7 @@
     cat['proj_descr'] = FieldIndex('description', IProject)
 
     cat['student_name'] = FieldIndex('name', IStudent)
+    cat['student_country'] = FieldIndex('country', IStudent)
 
     cat['mentor_name'] = FieldIndex('name', IMentor)
 
@@ -91,16 +93,19 @@
 
     s1 = Student()
     s1.name = u"Charith"
+    s1.country = "Sri Lanka"
     id = intids.register(s1)
     cat.index_doc(id, s1)
 
     s2 = Student()
     s2.name = u"Jane"
+    s2.country = "USA"
     id = intids.register(s2)
     cat.index_doc(id, s2)
 
     s3 = Student()
     s3.name = u"Ann"
+    s3.country = "Hungary"
     id = intids.register(s3)
     cat.index_doc(id, s3)
 

Modified: Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/tests/test_zope.py
===================================================================
--- Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/tests/test_zope.py	2008-07-10 08:27:25 UTC (rev 88157)
+++ Sandbox/adamg/ocql/branches/optimize-with-index/src/ocql/tests/test_zope.py	2008-07-10 08:29:00 UTC (rev 88158)
@@ -147,6 +147,30 @@
         self.doit(query, qo, set(["Save the world"]))
 
 
+        symbols = SymbolContainer()
+        #
+        # Filtering --one result using optimization
+        #
+        # set [ c in IStudent , c.country="USA" | c.name]
+        #
+        query = "[c in IStudent , c.country=USA | c.name]"
+        qo = Query(
+                   metadata, symbols,
+                   set,
+                   [
+                        In(
+                           metadata, symbols,
+                           Identifier(metadata,symbols,'c'),
+                           Identifier(metadata,symbols, 'IStudent')),
+                        Eq(
+                           metadata,symbols,
+                           Identifier(metadata, symbols, 'c.country'),
+                           Identifier(metadata, symbols, '"USA"'))
+                   ], Identifier(metadata, symbols, 'c.name'))
+
+        self.doit(query, qo, set(metadata.getFromIndex('IStudent', 'country', 'USA', 'USA')))
+
+
 def test_suite():
     flags =  doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS
     return unittest.TestSuite((



More information about the Checkins mailing list