Annotation of ZSQLExtend/Index.py, revision 1.1
1.1 ! dwinter 1: from BTrees.OOBTree import OOBTree
! 2: from OFS.Folder import Folder
! 3: from AccessControl import ClassSecurityInfo
! 4: from OFS.SimpleItem import SimpleItem
! 5: import re
! 6:
! 7: class OOIndex(SimpleItem):
! 8: """classe fŸr indices"""
! 9:
! 10: security=ClassSecurityInfo()
! 11: def __init__(self,id,results,key,value):
! 12: self._index=OOBTree()
! 13: self.id=id
! 14: for result in results:
! 15: ke=getattr(result,key)
! 16: va=getattr(result,value)
! 17: self._index[ke]=va
! 18:
! 19: def update(self,results,key,value):
! 20: del self._index
! 21:
! 22: self.__init__(self.id,results, key, value)
! 23:
! 24: security.declarePublic("getKeys")
! 25: def getKeys(self, pattern):
! 26: """getkeys"""
! 27: #method comes from Lexicon.py (globToWordIds only slightly modified
! 28: # Implement * and ? just as in the shell, except the pattern
! 29: # must not start with either of these
! 30: prefix = ""
! 31: while pattern and pattern[0] not in "*?":
! 32: prefix += pattern[0]
! 33: pattern = pattern[1:]
! 34: if not pattern:
! 35: # There were no globbing characters in the pattern
! 36: wid = self._index.get(prefix, 0)
! 37: if wid:
! 38: return [prefix]
! 39: else:
! 40: return []
! 41: if not prefix:
! 42: # The pattern starts with a globbing character.
! 43: # This is too efficient, so we raise an exception.
! 44: raise QueryError(
! 45: "pattern %r shouldn't start with glob character" % pattern)
! 46: pat = prefix
! 47: for c in pattern:
! 48: if c == "*":
! 49: pat += ".*"
! 50: elif c == "?":
! 51: pat += "."
! 52: else:
! 53: pat += re.escape(c)
! 54: pat += "$"
! 55: prog = re.compile(pat)
! 56: keys = self._index.keys(prefix) # Keys starting at prefix
! 57: wids = []
! 58: for key in keys:
! 59: if not key.startswith(prefix):
! 60: break
! 61: if prog.match(key):
! 62: wids.append(key)
! 63: return wids
! 64:
! 65:
! 66: class IndexManager(Folder):
! 67: """indexManager"""
! 68: meta_type="IndexManager"
! 69:
! 70: def __init__(self):
! 71: self.id="IndexManager"
! 72: self._indexes={}
! 73: def createIndex(self,id,results,key,value):
! 74: """create an index"""
! 75: index=OOIndex(id,results,key,value)
! 76: self._setOb(id, index)
! 77: ob=self._getOb(id, None)
! 78: ob.id=id
! 79: return index
! 80:
! 81: def updateIndex(self,id,results,key,value):
! 82: """update or create an index"""
! 83:
! 84: index=self._getOb(id, None)
! 85: if not index:
! 86: self.createIndex(id,results,key,value)
! 87: else:
! 88: index.update(results,key,value)
! 89:
! 90: return index
! 91:
! 92: def getKeysFromIndex(self,name,pattern):
! 93: """get keys"""
! 94: index=self._getOb(name, None)
! 95: if not index:
! 96: return []
! 97: else:
! 98: return index.getKeys(pattern)
! 99:
! 100: def manage_addIndexManager(self):
! 101: """add an index Manager"""
! 102: obj=IndexManager()
! 103:
! 104: self._setObject("IndexManager",obj)
! 105:
! 106: manage_addIndexManagerForm=manage_addIndexManager #no user interaction needed
! 107:
! 108:
! 109:
! 110:
! 111:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>