Changeset 483
- Timestamp:
- 09/11/07 02:33:51
- Files:
-
- trunk/dejavu/sandboxes.py (modified) (9 diffs)
- trunk/dejavu/storage/__init__.py (modified) (9 diffs)
- trunk/dejavu/storage/db.py (modified) (2 diffs)
- trunk/dejavu/storage/partitions.py (modified) (2 diffs)
- trunk/dejavu/storage/storefs.py (modified) (1 diff)
- trunk/dejavu/storage/storeram.py (modified) (1 diff)
- trunk/dejavu/storage/storeshelve.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/dejavu/sandboxes.py
r482 r483 64 64 for arg, key in zip(args, uniq): 65 65 kwargs[str(key)] = arg 66 expr = logic.filter(**kwargs) 67 try: 68 return self.xrecall(cls, expr).next() 69 except StopIteration: 70 return None 66 return self.unit(cls, logic.filter(**kwargs)) 71 67 recaller.__doc__ = "A single %s Unit, else None." % name 72 68 return recaller … … 117 113 unit.sandbox = None 118 114 119 def xrecall(self, relation, expr=None, inherit=False, **kwargs):115 def xrecall(self, classes, expr=None, inherit=False, **kwargs): 120 116 """Iterator over units of the given class(es) which match expr. 121 117 … … 123 119 subclasses of the given class will be recalled. 124 120 125 If the ' relation' arg is a UnitJoin, each yielded value will126 be a list of Units, in the same order as the relationarg.121 If the 'classes' arg is a UnitJoin, each yielded value will 122 be a list of Units, in the same order as the classes arg. 127 123 This facilitates unpacking in iterative consumer code like: 128 124 … … 141 137 multiple classes. 142 138 """ 143 if isinstance( relation, dejavu.UnitJoin):144 for unitrow in self._xmulti (relation, expr, **kwargs):139 if isinstance(classes, dejavu.UnitJoin): 140 for unitrow in self._xmultirecall(classes, expr, **kwargs): 145 141 yield unitrow 146 142 return 147 143 148 cls = relation144 cls = classes 149 145 expr = logic.combine(expr, kwargs) 150 146 … … 223 219 yield unit 224 220 225 def recall(self, relation, expr=None, inherit=False, **kwargs):221 def recall(self, classes, expr=None, inherit=False, **kwargs): 226 222 """List of units of the given class(es) which match expr. 227 223 … … 229 225 subclasses of the given class will be recalled. 230 226 231 If the ' relation' arg is a UnitJoin, each yielded value will232 be a list of Units, in the same order as the relationarg.227 If the 'classes' arg is a UnitJoin, each yielded value will 228 be a list of Units, in the same order as the classes arg. 233 229 This facilitates unpacking in iterative consumer code like: 234 230 … … 247 243 multiple classes. 248 244 """ 249 return [x for x in self.xrecall(relation, expr, inherit, **kwargs)] 250 251 def _xmulti(self, relation, expr=None, **kwargs): 245 return [x for x in self.xrecall(classes, expr, inherit, **kwargs)] 246 247 def unit(self, classes, expr=None, **kwargs): 248 """A single Unit/Unit set which matches the given expr, else None. 249 250 **kwargs will be combined into an Expression via logic.filter. 251 252 The first Unit (or set of Units, if 'classes' is a UnitJoin) 253 matching the expression is returned; if no Units match, None 254 is returned. 255 """ 256 expr = logic.combine(expr, kwargs) 257 258 try: 259 if isinstance(classes, dejavu.UnitJoin): 260 return self._xmultirecall(classes, expr).next() 261 else: 262 return self.xrecall(classes, expr).next() 263 except StopIteration: 264 return None 265 266 def _xmultirecall(self, classes, expr=None, **kwargs): 252 267 """Recall units of each cls if they together match the expr. 253 268 254 The ' relation' arg must be a UnitJoin, and each yielded value255 will be a list of Units, in the same order as the relationarg.269 The 'classes' arg must be a UnitJoin, and each yielded value 270 will be a list of Units, in the same order as the classes arg. 256 271 This facilitates unpacking in iterative consumer code like: 257 272 … … 278 293 # in the resultset. If you're using xmulti with no expr's, or 279 294 # in read-only scripts, it should be OK for now. But if you mutate 280 # Units and then call multirecall, expect inconsistent results.281 for unitset in self.store. multirecall(relation, expr):295 # Units and then call _multirecall, expect inconsistent results. 296 for unitset in self.store._xmultirecall(classes, expr): 282 297 confirmed = True 283 298 for index in xrange(len(unitset)): … … 300 315 yield unitset 301 316 302 def unit(self, cls, expr=None, inherit=False, **kwargs):303 """A single Unit which matches the given expr, else None.304 305 If inherit is True, the given class and all registered subclasses306 of the given class will be searched for a matching Unit.307 308 **kwargs will be combined into an Expression via logic.filter.309 The first Unit matching that expression is returned; if no310 Units match, None is returned.311 """312 try:313 return self.xrecall(cls, expr, inherit, **kwargs).next()314 except StopIteration:315 return None316 317 317 def xview(self, query, distinct=False): 318 318 """Yield tuples of attrs for the given Query. trunk/dejavu/storage/__init__.py
r482 r483 203 203 raise NotImplementedError 204 204 205 def xrecall(self, cl s, expr=None, order=None, limit=None, offset=None):205 def xrecall(self, classes, expr=None, order=None, limit=None, offset=None): 206 206 """Return an iterable of Units.""" 207 if isinstance(classes, dejavu.UnitJoin): 208 for unitrow in self._xmultirecall(classes, expr, order=order, 209 limit=limit, offset=offset): 210 yield unitrow 211 return 212 207 213 raise NotImplementedError 208 214 209 def recall(self, cl s, expr=None, order=None, limit=None, offset=None):215 def recall(self, classes, expr=None, order=None, limit=None, offset=None): 210 216 """Return a sequence of Unit instances which satisfy the expression.""" 211 return [x for x in self.xrecall(cls, expr, order, limit, offset)] 217 return [x for x in self.xrecall(classes, expr, order=order, 218 limit=limit, offset=offset)] 219 220 def unit(self, classes, expr=None, **kwargs): 221 """A single Unit/Unit set which matches the given expr, else None. 222 223 **kwargs will be combined into an Expression via logic.filter. 224 225 The first Unit (or set of Units, if 'classes' is a UnitJoin) 226 matching the expression is returned; if no Units match, None 227 is returned. 228 """ 229 expr = logic.combine(expr, kwargs) 230 231 try: 232 if isinstance(classes, dejavu.UnitJoin): 233 return self._xmultirecall(classes, expr).next() 234 else: 235 return self.xrecall(classes, expr).next() 236 except StopIteration: 237 return None 212 238 213 239 def _paginate(self, data, order=None, limit=None, offset=None): … … 238 264 # Views # 239 265 # 240 # The _combine, view, xview, and multirecall method given below use266 # The _combine, view, xview, and _multirecall method given below use 241 267 # self.recall to retrieve entire Units, and then slice and dice them 242 268 # in memory. This is quite slow; you should *definitely* override … … 327 353 yield [unit.__class__() for unit in row1] + row2 328 354 329 def xmultirecall(self, classes, expr=None, order=None, limit=None, offset=None):355 def _xmultirecall(self, classes, expr=None, order=None, limit=None, offset=None): 330 356 """Yield lists of units of the given classes which match expr.""" 331 357 if expr is None: … … 340 366 if expr(*unitrow): 341 367 yield unitrow 342 return self._paginate(_combine_inner , order, limit, offset)343 344 def multirecall(self, classes, expr=None, order=None, limit=None, offset=None):368 return self._paginate(_combine_inner(), order, limit, offset) 369 370 def _multirecall(self, classes, expr=None, order=None, limit=None, offset=None): 345 371 """Return lists of units which satisfy the expression.""" 346 return [t for t in self. xmultirecall(classes, expr=None, order=None,347 limit=None, offset=None)]372 return [t for t in self._xmultirecall(classes, expr=None, order=None, 373 limit=None, offset=None)] 348 374 349 375 def xview(self, query, distinct=False): … … 494 520 self.nextstore = allOptions.get('Next Store') 495 521 496 def xrecall(self, cls, expr=None, order=None, limit=None, offset=None): 522 def xrecall(self, classes, expr=None, order=None, limit=None, offset=None): 523 if isinstance(classes, dejavu.UnitJoin): 524 for unitrow in self._xmultirecall(classes, expr, order=order, 525 limit=limit, offset=offset): 526 yield unitrow 527 return 528 529 cls = classes 497 530 if self.logflags & logflags.RECALL: 498 531 self.log(logflags.RECALL.message(cls, expr)) 499 for unit in self.nextstore.xrecall(cls, expr, order, limit, offset): 532 for unit in self.nextstore.xrecall(cls, expr, order=order, 533 limit=limit, offset=offset): 500 534 yield unit 501 535 … … 530 564 return self.nextstore.xview(query, distinct) 531 565 532 def xmultirecall(self, classes, expr=None, order=None, limit=None, offset=None):566 def _xmultirecall(self, classes, expr=None, order=None, limit=None, offset=None): 533 567 """Full inner join units from each class.""" 534 568 if self.logflags & logflags.RECALL: 535 569 self.log(logflags.RECALL.message(classes, expr)) 536 return self.nextstore. xmultirecall(classes, expr, order, limit, offset)570 return self.nextstore._xmultirecall(classes, expr, order, limit, offset) 537 571 538 572 def count(self, cls, expr=None): … … 624 658 self.cache = resolve("ram") 625 659 626 def xrecall(self, cl s, expr=None, order=None, limit=None, offset=None):660 def xrecall(self, classes, expr=None, order=None, limit=None, offset=None): 627 661 """Return a Unit iterator.""" 662 if isinstance(classes, dejavu.UnitJoin): 663 return self._xmultirecall(classes, expr, order=order, 664 limit=limit, offset=offset) 665 666 cls = classes 628 667 # Units which have no identifiers are not cached 629 668 if not cls.identifiers: 630 return ProxyStorage.xrecall(self, cls, expr, order, limit, offset) 669 return ProxyStorage.xrecall(self, cls, expr, order=order, 670 limit=limit, offset=offset) 631 671 else: 632 672 if self.logflags & logflags.RECALL: … … 794 834 self.sweeper = IdleSweeper(lifetime) 795 835 796 def xrecall(self, cl s, expr=None, order=None, limit=None, offset=None):836 def xrecall(self, classes, expr=None, order=None, limit=None, offset=None): 797 837 """Return a Unit iterator.""" 838 if isinstance(classes, dejavu.UnitJoin): 839 for unitrow in self._xmultirecall(classes, expr, order=order, 840 limit=limit, offset=offset): 841 yield unitrow 842 return 843 844 cls = classes 798 845 start = datetime.datetime.now() 799 846 recallTimes = self._recallTimes.setdefault(cls, {}) … … 843 890 """ 844 891 845 def xrecall(self, cl s, expr=None, order=None, limit=None, offset=None):892 def xrecall(self, classes, expr=None, order=None, limit=None, offset=None): 846 893 """Return a Unit iterator.""" 894 if isinstance(classes, dejavu.UnitJoin): 895 return self._xmultirecall(classes, expr, order=order, 896 limit=limit, offset=offset) 897 898 cls = classes 847 899 # Units which have no identifiers are not cached 848 900 if not cls.identifiers: 849 return ProxyStorage.xrecall(self, cls, expr, order, limit, offset) 901 return ProxyStorage.xrecall(self, cls, expr, order=order, 902 limit=limit, offset=offset) 850 903 else: 851 904 if self.logflags & logflags.RECALL: trunk/dejavu/storage/db.py
r482 r483 83 83 self.db.connections.shutdown() 84 84 85 def xrecall(self, cl s, expr=None, order=None, limit=None, offset=None):85 def xrecall(self, classes, expr=None, order=None, limit=None, offset=None): 86 86 """Yield a sequence of Unit instances which satisfy the expression.""" 87 if isinstance(classes, dejavu.UnitJoin): 88 for unitrow in self._xmultirecall(classes, expr, order=None, 89 limit=None, offset=None): 90 yield unitrow 91 return 92 else: 93 cls = classes 94 87 95 if self.logflags & logflags.RECALL: 88 96 self.log(logflags.RECALL.message(cls, expr)) … … 293 301 return data.scalar() 294 302 295 def xmultirecall(self, classes, expr=None, order=None, limit=None, offset=None):303 def _xmultirecall(self, classes, expr=None, order=None, limit=None, offset=None): 296 304 """Yield Unit instance sets which satisfy the expression.""" 297 305 if self.logflags & logflags.RECALL: trunk/dejavu/storage/partitions.py
r482 r483 241 241 self.storage(unit.__class__).destroy(unit) 242 242 243 def xrecall(self, cl s, expr=None, order=None, limit=None, offset=None):243 def xrecall(self, classes, expr=None, order=None, limit=None, offset=None): 244 244 """Yield a sequence of Unit instances which satisfy the expression.""" 245 if isinstance(cls, dejavu.UnitJoin): 246 for unitrow in self.multirecall(cls, expr): 245 if isinstance(classes, dejavu.UnitJoin): 246 for unitrow in self._xmultirecall(classes, expr, order=None, 247 limit=None, offset=None): 247 248 yield unitrow 248 249 else: 249 for unit in self.storage(cl s).xrecall(cls, expr, order,250 limit, offset):250 for unit in self.storage(classes).xrecall( 251 cls, expr, order, limit, offset): 251 252 yield unit 252 253 253 def xmultirecall(self, classes, expr=None, order=None, limit=None, offset=None):254 def _xmultirecall(self, classes, expr=None, order=None, limit=None, offset=None): 254 255 """Yield lists of units of the given classes which match expr. 255 256 … … 259 260 expr = logic.Expression(lambda *args: True) 260 261 261 return self._single_store(classes). xmultirecall(classes, expr, order,262 limit, offset)262 return self._single_store(classes)._xmultirecall(classes, expr, order, 263 limit, offset) 263 264 264 265 def _single_store(self, relation): trunk/dejavu/storage/storefs.py
r482 r483 103 103 return unitdict 104 104 105 def xrecall(self, cls, expr=None, order=None, limit=None, offset=None): 105 def xrecall(self, classes, expr=None, order=None, limit=None, offset=None): 106 if isinstance(classes, dejavu.UnitJoin): 107 return self._xmultirecall(classes, expr, order=order, 108 limit=limit, offset=offset) 109 110 cls = classes 106 111 if self.logflags & logflags.RECALL: 107 112 self.log(logflags.RECALL.message(cls, expr)) trunk/dejavu/storage/storeram.py
r482 r483 23 23 return lock 24 24 25 def xrecall(self, cl s, expr=None, order=None, limit=None, offset=None):25 def xrecall(self, classes, expr=None, order=None, limit=None, offset=None): 26 26 """Yield units of the given cls which match the given expr.""" 27 if isinstance(classes, dejavu.UnitJoin): 28 return self._xmultirecall(classes, expr, order=order, 29 limit=limit, offset=offset) 30 31 cls = classes 27 32 if self.logflags & logflags.RECALL: 28 33 self.log(logflags.RECALL.message(cls, expr)) trunk/dejavu/storage/storeshelve.py
r482 r483 59 59 return s 60 60 61 def xrecall(self, cl s, expr=None, order=None, limit=None, offset=None):61 def xrecall(self, classes, expr=None, order=None, limit=None, offset=None): 62 62 """Yield units of the given cls which match the given expr.""" 63 if isinstance(classes, dejavu.UnitJoin): 64 return self._xmultirecall(classes, expr, order=order, 65 limit=limit, offset=offset) 66 67 cls = classes 63 68 if self.logflags & logflags.RECALL: 64 69 self.log(logflags.RECALL.message(cls, expr))
