0

我正在开发一个 API,在该 API 中,我根据请求中收到的条件树生成查询。以下是树格式:

树

它应该像这样在 SQL 查询中被翻译:

WHERE (a>b OR c<d) AND (e>f OR g<h)

或者,像这样

WHERE ((a>b) OR (c<d)) AND ((e>f) OR (g<h))

使用预购遍历,我能够生成查询。但是,我无法附加括号。以下是我的 inOrder 遍历代码:

public void inorder(Filter n, StringBuilder builder) {
        if (n != null) {
            inorder(n.getLeft(), builder);
            print(n, builder);
            inorder(n.getRight(), builder);
        }
    }

private void print(Filter node, StringBuilder builder) {
        if (null == node.getField() || null == node.getValue()) {
            builder.append(node.getLogicOperator());
        } else {
            builder.append((node.getField() + " " + node.getComparisonOperator() + " " + node
                    .getValue()));
        }
        builder.append("\n");
    }

谁能指导我在哪里插入括号?提前致谢。

****更新****

现在,我想从相同的结构生成 mongo 查询。我能够生成字符串但无法附加括号:我想要这样的东西:

$and : [
        { $or : [ { a: b}, { c: d } ] },
        { $or : [ { e: f}, { g: { $lt : h} } ] }
    ]

有人可以帮忙吗?

4

1 回答 1

0

如果按顺序遍历树,输出将是:

inorder_traversal(n) = "(" + inorder_traversal(leftchild(n)) + n + 
                       inorder_traversal(rithtchild(n)) + ")"

它包括一些不必要的括号,但应该没什么大不了的。

对于您的示例,它类似于:

( traversal(leftOR) AND traversal(rightOR) )
( ( traversal(a>b) OR traversal(c<d) ) AND ( traversal(e>f) OR traversal(g<h) )
( ( ( a>b ) OR ( c<d ) ) AND ( ( e> f) OR ( g<h ) ) )
于 2014-09-26T12:09:00.753 回答