[Zope-Checkins] CVS: Products/PluginIndexes/common - util.py:1.6.4.1

andreasjung@cvs.baymountain.com andreasjung@cvs.baymountain.com
Wed, 25 Jul 2001 09:29:08 -0400


Update of /cvs-repository/Products/PluginIndexes/common
In directory cvs.zope.org:/tmp/cvs-serv327/lib/python/Products/PluginIndexes/common

Modified Files:
      Tag: Zope-2_4-branch
	util.py 
Log Message:
        - Collector #2423: Searching a FieldIndexes for documents
          with a blank string has been broken.

 
=== Products/PluginIndexes/common/util.py 1.6 => 1.6.4.1 ===

 from DateTime import DateTime
 
+SequenceTypes = (TupleType, ListType)
+
 class parseIndexRequest:
     """
     This class provides functionality to hide the internals of a request
@@ -125,7 +127,7 @@
 
     ParserException = 'IndexRequestParseError'
 
-    def __init__(self,request,iid,options=[]): 
+    def __init__(self, request, iid, options=[]):
         """ parse a request  from the ZPublisher and return a uniform
         datastructure back to the _apply_index() method of the index
 
@@ -134,83 +136,78 @@
           options -- a list of options the index is interested in 
         """
 
-        self.id         = iid
-        self.keys       = None
+        self.id = iid
 
-        if not request.has_key(iid): return
+        if not request.has_key(iid):
+            self.keys = None
+            return
 
         # We keep this for backward compatility
-        if request.has_key(iid+'_usage'):
-            self.usage = request[iid+'_usage']
-
-        keys = request[iid]
-
-        if type(keys) == InstanceType:
-
-            if isinstance(keys,DateTime):
-                """query is a DateTime instance"""
+        usage_param = iid + '_usage'
+        if request.has_key(usage_param):
+            self.usage = request[usage_param]
+
+        param = request[iid]
+        keys = None
+        t = type(param)
+
+        if t is InstanceType and not isinstance(param, DateTime):
+            """ query is of type record """
+
+            record = param
+
+            if not hasattr(record, 'query'):
+                raise self.ParserException, (
+                    "record for '%s' *must* contain a "
+                    "'query' attribute" % self.id)
+            keys = record.query
 
-                self.keys = keys
-
-
-            else:
-                """ query is of type record """
-                record = keys
+            if type(keys) is StringType:
+                keys = [keys.strip()]
 
-                if hasattr(record,'query'):           
-                    keys = record.query
-                else:
-                    raise self.ParserException,\
-                       "record for '%s' *must* contain a 'query' attribute" % self.id
-                
-                if type(keys)== StringType:
-                    self.keys = [keys.strip()]
-                elif type(keys) == ListType:
-                    self.keys = keys
-    
-                for op in options:
-                    if op in ["query"]: continue 
-    
-                    if hasattr(record,op):
-                        setattr(self,k,getattr(record,k))
+            for op in options:
+                if op == "query": continue
 
+                if hasattr(record, op):
+                    setattr(self, op, getattr(record, op))
 
-        elif type(keys)==DictType:
+        elif t is DictType:
             """ query is a dictionary containing all parameters """
     
-            query = keys.get("query",[])
-            if type(query) in [TupleType,ListType]:
-                self.keys = query
+            query = param.get("query", ())
+            if type(query) in SequenceTypes:
+                keys = query
             else:
-                self.keys = [ query ]
+                keys = [ query ]
 
-            for op in  options:         
-                if op in ["query"]: continue
+            for op in options:         
+                if op == "query": continue
 
-                if keys.has_key(op):
-                    setattr(self,op,keys[op])
+                if param.has_key(op):
+                    setattr(self, op, param[op])
  
-
         else:
-            """ query is tuple, list or string """
+            """ query is tuple, list, string, number, or something else """
 
-            if type(keys) in [TupleType,ListType]:
-                self.keys  = keys
+            if t in SequenceTypes:
+                keys = param
             else:
-                self.keys = [keys]
+                keys = [param]
 
             for op in options:
-                if request.has_key(iid+"_"+op):
-                    setattr(self,op,request[iid+"_"+op])
-
+                field = iid + "_" + op
+                if request.has_key(field):
+                    setattr(self, op, request[field])
+
+        if keys is not None:
+            # Filter out empty strings.
+            keys = filter(lambda key: key != '', keys)
+        if not keys:
+            keys = None
 
-        if self.keys != None:
-            self.keys = filter(lambda x: len(str(x))>0 , self.keys)
+        self.keys = keys
 
-        if len(self.keys)==0:  self.keys=None
-        
 
- 
     def get(self,k,default_v=None):
         
         if hasattr(self,k):