2014-09-26 128 views
0

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

Tree

应该得到翻译在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"); 
    } 

任何人都可以请指导我在何处插入括号? 在此先感谢。

**** ****更新

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

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

任何人都可以请帮忙吗?

回答

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))) 
+0

点上!在考虑情景之后,我做了类似的事情。如果节点是根节点,我还插入了不附加括号的条件。干杯! – user3968762 2014-09-26 12:59:03

+0

你好,你能提供一些用于括号生成字符串的指针吗? – user3968762 2014-09-26 14:17:04