Mercurial > public > mercurial-scm > hg
comparison mercurial/revset.py @ 22859:513c0ba61db8
addset: do lazy sorting
The previous implementation was consuming the whole revset when asked for any
sort. The addset class is now doing lazy sorting like all other smarset classes.
This has no significant impact in the benchmark as-is. But this is important
to later change.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Thu, 09 Oct 2014 20:15:41 -0700 |
parents | 88e8a18329d3 |
children | 1dd178277cf5 |
comparison
equal
deleted
inserted
replaced
22858:d7cedb32a8ab | 22859:513c0ba61db8 |
---|---|
2519 self._r1 = revs1 | 2519 self._r1 = revs1 |
2520 self._r2 = revs2 | 2520 self._r2 = revs2 |
2521 self._iter = None | 2521 self._iter = None |
2522 self._ascending = ascending | 2522 self._ascending = ascending |
2523 self._genlist = None | 2523 self._genlist = None |
2524 self._asclist = None | |
2524 | 2525 |
2525 def __len__(self): | 2526 def __len__(self): |
2526 return len(self._list) | 2527 return len(self._list) |
2527 | 2528 |
2528 def __nonzero__(self): | 2529 def __nonzero__(self): |
2558 iter2 = iter(self._r2) | 2559 iter2 = iter(self._r2) |
2559 gen = self._iterordered(self._ascending, iter1, iter2) | 2560 gen = self._iterordered(self._ascending, iter1, iter2) |
2560 return gen | 2561 return gen |
2561 | 2562 |
2562 def __iter__(self): | 2563 def __iter__(self): |
2563 if self._genlist: | 2564 if self._ascending is None: |
2564 return iter(self._genlist) | 2565 if self._genlist: |
2565 return iter(self._iterator()) | 2566 return iter(self._genlist) |
2567 return iter(self._iterator()) | |
2568 self._trysetasclist() | |
2569 if self._ascending: | |
2570 it = self.fastasc | |
2571 else: | |
2572 it = self.fastdesc | |
2573 if it is None: | |
2574 # consume the gen and try again | |
2575 self._list | |
2576 return iter(self) | |
2577 return it() | |
2578 | |
2579 def _trysetasclist(self): | |
2580 """populate the _asclist attribut if possible and necessary""" | |
2581 if self._genlist is not None and self._asclist is None: | |
2582 self._asclist = sorted(self._genlist) | |
2566 | 2583 |
2567 @property | 2584 @property |
2568 def fastasc(self): | 2585 def fastasc(self): |
2586 self._trysetasclist() | |
2587 if self._asclist is not None: | |
2588 return self._asclist.__iter__ | |
2569 iter1 = self._r1.fastasc | 2589 iter1 = self._r1.fastasc |
2570 iter2 = self._r2.fastasc | 2590 iter2 = self._r2.fastasc |
2571 if None in (iter1, iter2): | 2591 if None in (iter1, iter2): |
2572 return None | 2592 return None |
2573 return lambda: self._iterordered(True, iter1(), iter2()) | 2593 return lambda: self._iterordered(True, iter1(), iter2()) |
2574 | 2594 |
2575 @property | 2595 @property |
2576 def fastdesc(self): | 2596 def fastdesc(self): |
2597 self._trysetasclist() | |
2598 if self._asclist is not None: | |
2599 return self._asclist.__reversed__ | |
2577 iter1 = self._r1.fastdesc | 2600 iter1 = self._r1.fastdesc |
2578 iter2 = self._r2.fastdesc | 2601 iter2 = self._r2.fastdesc |
2579 if None in (iter1, iter2): | 2602 if None in (iter1, iter2): |
2580 return None | 2603 return None |
2581 return lambda: self._iterordered(False, iter1(), iter2()) | 2604 return lambda: self._iterordered(False, iter1(), iter2()) |
2631 """Sort the added set | 2654 """Sort the added set |
2632 | 2655 |
2633 For this we use the cached list with all the generated values and if we | 2656 For this we use the cached list with all the generated values and if we |
2634 know they are ascending or descending we can sort them in a smart way. | 2657 know they are ascending or descending we can sort them in a smart way. |
2635 """ | 2658 """ |
2636 if self._ascending is None: | 2659 self._ascending = not reverse |
2637 self._list.sort(reverse=reverse) | |
2638 self._ascending = not reverse | |
2639 else: | |
2640 if bool(self._ascending) == bool(reverse): | |
2641 self.reverse() | |
2642 | 2660 |
2643 def isascending(self): | 2661 def isascending(self): |
2644 return self._ascending is not None and self._ascending | 2662 return self._ascending is not None and self._ascending |
2645 | 2663 |
2646 def isdescending(self): | 2664 def isdescending(self): |
2647 return self._ascending is not None and not self._ascending | 2665 return self._ascending is not None and not self._ascending |
2648 | 2666 |
2649 def reverse(self): | 2667 def reverse(self): |
2650 self._list.reverse() | 2668 if self._ascending is None: |
2651 if self._ascending is not None: | 2669 self._list.reverse() |
2670 else: | |
2652 self._ascending = not self._ascending | 2671 self._ascending = not self._ascending |
2653 | 2672 |
2654 def first(self): | 2673 def first(self): |
2655 if self: | 2674 if self: |
2656 return self._list.first() | 2675 return self._list.first() |