Add classes for visitor traversal
[cql-java-moved-to-github.git] / src / main / java / org / z3950 / zing / cql / CQLSortNode.java
1
2 package org.z3950.zing.cql;
3 import java.util.ArrayList;
4 import java.util.List;
5 import java.util.Properties;
6
7
8 /**
9  * Represents a sort node in a CQL parse-tree.
10  *
11  */
12 public class CQLSortNode extends CQLNode {
13     /**
14      * The root of a subtree representing the query whose result is to
15      * be sorted.
16      */ 
17     private CQLNode subtree;
18
19     /**
20      * The set of sort keys by which results are to be sorted,
21      * each expressed as an index together with zero or more
22      * modifiers.
23      */ 
24     List<ModifierSet> keys;
25
26     public CQLNode getSubtree() {
27         return subtree;
28     }
29
30     public CQLSortNode(CQLNode subtree) {
31         this.subtree = subtree;
32         keys = new ArrayList<ModifierSet>();
33     }
34
35     public void addSortIndex(ModifierSet key) {
36         keys.add(key);
37     }
38
39     public List<ModifierSet> getSortIndexes() {
40         return keys;
41     }
42
43     @Override
44     public void traverse(CQLNodeVisitor visitor) {
45       visitor.onSortNode(this);
46       subtree.traverse(visitor);
47     }
48
49     @Override
50     void toXCQLInternal(XCQLBuilder b, int level, List<CQLPrefix> prefixes,
51                          List<ModifierSet> sortkeys) {
52         if (sortkeys != null)
53             throw new Error("CQLSortNode.toXCQL() called with sortkeys");
54         subtree.toXCQLInternal(b, level, prefixes, keys);
55     }
56
57     @Override
58     public String toCQL() {
59         StringBuilder buf = new StringBuilder(subtree.toCQL());
60
61         if (keys != null) {
62             buf.append(" sortby");
63             for (int i = 0; i < keys.size(); i++) {
64                 ModifierSet key = keys.get(i);
65                 buf.append(" ").append(key.toCQL());
66             }
67         }
68
69         return buf.toString();
70     }
71
72     @Override
73     public String toPQF(Properties config) throws PQFTranslationException {
74         return "@attr 1=oops \"###\"";
75     }
76
77     @Override
78     public byte[] toType1BER(Properties config)
79         throws PQFTranslationException {
80         // There is no way to represent sorting in a standard Z39.50
81         // Type-1 query, so the best we can do is return the
82         // underlying query and ignore the sort-specification.
83         return subtree.toType1BER(config);
84     }
85 }