Add classes for visitor traversal
[cql-java-moved-to-github.git] / src / main / java / org / z3950 / zing / cql / CQLTermNode.java
index cdb62f7..2ad9188 100644 (file)
@@ -1,13 +1,9 @@
-// $Id: CQLTermNode.java,v 1.28 2007-07-03 13:41:24 mike Exp $
 
 package org.z3950.zing.cql;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Properties;
 
-import static org.z3950.zing.cql.Utils.*;
-
-
 /**
  * Represents a terminal node in a CQL parse-tree.
  * A term node consists of the term String itself, together with,
@@ -15,7 +11,6 @@ import static org.z3950.zing.cql.Utils.*;
  * these must be provided - you can't have an index without a
  * relation or vice versa.
  *
- * @version    $Id: CQLTermNode.java,v 1.28 2007-07-03 13:41:24 mike Exp $
  */
 public class CQLTermNode extends CQLNode {
     private String index;
@@ -47,6 +42,13 @@ public class CQLTermNode extends CQLNode {
     }
 
     @Override
+    public void traverse(CQLNodeVisitor visitor) {
+      //we visit relation first to allow filtering on relation type in the visitor
+      relation.traverse(visitor);
+      visitor.onTermNode(this);
+    }
+        
+    @Override
     public String getResultSetName() {
        if (isResultSetIndex(index))
            return term;
@@ -55,15 +57,15 @@ public class CQLTermNode extends CQLNode {
     }
 
     @Override
-    public String toXCQL(int level, List<CQLPrefix> prefixes,
+    void toXCQLInternal(XCQLBuilder b, int level, List<CQLPrefix> prefixes,
                         List<ModifierSet> sortkeys) {
-       return (indent(level) + "<searchClause>\n" +
-               renderPrefixes(level+1, prefixes) +
-               indent(level+1) + "<index>" + xq(index) + "</index>\n" +
-               relation.toXCQL(level+1) +
-               indent(level+1) + "<term>" + xq(term) + "</term>\n" +
-               renderSortKeys(level+1, sortkeys) +
-               indent(level) + "</searchClause>\n");
+      b.indent(level).append("<searchClause>\n");
+      renderPrefixes(b, level + 1, prefixes);
+      b.indent(level + 1).append("<index>").xq(index).append("</index>\n");
+      relation.toXCQLInternal(b, level + 1);
+      b.indent(level + 1).append("<term>").xq(term).append("</term>\n");
+      renderSortKeys(b, level + 1, sortkeys);
+      b.indent(level).append("</searchClause>\n");
     }
 
     @Override