Make constants read-only
[cql-java-moved-to-github.git] / src / main / java / org / z3950 / zing / cql / CQLParser.java
index 58e0326..dd69218 100644 (file)
@@ -19,9 +19,9 @@ import java.io.FileNotFoundException;
 public class CQLParser {
     private CQLLexer lexer;
     private int compat;        // When false, implement CQL 1.2
-    public static int V1POINT1 = 12368;
-    public static int V1POINT2 = 12369;
-    public static int V1POINT1SORT = 12370;
+    public static final int V1POINT1 = 12368;
+    public static final int V1POINT2 = 12369;
+    public static final int V1POINT1SORT = 12370;
 
     static private boolean DEBUG = false;
     static private boolean LEXDEBUG = false;
@@ -159,7 +159,7 @@ public class CQLParser {
                                            + "got " + lexer.render());
            String type = lexer.sval.toLowerCase();
            match(lexer.ttype);
-           if (!isRelation()) {
+           if (!isSymbolicRelation()) {
                // It's a simple modifier consisting of type only
                ms.addModifier(type);
            } else {
@@ -192,7 +192,12 @@ public class CQLParser {
 
            debug("non-parenthesised term");
            word = matchSymbol("index or term");
-           if (!isRelation() && lexer.ttype != lexer.TT_WORD)
+            while (lexer.ttype == lexer.TT_WORD && !isRelation()) {
+              word = word + " " + lexer.sval;
+              match(lexer.TT_WORD);
+            }
+
+           if (!isRelation())
                break;
 
            index = word;
@@ -231,10 +236,26 @@ public class CQLParser {
        return new CQLPrefixNode(name, identifier, node);
     }
 
-    // Checks for a relation
     private boolean isRelation() {
        debug("isRelation: checking ttype=" + lexer.ttype +
              " (" + lexer.render() + ")");
+        if (lexer.ttype == lexer.TT_WORD &&
+            (lexer.sval.indexOf('.') >= 0 ||
+             lexer.sval.equals("any") ||
+             lexer.sval.equals("all") ||
+             lexer.sval.equals("within") ||
+             lexer.sval.equals("encloses") ||
+             lexer.sval.equals("exact") ||
+             (lexer.sval.equals("scr") && compat != V1POINT2) ||
+             (lexer.sval.equals("adj") && compat == V1POINT2)))
+          return true;
+
+        return isSymbolicRelation();
+    }
+
+    private boolean isSymbolicRelation() {
+       debug("isSymbolicRelation: checking ttype=" + lexer.ttype +
+             " (" + lexer.render() + ")");
        return (lexer.ttype == '<' ||
                lexer.ttype == '>' ||
                lexer.ttype == '=' ||