File:  [Repository] / ZSQLExtend / Index.py
Revision 1.2: download - view: text, annotated - select for diffs - revision graph
Mon Feb 15 19:10:23 2010 UTC (14 years, 2 months ago) by casties
Branches: MAIN
CVS tags: HEAD
fixing small errors for zope 2.12

from BTrees.OOBTree import OOBTree
from OFS.Folder import Folder
from AccessControl import ClassSecurityInfo
from OFS.SimpleItem import SimpleItem
import re

class OOIndex(SimpleItem):
    """classe fuer indices"""
 
    security=ClassSecurityInfo()
    def __init__(self,id,results,key,value):
        self._index=OOBTree()
        self.id=id
        for result in results:
            ke=getattr(result,key)
            va=getattr(result,value)
            self._index[ke]=va
    
    def update(self,results,key,value):
        del self._index
        
        self.__init__(self.id,results, key, value)
        
    security.declarePublic("getKeys")
    def getKeys(self, pattern):
        """getkeys"""
        #method comes from Lexicon.py (globToWordIds only slightly modified
        # Implement * and ? just as in the shell, except the pattern
        # must not start with either of these
        prefix = ""
        while pattern and pattern[0] not in "*?":
            prefix += pattern[0]
            pattern = pattern[1:]
        if not pattern:
            # There were no globbing characters in the pattern
            wid = self._index.get(prefix, 0)
            if wid:
                return [prefix]
            else:
                return []
        if not prefix:
            # The pattern starts with a globbing character.
            # This is too efficient, so we raise an exception.
            raise QueryError(
                "pattern %r shouldn't start with glob character" % pattern)
        pat = prefix
        for c in pattern:
            if c == "*":
                pat += ".*"
            elif c == "?":
                pat += "."
            else:
                pat += re.escape(c)
        pat += "$"
        prog = re.compile(pat)
        keys = self._index.keys(prefix) # Keys starting at prefix
        wids = []
        for key in keys:
            if not key.startswith(prefix):
                break
            if prog.match(key):
                wids.append(key)
        return wids


class IndexManager(Folder):
    """indexManager"""
    meta_type="IndexManager"
    
    def __init__(self):
        self.id="IndexManager"
        self._indexes={}
    def createIndex(self,id,results,key,value):
        """create an index"""
        index=OOIndex(id,results,key,value)
        self._setOb(id, index)
        ob=self._getOb(id, None)
        ob.id=id
        return index
    
    def updateIndex(self,id,results,key,value):
        """update or create an index"""
        
        index=self._getOb(id, None)
        if not index:
            self.createIndex(id,results,key,value)
        else:
            index.update(results,key,value)
        
        return index
    
    def getKeysFromIndex(self,name,pattern):
        """get keys"""
        index=self._getOb(name, None)
        if not index:
            return []
        else:
            return index.getKeys(pattern)
        
def manage_addIndexManager(self):
    """add an index Manager"""
    obj=IndexManager()
    
    self._setObject("IndexManager",obj)
    
manage_addIndexManagerForm=manage_addIndexManager #no user interaction needed

            
        
        
        

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>