[Dev] Re: subscribe/monitor merge

Ted Leung twl at osafoundation.org
Thu Feb 17 17:27:41 PST 2005


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




More information about the Dev mailing list