revset: do not flip "and" arguments when optimizing

Rewrite `flipand(y, x)` to `andsmally(x, y)` so the AST order is unchanged,
which could be more friendly to developers.

Differential Revision: https://phab.mercurial-scm.org/D579
This commit is contained in:
Jun Wu 2017-08-30 16:05:12 -07:00
parent 507a4c9e22
commit 4cd80fdd9c
3 changed files with 30 additions and 30 deletions

View File

@ -169,8 +169,8 @@ def andset(repo, subset, x, y, order):
yorder = followorder
return getset(repo, getset(repo, subset, x, order), y, yorder)
def flipandset(repo, subset, y, x, order):
# 'flipand(y, x)' is equivalent to 'and(x, y)', but faster when y is small
def andsmallyset(repo, subset, x, y, order):
# 'andsmally(x, y)' is equivalent to 'and(x, y)', but faster when y is small
if order == anyorder:
yorder = anyorder
else:
@ -2101,7 +2101,7 @@ methods = {
"string": stringset,
"symbol": stringset,
"and": andset,
"flipand": flipandset,
"andsmally": andsmallyset,
"or": orset,
"not": notset,
"difference": differenceset,

View File

@ -374,7 +374,7 @@ def _optimize(x, small):
if tb is not None and tb[0] == 'not':
return wa, ('difference', ta, tb[1])
if wa > wb:
return w, ('flipand', tb, ta)
op = 'andsmally'
return w, (op, ta, tb)
elif op == 'or':
# fast path for machine-generated expression, that is likely to have

View File

@ -714,11 +714,11 @@ verify optimized tree:
None)
('symbol', '2'))
* optimized:
(flipand
('symbol', '2')
(andsmally
(func
('symbol', 'r3232')
None))
None)
('symbol', '2'))
* analyzed set:
<baseset [2]>
* optimized set:
@ -2056,13 +2056,13 @@ ordering defined by it.
('symbol', '_intlist')
('string', '0\x001\x002')))
* optimized:
(flipand
(func
('symbol', '_intlist')
('string', '0\x001\x002'))
(andsmally
(range
('symbol', '2')
('symbol', '0')))
('symbol', '0'))
(func
('symbol', '_intlist')
('string', '0\x001\x002')))
* set:
<filteredset
<spanset- 0:3>,
@ -2130,13 +2130,13 @@ ordering defined by it.
('symbol', '2')
('symbol', '0')))
* optimized:
(flipand
(range
('symbol', '2')
('symbol', '0'))
(andsmally
(func
('symbol', '_hexlist')
('string', '*'))) (glob)
('string', '*')) (glob)
(range
('symbol', '2')
('symbol', '0')))
* set:
<baseset [0, 2, 1]>
0
@ -2415,13 +2415,13 @@ ordering defined by it.
('symbol', '0')
('symbol', '1')))))
* optimized:
(flipand
(func
('symbol', '_list')
('string', '2\x000\x001'))
(andsmally
(func
('symbol', 'contains')
('string', 'glob:*')))
('string', 'glob:*'))
(func
('symbol', '_list')
('string', '2\x000\x001')))
* set:
<filteredset
<baseset+ [0, 1, 2]>,
@ -2447,15 +2447,15 @@ ordering defined by it.
('symbol', '2')
('symbol', '1')))))
* optimized:
(flipand
(func
('symbol', '_list')
('string', '0\x002\x001'))
(andsmally
(func
('symbol', 'reverse')
(func
('symbol', 'contains')
('string', 'glob:*'))))
('string', 'glob:*')))
(func
('symbol', '_list')
('string', '0\x002\x001')))
* set:
<filteredset
<baseset- [0, 1, 2]>,
@ -3154,11 +3154,11 @@ no crash by empty group "()" while optimizing to "only()"
(group
None))
* optimized:
(flipand
None
(andsmally
(func
('symbol', 'ancestors')
('symbol', '1')))
('symbol', '1'))
None)
hg: parse error: missing argument
[255]