allow list of values in tracking queries

git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2098 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2007-10-08 11:21:50 +00:00
parent f5429af719
commit c266f353df
2 changed files with 17 additions and 8 deletions

View file

@ -39,6 +39,12 @@ track data.
>>> len(result) >>> len(result)
2 2
By supplying a list we can also search for more than one value in one query.
>>> result = tracks.query(taskId=('a001', 'a002'))
>>> len(result)
2
What happens if we store more than on record for one set of keys? What happens if we store more than on record for one set of keys?
>>> tracks.saveUserTrack('a001', 0, 'u1', {'somekey': 'newvalue'}) >>> tracks.saveUserTrack('a001', 0, 'u1', {'somekey': 'newvalue'})

View file

@ -30,7 +30,7 @@ from zope.index.field import FieldIndex
from persistent import Persistent from persistent import Persistent
from BTrees import OOBTree, IOBTree from BTrees import OOBTree, IOBTree
from BTrees.IFBTree import intersection from BTrees.IFBTree import intersection, union
from interfaces import IRun, ITrackingStorage, ITrack from interfaces import IRun, ITrackingStorage, ITrack
@ -209,14 +209,14 @@ class TrackingStorage(BTreeContainer):
for idx in kw: for idx in kw:
value = kw[idx] value = kw[idx]
if idx in self.indexAttributes: if idx in self.indexAttributes:
#if type(value) not in (list, tuple): if type(value) not in (list, tuple):
# value = [value] value = [value]
# TODO: handle a list of values, provide union of results # TODO: handle a list of values, provide union of results
# resultx = None resultx = None
# for v in value: for v in value:
# result = self.union(result, self.indexes[idx].apply((v, v))) resultx = self.union(resultx, self.indexes[idx].apply((v, v)))
# result = self.intersect(result, resultx) result = self.intersect(result, resultx)
result = self.intersect(result, self.indexes[idx].apply((value, value))) #result = self.intersect(result, self.indexes[idx].apply((value, value)))
elif idx == 'timeFrom': elif idx == 'timeFrom':
result = self.intersect(result, result = self.intersect(result,
self.indexes['timeStamp'].apply((value, None))) self.indexes['timeStamp'].apply((value, None)))
@ -232,6 +232,9 @@ class TrackingStorage(BTreeContainer):
def intersect(self, r1, r2): def intersect(self, r1, r2):
return r1 is None and r2 or intersection(r1, r2) return r1 is None and r2 or intersection(r1, r2)
def union(self, r1, r2):
return r1 is None and r2 or union(r1, r2)
def getUserNames(self, taskId): def getUserNames(self, taskId):
return sorted(self.taskUsers.get(taskId, [])) return sorted(self.taskUsers.get(taskId, []))