是否可以提取Boost.Proto表达式树的各个部分,分别(外部)对其进行求值,然后对表达式树进行变异,将提取的部分替换为结果?
在我的特定情况下,我正在尝试评估是否可以重复重写一些旧代码:
...
(依此类推)
我希望做的是:
1.生成单个大型表达式树
2.从表达式树中获取SQL。这包括:
b。访问树并检查在生成结果单SQL之前必须评估的子查询
C。如果存在子查询,请创建sql并以字符串形式返回,从外部评估sql,并对树进行变异,将子查询替换为结果
(此外,我想识别相同的子查询,并尽可能评估一次)
这可能吗?是否需要难以理解/学习的代码?
我已经浏览了Boost.Proto文档,但是我不确定它是否适用于这种情况,在这种情况下,我需要从外部评估子树,并将其替换为结果,直到将整个树简化为单个查询为止。
编辑:
可以说我有下表:
对象
id |名称
attribute_link
objectid |属性ID
属性
id | parent |名称|值
我的查询以自定义“查询”对象的形式进入-具有多个AND,OR子句的(二进制)树。
例:
query1 = object.id = 10 OR(attribute.name =“名称”或attribute.name =“name2”)
转换为:获取对象10的属性,其中属性的名称为“name”。请注意parentid字段,这意味着我们要查找的attribute.name可以嵌套,而不是直接链接到我们的对象。
我需要做的是:
1.将其翻译成带有足够信息的表达式树
2.将此树发送到db层
3.如上所述处理树(有时分多个阶段)
表达式树可能看起来像:
find_attributes(object_id = 10 AND attribute_name =(“name”或“name2”))
有多个SQL语法不同的数据库,这就是为什么我要这样做。因此,我需要能够覆盖基于数据库的某些处理步骤。
例如PostgreSQL:
结果查询可能类似于:
与
get_roots AS(SELECT * FROM属性(id = 20或id = 21)),
get_childs AS(SELECT * FROM get_roots,属性WHERE attributes.parentid = get_roots.id),
get_grandchilds AS(选择*从get_childs,属性WHERE attribute.parentid = get_childs.id)
选择*从get_roots
联盟
SELECT * FROM get_childs
联盟
选择*从get_grandchilds
(假设此处的属性只有三个层次,可以将其重写为递归CTE)
我想这可能是可行的,但是会做太多的工作吗?查询数量有限,这里提出的查询是最复杂的。
最佳答案
原始树结构是在编译时设置的,因此是不可变的。通常,您要做的就是用所需的元素重新生成一棵新树。可以简单地将其转换为树形树并返回一棵新树。
关于c++ - 是否可以在Boost.Proto中构建和增量评估/变异表达式树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18034557/