D562: revset: drop optimization about reordering "or" set elements
quark (Jun Wu)
phabricator at mercurial-scm.org
Tue Aug 29 14:11:35 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" - reordering "or"
may help "__contains__" test but not iteration, reordering "and" could help
both. 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).
In the future, we might consider optimization at runtime (ex. do reordering
and rewrites inside "orset").
REPOSITORY
rHG Mercurial
REVISION DETAIL
https://phab.mercurial-scm.org/D562
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