update documentation
[cql-java-moved-to-github.git] / src / org / z3950 / zing / cql / CQLTermNode.java
index 5889354..0f9d3a9 100644 (file)
@@ -1,4 +1,4 @@
-// $Id: CQLTermNode.java,v 1.7 2002-11-06 00:05:58 mike Exp $
+// $Id: CQLTermNode.java,v 1.10 2002-11-20 15:38:27 mike Exp $
 
 package org.z3950.zing.cql;
 import java.util.Properties;
@@ -12,7 +12,7 @@ import java.util.Vector;
  * these must be provided - you can't have a qualifier without a
  * relation or vice versa.
  *
- * @version    $Id: CQLTermNode.java,v 1.7 2002-11-06 00:05:58 mike Exp $
+ * @version    $Id: CQLTermNode.java,v 1.10 2002-11-20 15:38:27 mike Exp $
  */
 public class CQLTermNode extends CQLNode {
     private String qualifier;
@@ -34,10 +34,11 @@ public class CQLTermNode extends CQLNode {
     public CQLRelation getRelation() { return relation; }
     public String getTerm() { return term; }
 
-    public String toXCQL(int level) {
+    public String toXCQL(int level, Vector prefixes) {
        return (indent(level) + "<searchClause>\n" +
+               renderPrefixes(level+1, prefixes) +
                indent(level+1) + "<index>" + xq(qualifier) + "</index>\n" +
-               relation.toXCQL(level+1) +
+               relation.toXCQL(level+1, new Vector()) +
                indent(level+1) + "<term>" + xq(term) + "</term>\n" +
                indent(level) + "</searchClause>\n");
     }
@@ -55,41 +56,66 @@ public class CQLTermNode extends CQLNode {
        return res;
     }
 
-    public String toPQF(Properties config)
-       throws UnknownQualifierException, UnknownRelationException {
+    public String toPQF(Properties config) throws PQFTranslationException {
        Vector attrs = new Vector();
 
-       if (qualifier != null) {
-           String s = config.getProperty(qualifier);
-           if (s == null)
-               throw new UnknownQualifierException(qualifier);
-           attrs.add(s);
-       } else {
-           // ### get a default access point from properties?
+       String attr;
+       attr = config.getProperty("qualifier." + qualifier);
+       if (attr == null)
+           throw new UnknownQualifierException(qualifier);
+       attrs.add(attr);
+
+       String rel = relation.getBase();
+       if (rel.equals("=")) {
+           rel = "eq";
+       } else if (rel.equals("<=")) {
+           rel = "le";
+       } else if (rel.equals(">=")) {
+           rel = "ge";
+       }
+       // ### Handling "any" and "all" properly would involve breaking
+       // the string down into a bunch of individual words and ORring
+       // or ANDing them together.  Another day.
+       attr = config.getProperty("relation." + rel);
+       if (attr == null)
+           throw new UnknownRelationException(rel);
+       attrs.add(attr);
+
+       String[] mods = relation.getModifiers();
+       for (int i = 0; i < mods.length; i++) {
+           attr = config.getProperty("relationModifier." + mods[i]);
+           if (attr == null)
+               throw new UnknownRelationModifierException(mods[i]);
+           attrs.add(attr);
        }
 
-       if (relation != null) {
-           String rel = relation.getBase();
-           // ### handle "any" and "all"
-           String s = config.getProperty("cql-java.relation." + rel);
-           if (s == null)
-               throw new UnknownRelationException(rel);
-           attrs.add(s);
-       } else {
-           // ### get a default relation from properties?
+       String pos = "unanchored";
+       String text = term;
+       if (text.length() > 0 && text.substring(0, 1).equals("^")) {
+           text = text.substring(1);
+           pos = "anchored";
        }
+       attr = config.getProperty("position." + pos);
+       if (attr == null)
+           throw new UnknownPositionException(pos);
+       attrs.add(attr);
+
+       attr = config.getProperty("structure." + rel);
+       if (attr == null)
+           attr = config.getProperty("structure.*");
+       attrs.add(attr);
 
-       // ### handle position attributes
-       // ### handle structure attributes
-       // ### handle "always" attributes
+       attr = config.getProperty("always");
+       if (attr != null)
+           attrs.add(attr);
 
-       // ### should split Vector elements on spaces
        String s = "";
        for (int i = 0; i < attrs.size(); i++) {
-           s += "@attr " + (String) attrs.get(i) + " ";
+           attr = (String) attrs.get(i);
+           s += "@attr " + Utils.replaceString(attr, " ", " @attr ") + " ";
        }
 
-       return s + maybeQuote(term);
+       return s + maybeQuote(text);
     }
 
     static String maybeQuote(String str) {