[Zope-Checkins] SVN: Zope/branches/andig-compositeindex/ make_query, full IUniqueValueIndex support added

Andreas Gabriel gabriel at hrz.uni-marburg.de
Tue Oct 5 18:47:25 EDT 2010


Log message for revision 117258:
  make_query, full IUniqueValueIndex support added
  

Changed:
  U   Zope/branches/andig-compositeindex/buildout.cfg
  U   Zope/branches/andig-compositeindex/src/Products/PluginIndexes/CompositeIndex/CompositeIndex.py

-=-
Modified: Zope/branches/andig-compositeindex/buildout.cfg
===================================================================
--- Zope/branches/andig-compositeindex/buildout.cfg	2010-10-05 22:45:20 UTC (rev 117257)
+++ Zope/branches/andig-compositeindex/buildout.cfg	2010-10-05 22:47:25 UTC (rev 117258)
@@ -98,6 +98,7 @@
     zope.structuredtext
     zope.tal
     zope.tales
+    zope.testing
     zope.traversing
     zope.viewlet
 

Modified: Zope/branches/andig-compositeindex/src/Products/PluginIndexes/CompositeIndex/CompositeIndex.py
===================================================================
--- Zope/branches/andig-compositeindex/src/Products/PluginIndexes/CompositeIndex/CompositeIndex.py	2010-10-05 22:45:20 UTC (rev 117257)
+++ Zope/branches/andig-compositeindex/src/Products/PluginIndexes/CompositeIndex/CompositeIndex.py	2010-10-05 22:47:25 UTC (rev 117258)
@@ -16,10 +16,8 @@
 
 from Acquisition import aq_parent
 
-from Globals import DTMLFile
+from App.special_dtml import DTMLFile
 
-from time import time
-
 from BTrees.IIBTree import IIBTree, IITreeSet, IISet, union, intersection, difference
 from BTrees.OOBTree import OOBTree
 from BTrees.IOBTree import IOBTree
@@ -32,6 +30,7 @@
 from Products.PluginIndexes.interfaces import ITransposeQuery
 from Products.PluginIndexes.interfaces import IUniqueValueIndex
 from Products.PluginIndexes.KeywordIndex.KeywordIndex import KeywordIndex
+
 from Products.PluginIndexes.common.util import parseIndexRequest
 
 from util import PermuteKeywordList
@@ -75,7 +74,7 @@
             self._cindexes[i] = OOBTree()
         
 
-    def _apply_index(self, request, cid='', type=type):
+    def _apply_index(self, request, resultset=None):
         """ Apply the index to query parameters given in the request arg. """
         
         record = parseIndexRequest(request, self.id, self.query_options)
@@ -86,7 +85,7 @@
                 for i,k in enumerate(record.keys):
                     record.keys[i] = hash(k)
                     
-            return super(CompositeIndex,self)._apply_index(request, cid=cid, type=type)
+            return super(CompositeIndex,self)._apply_index(request, resultset=resultset)
          
         operator = self.useOperator
 
@@ -113,7 +112,7 @@
         # sort from short to long sets
         rank.sort()
 
-        k     = None
+        k = None
         for l,res in rank:
 
             k = intersection(k, res)
@@ -121,7 +120,6 @@
             if not k:
                 break
 
-
         # if any operator of composite indexes is set to "and"
         # switch to intersecton mode
         
@@ -129,10 +127,10 @@
             set_func = union
         else:
             set_func = intersection
-
         
         rank=[]
         if set_func == intersection:
+            res = None
             for key in k:
                 set=self._index.get(key, IISet())
                 rank.append((len(set),key))
@@ -141,13 +139,13 @@
             rank.sort()
 
         else:
+            res = None
             # dummy length
             if k:
                 rank = enumerate(k)
 
-        res = None
+
         # collect docIds
-
         for l,key in rank:
             
             set=self._index.get(key, None)
@@ -445,6 +443,45 @@
         # This method is superceded by documentToKeyMap
         logger.warn('keyForDocument: return hashed key')
         return super(CompositeIndex,self).keyForDocument(id)
+
+
+    def hasUniqueValuesFor(self, name):
+        """has unique values for column name"""
+        if name in self.getComponentIndexNames():
+            return 1
+        else:
+            return 0
+
+    def uniqueValues(self, name=None, withLengths=0):
+        """returns the unique values for name
+
+        if withLengths is true, returns a sequence of
+        tuples of (value, length)
+        """
+
+        # default: return unique values from first component
+
+        if name is None:
+            name = self.getComponentIndexNames()[0]
+        
+        if self._cindexes.has_key(name):
+            index = self._cindexes[name]
+        else:
+            return []
+
+        if not withLengths:
+            return tuple(index.keys())
+        else:
+            rl=[]
+            for i in index.keys():
+                set = index[i]
+                if isinstance(set, int):
+                    l = 1
+                else:
+                    l = len(set)
+                rl.append((i, l))
+            return tuple(rl)
+
     
     def documentToKeyMap(self):
         logger.warn('documentToKeyMap: return hashed key map')
@@ -466,56 +503,43 @@
         
         cquery = query.copy()
 
-        catalog = aq_parent(self)
-
-        indexes = catalog.indexes
-
-        parent = aq_parent(catalog)
-
-        if parent.hasProperty('compositeindex') and not parent.getProperty('compositeindex',True):
-            logger.warn('skip make_query')
-            return
-        
         cIdxs = self.getComponentIndexNames()
 
         records=[]
-        for i in cIdxs:
-            index = indexes.get(i,None)
+        for name in cIdxs:
             abort = False
                     
-            if index:
-                rec = parseIndexRequest(query, index.id, index.query_options)
+            #TODO query_options
+            # if intex_type == "FieldIndex":
+            #    query_options = ["query","range"]
+            # elif intex_type == "KeywordIndex":
+            #    query_options = ["query","operator","range"]
+
+            query_options = ["query","range"]
+            rec = parseIndexRequest(query, name, query_options)
                         
-                if not IUniqueValueIndex.providedBy(index):
-                    logger.warn('index %s: not an instance of IUniqueValueIndex' % index.id)
-                    abort = True
 
-                if abort or rec.keys is None:
-                    continue
+
+            if rec.keys is None:
+                continue
                         
-                records.append((i, rec))
+            records.append((name, rec))
 
                         
-        # transform request only if more than one component 
-        # of the composite key is applied 
-        if len(records) > 1:
 
-            cquery.update( { cId: { 'query': records }} )
 
+        cquery.update( { self.id: { 'query': records }} )
+
                     
-            # delete obsolete query attributes from request
-            for i in cIdxs[:len(records)+1]:
-                if cquery.has_key(i):
-                    del cquery[i]
+        # delete obsolete query attributes from request
+        for i in cIdxs[:len(records)+1]:
+            if cquery.has_key(i):
+                del cquery[i]
 
-            logger.debug('composite query build "%s"' % cquery)
-            return cquery
+        logger.debug('composite query build "%s"' % cquery)
+        
+        return cquery
 
-        else:
-            logger.debug('only one component was affected, skip composite query build')
-            
-                    
-        return query        
     
 
     manage = manage_main = DTMLFile('dtml/manageCompositeIndex', globals())



More information about the Zope-Checkins mailing list