D561: revset: drop optimization about reordering "or" set elements
quark (Jun Wu)
phabricator at mercurial-scm.org
Tue Aug 29 14:02:49 UTC 2017
quark created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.
REVISION SUMMARY
The reordering optimization is more important for "and" than "or", given the
implementation details about "addset" and "filteredset". We are going to
simplify the tree to remove ordering information. Removing "or" reordering
optimization would make things simpler.
This effectively reverts https://phab.mercurial-scm.org/rHGc63cb2d10d6d5dc823853300f14fa9638bccfb68. It tracks back to the "orset"
function added by the initial commit of revset (https://phab.mercurial-scm.org/rHGc9ce8ecd6ca116c60b5ddda6cdf5a1f1e723c27a).
REPOSITORY
rHG Mercurial
REVISION DETAIL
https://phab.mercurial-scm.org/D561
AFFECTED FILES
mercurial/revsetlang.py
tests/test-revset.t
CHANGE DETAILS
diff --git a/tests/test-revset.t b/tests/test-revset.t
--- a/tests/test-revset.t
+++ b/tests/test-revset.t
@@ -2076,19 +2076,19 @@
define)
(or
(list
- ('symbol', '2')
(range
('symbol', '0')
('symbol', '1')
- follow))
+ follow)
+ ('symbol', '2'))
follow)
define)
* set:
<filteredset
<spanset- 0:3>,
<addset
- <baseset [2]>,
- <spanset+ 0:2>>>
+ <spanset+ 0:2>,
+ <baseset [2]>>>
2
1
0
@@ -2569,69 +2569,6 @@
1
0
- 'A + B' can be rewritten to 'B + A' by weight only when the order doesn't
- matter (e.g. 'X & (A + B)' can be 'X & (B + A)', but '(A + B) & X' can't):
-
- $ try -p optimized '0:2 & (reverse(contains("a")) + 2)'
- * optimized:
- (and
- (range
- ('symbol', '0')
- ('symbol', '2')
- define)
- (or
- (list
- ('symbol', '2')
- (func
- ('symbol', 'reverse')
- (func
- ('symbol', 'contains')
- ('string', 'a')
- define)
- follow))
- follow)
- define)
- * set:
- <filteredset
- <spanset+ 0:3>,
- <addset
- <baseset [2]>,
- <filteredset
- <fullreposet+ 0:10>,
- <contains 'a'>>>>
- 0
- 1
- 2
-
- $ try -p optimized '(reverse(contains("a")) + 2) & 0:2'
- * optimized:
- (and
- (range
- ('symbol', '0')
- ('symbol', '2')
- follow)
- (or
- (list
- (func
- ('symbol', 'reverse')
- (func
- ('symbol', 'contains')
- ('string', 'a')
- define)
- define)
- ('symbol', '2'))
- define)
- define)
- * set:
- <addset
- <filteredset
- <spanset- 0:3>,
- <contains 'a'>>,
- <baseset [2]>>
- 1
- 0
- 2
-
test sort revset
--------------------------------------------
diff --git a/mercurial/revsetlang.py b/mercurial/revsetlang.py
--- a/mercurial/revsetlang.py
+++ b/mercurial/revsetlang.py
@@ -467,9 +467,6 @@
flushss()
if len(ts) == 1:
return ws[0], ts[0] # 'or' operation is fully optimized out
- if order != defineorder:
- # reorder by weight only when f(a + b) == f(b + a)
- ts = [wt[1] for wt in sorted(zip(ws, ts), key=lambda wt: wt[0])]
return max(ws), (op, ('list',) + tuple(ts), order)
elif op == 'not':
# Optimize not public() to _notpublic() because we have a fast version
To: quark, #hg-reviewers
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list