This looks fine to me.
On Feb 17, 2005, at 5:16 PM, Alec Flett wrote:
ok, here's an updated version of the patch, cleaned up.. comments?
John had suggested a time-based notification throttling mechanism - I can incorporate that after I commit this.
Alec Index: Query.py =================================================================== RCS file: /usr/local/cvsrep/chandler/repository/query/Query.py,v retrieving revision 1.24 diff -u -r1.24 Query.py --- Query.py 8 Feb 2005 21:40:58 -0000 1.24 +++ Query.py 18 Feb 2005 01:14:38 -0000 @@ -36,12 +36,12 @@ self._queryStringIsStale = True self.args = {} self._logical_plan = None - self._callbacks = {} - self.monitorCallbacks = {} + self._otherViewSubscribeCallbacks = {} + self._sameViewSubscribeCallbacks = {}
def onItemLoad(self, view): - self._callbacks = {} - self.monitorCallbacks = {} + self._otherViewSubscribeCallbacks = {} + self._sameViewSubscribeCallbacks = {} try: if self._resultSet is not []: self._compile() @@ -84,7 +84,7 @@ self._logical_plan = None self.stale = True
- def subscribe(self, callbackItem = None, callbackMethodName = None):
+ def subscribe(self, callbackItem = None, callbackMethodName = None, inSameView = True, inOtherViews = True):
"""
This query should subscribe to repository changes
@@ -93,26 +93,47 @@
@param callbackMethodName: The name of the callback method on the callbackItem
@type callbackMethodName: string
+
+ @param inSameView: if we should subscribe to changes in the current view
+ @type inSameView: Boolean
+ @param inOtherViews: if we should subscribe to changes from commits in other views
+ @type inOtherViews: Boolean
"""
if callbackItem is not None:
- self._callbacks [callbackItem.itsUUID] = callbackMethodName
+ if inSameView:
+ self._otherViewSubscribeCallbacks [callbackItem.itsUUID] = callbackMethodName
+ if inOtherViews:
+ self._sameViewSubscribeCallbacks[callbackItem.itsUUID] = callbackMethodName
+ #@@@ add monitor for items in result set
log.debug(u"RepoQuery<>.subscribe(): %s" % (self.queryString))
self.itsView.addNotificationCallback(self.queryCallback)
- def unsubscribe(self, callbackItem=None):
+ def unsubscribe(self, callbackItem=None, inSameView = True, inOtherViews = True):
"""
This query should stop subscribing to repository changes. If you don't specify a
callbackItemUUID, all subscriptions will be removed.
@param callbackItem: callbackItem to be removed
@type callbackItem: Item
+ @param inSameView: if we should remove the item from the view subscriptions
+ @type inSameView: Boolean
+ @param inOtherViews: if we should remove the item from the commit subscriptions
+ @type inOtherViews: Boolean
"""
if callbackItem is None:
- self._callbacks = {}
+ if inOtherViews:
+ self._otherViewSubscribeCallbacks = {}
+ if inSameView:
+ self._sameViewSubscribeCallbacks = {}
else:
- del self._callbacks [callbackItem.itsUUID]
+ if inOtherViews:
+ del self._otherViewSubscribeCallbacks [callbackItem.itsUUID]
+ if inSameView:
+ del self._sameViewSubscribeCallbacks [callbackItem.itsUUID]
+ #@@@ remove monitor for items in result set
+
self.itsView.removeNotificationCallback(self.queryCallback)
- return len (self._callbacks)
+ return len (self._otherViewSubscribeCallbacks)
def __queryHasChanged(self): return self._queryStringIsStale and self.queryString @@ -167,9 +188,9 @@
if changed:
log.debug(u"RepoQuery.queryCallback: %s %s query result" % (uuid, action))
- for callbackUUID in self._callbacks:
+ for callbackUUID in self._otherViewSubscribeCallbacks:
item = view.find (callbackUUID)
- method = getattr (type(item), self._callbacks [callbackUUID])
+ method = getattr (type(item), self._otherViewSubscribeCallbacks [callbackUUID])
method (item, (added,removed))
log.debug(u"queryCallback: %s:%f" % (self.queryString, time.time()-start))
@@ -234,35 +255,6 @@
return plan
- def monitor(self, callbackItem = None, callbackMethodName = None):
- """
- This query should subscribe to monitor changes
-
- @param callbackItem: a Chandler Item that provides a callback method
- @type callbackItem: Item
-
- @param callbackMethodName: The name of the callback method on the callbackItem
- @type callbackMethodName: string
- """
- if callbackItem is not None:
- self.monitorCallbacks[callbackItem.itsUUID] = callbackMethodName
- #@@@ add monitor for items in result set
-
- def unMonitor(self, callbackItem=None):
- """
- This query should stop subscribing to monitor changes. If you don't specify a
- callbackItemUUID, all subscriptions will be removed.
-
- @param callbackItem: callbackItem to be removed
- @type callbackItem: Item
- """
- if callbackItem is None:
- self.monitorCallbacks = {}
- else:
- del self.monitorCallbacks [callbackItem.itsUUID]
- #@@@ remove monitor for items in result set
- return len (self._callbacks)
-
def monitorCallback(self, op, item, attribute, *args, **kwds):
flag = self._logical_plan.monitored(op, item, attribute, *args, **kwds)
if flag is not None:
@@ -270,9 +262,9 @@
action = ([item], [])
else:
action = ([], [item])
- for callbackUUID in self.monitorCallbacks:
+ for callbackUUID in self._sameViewSubscribeCallbacks:
i = self.itsView.find(callbackUUID)
- method = getattr(type(i), self.monitorCallbacks[callbackUUID])
+ method = getattr(type(i), self._sameViewSubscribeCallbacks[callbackUUID])
method(i, action)
class LogicalPlan(object):
@@ -479,7 +471,7 @@
log.debug(u"analyze_for: collection = %s, closure = %s" % (self.collection, self.closure))
self.plan= (self.collection, compile(self.closure,'<string>','eval'))
- if len(self.__item.monitorCallbacks) > 0:
+ if len(self.__item._sameViewSubscribeCallbacks) > 0:
for a in self.affectedAttributes:
Monitors.Monitors.attach(self.__item, 'monitorCallback', 'set', a)
@@ -522,7 +514,7 @@
try:
c = eval(self._predicate)
if c:
- if len(self.__item.monitorCallbacks) > 0:
+ if len(self.__item._sameViewSubscribeCallbacks) > 0:
if len(self.affectedAttributes) > 1:
print "monitoring of multi-item paths is not yet supported"
yield i
---- Ted Leung Open Source Applications Foundation (OSAF) PGP Fingerprint: 1003 7870 251F FA71 A59A CEE3 BEBA 2B87 F5FC 4B42
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Open Source Applications Foundation "Dev" mailing list http://lists.osafoundation.org/mailman/listinfo/dev
