comparison mercurial/filesetlang.py @ 38869:7e7e2b2ff284

fileset: add stub for weight-based optimization The main purpose of this change is to group basic patterns, which can be mapped to a plain matcher. I'm not so interested in a weight of each function.
author Yuya Nishihara <yuya@tcha.org>
date Sat, 21 Jul 2018 15:52:26 +0900
parents 3ea6ce609747
children b975c5801487
comparison
equal deleted inserted replaced
38868:3ea6ce609747 38869:7e7e2b2ff284
162 return (op, x[1], ta) 162 return (op, x[1], ta)
163 raise error.ProgrammingError('invalid operator %r' % op) 163 raise error.ProgrammingError('invalid operator %r' % op)
164 164
165 def analyze(x): 165 def analyze(x):
166 """Transform raw parsed tree to evaluatable tree which can be fed to 166 """Transform raw parsed tree to evaluatable tree which can be fed to
167 getmatch() 167 optimize() or getmatch()
168 168
169 All pseudo operations should be mapped to real operations or functions 169 All pseudo operations should be mapped to real operations or functions
170 defined in methods or symbols table respectively. 170 defined in methods or symbols table respectively.
171 """ 171 """
172 return _analyze(x) 172 return _analyze(x)
173 173
174 def _optimize(x):
175 if x is None:
176 return 0, x
177
178 op = x[0]
179 if op in {'string', 'symbol'}:
180 return 0.5, x
181 if op == 'kindpat':
182 w, t = _optimize(x[2])
183 return w, (op, x[1], t)
184 if op == 'not':
185 w, t = _optimize(x[1])
186 return w, (op, t)
187 if op in {'and', 'minus'}:
188 wa, ta = _optimize(x[1])
189 wb, tb = _optimize(x[2])
190 return max(wa, wb), (op, ta, tb)
191 if op == 'or':
192 ws, ts = zip(*(_optimize(y) for y in x[1:]))
193 return max(ws), (op,) + ts
194 if op == 'list':
195 ws, ts = zip(*(_optimize(y) for y in x[1:]))
196 return sum(ws), (op,) + ts
197 if op == 'func':
198 f = getsymbol(x[1])
199 w = getattr(symbols.get(f), '_weight', 1)
200 wa, ta = _optimize(x[2])
201 return w + wa, (op, x[1], ta)
202 raise error.ProgrammingError('invalid operator %r' % op)
203
204 def optimize(x):
205 """Reorder/rewrite evaluatable tree for optimization
206
207 All pseudo operations should be transformed beforehand.
208 """
209 _w, t = _optimize(x)
210 return t
211
174 def prettyformat(tree): 212 def prettyformat(tree):
175 return parser.prettyformat(tree, ('string', 'symbol')) 213 return parser.prettyformat(tree, ('string', 'symbol'))