[Zope-Checkins] CVS: Zope/lib/python/Products/PluginIndexes/PathIndex - PathIndex.py:1.35.8.1

Andreas Jung andreas at andreas-jung.com
Fri Aug 15 11:36:00 EDT 2003


Update of /cvs-repository/Zope/lib/python/Products/PluginIndexes/PathIndex
In directory cvs.zope.org:/tmp/cvs-serv17498/PathIndex

Modified Files:
      Tag: ajung-indexes-btrees-length-branch
	PathIndex.py 
Log Message:
- white space cleanup
- code cleanup
- removed splitPath()
- added tests for reindexing


=== Zope/lib/python/Products/PluginIndexes/PathIndex/PathIndex.py 1.35 => 1.35.8.1 ===
--- Zope/lib/python/Products/PluginIndexes/PathIndex/PathIndex.py:1.35	Tue Jun 17 15:01:07 2003
+++ Zope/lib/python/Products/PluginIndexes/PathIndex/PathIndex.py	Fri Aug 15 10:35:24 2003
@@ -41,7 +41,7 @@
     - every component is kept as a  key of a OOBTree in self._indexes
 
     - the value is a mapping 'level of the path component' to
-      'all documentIds with this path component on this level'
+      'all docids with this path component on this level'
 
     """
 
@@ -55,33 +55,25 @@
          'help': ('PathIndex','PathIndex_Settings.stx')},
     )
 
-    query_options = ["query", "level", "operator"]
-
+    query_options = ("query", "level", "operator")
 
     def __init__(self,id,caller=None):
         self.id = id
-
-        # experimental code for specifing the operator
-        self.operators = ['or','and']
+        self.operators = ('or','and')
         self.useOperator = 'or'
-
         self.clear()
 
-
     def clear(self):
-        """ clear everything """
-
-        self._depth   = 0
-        self._index   = OOBTree()
+        self._depth = 0
+        self._index = OOBTree()
         self._unindex = IOBTree()
 
-
     def insertEntry(self, comp, id, level):
         """Insert an entry.
 
-        comp is a path component (generated by splitPath() )
-        id is the documentId
-        level is the level of the component inside the path
+           comp is a path component 
+           id is the docid
+           level is the level of the component inside the path
         """
 
         if not self._index.has_key(comp):
@@ -94,16 +86,11 @@
         if level > self._depth:
             self._depth = level
 
-
-    def index_object(self, documentId, obj ,threshold=100):
+    def index_object(self, docid, obj ,threshold=100):
         """ hook for (Z)Catalog """
 
-        # first we check if the object provide an attribute or
-        # method to be used as hook for the PathIndex
-
-        if hasattr(obj, self.id):
-            f = getattr(obj, self.id)
-
+        f = getattr(obj, self.id, None)
+        if f is not None:
             if safe_callable(f):
                 try:
                     path = f()
@@ -112,8 +99,7 @@
             else:
                 path = f
 
-            if not (isinstance(path, StringType) or
-                    isinstance(path, TupleType)):
+            if not isinstance(path, (StringType, TupleType)):
                 raise TypeError('path value must be string or tuple of strings')
         else:
             try:
@@ -121,36 +107,31 @@
             except AttributeError:
                 return 0
 
-        if type(path) in (ListType, TupleType):
+        if isinstance(path, (ListType, TupleType)):
             path = '/'+ '/'.join(path[1:])
-
-        comps = self.splitPath(path, obj)
+        comps = filter(None, path.split('/'))
 
         for i in range(len(comps)):
-            self.insertEntry(comps[i], documentId, i)
-
-        self._unindex[documentId] = path
-
+            self.insertEntry(comps[i], docid, i)
+        self._unindex[docid] = path
         return 1
 
-
-    def unindex_object(self, documentId):
+    def unindex_object(self, docid):
         """ hook for (Z)Catalog """
 
-        if not self._unindex.has_key(documentId):
+        if not self._unindex.has_key(docid):
             LOG(self.__class__.__name__, ERROR,
                 'Attempt to unindex nonexistent document'
-                ' with id %s' % documentId)
+                ' with id %s' % docid)
             return
 
-        path = self._unindex[documentId]
-        comps = path.split('/')
+        comps =  self._unindex[docid].split('/')
 
         for level in range(len(comps[1:])):
             comp = comps[level+1]
 
             try:
-                self._index[comp][level].remove(documentId)
+                self._index[comp][level].remove(docid)
 
                 if not self._index[comp][level]:
                     del self._index[comp][level]
@@ -160,34 +141,9 @@
             except KeyError:
                 LOG(self.__class__.__name__, ERROR,
                     'Attempt to unindex document'
-                    ' with id %s failed' % documentId)
-
-        del self._unindex[documentId]
-
-
-    def printIndex(self):
-        for k,v in self._index.items():
-            print "-"*78
-            print k
-            for k1,v1 in v.items():
-                print k1,v1,
-
-            print
-
-
-    def splitPath(self, path, obj=None):
-        """ split physical path of object. If the object has
-        as function splitPath() we use this user-defined function
-        to split the path
-        """
-
-        if hasattr(obj, "splitPath"):
-            comps = obj.splitPath(path)
-        else:
-            comps = filter(None, path.split('/'))
-
-        return comps
+                    ' with id %s failed' % docid)
 
+        del self._unindex[docid]
 
     def search(self, path, default_level=0):
         """
@@ -199,88 +155,69 @@
         level <  0  not implemented yet
         """
 
-        if isinstance(path,StringType):
+        if isinstance(path, StringType):
             level = default_level
         else:
             level = int(path[1])
             path  = path[0]
 
-        comps = self.splitPath(path)
+        comps = filter(None, path.split('/'))
 
         if len(comps) == 0:
             return IISet(self._unindex.keys())
 
         if level >= 0:
-
             results = []
             for i in range(len(comps)):
                 comp = comps[i]
-
                 if not self._index.has_key(comp): return IISet()
                 if not self._index[comp].has_key(level+i): return IISet()
-
                 results.append( self._index[comp][level+i] )
 
             res = results[0]
-
             for i in range(1,len(results)):
                 res = intersection(res,results[i])
-
             return res
 
         else:
-
             results = IISet()
-
             for level in range(0,self._depth + 1):
-
                 ids = None
                 error = 0
-
                 for cn in range(0,len(comps)):
                     comp = comps[cn]
-
                     try:
                         ids = intersection(ids,self._index[comp][level+cn])
                     except KeyError:
                         error = 1
-
                 if error==0:
                     results = union(results,ids)
-
             return results
 
-
-
     def __len__(self):
         """ len """
         # XXX REALLY inefficient
         return len(self._index)
 
-
     def numObjects(self):
         """ return the number of indexed objects"""
         # XXX REALLY inefficient
         return len(self._unindex)
 
-
     def keys(self):
         """ return list of all path components """
         # XXX Could this be lazy, does it need to be a list?
         return list(self._index.keys())
 
-
     def values(self):
         # XXX Could this be lazy, does it need to be a list?
         return list(self._index.values())
 
-
     def items(self):
-        """ mapping path components : documentIds """
+        """ mapping path components : docids """
         # XXX Could this be lazy, does it need to be a list?
         return list(self._index.items())
 
-
     def _apply_index(self, request, cid=''):
         """ hook for (Z)Catalog
         request   mapping type (usually {"path": "..." }
@@ -307,8 +244,8 @@
         operator = record.get('operator',self.useOperator).lower()
 
         # depending on the operator we use intersection of union
-        if operator=="or":  set_func = union
-        else:               set_func = intersection
+        if operator == "or":  set_func = union
+        else: set_func = intersection
 
         res = None
 
@@ -325,26 +262,23 @@
         """has unique values for column name"""
         return name == self.id
 
-
     def uniqueValues(self, name=None, withLength=0):
         """ needed to be consistent with the interface """
         return self._index.keys()
 
-
     def getIndexSourceNames(self):
         """ return names of indexed attributes """
         return ('getPhysicalPath', )
 
-
-    def getEntryForObject(self, documentId, default=_marker):
-        """ Takes a document ID and returns all the information we have
-        on that specific object. """
+    def getEntryForObject(self, docid, default=_marker):
+        """ Takes a document ID and returns all the information 
+            we have on that specific object. 
+        """
         try:
-            return self._unindex[documentId]
+            return self._unindex[docid]
         except KeyError:
             # XXX Why is default ignored?
             return None
-
 
     index_html = DTMLFile('dtml/index', globals())
     manage_workspace = DTMLFile('dtml/managePathIndex', globals())




More information about the Zope-Checkins mailing list