| 442 | | if not self._compiled: |
|---|
| 443 | | import compiler |
|---|
| 444 | | from compiler import ast, misc, pycodegen |
|---|
| 445 | | |
|---|
| 446 | | def _generate(node): |
|---|
| 447 | | if node.type == node.TERM: |
|---|
| 448 | | return ast.Compare(ast.Const(node.value), [('in', ast.Name('text'))]) |
|---|
| 449 | | elif node.type == node.AND: |
|---|
| 450 | | return ast.And([_generate(node.left), _generate(node.right)]) |
|---|
| 451 | | elif node.type == node.OR: |
|---|
| 452 | | return ast.Or([_generate(node.left), _generate(node.right)]) |
|---|
| 453 | | elif node.type == node.NOT: |
|---|
| 454 | | return ast.Not(_generate(node.left)) |
|---|
| 455 | | else: |
|---|
| 456 | | raise NotImplementedError |
|---|
| 457 | | |
|---|
| 458 | | qast = ast.Expression(ast.Lambda(['text'], [], 0, _generate(self))) |
|---|
| 459 | | misc.set_filename('<%s compiled query>' % self.__class__.__name__, |
|---|
| 460 | | qast) |
|---|
| 461 | | gen = pycodegen.ExpressionCodeGenerator(qast) |
|---|
| 462 | | self._compiled = eval(gen.getCode()) |
|---|
| 463 | | return self._compiled(text) |
|---|
| | 443 | import compiler |
|---|
| | 444 | from compiler import ast, misc, pycodegen |
|---|
| | 445 | |
|---|
| | 446 | def _generate(node): |
|---|
| | 447 | if node.type == node.TERM: |
|---|
| | 448 | return ast.Compare(ast.Const(node.value.lower()), |
|---|
| | 449 | [('in', ast.Name('text'))]) |
|---|
| | 450 | elif node.type == node.AND: |
|---|
| | 451 | return ast.And([_generate(node.left), _generate(node.right)]) |
|---|
| | 452 | elif node.type == node.OR: |
|---|
| | 453 | return ast.Or([_generate(node.left), _generate(node.right)]) |
|---|
| | 454 | elif node.type == node.NOT: |
|---|
| | 455 | return ast.Not(_generate(node.left)) |
|---|
| | 456 | else: |
|---|
| | 457 | raise NotImplementedError |
|---|
| | 458 | |
|---|
| | 459 | qast = ast.Expression(ast.Lambda(['text'], [], 0, _generate(self))) |
|---|
| | 460 | misc.set_filename('<%s compiled query>' % self.__class__.__name__, |
|---|
| | 461 | qast) |
|---|
| | 462 | gen = pycodegen.ExpressionCodeGenerator(qast) |
|---|
| | 463 | self.__call__ = eval(gen.getCode()) |
|---|
| | 464 | return self.__call__(text) |
|---|