c++ - 是否可以在Boost.Proto中构建和增量评估/变异表达式树?

标签 c++ expression-trees boost-proto

是否可以提取Boost.Proto表达式树的各个部分,分别(外部)对其进行求值,然后对表达式树进行变异,将提取的部分替换为结果?

在我的特定情况下,我正在尝试评估是否可以重复重写一些旧代码:

  • 生成sql
  • 查询数据库
  • 使用结果生成新的sql查询
  • 再次查询数据库
    ...
    (依此类推)

  • 我希望做的是:
    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:
  • 处理将首先识别find_attributes节点,并知道我们正在搜索
  • 属性
  • 进一步查找,该属性需要链接到object.id = 10,我们立即生成并运行查询以获取所有object.id = 10的属性,并将表达式树中的object_id = 10节点替换为实际的属性ID(object_id = 10)=>(attribute_id =(20 OR 21))。
  • 然后,我们找到attribute_name节点,并且由于属性是嵌套的,因此我们需要找到所有具有name =“name”或“name2”的属性行
  • 作为(可选)优化步骤,因为有数百万个属性,所以我们需要将attribute_id和attribute_name节点合并为一个查询

  • 结果查询可能类似于:
  • (查找属性id)SELECT id from属性WHERE objectid = 10)
  • (最终查询)-


    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/

    相关文章:

    c# - 如何用表达式树表达 All have Any

    c# - 奇怪的异常编译动态构建表达式

    c# - 查找 NewArrayExpression 的大小

    c++ - 切换到更高版本的 Boost 1.6.1 时出现编译错误

    c++ - 在 Boost Phoenix 表达式中转换函数体

    c++ - 带有 vector 的新运算符

    c++ - 增量后左值误差

    c++ - 变量隐藏在 Boost Phoenix 的嵌套 let block 中

    c++ - 平衡二叉搜索树 (BST)

    c++ - 在终端之外获取键盘输入 C++