You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
AQuery/engine/expr.py

58 lines
1.8 KiB

from engine.ast import ast_node
class expr(ast_node):
name='expr'
builtin_func_maps = {
3 years ago
'max': 'max',
'min': 'min',
'avg':'avg',
'sum':'sum',
3 years ago
}
binary_ops = {
'sub':'-',
'add':'+',
'mul':'*',
'div':'%',
}
unary_ops = {
'neg' : '-',
}
def __init__(self, parent, node):
from engine.projection import projection
if type(parent) in [projection, expr]:
self.datasource = parent.datasource
else:
self.datasource = None
self.udf_map = parent.context.udf_map
self.k9expr = ''
self.func_maps = {**self.udf_map, **self.builtin_func_maps}
ast_node.__init__(self, parent, node, None)
def produce(self, node):
if type(node) is dict:
for key, val in node.items():
if key in self.func_maps:
self.k9expr += f"{self.func_maps[key]}("
# if type(val) in [dict, str]:
self.k9expr += expr(self, val).k9expr
3 years ago
self.k9expr += ')'
elif key in self.binary_ops:
l = expr(self, val[0]).k9expr
r = expr(self, val[1]).k9expr
self.k9expr += f'({l}{self.binary_ops[key]}{r})'
elif key in self.unary_ops:
3 years ago
self.k9expr += f'({expr(self, val).k9expr}{self.unary_ops[key]})'
else:
3 years ago
print(f'Undefined expr: {key}{val}')
elif type(node) is str:
self.k9expr = self.datasource.parse_tablenames(node)
3 years ago
else:
self.k9expr = f'{node}'
def __str__(self):
return self.k9expr