Package Pyblio :: Package Stores :: Module resultset
[hide private]
[frames] | no frames]

Source Code for Module Pyblio.Stores.resultset

  1  # This file is part of pybliographer 
  2  #  
  3  # Copyright (C) 1998-2006 Frederic GOBRY 
  4  # Email : gobry@pybliographer.org 
  5  #           
  6  # This program is free software; you can redistribute it and/or 
  7  # modify it under the terms of the GNU General Public License 
  8  # as published by the Free Software Foundation; either version 2  
  9  # of the License, or (at your option) any later version. 
 10  #    
 11  # This program is distributed in the hope that it will be useful, 
 12  # but WITHOUT ANY WARRANTY; without even the implied warranty of 
 13  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 14  # GNU General Public License for more details.  
 15  #  
 16  # You should have received a copy of the GNU General Public License 
 17  # along with this program; if not, write to the Free Software 
 18  # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
 19  """ 
 20  Common implementation of in-memory result sets and views. 
 21   
 22  The result sets use a Pyblio.Arrays.KeyArray to store their 
 23  content. Views are implemented with plain lists of keys. 
 24  """ 
 25   
 26  from Pyblio import Store, Callback, Arrays, Sort 
 27   
28 -class ResultSet(Store.ResultSet, Callback.Publisher):
29 - def __init__(self, rsid, db, contents=None):
30 Callback.Publisher.__init__ (self) 31 if contents is None: 32 self._contents = Arrays.KeyArray() 33 else: 34 self._contents = contents 35 self.id = rsid 36 self.name = None 37 self._db = db 38 self._db.register('delete-item', self._on_db_delete) 39 self._db.register('update-item', self._on_db_update)
40
41 - def view (self, criterion):
42 return View(self, criterion)
43
44 - def add(self, k):
45 self._contents.add(k) 46 self.emit('add-item', k) 47 return
48
49 - def __delitem__(self, k):
50 del self._contents[k] 51 self.emit ('delete-item', k) 52 return
53
54 - def itervalues (self):
55 for k in self._contents: 56 yield self._db[k]
57
58 - def iteritems (self):
59 for k in self._contents: 60 yield (k, self._db[k])
61
62 - def iterkeys(self):
63 return iter(self._contents)
64 65 __iter__ = iterkeys 66
67 - def __len__(self):
68 return len(self._contents)
69
70 - def destroy(self):
71 for k in list(self._contents): 72 del self._db[k]
73
74 - def _from_array(self, contents):
75 self._contents = contents
76
77 - def _on_db_delete (self, k):
78 """ invoked when the database removes an item """ 79 try: 80 del self[k] 81 except IndexError: 82 pass
83
84 - def _on_db_update(self, k):
85 if k in self._contents: 86 self.emit('update-item', k)
87 88 # This class could certainly benefit from optimisations: when changing 89 # a single value, the full list of results is recomputed every time.
90 -class View(Callback.Publisher):
91
92 - def __init__ (self, src, crit):
93 Callback.Publisher.__init__(self) 94 95 self._crit = crit 96 self._src = src 97 98 self._update(None, '') 99 100 self._src.register('add-item', self._update, 'add-item') 101 self._src.register('delete-item', self._update, 'delete-item') 102 self._src.register('update-item', self._update, 'update-item') 103 return
104
105 - def _update(self, key, signal):
106 view = [(self._crit.cmp_key(e), e.key) for e in self._src.itervalues()] 107 view.sort(lambda a, b: Sort.compare(a[0], b[0])) 108 109 self._view = [x[1] for x in view] 110 self.emit(signal, key) 111 return
112
113 - def __len__ (self):
114 return len(self._view)
115
116 - def __getitem__ (self, i):
117 return self._view[i]
118
119 - def __iter__ (self):
120 return iter (self._view)
121
122 - def iterkeys (self):
123 return iter(self._view)
124
125 - def iteritems(self):
126 for i in self._view: 127 yield (i, self._src._db[i])
128
129 - def itervalues(self):
130 for i in self._view: 131 yield self._src._db[i]
132
133 - def index(self, key):
134 try: 135 return self._view.index(key) 136 except ValueError: 137 raise KeyError(key)
138