AlaSQL:获得opperands的地方

时间:2016-01-19 10:32:15

标签: alasql

我有一个特定的要求,我很确定这不是微不足道的,而是想要以防万一。如果我有SELECT * FROM table1 WHERE a = b AND a->fn(b->c) > 0 条件的任何查询:

WHERE

我想知道参与['a', 'b', 'a->fn(b->c)', 0]的所有操作数,在本例中为{{1}}。

原因是我想跟踪这些值,如果有任何更改,那么我只是重新评估查询。

1 个答案:

答案 0 :(得分:3)

您可以使用alasql.parse()函数从SQL语句生成抽象语法树。要从WHERE语句的SELECT子句打印部分树,请使用:

var ast = alasql.parse('SELECT * FROM table1 WHERE a = b AND a->fn(b->c) > 0');
console.log(ast.statements[0].where);

然后你会看到树的结构。

{"expression":
   {"left":
       {"left": {"columnid":"a"},"op":"=", "right":{"columnid":"b"}},
     "op":"AND",
     "right":{"left":
                  {"left":{"columnid":"a"},
                   "op":"->",
                   "right":
                        {"funcid":"fn","args":[
                          {"left":{"columnid":"b"},
                           "op":"->",
                           "right":"c"}
                         ]}},
              "op":">",
              "right":{"value":0}}}}

您可以沿着这棵树走路来收集所有参数。每个节点都是yy.xxx类型的对象,因此您可以对其进行测试:

if(node instanceof yy.Column) // then process as the column

这是你问题的答案吗?