Comments
Patch
@@ -184,7 +184,14 @@ def _optimize(x):
if op == 'not':
w, t = _optimize(x[1])
return w, (op, t)
- if op in {'and', 'minus'}:
+ if op == 'and':
+ wa, ta = _optimize(x[1])
+ wb, tb = _optimize(x[2])
+ if wa <= wb:
+ return wa, (op, ta, tb)
+ else:
+ return wb, (op, tb, ta)
+ if op == 'minus':
wa, ta = _optimize(x[1])
wb, tb = _optimize(x[2])
return max(wa, wb), (op, ta, tb)
@@ -186,18 +186,18 @@ Show parsed tree at stages:
(symbol 'a2')
(and
(func
- (symbol 'grep')
- (string 'b'))
+ (symbol 'clean')
+ None)
(func
- (symbol 'clean')
- None)))
+ (symbol 'grep')
+ (string 'b'))))
* matcher:
<unionmatcher matchers=[
<patternmatcher patterns='(?:a1$)'>,
<patternmatcher patterns='(?:a2$)'>,
<intersectionmatcher
- m1=<predicatenmatcher pred=grep('b')>,
- m2=<predicatenmatcher pred=clean>>]>
+ m1=<predicatenmatcher pred=clean>,
+ m2=<predicatenmatcher pred=grep('b')>>]>
a1
a2
b1
@@ -283,6 +283,19 @@ Test files properties
$ fileset 'binary()'
bin
+ $ fileset -p optimized -s 'binary() and b*'
+ * optimized:
+ (and
+ (symbol 'b*')
+ (func
+ (symbol 'binary')
+ None))
+ * matcher:
+ <intersectionmatcher
+ m1=<patternmatcher patterns='(?:b[^/]*$)'>,
+ m2=<predicatenmatcher pred=binary>>
+ bin
+
$ fileset 'grep("b{1}")'
.hgignore
b1