Add EXISTS/NOT EXISTS.

- Fixed the precedence order of NOT.

Change-Id: I7ec20753659e2de2fd65e5f858e0f73796b907d0
Reviewed-on: https://asterix-gerrit.ics.uci.edu/1001
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Till Westmann <tillw@apache.org>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
diff --git a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AQLToSQLPPPrintVisitor.java b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AQLToSQLPPPrintVisitor.java
index ba837b5..2af2816 100644
--- a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AQLToSQLPPPrintVisitor.java
+++ b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AQLToSQLPPPrintVisitor.java
@@ -119,8 +119,8 @@
 
         String generated = generateVariableSymbol();
         if (unnestClauseList.size() > 0) {
-            Map<VariableExpr, Expression> varExprMap = extractDefinedCollectionVariables(clauseList, cuttingGbyClause,
-                    generated);
+            Map<VariableExpr, Expression> varExprMap =
+                    extractDefinedCollectionVariables(clauseList, cuttingGbyClause, generated);
 
             returnExpr = (Expression) AQLVariableSubstitutionUtil.substituteVariable(returnExpr, varExprMap);
             List<Clause> newUnnestClauses = new ArrayList<Clause>();
@@ -560,7 +560,7 @@
     }
 
     // Merge consecutive "where" clauses.
-    private void mergeConsecutiveWhereClauses(List<Clause> clauses) {
+    private void mergeConsecutiveWhereClauses(List<Clause> clauses) throws AsterixException {
         List<Clause> results = new ArrayList<Clause>();
         int size = clauses.size();
         for (int index = 0; index < size;) {
diff --git a/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj b/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj
index fcb6eb4..586464c 100644
--- a/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj
+++ b/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj
@@ -83,7 +83,6 @@
 import org.apache.asterix.lang.common.expression.UnaryExpr;
 import org.apache.asterix.lang.common.expression.UnorderedListTypeDefinition;
 import org.apache.asterix.lang.common.expression.VariableExpr;
-import org.apache.asterix.lang.common.expression.UnaryExpr.Sign;
 import org.apache.asterix.lang.common.literal.DoubleLiteral;
 import org.apache.asterix.lang.common.literal.FalseLiteral;
 import org.apache.asterix.lang.common.literal.FloatLiteral;
@@ -1582,7 +1581,11 @@
           op.addOperand(operand);
         op.setCurrentop(true);
         }
-      op.addOperator(token.image);
+        try{
+          op.addOperator(token.image);
+        } catch (AsterixException e){
+          throw new ParseException(e.getMessage());
+        }
     }
 
     operand = AndExpr()
@@ -1613,7 +1616,11 @@
           op.addOperand(operand);
         op.setCurrentop(true);
         }
-      op.addOperator(token.image);
+        try{
+          op.addOperator(token.image);
+        } catch (AsterixException e){
+          throw new ParseException(e.getMessage());
+        }
     }
 
     operand = RelExpr()
@@ -1665,7 +1672,11 @@
           op.setCurrentop(true);
           broadcast = false;
           }
-        op.addOperator(token.image);
+         try{
+           op.addOperator(token.image);
+         } catch (AsterixException e){
+           throw new ParseException(e.getMessage());
+         }
       }
 
        operand = AddExpr()
@@ -1704,7 +1715,11 @@
         op.addOperand(operand);
         op.setCurrentop(true);
         }
-      ((OperatorExpr)op).addOperator(token.image);
+        try{
+          ((OperatorExpr)op).addOperator(token.image);
+        } catch (AsterixException e){
+          throw new ParseException(e.getMessage());
+        }
     }
 
     operand = MultExpr()
@@ -1733,7 +1748,11 @@
         op.addOperand(operand);
         op.setCurrentop(true);
         }
-      op.addOperator(token.image);
+        try{
+          op.addOperator(token.image);
+        } catch (AsterixException e){
+          throw new ParseException(e.getMessage());
+        }
     }
     operand = UnionExpr()
     {
@@ -1769,19 +1788,18 @@
 
 Expression UnaryExpr() throws ParseException:
 {
-    Expression uexpr = null;
+    UnaryExpr uexpr = null;
     Expression expr = null;
 }
 {
     ( (<PLUS> | <MINUS>)
     {
           uexpr = new UnaryExpr();
-        if("+".equals(token.image))
-            ((UnaryExpr)uexpr).setSign(Sign.POSITIVE);
-        else if("-".equals(token.image))
-            ((UnaryExpr)uexpr).setSign(Sign.NEGATIVE);
-        else
-            throw new ParseException();
+          try{
+            uexpr.setExprType(token.image);
+          } catch (AsterixException e){
+            throw new ParseException(e.getMessage());
+          }
     }
     )?