You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by sj...@apache.org on 2016/09/09 20:54:09 UTC

[07/15] asterixdb-bad git commit: Fixed structure

http://git-wip-us.apache.org/repos/asf/asterixdb-bad/blob/0921e3c9/target/generated-resources/javacc/grammar.jj
----------------------------------------------------------------------
diff --git a/target/generated-resources/javacc/grammar.jj b/target/generated-resources/javacc/grammar.jj
deleted file mode 100644
index ad77885..0000000
--- a/target/generated-resources/javacc/grammar.jj
+++ /dev/null
@@ -1,2949 +0,0 @@
-options{
-
-
-       STATIC = false;
-
-}
-PARSER_BEGIN(BADAQLParser)
-
-package org.apache.asterix.bad.lang;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import org.apache.asterix.bad.lang.statement.BrokerDropStatement;
-import org.apache.asterix.bad.lang.statement.ChannelDropStatement;
-import org.apache.asterix.bad.lang.statement.ChannelSubscribeStatement;
-import org.apache.asterix.bad.lang.statement.ChannelUnsubscribeStatement;
-import org.apache.asterix.bad.lang.statement.CreateBrokerStatement;
-import org.apache.asterix.bad.lang.statement.CreateChannelStatement;
-import org.apache.asterix.common.annotations.AutoDataGen;
-import org.apache.asterix.common.annotations.DateBetweenYearsDataGen;
-import org.apache.asterix.common.annotations.DatetimeAddRandHoursDataGen;
-import org.apache.asterix.common.annotations.DatetimeBetweenYearsDataGen;
-import org.apache.asterix.common.annotations.FieldIntervalDataGen;
-import org.apache.asterix.common.annotations.FieldValFileDataGen;
-import org.apache.asterix.common.annotations.FieldValFileSameIndexDataGen;
-import org.apache.asterix.common.annotations.IRecordFieldDataGen;
-import org.apache.asterix.common.annotations.InsertRandIntDataGen;
-import org.apache.asterix.common.annotations.ListDataGen;
-import org.apache.asterix.common.annotations.ListValFileDataGen;
-import org.apache.asterix.common.annotations.SkipSecondaryIndexSearchExpressionAnnotation;
-import org.apache.asterix.common.annotations.TypeDataGen;
-import org.apache.asterix.common.annotations.UndeclaredFieldsDataGen;
-import org.apache.asterix.common.config.DatasetConfig.DatasetType;
-import org.apache.asterix.common.config.DatasetConfig.IndexType;
-import org.apache.asterix.common.exceptions.AsterixException;
-import org.apache.asterix.common.functions.FunctionSignature;
-import org.apache.asterix.lang.aql.clause.DistinctClause;
-import org.apache.asterix.lang.aql.clause.ForClause;
-import org.apache.asterix.lang.aql.expression.FLWOGRExpression;
-import org.apache.asterix.lang.aql.expression.UnionExpr;
-import org.apache.asterix.lang.aql.util.RangeMapBuilder;
-import org.apache.asterix.lang.common.base.Clause;
-import org.apache.asterix.lang.common.base.Expression;
-import org.apache.asterix.lang.common.base.IParser;
-import org.apache.asterix.lang.common.base.Literal;
-import org.apache.asterix.lang.common.base.Statement;
-import org.apache.asterix.lang.common.clause.GroupbyClause;
-import org.apache.asterix.lang.common.clause.LetClause;
-import org.apache.asterix.lang.common.clause.LimitClause;
-import org.apache.asterix.lang.common.clause.OrderbyClause;
-import org.apache.asterix.lang.common.clause.UpdateClause;
-import org.apache.asterix.lang.common.clause.WhereClause;
-import org.apache.asterix.lang.common.context.RootScopeFactory;
-import org.apache.asterix.lang.common.context.Scope;
-import org.apache.asterix.lang.common.expression.AbstractAccessor;
-import org.apache.asterix.lang.common.expression.CallExpr;
-import org.apache.asterix.lang.common.expression.FieldAccessor;
-import org.apache.asterix.lang.common.expression.FieldBinding;
-import org.apache.asterix.lang.common.expression.GbyVariableExpressionPair;
-import org.apache.asterix.lang.common.expression.IfExpr;
-import org.apache.asterix.lang.common.expression.IndexAccessor;
-import org.apache.asterix.lang.common.expression.ListConstructor;
-import org.apache.asterix.lang.common.expression.LiteralExpr;
-import org.apache.asterix.lang.common.expression.OperatorExpr;
-import org.apache.asterix.lang.common.expression.OrderedListTypeDefinition;
-import org.apache.asterix.lang.common.expression.QuantifiedExpression;
-import org.apache.asterix.lang.common.expression.RecordConstructor;
-import org.apache.asterix.lang.common.expression.RecordTypeDefinition;
-import org.apache.asterix.lang.common.expression.TypeExpression;
-import org.apache.asterix.lang.common.expression.TypeReferenceExpression;
-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.literal.DoubleLiteral;
-import org.apache.asterix.lang.common.literal.FalseLiteral;
-import org.apache.asterix.lang.common.literal.FloatLiteral;
-import org.apache.asterix.lang.common.literal.LongIntegerLiteral;
-import org.apache.asterix.lang.common.literal.MissingLiteral;
-import org.apache.asterix.lang.common.literal.NullLiteral;
-import org.apache.asterix.lang.common.literal.StringLiteral;
-import org.apache.asterix.lang.common.literal.TrueLiteral;
-import org.apache.asterix.lang.common.parser.ScopeChecker;
-import org.apache.asterix.lang.common.statement.CompactStatement;
-import org.apache.asterix.lang.common.statement.ConnectFeedStatement;
-import org.apache.asterix.lang.common.statement.CreateDataverseStatement;
-import org.apache.asterix.lang.common.statement.CreateFeedPolicyStatement;
-import org.apache.asterix.lang.common.statement.CreateFeedStatement;
-import org.apache.asterix.lang.common.statement.CreateFunctionStatement;
-import org.apache.asterix.lang.common.statement.CreateIndexStatement;
-import org.apache.asterix.lang.common.statement.CreatePrimaryFeedStatement;
-import org.apache.asterix.lang.common.statement.CreateSecondaryFeedStatement;
-import org.apache.asterix.lang.common.statement.DatasetDecl;
-import org.apache.asterix.lang.common.statement.DataverseDecl;
-import org.apache.asterix.lang.common.statement.DataverseDropStatement;
-import org.apache.asterix.lang.common.statement.DeleteStatement;
-import org.apache.asterix.lang.common.statement.DisconnectFeedStatement;
-import org.apache.asterix.lang.common.statement.DropDatasetStatement;
-import org.apache.asterix.lang.common.statement.ExternalDetailsDecl;
-import org.apache.asterix.lang.common.statement.FeedDropStatement;
-import org.apache.asterix.lang.common.statement.FeedPolicyDropStatement;
-import org.apache.asterix.lang.common.statement.FunctionDecl;
-import org.apache.asterix.lang.common.statement.FunctionDropStatement;
-import org.apache.asterix.lang.common.statement.IndexDropStatement;
-import org.apache.asterix.lang.common.statement.InsertStatement;
-import org.apache.asterix.lang.common.statement.InternalDetailsDecl;
-import org.apache.asterix.lang.common.statement.LoadStatement;
-import org.apache.asterix.lang.common.statement.NodeGroupDropStatement;
-import org.apache.asterix.lang.common.statement.NodegroupDecl;
-import org.apache.asterix.lang.common.statement.Query;
-import org.apache.asterix.lang.common.statement.RefreshExternalDatasetStatement;
-import org.apache.asterix.lang.common.statement.RunStatement;
-import org.apache.asterix.lang.common.statement.SetStatement;
-import org.apache.asterix.lang.common.statement.TypeDecl;
-import org.apache.asterix.lang.common.statement.TypeDropStatement;
-import org.apache.asterix.lang.common.statement.UpdateStatement;
-import org.apache.asterix.lang.common.statement.UpsertStatement;
-import org.apache.asterix.lang.common.statement.WriteStatement;
-import org.apache.asterix.lang.common.struct.Identifier;
-import org.apache.asterix.lang.common.struct.QuantifiedPair;
-import org.apache.asterix.lang.common.struct.VarIdentifier;
-import org.apache.asterix.metadata.utils.MetadataConstants;
-import org.apache.hyracks.algebricks.common.utils.Pair;
-import org.apache.hyracks.algebricks.common.utils.Triple;
-import org.apache.hyracks.algebricks.core.algebra.expressions.IExpressionAnnotation;
-import org.apache.hyracks.algebricks.core.algebra.expressions.IndexedNLJoinExpressionAnnotation;
-import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
-import org.apache.xerces.util.IntStack;
-
-class BADAQLParser extends ScopeChecker implements IParser {
-
-    // optimizer hints
-    private static final String AUTO_HINT = "auto";
-    private static final String BROADCAST_JOIN_HINT = "bcast";
-    private static final String COMPOSE_VAL_FILES_HINT = "compose-val-files";
-    private static final String DATE_BETWEEN_YEARS_HINT = "date-between-years";
-    private static final String DATETIME_ADD_RAND_HOURS_HINT = "datetime-add-rand-hours";
-    private static final String DATETIME_BETWEEN_YEARS_HINT = "datetime-between-years";
-    private static final String HASH_GROUP_BY_HINT = "hash";
-    private static final String INDEXED_NESTED_LOOP_JOIN_HINT = "indexnl";
-    private static final String INMEMORY_HINT = "inmem";
-    private static final String INSERT_RAND_INT_HINT = "insert-rand-int";
-    private static final String INTERVAL_HINT = "interval";
-    private static final String LIST_HINT = "list";
-    private static final String LIST_VAL_FILE_HINT = "list-val-file";
-    private static final String RANGE_HINT = "range";
-    private static final String SKIP_SECONDARY_INDEX_SEARCH_HINT = "skip-index";
-    private static final String VAL_FILE_HINT = "val-files";
-    private static final String VAL_FILE_SAME_INDEX_HINT = "val-file-same-idx";
-    private static final String GEN_FIELDS_HINT = "gen-fields";
-    // data generator hints
-    private static final String DGEN_HINT = "dgen";
-
-    private static class IndexParams {
-      public IndexType type;
-      public int gramLength;
-
-      public IndexParams(IndexType type, int gramLength) {
-        this.type = type;
-        this.gramLength = gramLength;
-      }
-    };
-
-    private static class FunctionName {
-       public String dataverse = null;
-       public String library = null;
-       public String function = null;
-       public String hint = null;
-    }
-
-    private static String getHint(Token t) {
-        if (t.specialToken == null) {
-            return null;
-        }
-        String s = t.specialToken.image;
-        int n = s.length();
-        if (n < 2) {
-            return null;
-        }
-        return s.substring(1).trim();
-    }
-
-    private static IRecordFieldDataGen parseFieldDataGen(String hint) throws ParseException {
-      IRecordFieldDataGen rfdg = null;
-      String splits[] = hint.split(" +");
-      if (splits[0].equals(VAL_FILE_HINT)) {
-        File[] valFiles = new File[splits.length - 1];
-        for (int k=1; k<splits.length; k++) {
-          valFiles[k-1] = new File(splits[k]);
-        }
-        rfdg = new FieldValFileDataGen(valFiles);
-      } else if (splits[0].equals(VAL_FILE_SAME_INDEX_HINT)) {
-        rfdg = new FieldValFileSameIndexDataGen(new File(splits[1]), splits[2]);
-      } else if (splits[0].equals(LIST_VAL_FILE_HINT)) {
-        rfdg = new ListValFileDataGen(new File(splits[1]), Integer.parseInt(splits[2]), Integer.parseInt(splits[3]));
-      } else if (splits[0].equals(LIST_HINT)) {
-        rfdg = new ListDataGen(Integer.parseInt(splits[1]), Integer.parseInt(splits[2]));
-      } else if (splits[0].equals(INTERVAL_HINT)) {
-        FieldIntervalDataGen.ValueType vt;
-        if (splits[1].equals("int")) {
-          vt = FieldIntervalDataGen.ValueType.INT;
-        } else if (splits[1].equals("long")) {
-          vt = FieldIntervalDataGen.ValueType.LONG;
-        } else if (splits[1].equals("float")) {
-          vt = FieldIntervalDataGen.ValueType.FLOAT;
-        } else if (splits[1].equals("double")) {
-          vt = FieldIntervalDataGen.ValueType.DOUBLE;
-        } else {
-          throw new ParseException("Unknown type for interval data gen: " + splits[1]);
-        }
-        rfdg = new FieldIntervalDataGen(vt, splits[2], splits[3]);
-      } else if (splits[0].equals(INSERT_RAND_INT_HINT)) {
-        rfdg = new InsertRandIntDataGen(splits[1], splits[2]);
-      } else if (splits[0].equals(DATE_BETWEEN_YEARS_HINT)) {
-        rfdg = new DateBetweenYearsDataGen(Integer.parseInt(splits[1]), Integer.parseInt(splits[2]));
-      } else if (splits[0].equals(DATETIME_BETWEEN_YEARS_HINT)) {
-        rfdg = new DatetimeBetweenYearsDataGen(Integer.parseInt(splits[1]), Integer.parseInt(splits[2]));
-      } else if (splits[0].equals(DATETIME_ADD_RAND_HOURS_HINT)) {
-        rfdg = new DatetimeAddRandHoursDataGen(Integer.parseInt(splits[1]), Integer.parseInt(splits[2]), splits[3]);
-      } else if (splits[0].equals(AUTO_HINT)) {
-        rfdg = new AutoDataGen(splits[1]);
-      }
-      return rfdg;
-    }
-
-    public BADAQLParser(String s){
-        this(new StringReader(s));
-        super.setInput(s);
-    }
-
-    public static void main(String args[]) throws ParseException, TokenMgrError, IOException, FileNotFoundException, AsterixException {
-        File file = new File(args[0]);
-        Reader fis = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
-        BADAQLParser parser = new BADAQLParser(fis);
-        List<Statement> st = parser.parse();
-        //st.accept(new AQLPrintVisitor(), 0);
-    }
-
-    public List<Statement> parse() throws AsterixException {
-        try {
-            return Statement();
-        } catch (Error e) {
-            // this is here as the JavaCharStream that's below the lexer somtimes throws Errors that are not handled
-            // by the ANTLR-generated lexer or parser (e.g it does this for invalid backslash u + 4 hex digits escapes)
-            throw new AsterixException(new ParseException(e.getMessage()));
-        } catch (ParseException e){
-            throw new AsterixException(e.getMessage());
-        }
-    }
-}
-
-PARSER_END(BADAQLParser)
-
-
-LimitClause LimitClause() throws ParseException:
-{
-    LimitClause lc = new LimitClause();
-    Expression expr;
-    pushForbiddenScope(getCurrentScope());
-}
-{
-    <LIMIT> expr = Expression()    { lc.setLimitExpr(expr);    }
-    (<OFFSET> expr = Expression() { lc.setOffset(expr);    })?
-
-  {
-    popForbiddenScope();
-    return lc;
-  }
-}
-
-String StringLiteral() throws ParseException:
-{
-}
-{
-  <STRING_LITERAL>
-    {
-      return removeQuotesAndEscapes(token.image);
-    }
-}
-
-RefreshExternalDatasetStatement RefreshExternalDatasetStatement() throws ParseException:
-{
-  RefreshExternalDatasetStatement redss = new RefreshExternalDatasetStatement();
-  Pair<Identifier,Identifier> nameComponents = null;
-  String datasetName = null;
-}
-{
-  (
-    <REFRESH> <EXTERNAL> <DATASET> nameComponents = QualifiedName()
-    {
-    redss.setDataverseName(nameComponents.first);
-    redss.setDatasetName(nameComponents.second);
-    return redss;
-    }
-  )
-}
-
-Statement CompactStatement() throws ParseException:
-{
-  Pair<Identifier,Identifier> nameComponents = null;
-  Statement stmt = null;
-}
-{
-  <COMPACT> <DATASET> nameComponents = QualifiedName()
-    {
-      stmt = new CompactStatement(nameComponents.first, nameComponents.second);
-    }
-    {
-      return stmt;
-    }
-}
-
-Expression AndExpr() throws ParseException:
-{
-  OperatorExpr op = null;
-  Expression operand = null;
-}
-{
-    operand = RelExpr()
-    (
-
-      <AND>
-      {
-        if (op == null) {
-          op = new OperatorExpr();
-          op.addOperand(operand);
-        op.setCurrentop(true);
-        }
-        try{
-          op.addOperator(token.image);
-        } catch (AsterixException e){
-          throw new ParseException(e.getMessage());
-        }
-    }
-
-    operand = RelExpr()
-    {
-      op.addOperand(operand);
-    }
-
-    )*
-
-    {
-      return op==null? operand: op;
-    }
-}
-
-TypeDecl TypeSpecification(String hint, boolean dgen) throws ParseException:
-{
-  Pair<Identifier,Identifier> nameComponents = null;
-  boolean ifNotExists = false;
-  TypeExpression typeExpr = null;
-}
-{
-  <TYPE> nameComponents = TypeName() ifNotExists = IfNotExists()
-  <AS> typeExpr = TypeExpr()
-    {
-      long numValues = -1;
-      String filename = null;
-      if (dgen) {
-        String splits[] = hint.split(" +");
-        if (splits.length != 3) {
-          throw new ParseException("Expecting /*+ dgen <filename> <numberOfItems> */");
-        }
-        filename = splits[1];
-        numValues = Long.parseLong(splits[2]);
-      }
-      TypeDataGen tddg = new TypeDataGen(dgen, filename, numValues);
-      return new TypeDecl(nameComponents.first, nameComponents.second, typeExpr, tddg, ifNotExists);
-    }
-}
-
-TOKEN_MGR_DECLS:
-{
-    public int commentDepth = 0;
-    public IntStack lexerStateStack = new IntStack();
-
-    public void pushState() {
-      lexerStateStack.push( curLexState );
-    }
-
-    public void popState(String token) {
-      if (lexerStateStack.size() > 0) {
-         SwitchTo( lexerStateStack.pop() );
-      } else {
-         int errorLine = input_stream.getEndLine();
-         int errorColumn = input_stream.getEndColumn();
-         String msg = "Lexical error at line " + errorLine + ", column " + errorColumn + ". Encountered \"" + token
-             + "\" but state stack is empty.";
-         throw new TokenMgrError(msg, -1);
-      }
-    }
-}
-
-Statement WriteStatement() throws ParseException:
-{
-  String nodeName = null;
-  String fileName = null;
-  Query query;
-  String writerClass = null;
-  Pair<Identifier,Identifier> nameComponents = null;
-}
-{
-  <WRITE> <OUTPUT> <TO> nodeName = Identifier() <COLON> fileName = StringLiteral()
-    ( <USING> writerClass = StringLiteral() )?
-    {
-      return new WriteStatement(new Identifier(nodeName), fileName, writerClass);
-    }
-}
-
-Pair<Integer, Pair<List<String>, TypeExpression>>OpenField() throws ParseException:
-{
-  TypeExpression fieldType = null;
-  Pair<Integer, List<String>> fieldList = null;
-}
-{
-  fieldList = NestedField()
-  ( <COLON> fieldType =  IndexedTypeExpr() <QUES>)?
-  {
-    return new Pair<Integer, Pair<List<String>, TypeExpression>>
-           (fieldList.first, new Pair<List<String>, TypeExpression>(fieldList.second, fieldType));
-  }
-}
-
-boolean IfExists() throws ParseException:
-{
-}
-{
-  (
-    LOOKAHEAD(1)
-    <IF> <EXISTS>
-    {
-      return true;
-    }
-  )?
-    {
-      return false;
-    }
-}
-
-Expression Index() throws ParseException:
-{
-    Expression expr = null;
-}
-{
-  <LEFTBRACKET> ( expr = Expression()
-    {
-        if(expr.getKind() == Expression.Kind.LITERAL_EXPRESSION)
-        {
-            Literal lit = ((LiteralExpr)expr).getValue();
-            if(lit.getLiteralType() != Literal.Type.INTEGER &&
-               lit.getLiteralType() != Literal.Type.LONG) {
-                throw new ParseException("Index should be an INTEGER");
-            }
-        }
-    }
-
-      | <QUES> // ANY
-
-      )
-
-   <RIGHTBRACKET>
-    {
-      return expr;
-    }
-}
-
-IndexParams IndexType() throws ParseException:
-{
-  IndexType type = null;
-  int gramLength = 0;
-}
-{
-  (
-    <BTREE>
-    {
-      type = IndexType.BTREE;
-    }
-   |<RTREE>
-    {
-      type = IndexType.RTREE;
-    }
-   |<KEYWORD>
-    {
-      type = IndexType.LENGTH_PARTITIONED_WORD_INVIX;
-    }
-   |<NGRAM> <LEFTPAREN> <INTEGER_LITERAL>
-    {
-      type = IndexType.LENGTH_PARTITIONED_NGRAM_INVIX;
-      gramLength = Integer.valueOf(token.image);
-    }
-    <RIGHTPAREN>
-  )
-  {
-    return new IndexParams(type, gramLength);
-  }
-}
-
-CreateBrokerStatement BrokerSpecification() throws ParseException:
-{
-  CreateBrokerStatement cbs = null;
-  Pair<Identifier,Identifier> name = null;
-  String endPoint = null;
-}
-{
-  (
-    <BROKER>  name = QualifiedName()
-    <AT>  endPoint = StringLiteral()
-    {
-      cbs = new CreateBrokerStatement(name.first, name.second,endPoint);
-    }
-  )
-    {
-      return cbs;
-    }
-}
-
-FunctionDecl FunctionDeclaration() throws ParseException:
-{
-  FunctionDecl funcDecl;
-  FunctionSignature signature;
-  String functionName;
-  List<VarIdentifier> paramList = new ArrayList<VarIdentifier>();
-  Expression funcBody;
-  createNewScope();
-}
-{
-  <DECLARE> <FUNCTION> functionName = Identifier()
-  paramList = ParameterList()
-  <LEFTBRACE> funcBody = Expression() <RIGHTBRACE>
-    {
-      signature = new FunctionSignature(defaultDataverse, functionName, paramList.size());
-      getCurrentScope().addFunctionDescriptor(signature, false);
-      funcDecl = new FunctionDecl(signature, paramList, funcBody);
-      removeCurrentScope();
-      return funcDecl;
-    }
-}
-
-Triple<Identifier,Identifier,Identifier>DoubleQualifiedName() throws ParseException:
-{
-  String first = null;
-  String second = null;
-  String third = null;
-}
-{
-  first = Identifier() <DOT> second = Identifier() (<DOT> third = Identifier())?
-  {
-    Identifier id1 = null;
-    Identifier id2 = null;
-    Identifier id3 = null;
-    if (third == null) {
-      id2 = new Identifier(first);
-      id3 = new Identifier(second);
-    } else {
-      id1 = new Identifier(first);
-      id2 = new Identifier(second);
-      id3 = new Identifier(third);
-    }
-    return new Triple<Identifier,Identifier,Identifier>(id1, id2, id3);
-  }
-}
-
-Expression MultExpr() throws ParseException:
-{
-  OperatorExpr op = null;
-  Expression operand = null;
-}
-{
-    operand = ExponentExpr()
-
-    (( <MUL> | <DIV> | <MOD> | <IDIV>)
-      {
-        if (op == null) {
-          op = new OperatorExpr();
-          op.addOperand(operand);
-          op.setCurrentop(true);
-        }
-        try{
-          op.addOperator(token.image);
-        } catch (AsterixException e){
-          throw new ParseException(e.getMessage());
-        }
-    }
-    operand = ExponentExpr()
-    {
-       op.addOperand(operand);
-    }
-    )*
-
-     {
-       return op==null?operand:op;
-     }
-}
-
-InsertStatement InsertStatement() throws ParseException:
-{
-  Pair<Identifier,Identifier> nameComponents = null;
-  Pair<Integer, List<String>> returnField = new Pair<Integer, List<String>>(0, null);
-  boolean returnRecord = false;
-  Query query;
-  boolean upsert = false;
-}
-{
-  (<INSERT>|<UPSERT>{ upsert = true; }) <INTO> <DATASET> nameComponents = QualifiedName() 
-  query = Query() (<RETURN> "records"{returnRecord = true;} | "returning" returnField = NestedField())?
-    {
-      query.setTopLevel(true);
-      if(upsert){
-        return new UpsertStatement(nameComponents.first, nameComponents.second, query, getVarCounter());
-      } else{
-        return new InsertStatement(nameComponents.first, nameComponents.second, query, getVarCounter(),
-        returnRecord, returnField.second);
-      }
-    }
-}
-
-Expression FunctionCallExpr() throws ParseException:
-{
-  CallExpr callExpr;
-  List<Expression> argList = new ArrayList<Expression>();
-  Expression tmp;
-  int arity = 0;
-  FunctionName funcName = null;
-  String hint = null;
-}
-{
-  funcName = FunctionName()
-    {
-      hint = funcName.hint;
-    }
-  <LEFTPAREN> (tmp = Expression()
-    {
-      argList.add(tmp);
-      arity ++;
-    }
-  (<COMMA> tmp = Expression()
-    {
-      argList.add(tmp);
-      arity++;
-    }
-  )*)? <RIGHTPAREN>
-    {
-      // TODO use funcName.library
-      String fqFunctionName = funcName.library == null ? funcName.function : funcName.library + "#" + funcName.function;
-      FunctionSignature signature
-        = lookupFunctionSignature(funcName.dataverse, fqFunctionName, arity);
-      if (signature == null) {
-        signature = new FunctionSignature(funcName.dataverse, fqFunctionName, arity);
-      }
-      callExpr = new CallExpr(signature,argList);
-      if (hint != null) {
-        if (hint.startsWith(INDEXED_NESTED_LOOP_JOIN_HINT)) {
-          callExpr.addHint(IndexedNLJoinExpressionAnnotation.INSTANCE);
-        } else if (hint.startsWith(SKIP_SECONDARY_INDEX_SEARCH_HINT)) {
-          callExpr.addHint(SkipSecondaryIndexSearchExpressionAnnotation.INSTANCE);
-        }
-      }
-      return callExpr;
-    }
-}
-
-Clause Clause() throws ParseException:
-{
-  Clause clause;
-}
-{
-    (
-         clause = ForClause()
-       | clause = LetClause()
-       | clause = WhereClause()
-       | clause = OrderbyClause()
-       | clause = GroupClause()
-       | clause = LimitClause()
-       | clause = DistinctClause()
-    )
-    {
-      return clause;
-    }
-}
-
-Pair<Integer, List<String>>NestedField() throws ParseException:
-{
-  List<String> exprList = new ArrayList<String>();
-  String lit = null;
-  int source = 0;
-}
-{
-  lit = Identifier()
-  {
-    boolean meetParens = false;
-  }
-  (
-    LOOKAHEAD(1)
-    <LEFTPAREN><RIGHTPAREN>
-    {
-        if(!lit.equals("meta")){
-            throw new ParseException("The string before () has to be \"meta\".");
-        }
-        meetParens = true;
-        source = 1;
-    }
-  )?
-  {
-    if(!meetParens){
-        exprList.add(lit);
-    }
-  }
-  (<DOT>
-    lit = Identifier()
-    {
-      exprList.add(lit);
-    }
-  )*
-  {
-    return new Pair<Integer, List<String>>(source, exprList);
-  }
-}
-
-Expression Literal() throws ParseException:
-{
-  LiteralExpr lit = new LiteralExpr();
-  String str = null;
-}
-{
-  ( str = StringLiteral()
-    {
-      lit.setValue(new StringLiteral(str));
-    }
-  | <INTEGER_LITERAL>
-    {
-      lit.setValue(new LongIntegerLiteral(new Long(token.image)));
-    }
-  | <FLOAT_LITERAL>
-    {
-      lit.setValue(new FloatLiteral(new Float(token.image)));
-    }
-  | <DOUBLE_LITERAL>
-    {
-      lit.setValue(new DoubleLiteral(new Double(token.image)));
-    }
-  | <MISSING>
-    {
-      lit.setValue(MissingLiteral.INSTANCE);
-    }
-  | <NULL>
-    {
-      lit.setValue(NullLiteral.INSTANCE);
-    }
-  | <TRUE>
-    {
-      lit.setValue(TrueLiteral.INSTANCE);
-    }
-  | <FALSE>
-    {
-      lit.setValue(FalseLiteral.INSTANCE);
-    }
-  )
-    {
-      return lit;
-    }
-}
-
-Expression OperatorExpr() throws ParseException:
-{
-  OperatorExpr op = null;
-  Expression operand = null;
-}
-{
-    operand = AndExpr()
-    (
-
-      <OR>
-      {
-        if (op == null) {
-          op = new OperatorExpr();
-          op.addOperand(operand);
-        op.setCurrentop(true);
-        }
-        try{
-          op.addOperator(token.image);
-        } catch (AsterixException e){
-          throw new ParseException(e.getMessage());
-        }
-    }
-
-    operand = AndExpr()
-    {
-      op.addOperand(operand);
-    }
-
-    )*
-
-    {
-      return op==null? operand: op;
-    }
-}
-
-Expression AddExpr() throws ParseException:
-{
-  OperatorExpr op = null;
-  Expression operand = null;
-}
-{
-    operand = MultExpr()
-
-    ( (<PLUS> | <MINUS>)
-      {
-        if (op == null) {
-          op = new OperatorExpr();
-        op.addOperand(operand);
-        op.setCurrentop(true);
-        }
-        try{
-          ((OperatorExpr)op).addOperator(token.image);
-        } catch (AsterixException e){
-          throw new ParseException(e.getMessage());
-        }
-    }
-
-    operand = MultExpr()
-    {
-      op.addOperand(operand);
-    }
-    )*
-
-    {
-       return op==null? operand: op;
-     }
-}
-
-Statement SetStatement() throws ParseException:
-{
-  String pn = null;
-  String pv = null;
-}
-{
-  <SET> pn = Identifier() pv = StringLiteral()
-    {
-      return new SetStatement(pn, pv);
-    }
-}
-
-RunStatement RunStatement() throws ParseException:
-{
-  String system = null;
-  String tmp;
-  ArrayList<String> parameters = new  ArrayList<String>();
-  Pair<Identifier,Identifier> nameComponentsFrom = null;
-  Pair<Identifier,Identifier> nameComponentsTo = null;
-}
-{
-  <RUN> system = Identifier()<LEFTPAREN> ( tmp = Identifier() [<COMMA>]
-    {
-      parameters.add(tmp);
-    }
-  )*<RIGHTPAREN>
-  <FROM> <DATASET> nameComponentsFrom  = QualifiedName()
-  <TO> <DATASET> nameComponentsTo  = QualifiedName()
-    {
-      return new RunStatement(system, parameters, nameComponentsFrom.first, nameComponentsFrom.second, nameComponentsTo.first, nameComponentsTo.second);
-    }
-}
-
-List<Statement>Statement() throws ParseException:
-{
-  scopeStack.push(RootScopeFactory.createRootScope(this));
-  List<Statement> decls = new ArrayList<Statement>();
-  Statement stmt = null;
-}
-{
-  ( stmt = SingleStatement() (";") ?
-    {
-      decls.add(stmt);
-    }
-  )*
-  <EOF>
-  {
-    return decls;
-  }
-}
-
-String GetPolicy() throws ParseException:
-{
-  String policy = null;
-}
-{
-   <USING> <POLICY> policy = Identifier()
-   {
-     return policy;
-   }
-
-}
-
-Expression FLWOGR() throws ParseException:
-{
-    FLWOGRExpression flworg = new FLWOGRExpression();
-    List<Clause> clauseList = new ArrayList<Clause>();
-    Expression returnExpr;
-    Clause tmp;
-    createNewScope();
-}
-{
-     (tmp = ForClause()  {clauseList.add(tmp);} | tmp = LetClause() {clauseList.add(tmp);})
-      (tmp = Clause() {clauseList.add(tmp);})* (<RETURN>|<SELECT>) returnExpr = Expression()
-
-     {
-       flworg.setClauseList(clauseList);
-       flworg.setReturnExpr(returnExpr);
-       removeCurrentScope();
-       return flworg;
-     }
-}
-
-DistinctClause DistinctClause() throws ParseException:
-{
-  List<Expression> exprs = new ArrayList<Expression>();
-  Expression expr;
-}
-{
-  <DISTINCT> <BY> expr = Expression()
-  {
-    exprs.add(expr);
-  }
-  (<COMMA> expr = Expression()
-      {
-          exprs.add(expr);
-      }
-  )*
-  {
-      return new DistinctClause(exprs);
-  }
-}
-
-Identifier Field() throws ParseException:
-{
-  String ident = null;
-}
-{
-  <DOT> ident = Identifier()
-    {
-      return new Identifier(ident);
-    }
-}
-
-String Identifier() throws ParseException:
-{
-  String lit = null;
-}
-{
-  ((<IDENTIFIER>)
-    {
-      return token.image;
-    }
-  | lit = StringLiteral()
-    {
-      return lit;
-    }
-  )
-}
-
-// Merged Non-terminal
-Statement SingleStatement() throws ParseException:
-{
-  Statement stmt = null;
-}
-{
-  (
-    stmt = DataverseDeclaration()
-    | stmt = FunctionDeclaration()
-    | stmt = CreateStatement()
-    | stmt = LoadStatement()
-    | stmt = DropStatement()
-    | stmt = WriteStatement()
-    | stmt = SetStatement()
-    | stmt = InsertStatement()
-    | stmt = DeleteStatement()
-    | stmt = UpdateStatement()
-    | stmt = FeedStatement()
-    | stmt = CompactStatement()
-    | stmt = Query()
-    | stmt = RefreshExternalDatasetStatement()
-    | stmt = RunStatement()
-    | stmt = ChannelSubscriptionStatement()
-  )
-  {
-  return stmt;
-  }
-}
-
-Clause LetClause() throws ParseException:
-{
-    LetClause lc = new LetClause();
-    VariableExpr varExp;
-    Expression beExp;
-    extendCurrentScope();
-}
-{
-    (<LET>|<WITH>) varExp = Variable() <ASSIGN> beExp = Expression()
-    {
-      getCurrentScope().addNewVarSymbolToScope(varExp.getVar());
-      lc.setVarExpr(varExp);
-      lc.setBindingExpr(beExp);
-      return lc;
-    }
-}
-
-ListConstructor UnorderedListConstructor() throws ParseException:
-{
-      ListConstructor expr = new ListConstructor();
-      List<Expression> exprList = null;
-      expr.setType(ListConstructor.Type.UNORDERED_LIST_CONSTRUCTOR);
-}
-{
-    <LEFTDBLBRACE> exprList = ExpressionList() <RIGHTDBLBRACE>
-    {
-      expr.setExprList(exprList);
-      return expr;
-    }
-}
-
-Expression PrimaryExpr() throws ParseException:
-{
-  Expression expr = null;
-}
-{
-  ( LOOKAHEAD(2)
-    expr = FunctionCallExpr()
-  | expr = Literal()
-  | expr = DatasetAccessExpression()
-  | expr = VariableRef()
-    {
-      if(((VariableExpr)expr).getIsNewVar() == true)
-        throw new ParseException("can't find variable " + ((VariableExpr)expr).getVar());
-    }
-  | expr = ListConstructor()
-  | expr = RecordConstructor()
-  | expr = ParenthesizedExpression()
-  )
-    {
-      return expr;
-    }
-}
-
-Expression DatasetAccessExpression() throws ParseException:
-{
-  String funcName;
-  String arg1 = null;
-  String arg2 = null;
-  Expression nameArg;
-}
-{
-  <DATASET>
-    {
-      funcName = token.image;
-    }
-  ( ( arg1 = Identifier() ( <DOT> arg2 = Identifier() )? )
-    {
-      String name = arg2 == null ? arg1 : arg1 + "." + arg2;
-      LiteralExpr ds = new LiteralExpr();
-      ds.setValue( new StringLiteral(name) );
-      nameArg = ds;
-      if(arg2 != null){
-          addDataverse(arg1.toString());
-          addDataset(name);
-      } else {
-          addDataset(defaultDataverse + "." + name);
-      }
-    }
-  | ( <LEFTPAREN> nameArg = Expression() <RIGHTPAREN> ) )
-    {
-      String dataverse = MetadataConstants.METADATA_DATAVERSE_NAME;
-      FunctionSignature signature = lookupFunctionSignature(dataverse, funcName, 1);
-      if (signature == null) {
-        signature = new FunctionSignature(dataverse, funcName, 1);
-      }
-      List<Expression> argList = new ArrayList<Expression>();
-      argList.add(nameArg);
-      return new CallExpr(signature, argList);
-    }
-}
-
-Pair<Identifier,Identifier>QualifiedName() throws ParseException:
-{
-  String first = null;
-  String second = null;
-}
-{
-  first = Identifier() (<DOT> second = Identifier())?
-  {
-    Identifier id1 = null;
-    Identifier id2 = null;
-    if (second == null) {
-      id2 = new Identifier(first);
-    } else
-    {
-      id1 = new Identifier(first);
-      id2 = new Identifier(second);
-    }
-    return new Pair<Identifier,Identifier>(id1, id2);
-  }
-}
-
-UpdateClause UpdateClause() throws ParseException:
-{
-  Expression target = null;
-  Expression value = null ;
-  InsertStatement is = null;
-  DeleteStatement ds = null;
-  UpdateStatement us = null;
-  Expression condition = null;
-  UpdateClause ifbranch = null;
-  UpdateClause elsebranch = null;
-}
-{
-   (<SET> target = Expression() <ASSIGN> value = Expression()
-   | is = InsertStatement()
-   | ds = DeleteStatement()
-   | us = UpdateStatement()
-   | <IF> <LEFTPAREN> condition = Expression() <RIGHTPAREN>
-     <THEN> ifbranch = UpdateClause()
-     [LOOKAHEAD(1) <ELSE> elsebranch = UpdateClause()]
-     {
-       return new UpdateClause(target, value, is, ds, us, condition, ifbranch, elsebranch);
-     }
-   )
-}
-
-Clause ForClause() throws ParseException:
-{
-    ForClause fc = new ForClause();
-    VariableExpr varExp;
-    VariableExpr varPos = null;
-    Expression inExp;
-    extendCurrentScope();
-}
-{
-    (<FOR>|<FROM>) varExp = Variable() (<AT> varPos = Variable())?  <IN> ( inExp = Expression() )
-    {
-      fc.setVarExpr(varExp);
-      getCurrentScope().addNewVarSymbolToScope(varExp.getVar());
-      fc.setInExpr(inExp);
-      if (varPos != null) {
-        fc.setPosExpr(varPos);
-        getCurrentScope().addNewVarSymbolToScope(varPos.getVar());
-      }
-      return fc;
-    }
-}
-
-Clause OrderbyClause() throws ParseException:
-{
-    OrderbyClause oc = new OrderbyClause();
-    Expression orderbyExpr;
-    List<Expression> orderbyList = new ArrayList<Expression>();
-    List<OrderbyClause.OrderModifier> modifierList = new ArrayList<OrderbyClause.OrderModifier >();
-    int numOfOrderby = 0;
-}
-{
-  (
-    <ORDER>
-      {
-        String hint = getHint(token);
-        if (hint != null) {
-          if (hint.startsWith(INMEMORY_HINT)) {
-            String splits[] = hint.split(" +");
-            int numFrames = Integer.parseInt(splits[1]);
-            int numTuples = Integer.parseInt(splits[2]);
-            oc.setNumFrames(numFrames);
-            oc.setNumTuples(numTuples);
-          }
-          if (hint.startsWith(RANGE_HINT)) {
-            try{
-              oc.setRangeMap(RangeMapBuilder.parseHint(hint.substring(RANGE_HINT.length())));
-            } catch (AsterixException e) {
-              throw new ParseException(e.getMessage());
-            }
-          }
-        }
-      }
-    <BY> orderbyExpr = Expression()
-    {
-      orderbyList.add(orderbyExpr);
-      OrderbyClause.OrderModifier modif = OrderbyClause.OrderModifier.ASC;
-    }
-    ( (<ASC> { modif = OrderbyClause.OrderModifier.ASC; })
-    | (<DESC> { modif = OrderbyClause.OrderModifier.DESC; }))?
-    {
-      modifierList.add(modif);
-    }
-
-    (<COMMA> orderbyExpr = Expression()
-    {
-      orderbyList.add(orderbyExpr);
-      modif = OrderbyClause.OrderModifier.ASC;
-    }
-    ( (<ASC> { modif = OrderbyClause.OrderModifier.ASC; })
-    | (<DESC> { modif = OrderbyClause.OrderModifier.DESC; }))?
-    {
-      modifierList.add(modif);
-    }
-    )*
-)
-    {
-      oc.setModifierList(modifierList);
-      oc.setOrderbyList(orderbyList);
-      return oc;
-    }
-}
-
-Expression IfThenElse() throws ParseException:
-{
-  Expression condExpr;
-  Expression thenExpr;
-  Expression elseExpr;
-  IfExpr ifExpr = new IfExpr();
-}
-{
-    <IF> <LEFTPAREN> condExpr = Expression() <RIGHTPAREN> <THEN> thenExpr = Expression() <ELSE> elseExpr = Expression()
-
-    {
-      ifExpr.setCondExpr(condExpr);
-      ifExpr.setThenExpr(thenExpr);
-      ifExpr.setElseExpr(elseExpr);
-      return ifExpr;
-    }
-}
-
-void RecordField(RecordTypeDefinition recType) throws ParseException:
-{
-  String fieldName;
-  TypeExpression type = null;
-  boolean nullable = false;
-}
-{
-  fieldName = Identifier()
-    {
-      String hint = getHint(token);
-      IRecordFieldDataGen rfdg = hint != null ? parseFieldDataGen(hint) : null;
-    }
-  <COLON> type =  TypeExpr() (<QUES> { nullable = true; } )?
-    {
-      recType.addField(fieldName, type, nullable, rfdg);
-    }
-}
-
-Expression UnionExpr() throws ParseException:
-{
-    UnionExpr union = null;
-    Expression operand1 = null;
-    Expression operand2 = null;
-}
-{
-   operand1 = UnaryExpr()
-   (<UNION>
-       (operand2 = UnaryExpr()) {
-          if (union == null) {
-             union = new UnionExpr();
-             union.addExpr(operand1);
-          }
-          union.addExpr(operand2);
-       } )*
-   {
-     return (union == null)? operand1: union;
-   }
-}
-
-Expression RelExpr() throws ParseException:
-{
-  OperatorExpr op = null;
-  Expression operand = null;
-  boolean broadcast = false;
-  IExpressionAnnotation annotation = null;
-}
-{
-    operand = AddExpr()
-    {
-      if (operand instanceof VariableExpr) {
-        String hint = getHint(token);
-        if (hint != null && hint.equals(BROADCAST_JOIN_HINT)) {
-          broadcast = true;
-        }
-      }
-    }
-
-    (
-      LOOKAHEAD(2)( <LT> | <GT> | <LE> | <GE> | <EQ> | <NE> |<SIMILAR>)
-        {
-          String mhint = getHint(token);
-          if (mhint != null) {
-            if (mhint.equals(INDEXED_NESTED_LOOP_JOIN_HINT)) {
-            annotation = IndexedNLJoinExpressionAnnotation.INSTANCE;
-          } else if (mhint.equals(SKIP_SECONDARY_INDEX_SEARCH_HINT)) {
-            annotation = SkipSecondaryIndexSearchExpressionAnnotation.INSTANCE;
-          }
-        }
-          if (op == null) {
-            op = new OperatorExpr();
-            op.addOperand(operand, broadcast);
-          op.setCurrentop(true);
-          broadcast = false;
-          }
-         try{
-           op.addOperator(token.image);
-         } catch (AsterixException e){
-           throw new ParseException(e.getMessage());
-         }
-      }
-
-       operand = AddExpr()
-      {
-         broadcast = false;
-         if (operand instanceof VariableExpr) {
-           String hint = getHint(token);
-           if (hint != null && hint.equals(BROADCAST_JOIN_HINT)) {
-             broadcast = true;
-           }
-         }
-         op.addOperand(operand, broadcast);
-      }
-    )?
-
-     {
-       if (annotation != null) {
-         op.addHint(annotation);
-       }
-       return op==null? operand: op;
-     }
-}
-
-String FilterField() throws ParseException:
-{
-  String filterField = null;
-}
-{
-  filterField = Identifier()
-    {
-      return filterField;
-    }
-}
-
-FunctionSignature ApplyFunction() throws ParseException:
-{
-  FunctionName functioName = null;
-  FunctionSignature funcSig = null;
-}
-{
-  <APPLY> <FUNCTION> functioName = FunctionName()
-    {
-       String fqFunctionName = functioName.library == null ? functioName.function : functioName.library + "#" + functioName.function;
-       return new FunctionSignature(functioName.dataverse, fqFunctionName, 1);
-    }
-}
-
-String CompactionPolicy() throws ParseException:
-{
-  String compactionPolicy = null;
-}
-{
-  compactionPolicy = Identifier()
-    {
-      return compactionPolicy;
-    }
-}
-
-FunctionName FunctionName() throws ParseException:
-{
-  String first = null;
-  String second = null;
-  String third = null;
-  boolean secondAfterDot = false;
-}
-{
-  first = Identifier()
-  {
-    FunctionName result = new FunctionName();
-    result.hint = getHint(token);
-  }
-  ( <DOT> second = Identifier()
-    {
-      secondAfterDot = true;
-    }
-  ( <SYMBOLHASH> third = Identifier())? | <SYMBOLHASH> second = Identifier() )?
-    {
-      if (second == null) {
-        result.dataverse = defaultDataverse;
-        result.library = null;
-        result.function = first;
-      } else if (third == null) {
-        if (secondAfterDot) {
-          result.dataverse = first;
-          result.library   = null;
-          result.function = second;
-        } else {
-          result.dataverse = defaultDataverse;
-          result.library   = first;
-          result.function = second;
-        }
-      } else {
-        result.dataverse = first;
-        result.library   = second;
-        result.function  = third;
-      }
-
-      if (result.function.equalsIgnoreCase("int")) {
-            result.function = "int64";
-      }
-      return result;
-    }
-}
-
-List<Expression>ExpressionList() throws ParseException:
-{
-      Expression expr = null;
-      List<Expression> list = null;
-      List<Expression> exprList = new ArrayList<Expression>();
-}
-{
-    (
-      expr = Expression() { exprList.add(expr); }
-      (LOOKAHEAD(1) <COMMA> list = ExpressionList() { exprList.addAll(list); })?
-    )?
-    (LOOKAHEAD(1) Comma())?
-    {
-        return exprList;
-    }
-}
-
-DeleteStatement DeleteStatement() throws ParseException:
-{
-  VariableExpr var = null;
-  Expression condition = null;
-  Pair<Identifier, Identifier> nameComponents;
-  // This is related to the new metadata lock management
-  setDataverses(new ArrayList<String>());
-  setDatasets(new ArrayList<String>());
-
-}
-{
-  <DELETE> var = Variable()
-    {
-      getCurrentScope().addNewVarSymbolToScope(var.getVar());
-    }
-  <FROM> <DATASET> nameComponents  = QualifiedName()
-  (<WHERE> condition = Expression())?
-    {
-      // First we get the dataverses and datasets that we want to lock
-      List<String> dataverses = getDataverses();
-      List<String> datasets = getDatasets();
-      // we remove the pointer to the dataverses and datasets
-      setDataverses(null);
-      setDatasets(null);
-      return new DeleteStatement(var, nameComponents.first, nameComponents.second,
-          condition, getVarCounter(), dataverses, datasets);
-    }
-}
-
-Map<String,String>Properties() throws ParseException:
-{
-  Map<String,String> properties = new HashMap<String,String>();
-  Pair<String, String> property;
-}
-{
-  ( <LEFTPAREN> property = Property()
-    {
-      properties.put(property.first, property.second);
-    }
-  ( <COMMA> property = Property()
-    {
-      properties.put(property.first, property.second);
-    }
-  )* <RIGHTPAREN> )?
-    {
-      return properties;
-    }
-}
-
-Clause GroupClause() throws ParseException:
-{
-    GroupbyClause gbc = new GroupbyClause();
-    // GbyVariableExpressionPair pair = new GbyVariableExpressionPair();
-    List<GbyVariableExpressionPair> vePairList = new ArrayList<GbyVariableExpressionPair>();
-    List<GbyVariableExpressionPair> decorPairList = new ArrayList<GbyVariableExpressionPair>();
-    Map<Expression, VariableExpr> withVarMap = new HashMap<Expression, VariableExpr>();
-    VariableExpr var = null;
-    VariableExpr withVar = null;
-    Expression expr = null;
-    VariableExpr decorVar = null;
-    Expression decorExpr = null;
-}
-{
-      {
-        Scope newScope = extendCurrentScopeNoPush(true);
-        // extendCurrentScope(true);
-      }
-    <GROUP>
-      {
-         String hint = getHint(token);
-         if (hint != null && hint.equals(HASH_GROUP_BY_HINT)) {
-           gbc.setHashGroupByHint(true);
-         }
-      }
-    <BY> (LOOKAHEAD(2)  var = Variable()
-    {
-      newScope.addNewVarSymbolToScope(var.getVar());
-    } <ASSIGN>)?
-    expr = Expression()
-       {
-         GbyVariableExpressionPair pair1 = new GbyVariableExpressionPair(var, expr);
-         vePairList.add(pair1);
-       }
-    (<COMMA> ( LOOKAHEAD(2) var = Variable()
-    {
-      newScope.addNewVarSymbolToScope(var.getVar());
-    } <ASSIGN>)?
-        expr = Expression()
-         {
-           GbyVariableExpressionPair pair2 = new GbyVariableExpressionPair(var, expr);
-           vePairList.add(pair2);
-         }
-        )*
-    (<DECOR> decorVar = Variable() <ASSIGN> decorExpr = Expression()
-       {
-         newScope.addNewVarSymbolToScope(decorVar.getVar());
-         GbyVariableExpressionPair pair3 = new GbyVariableExpressionPair(decorVar, decorExpr);
-         decorPairList.add(pair3);
-       }
-      (<COMMA> <DECOR> decorVar = Variable() <ASSIGN> decorExpr = Expression()
-           {
-             newScope.addNewVarSymbolToScope(decorVar.getVar());
-             GbyVariableExpressionPair pair4 = new GbyVariableExpressionPair(decorVar, decorExpr);
-             decorPairList.add(pair4);
-           }
-       )*
-    )?
-    (<WITH>|<KEEPING>) withVar = VariableRef()
-    {
-      if(withVar.getIsNewVar()==true)
-          throw new ParseException("can't find variable " + withVar.getVar());
-      withVarMap.put(withVar, withVar);
-      newScope.addNewVarSymbolToScope(withVar.getVar());
-    }
-    (<COMMA> withVar = VariableRef()
-    {
-      if(withVar.getIsNewVar()==true)
-          throw new ParseException("can't find variable " + withVar.getVar());
-      withVarMap.put(withVar, withVar);
-      newScope.addNewVarSymbolToScope(withVar.getVar());
-    })*
-    {
-      gbc.setGbyPairList(vePairList);
-      gbc.setDecorPairList(decorPairList);
-      gbc.setWithVarMap(withVarMap);
-      replaceCurrentScope(newScope);
-      return gbc;
-    }
-}
-
-OrderedListTypeDefinition OrderedListTypeDef() throws ParseException:
-{
-  TypeExpression type = null;
-}
-{
-  <LEFTBRACKET>
-    ( type =  TypeExpr() )
-  <RIGHTBRACKET>
-  {
-    return new OrderedListTypeDefinition(type);
-  }
-}
-
-boolean IfNotExists() throws ParseException:
-{
-}
-{
-  (
-    LOOKAHEAD(1)
-    <IF>
-    <IDENTIFIER>
-    (
-      {
-        if(!token.image.equals("not")){
-           throw new ParseException("Expect word \"not\" at line " + token.beginLine + ", column "
-                         + token.beginColumn +"!");
-        }
-      }
-    )
-    <EXISTS>
-    {
-      return true;
-    }
-  )?
-    {
-      return false;
-    }
-}
-
-Expression ListConstructor() throws ParseException:
-{
-    Expression expr = null;
-}
-{
-    (
-        expr = OrderedListConstructor() | expr = UnorderedListConstructor()
-    )
-
-    {
-      return expr;
-    }
-}
-
-LoadStatement LoadStatement() throws ParseException:
-{
-  Identifier dataverseName = null;
-  Identifier datasetName = null;
-  boolean alreadySorted = false;
-  String adapterName;
-  Map<String,String> properties;
-  Pair<Identifier,Identifier> nameComponents = null;
-}
-{
-  <LOAD> <DATASET> nameComponents = QualifiedName()
-    {
-      dataverseName = nameComponents.first;
-      datasetName = nameComponents.second;
-    }
-  <USING> adapterName = AdapterName() properties = Configuration()
-  (<PRESORTED>
-    {
-      alreadySorted = true;
-    }
-  )?
-    {
-      return new LoadStatement(dataverseName, datasetName, adapterName, properties, alreadySorted);
-    }
-}
-
-Statement ChannelSubscriptionStatement() throws ParseException:
-{
-  Statement stmt = null;
-  Pair<Identifier,Identifier> nameComponents = null;
-  List<Expression> argList = new ArrayList<Expression>();
-  Expression tmp = null;
-  String id = null;
-  String subscriptionId = null;
-  Pair<Identifier,Identifier> brokerName = null;
-}
-{
-  (
-  "subscribe" <TO> nameComponents = QualifiedName()
-   <LEFTPAREN> (tmp = Expression()
-   {
-      argList.add(tmp);
-   }
-   (<COMMA> tmp = Expression()
-   {
-      argList.add(tmp);
-   }
-   )*)? <RIGHTPAREN> <ON> brokerName = QualifiedName()
-   {
-      stmt = new ChannelSubscribeStatement(nameComponents.first, nameComponents.second, argList, getVarCounter(), brokerName.first, brokerName.second, subscriptionId);
-   }
-   | "unsubscribe" id = StringLiteral() <FROM> nameComponents = QualifiedName()
-      {
-        setDataverses(new ArrayList<String>());
-        setDatasets(new ArrayList<String>());
-        VariableExpr varExp = new VariableExpr();
-        VarIdentifier var = new VarIdentifier();
-        varExp.setVar(var);
-        var.setValue("$subscriptionPlaceholder");
-        getCurrentScope().addNewVarSymbolToScope(varExp.getVar());
-        List<String> dataverses = getDataverses();
-        List<String> datasets = getDatasets();
-        // we remove the pointer to the dataverses and datasets
-        setDataverses(null);
-        setDatasets(null);
-        stmt = new ChannelUnsubscribeStatement(varExp, nameComponents.first, nameComponents.second, id, getVarCounter(), dataverses, datasets);
-      }
-     | "change" "subscription" subscriptionId = StringLiteral()  <ON> nameComponents = QualifiedName()
-       <LEFTPAREN> (tmp = Expression()
-       {
-         argList.add(tmp);
-       }
-       (<COMMA> tmp = Expression()
-       {
-         argList.add(tmp);
-       }
-       )*)? <RIGHTPAREN>
-        <TO> brokerName = QualifiedName()
-      {
-        stmt = new ChannelSubscribeStatement(nameComponents.first, nameComponents.second, argList, getVarCounter(), brokerName.first, brokerName.second, subscriptionId);
-      }
-    )
-    {
-      return stmt;
-    }
-}
-
-Expression UnaryExpr() throws ParseException:
-{
-    UnaryExpr uexpr = null;
-    Expression expr = null;
-}
-{
-    ( (<PLUS> | <MINUS>)
-    {
-          uexpr = new UnaryExpr();
-          try{
-            uexpr.setExprType(token.image);
-          } catch (AsterixException e){
-            throw new ParseException(e.getMessage());
-          }
-    }
-    )?
-
-    expr = ValueExpr()
-    {
-        if(uexpr!=null){
-            ((UnaryExpr)uexpr).setExpr(expr);
-            return uexpr;
-        }
-        else{
-            return expr;
-        }
-    }
-}
-
-Query Query() throws ParseException:
-{
-  Query query = new Query(false);
-  // we set the pointers to the dataverses and datasets lists to fill them with entities to be locked
-  setDataverses(query.getDataverses());
-  setDatasets(query.getDatasets());
-  Expression expr;
-}
-{
-  expr = Expression()
-    {
-      query.setBody(expr);
-      query.setVarCounter(getVarCounter());
-      // we remove the pointers to the locked entities before we return the query object
-      setDataverses(null);
-      setDatasets(null);
-      return query;
-    }
-}
-
-Expression ValueExpr() throws ParseException:
-{
-  Expression expr = null;
-  Identifier ident = null;
-  AbstractAccessor fa = null;
-  Expression indexExpr = null;
-}
-{
-  expr = PrimaryExpr() ( ident = Field()
-    {
-      fa = (fa == null ? new FieldAccessor(expr, ident)
-                       : new FieldAccessor(fa, ident));
-    }
-  | indexExpr = Index()
-    {
-      fa = (fa == null ? new IndexAccessor(expr, indexExpr)
-                       : new IndexAccessor(fa, indexExpr));
-     }
-  )*
-    {
-      return fa == null ? expr : fa;
-    }
-}
-
-TypeReferenceExpression TypeReference() throws ParseException:
-{
-  String id = null;
-}
-{
- id = Identifier()
-   {
-     if (id.equalsIgnoreCase("int")) {
-        id = "int64";
-     }
-
-     return new TypeReferenceExpression(new Identifier(id));
-   }
-}
-
-// Merged Non-terminal
-Statement DropStatement() throws ParseException:
-{
-  String id = null;
-  Pair<Identifier,Identifier> pairId = null;
-  Triple<Identifier,Identifier,Identifier> tripleId = null;
-  FunctionSignature funcSig = null;
-  boolean ifExists = false;
-  Statement stmt = null;
-}
-{
-  <DROP>
-  (
-    <DATASET> pairId = QualifiedName() ifExists = IfExists()
-      {
-        stmt = new DropDatasetStatement(pairId.first, pairId.second, ifExists);
-      }
-    | <INDEX> tripleId = DoubleQualifiedName() ifExists = IfExists()
-      {
-        stmt = new IndexDropStatement(tripleId.first, tripleId.second, tripleId.third, ifExists);
-      }
-    | <NODEGROUP> id = Identifier() ifExists = IfExists()
-      {
-        stmt = new NodeGroupDropStatement(new Identifier(id), ifExists);
-      }
-    | <TYPE> pairId = TypeName() ifExists = IfExists()
-      {
-        stmt = new TypeDropStatement(pairId.first, pairId.second, ifExists);
-      }
-    | <DATAVERSE> id = Identifier() ifExists = IfExists()
-      {
-        stmt = new DataverseDropStatement(new Identifier(id), ifExists);
-      }
-    | <FUNCTION> funcSig = FunctionSignature() ifExists = IfExists()
-      {
-        stmt = new FunctionDropStatement(funcSig, ifExists);
-      }
-    | <FEED> pairId = QualifiedName() ifExists = IfExists()
-      {
-        stmt = new FeedDropStatement(pairId.first, pairId.second, ifExists);
-      }
-    | <INGESTION> <POLICY> pairId = QualifiedName() ifExists = IfExists()
-      {
-        stmt = new FeedPolicyDropStatement(pairId.first, pairId.second, ifExists);
-      }
-    | <CHANNEL> pairId = QualifiedName() ifExists = IfExists()
-      {
-        stmt = new ChannelDropStatement(pairId.first, pairId.second, ifExists);
-      }
-      	      | <BROKER> pairId = QualifiedName() ifExists = IfExists()	
-      {	
-        stmt = new BrokerDropStatement(pairId.first, pairId.second, ifExists);	
-      }
-      
-  )
-  {
-  return stmt;
-  }
-}
-
-Expression ParenthesizedExpression() throws ParseException:
-{
-  Expression expr;
-}
-{
-    <LEFTPAREN> expr = Expression() <RIGHTPAREN>
-    {
-      return expr;
-    }
-}
-
-// Merged Non-terminal
-Statement CreateStatement() throws ParseException:
-{
-  String hint = null;
-  boolean dgen = false;
-  Statement stmt = null;
-}
-{
-  <CREATE>
-  (
-    {
-      hint = getHint(token);
-      if (hint != null && hint.startsWith(DGEN_HINT)) {
-        dgen = true;
-      }
-    }
-    stmt = TypeSpecification(hint, dgen)
-    | stmt = NodegroupSpecification()
-    | stmt = DatasetSpecification()
-    | stmt = IndexSpecification()
-    | stmt = DataverseSpecification()
-    | stmt = FunctionSpecification()
-    | stmt = FeedSpecification()
-    | stmt = FeedPolicySpecification()
-    | stmt = ChannelSpecification() | stmt = BrokerSpecification()
-  )
-  {
-  return stmt;
-  }
-}
-
-QuantifiedExpression QuantifiedExpression() throws ParseException:
-{
-  QuantifiedExpression qc = new QuantifiedExpression();
-  List<QuantifiedPair> quantifiedList = new ArrayList<QuantifiedPair>();
-  Expression satisfiesExpr;
-  VariableExpr var;
-  Expression inExpr;
-  QuantifiedPair pair;
-}
-{
-  {
-    createNewScope();
-  }
-
-   (      (<SOME>  {  qc.setQuantifier(QuantifiedExpression.Quantifier.SOME);    })
-        | (<EVERY> {  qc.setQuantifier(QuantifiedExpression.Quantifier.EVERY);    }))
-    var = Variable() <IN> inExpr = Expression()
-    {
-      pair = new QuantifiedPair(var, inExpr);
-      getCurrentScope().addNewVarSymbolToScope(var.getVar());
-      quantifiedList.add(pair);
-    }
-    (
-    <COMMA> var = Variable() <IN> inExpr = Expression()
-    {
-      pair = new QuantifiedPair(var, inExpr);
-      getCurrentScope().addNewVarSymbolToScope(var.getVar());
-      quantifiedList.add(pair);
-    }
-    )*
-     <SATISFIES> satisfiesExpr = Expression()
-     {
-       qc.setSatisfiesExpr(satisfiesExpr);
-       qc.setQuantifiedList(quantifiedList);
-       removeCurrentScope();
-       return qc;
-     }
-}
-
-String AdapterName() throws ParseException:
-{
-  String adapterName = null;
-}
-{
-  adapterName = Identifier()
-    {
-      return adapterName;
-    }
-}
-
-DataverseDecl DataverseDeclaration() throws ParseException:
-{
-  String dvName = null;
-}
-{
-  <USE> <DATAVERSE> dvName = Identifier()
-    {
-      defaultDataverse = dvName;
-      return new DataverseDecl(new Identifier(dvName));
-    }
-}
-
-CreateFeedStatement FeedSpecification() throws ParseException:
-{
-  Pair<Identifier,Identifier> nameComponents = null;
-  boolean ifNotExists = false;
-  String adapterName = null;
-  Map<String,String> properties = null;
-  FunctionSignature appliedFunction = null;
-  CreateFeedStatement cfs = null;
-  Pair<Identifier,Identifier> sourceNameComponents = null;
-
-}
-{
-  (
-    <SECONDARY> <FEED>  nameComponents = QualifiedName() ifNotExists = IfNotExists()
-    <FROM> <FEED> sourceNameComponents = QualifiedName() (appliedFunction = ApplyFunction())?
-    {
-      cfs = new CreateSecondaryFeedStatement(nameComponents, sourceNameComponents, appliedFunction, ifNotExists);
-    }
-   |
-    (<PRIMARY>)? <FEED> nameComponents = QualifiedName() ifNotExists = IfNotExists()
-    <USING> adapterName = AdapterName() properties = Configuration() (appliedFunction = ApplyFunction())?
-     {
-      cfs = new CreatePrimaryFeedStatement(nameComponents, adapterName, properties, appliedFunction, ifNotExists);
-     }
-  )
-  {
-    return cfs;
-  }
-}
-
-FunctionSignature FunctionSignature() throws ParseException:
-{
-  FunctionName fctName = null;
-  int arity = 0;
-}
-{
-  fctName = FunctionName() <SYMBOLAT> <INTEGER_LITERAL>
-    {
-      arity = new Integer(token.image);
-      if (arity < 0 && arity != FunctionIdentifier.VARARGS) {
-        throw new ParseException(" invalid arity:" + arity);
-      }
-
-      // TODO use fctName.library
-      String fqFunctionName = fctName.library == null ? fctName.function : fctName.library + "#" + fctName.function;
-      return new FunctionSignature(fctName.dataverse, fqFunctionName, arity);
-    }
-}
-
-FieldBinding FieldBinding() throws ParseException:
-{
-    FieldBinding fb = new FieldBinding();
-    Expression left, right;
-}
-{
-    left = Expression() <COLON> right = Expression()
-    {
-      fb.setLeftExpr(left);
-      fb.setRightExpr(right);
-      return fb;
-    }
-}
-
-DatasetDecl DatasetSpecification() throws ParseException:
-{
-  Pair<Identifier,Identifier> nameComponents = null;
-  boolean ifNotExists = false;
-  Pair<Identifier,Identifier> typeComponents = null;
-  String adapterName = null;
-  Map<String,String> properties = null;
-  Map<String,String> compactionPolicyProperties = null;
-  FunctionSignature appliedFunction = null;
-  Pair<List<Integer>, List<List<String>>> primaryKeyFields = null;
-  String nodeGroupName = null;
-  Map<String,String> hints = new HashMap<String,String>();
-  DatasetDecl dsetDecl = null;
-  boolean autogenerated = false;
-  String compactionPolicy = null;
-  boolean temp = false;
-  Pair<Integer, List<String>> filterField = null;
-  Pair<Identifier,Identifier> metaTypeComponents = new Pair<Identifier, Identifier>(null, null);
-}
-{
-  (
-    <EXTERNAL> <DATASET> nameComponents = QualifiedName()
-    <LEFTPAREN> typeComponents = TypeName() <RIGHTPAREN>
-    ifNotExists = IfNotExists()
-    <USING> adapterName = AdapterName() properties = Configuration()
-    ( <ON> nodeGroupName = Identifier() )?
-    ( <HINTS> hints = Properties() )?
-    ( <USING> <COMPACTION> <POLICY> compactionPolicy = CompactionPolicy() (compactionPolicyProperties = Configuration())? )?
-      {
-        ExternalDetailsDecl edd = new ExternalDetailsDecl();
-        edd.setAdapter(adapterName);
-        edd.setProperties(properties);
-        dsetDecl = new DatasetDecl(nameComponents.first,
-                                   nameComponents.second,
-                                   typeComponents.first,
-                                   typeComponents.second,
-                                   metaTypeComponents.first,
-                                   metaTypeComponents.second,
-                                   nodeGroupName != null? new Identifier(nodeGroupName): null,
-                                   compactionPolicy,
-                                   compactionPolicyProperties,
-                                   hints,
-                                   DatasetType.EXTERNAL,
-                                   edd,
-                                   ifNotExists);
-      }
-
-    | (<INTERNAL> | <TEMPORARY> {
-            temp = token.image.toLowerCase().equals("temporary");
-        }
-      )?
-    <DATASET> nameComponents = QualifiedName()
-    <LEFTPAREN> typeComponents = TypeName() <RIGHTPAREN>
-    (
-        { String name; }
-        <WITH>
-        name = Identifier()
-        {
-            if(!name.equals("meta")){
-                throw new ParseException("We can only support one additional associated field called \"meta\".");
-            }
-        }
-        <LEFTPAREN> metaTypeComponents = TypeName() <RIGHTPAREN>
-    )?
-    ifNotExists = IfNotExists()
-    primaryKeyFields = PrimaryKey()
-    ( <AUTOGENERATED> { autogenerated = true; } )?
-    ( <ON> nodeGroupName = Identifier() )?
-    ( <HINTS> hints = Properties() )?
-    ( <USING> <COMPACTION> <POLICY> compactionPolicy = CompactionPolicy() (compactionPolicyProperties = Configuration())? )?
-    ( <WITH> <FILTER> <ON> filterField = NestedField() )?
-      {
-        if(filterField!=null && filterField.first!=0){
-          throw new ParseException("A filter field can only be a field in the main record of the dataset.");
-        }
-        InternalDetailsDecl idd = new InternalDetailsDecl(primaryKeyFields.second,
-                                                          primaryKeyFields.first,
-                                                          autogenerated,
-                                                          filterField == null? null : filterField.second,
-                                                          temp);
-        dsetDecl = new DatasetDecl(nameComponents.first,
-                                   nameComponents.second,
-                                   typeComponents.first,
-                                   typeComponents.second,
-                                   metaTypeComponents.first,
-                                   metaTypeComponents.second,
-                                   nodeGroupName != null ? new Identifier(nodeGroupName) : null,
-                                   compactionPolicy,
-                                   compactionPolicyProperties,
-                                   hints,
-                                   DatasetType.INTERNAL,
-                                   idd,
-                                   ifNotExists);
-      }
-  )
-    {
-      return dsetDecl;
-    }
-}
-
-Clause WhereClause() throws ParseException:
-{
-  WhereClause wc = new WhereClause();
-  Expression whereExpr;
-}
-{
-    <WHERE> whereExpr = Expression()
-    {
-      wc.setWhereExpr(whereExpr);
-      return wc;
-    }
-}
-
-Pair<String, String>KeyValuePair() throws ParseException:
-{
-  String key;
-  String value;
-}
-{
-  <LEFTPAREN> key = StringLiteral() <EQ> value = StringLiteral() <RIGHTPAREN>
-    {
-      return new Pair<String, String>(key, value);
-    }
-}
-
-Statement FeedStatement() throws ParseException:
-{
-  Pair<Identifier,Identifier> feedNameComponents = null;
-  Pair<Identifier,Identifier> datasetNameComponents = null;
-
-  Map<String,String> configuration = null;
-  Statement stmt = null;
-  String policy = null;
-}
-{
-  (
-    <CONNECT> <FEED> feedNameComponents = QualifiedName() <TO> <DATASET> datasetNameComponents = QualifiedName() (policy = GetPolicy())?
-      {
-        stmt = new ConnectFeedStatement(feedNameComponents, datasetNameComponents, policy, getVarCounter());
-      }
-    | <DISCONNECT> <FEED> feedNameComponents = QualifiedName() <FROM> <DATASET> datasetNameComponents = QualifiedName()
-      {
-        stmt = new DisconnectFeedStatement(feedNameComponents, datasetNameComponents);
-      }
-  )
-    {
-      return stmt;
-    }
-}
-
-CreateFeedPolicyStatement FeedPolicySpecification() throws ParseException:
-{
-  String policyName = null;
-  String basePolicyName = null;
-  String sourcePolicyFile = null;
-  String definition = null;
-  boolean ifNotExists = false;
-  Map<String,String> properties = null;
-  CreateFeedPolicyStatement cfps = null;
-}
-{
-  (
-    <INGESTION> <POLICY>  policyName = Identifier() ifNotExists = IfNotExists()
-    <FROM>
-    (
-      <POLICY> basePolicyName = Identifier() properties = Configuration() ( <DEFINITION> definition = StringLiteral())?
-      {
-        cfps = new CreateFeedPolicyStatement(policyName, basePolicyName, properties, definition, ifNotExists);
-      }
-     |<PATH> sourcePolicyFile = StringLiteral() (<DEFINITION> definition = StringLiteral())?
-      {
-        cfps = new CreateFeedPolicyStatement(policyName, sourcePolicyFile, definition, ifNotExists);
-      }
-    )
-  )
-  {
-    return cfps;
-  }
-}
-
-VariableExpr VariableRef() throws ParseException:
-{
-    VariableExpr varExp = new VariableExpr();
-    VarIdentifier var = new VarIdentifier();
-}
-{
-  <VARIABLE>
-    {
-     String varName = token.image;
-     Identifier ident = lookupSymbol(varName);
-     if (isInForbiddenScopes(varName)) {
-       throw new ParseException("Inside limit clauses, it is disallowed to reference a variable having the same name as any variable bound in the same scope as the limit clause.");
-     }
-     if(ident != null) { // exist such ident
-       varExp.setIsNewVar(false);
-       varExp.setVar((VarIdentifier)ident);
-     } else {
-       varExp.setVar(var);
-     }
-     var.setValue(varName);
-     return varExp;
-    }
-}
-
-ListConstructor OrderedListConstructor() throws ParseException:
-{
-      ListConstructor expr = new ListConstructor();
-      List<Expression> exprList = null;
-      expr.setType(ListConstructor.Type.ORDERED_LIST_CONSTRUCTOR);
-}
-{
-    <LEFTBRACKET> exprList = ExpressionList() <RIGHTBRACKET>
-    {
-      expr.setExprList(exprList);
-      return expr;
-    }
-}
-
-VariableExpr Variable() throws ParseException:
-{
-    VariableExpr varExp = new VariableExpr();
-    VarIdentifier var = new VarIdentifier();
-}
-{
-  <VARIABLE>
-    {
-     Identifier ident = lookupSymbol(token.image);
-     if(ident != null) { // exist such ident
-       varExp.setIsNewVar(false);
-     }
-     varExp.setVar(var);
-     var.setValue(token.image);
-     return varExp;
-    }
-}
-
-CreateChannelStatement ChannelSpecification() throws ParseException:
-{
-  Pair<Identifier,Identifier> nameComponents = null;
-  FunctionSignature appliedFunction = null;
-  CreateChannelStatement ccs = null;
-  String fqFunctionName = null;
-  Expression period = null;
-}
-{
-  (
-    "repetitive" <CHANNEL>  nameComponents = QualifiedName()
-    <USING> appliedFunction = FunctionSignature()
-    "period" period = FunctionCallExpr()
-    {
-      ccs = new CreateChannelStatement(nameComponents.first,
-                                   nameComponents.second, appliedFunction, period);
-    }
-  )
-    {
-      return ccs;
-    }
-}
-
-UpdateStatement UpdateStatement() throws ParseException:
-{
-  VariableExpr vars;
-  Expression target;
-  Expression condition;
-  UpdateClause uc;
-  List<UpdateClause> ucs = new ArrayList<UpdateClause>();
-}
-{
-  <UPDATE> vars = Variable() <IN> target = Expression()
-  <WHERE> condition = Expression()
-  <LEFTPAREN> (uc = UpdateClause()
-    {
-      ucs.add(uc);
-    }
-  (<COMMA> uc = UpdateClause()
-    {
-      ucs.add(uc);
-    }
-  )*) <RIGHTPAREN>
-    {
-      return new UpdateStatement(vars, target, condition, ucs);
-    }
-}
-
-RecordConstructor RecordConstructor() throws ParseException:
-{
-      RecordConstructor expr = new RecordConstructor();
-      FieldBinding tmp = null;
-      List<FieldBinding> fbList = new ArrayList<FieldBinding>();
-}
-{
-    <LEFTBRACE> (tmp = FieldBinding()
-    {
-      fbList.add(tmp);
-    }
-    (<COMMA> tmp = FieldBinding() { fbList.add(tmp);  })*)? <RIGHTBRACE>
-    {
-      expr.setFbList(fbList);
-      return expr;
-    }
-}
-
-Expression ExponentExpr() throws ParseException:
-{
-  OperatorExpr op = null;
-  Expression operand = null;
-}
-{
-    operand = UnionExpr()
-
-    ( <CARET>
-      {
-        if (op == null) {
-          op = new OperatorExpr();
-          op.addOperand(operand);
-          op.setCurrentop(true);
-        }
-        try{
-          op.addOperator(token.image);
-        } catch (AsterixException e){
-          throw new ParseException(e.getMessage());
-        }
-    }
-    operand = UnionExpr()
-    {
-       op.addOperand(operand);
-    }
-    )?
-
-    {
-       return op==null?operand:op;
-    }
-}
-
-CreateFunctionStatement FunctionSpecification() throws ParseException:
-{
-  FunctionSignature signature;
-  boolean ifNotExists = false;
-  List<VarIdentifier> paramList = new ArrayList<VarIdentifier>();
-  String functionBody;
-  VarIdentifier var = null;
-  Expression functionBodyExpr;
-  Token beginPos;
-  Token endPos;
-  FunctionName fctName = null;
-
-  createNewScope();
-}
-{
-  <FUNCTION> fctName = FunctionName()
-  ifNotExists = IfNotExists()
-  paramList = ParameterList()
-  <LEFTBRACE>
-  {
-     beginPos = token;
-  }
-  functionBodyExpr = Expression() <RIGHTBRACE>
-    {
-      endPos = token;
-      functionBody = extractFragment(beginPos.beginLine, beginPos.beginColumn, endPos.beginLine, endPos.beginColumn);
-      // TODO use fctName.library
-      signature = new FunctionSignature(fctName.dataverse, fctName.function, paramList.size());
-      getCurrentScope().addFunctionDescriptor(signature, false);
-      removeCurrentScope();
-      return new CreateFunctionStatement(signature, paramList, functionBody, ifNotExists);
-    }
-}
-
-List<VarIdentifier>ParameterList() throws ParseException:
-{
-  List<VarIdentifier> paramList = new ArrayList<VarIdentifier>();
-  VarIdentifier var = null;
-}
-{
-  <LEFTPAREN> (<VARIABLE>
-    {
-      var = new VarIdentifier();
-      var.setValue(token.image);
-      paramList.add(var);
-      getCurrentScope().addNewVarSymbolToScope(var);
-    }
-  ( <COMMA> <VARIABLE>
-    {
-      var = new VarIdentifier();
-      var.setValue(token.image);
-      paramList.add(var);
-      getCurrentScope().addNewVarSymbolToScope(var);
-    }
-  )*)? <RIGHTPAREN>
-    {
-      return paramList;
-    }
-}
-
-CreateDataverseStatement DataverseSpecification() throws ParseException:
-{
-  String dvName = null;
-  boolean ifNotExists = false;
-  String format = null;
-}
-{
-  <DATAVERSE> dvName = Identifier()
-  ifNotExists = IfNotExists()
-  ( <WITH> <FORMAT> format = StringLiteral() )?
-    {
-      return new CreateDataverseStatement(new Identifier(dvName), format, ifNotExists);
-    }
-}
-
-void Comma() :
-{}
-{
-   <COMMA>
-}
-
-Pair<String, String>Property() throws ParseException:
-{
-  String key;
-  String value;
-}
-{
-  key = Identifier() <EQ> ( value = StringLiteral() | <INTEGER_LITERAL>
-    {
-      try {
-        value = "" + Long.valueOf(token.image);
-      } catch (NumberFormatException nfe) {
-        throw new ParseException("inapproriate value: " + token.image);
-      }
-    }
-  )
-    {
-      return new Pair<String, String>(key.toUpperCase(), value);
-    }
-}
-
-Expression Expression() :
-{
-  Expression expr = null;
-  Expression exprP = null;
-}
-{
-(
-
-//OperatorExpr | IfThenElse | FLWOGRExpression | QuantifiedExpression
-    expr = OperatorExpr()
-    | expr = IfThenElse()
-    | expr = FLWOGR()
-    | expr = QuantifiedExpression()
-
-
-)
-    {
-      return (exprP==null) ? expr : exprP;
-    }
-}
-
-CreateIndexStatement IndexSpecification() throws ParseException:
-{
-  CreateIndexStatement cis = new CreateIndexStatement();
-  String indexName = null;
-  boolean ifNotExists = false;
-  Pair<Identifier,Identifier> nameComponents = null;
-  Pair<Integer, Pair<List<String>, TypeExpression>> fieldPair = null;
-  IndexParams indexType = null;
-  boolean enforced = false;
-}
-{
-  <INDEX> indexName = Identifier()
-  ifNotExists = IfNotExists()
-  <ON> nameComponents = QualifiedName()
-  <LEFTPAREN> ( fieldPair = OpenField()
-    {
-       cis.addFieldExprPair(fieldPair.second);
-       cis.addFieldIndexIndicator(fieldPair.first);
-    }
-  ) (<COMMA> fieldPair = OpenField()
-    {
-       cis.addFieldExprPair(fieldPair.second);
-       cis.addFieldIndexIndicator(fieldPair.first);
-    }
-  )* <RIGHTPAREN> ( <TYPE> indexType = IndexType() )? ( <ENFORCED> { enforced = true; } )?
-    {
-      cis.setIndexName(new Identifier(indexName));
-      cis.setIfNotExists(ifNotExists);
-      cis.setDataverseName(nameComponents.first);
-      cis.setDatasetName(nameComponents.second);
-      if (indexType != null) {
-        cis.setIndexType(indexType.type);
-        cis.setGramLength(indexType.gramLength);
-      }
-      cis.setEnforced(enforced);
-      return cis;
-    }
-}
-
-RecordTypeDefinition RecordTypeDef() throws ParseException:
-{
-  RecordTypeDefinition recType = new RecordTypeDefinition();
-  RecordTypeDefinition.RecordKind recordKind = null;
-}
-{
-  ( <CLOSED>{ recordKind = RecordTypeDefinition.RecordKind.CLOSED; }
-    | <OPEN>{ recordKind = RecordTypeDefinition.RecordKind.OPEN; } )?
-   <LEFTBRACE>
-    {
-      String hint = getHint(token);
-      if (hint != null) {
-        String splits[] = hint.split(" +");
-        if (splits[0].equals(GEN_FIELDS_HINT)) {
-          if (splits.length != 5) {
-            throw new ParseException("Expecting: /*+ gen-fields <type> <min> <max> <prefix>*/");
-          }
-          if (!splits[1].equals("int")) {
-            throw new ParseException("The only supported type for gen-fields is int.");
-          }
-          UndeclaredFieldsDataGen ufdg = new UndeclaredFieldsDataGen(UndeclaredFieldsDataGen.Type.INT,
-             Integer.parseInt(splits[2]), Integer.parseInt(splits[3]), splits[4]);
-          recType.setUndeclaredFieldsDataGen(ufdg);
-        }
-      }
-
-    }
-        (
-          RecordField(recType)
-          ( <COMMA>  RecordField(recType) )*
-        )?
-   <RIGHTBRACE>
-   {
-      if (recordKind == null) {
-        recordKind = RecordTypeDefinition.RecordKind.OPEN;
-      }
-      recType.setRecordKind(recordKind);
-      return recType;
-   }
-}
-
-UnorderedListTypeDefinition UnorderedListTypeDef() throws ParseException:
-{
-  TypeExpression type = null;
-}
-{
-  <LEFTDBLBRACE>
-    ( type =  TypeExpr() )
-  <RIGHTDBLBRACE>
-  {
-    return new UnorderedListTypeDefinition(type);
-  }
-}
-
-TypeExpression IndexedTypeExpr() throws ParseException:
-{
-  TypeExpression typeExpr = null;
-}
-{
-  (
-      typeExpr = TypeReference()
-    | typeExpr = OrderedListTypeDef()
-    | typeExpr = UnorderedListTypeDef()
-  )
-  {
-    return typeExpr;
-  }
-}
-
-NodegroupDecl NodegroupSpecification() throws ParseException:
-{
-  String name = null;
-  String tmp = null;
-  boolean ifNotExists = false;
-  List<Identifier>ncNames = null;
-}
-{
-  <NODEGROUP> name = Identifier()
-  ifNotExists = IfNotExists() <ON> tmp = Identifier()
-    {
-      ncNames = new ArrayList<Identifier>();
-      ncNames.add(new Identifier(tmp));
-    }
-  ( <COMMA> tmp = Identifier()
-    {
-      ncNames.add(new Identifier(tmp));
-    }
-  )*
-    {
-      return new NodegroupDecl(new Identifier(name), ncNames, ifNotExists);
-    }
-}
-
-Pair<Identifier,Identifier>TypeName() throws ParseException:
-{
-  Pair<Identifier,Identifier> name = null;
-}
-{
-  name = QualifiedName()
-    {
-      if (name.first == null) {
-        name.first = new Identifier(defaultDataverse);
-      }
-      return name;
-    }
-}
-
-Pair<List<Integer>, List<List<String>>>PrimaryKey() throws ParseException:
-{
-   Pair<Integer, List<String>> tmp = null;
-   List<Integer> keyFieldSourceIndicators = new ArrayList<Integer>();
-   List<List<String>> primaryKeyFields = new ArrayList<List<String>>();
-}
-{
-  <PRIMARY> <KEY> tmp = NestedField()
-    {
-      keyFieldSourceIndicators.add(tmp.first);
-      primaryKeyFields.add(tmp.second);
-    }
-  ( <COMMA> tmp = NestedField()
-    {
-      keyFieldSourceIndicators.add(tmp.first);
-      primaryKeyFields.add(tmp.second);
-    }
-  )*
-    {
-      return new Pair<List<Integer>, List<List<String>>> (keyFieldSourceIndicators, primaryKeyFields);
-    }
-}
-
-TypeExpression TypeExpr() throws ParseException:
-{
-  TypeExpression typeExpr = null;
-}
-{
-  (
-      typeExpr = RecordTypeDef()
-    | typeExpr = TypeReference()
-    | typeExpr = OrderedListTypeDef()
-    | typeExpr = UnorderedListTypeDef()
-  )
-  {
-    return typeExpr;
-  }
-}
-
-Map<String,String>Configuration() throws ParseException:
-{
-    Map<String,String> configuration = new LinkedHashMap<String,String>();
-    Pair<String, String> keyValuePair = null;
-}
-{
-  <LEFTPAREN> ( keyValuePair = KeyValuePair()
-    {
-      configuration.put(keyValuePair.first, keyValuePair.second);
-    }
-  ( <COMMA> keyValuePair = KeyValuePair()
-    {
-      configuration.put(keyValuePair.first, keyValuePair.second);
-    }
-  )* )? <RIGHTPAREN>
-    {
-      return configuration;
-    }
-}
-< DEFAULT,IN_DBL_BRACE >
- TOKEN [IGNORE_CASE] :
-{
-    <BROKER : "broker">
-  | <CHANNEL : "channel">
-}
-< DEFAULT,IN_DBL_BRACE >
- TOKEN :
-{
-    <APPLY : "apply">
-  | <AS : "as">
-  | <ASC : "asc">
-  | <AT : "at">
-  | <AUTOGENERATED : "autogenerated">
-  | <BTREE : "btree">
-  | <BY : "by">
-  | <CLOSED : "closed">
-  | <COMPACT : "compact">
-  | <COMPACTION : "compaction">
-  | <CONNECT : "connect">
-  | <CREATE : "create">
-  | <DATASET : "dataset">
-  | <DATAVERSE : "dataverse">
-  | <DECLARE : "declare">
-  | <DECOR : "decor">
-  | <DEFINITION : "definition">
-  | <DELETE : "delete">
-  | <DESC : "desc">
-  | <DISCONNECT : "disconnect">
-  | <DISTINCT : "distinct">
-  | <DROP : "drop">
-  | <ELSE : "else">
-  | <ENFORCED : "enforced">
-  | <EVERY : "every">
-  | <EXISTS : "exists">
-  | <EXTERNAL : "external">
-  | <FEED : "feed">
-  | <FILTER : "filter">
-  | <FOR : "for">
-  | <FORMAT : "format">
-  | <FROM : "from">
-  | <FUNCTION : "function">
-  | <GROUP : "group">
-  | <HINTS : "hints">
-  | <IF : "if">
-  | <IN : "in">
-  | <INDEX : "index">
-  | <INGESTION : "ingestion">
-  | <INSERT : "insert">
-  | <INTERNAL : "internal">
-  | <INTO : "into">
-  | <KEY : "key">
-  | <KEYWORD : "keyword">
-  | <KEEPING : "keeping">
-  | <LET : "let">
-  | <LIMIT : "limit">
-  | <LOAD : "load">
-  | <NGRAM : "ngram">
-  | <NODEGROUP : "nodegroup">
-  | <OFFSET : "offset">
-  | <ON : "on">
-  | <OPEN : "open">
-  | <ORDER : "order">
-  | <OUTPUT : "output">
-  | <PATH : "path">
-  | <POLICY : "policy">
-  | <PRESORTED : "pre-sorted">
-  | <PRIMARY : "primary">
-  | <REFRESH : "refresh">
-  | <RETURN : "return">
-  | <RTREE : "rtree">
-  | <RUN : "run">
-  | <SATISFIES : "satisfies">
-  | <SECONDARY : "secondary">
-  | <SELECT : "select">
-  | <SET : "set">
-  | <SOME : "some">
-  | <TEMPORARY : "temporary">
-  | <THEN : "then">
-  | <TO : "to">
-  | <TYPE : "type">
-  | <UNION : "union">
-  | <UPDATE : "update">
-  | <UPSERT : "upsert">
-  | <USE : "use">
-  | <USING : "using">
-  | <WHERE : "where">
-  | <WITH : "with">
-  | <WRITE : "write">
-}
-< DEFAULT,IN_DBL_BRACE >
- TOKEN :
-{
-    <CARET : "^">
-  | <DIV : "/">
-  | <IDIV : "idiv">
-  | <MINUS : "-">
-  | <MOD : "%">
-  | <MUL : "*">
-  | <PLUS : "+">
-
-  | <LEFTPAREN : "(">
-  | <RIGHTPAREN : ")">
-  | <LEFTBRACKET : "[">
-  | <RIGHTBRACKET : "]">
-
-  | <COLON : ":">
-  | <COMMA : ",">
-  | <DOT : ".">
-  | <QUES : "?">
-
-  | <LT : "<">
-  | <GT : ">">
-  | <LE : "<=">
-  | <GE : ">=">
-  | <EQ : "=">
-  | <NE : "!=">
-  | <SIMILAR : "~=">
-  | <ASSIGN : ":=">
-
-  | <AND : "and">
-  | <OR : "or">
-
-  | <SYMBOLAT : "@">
-  | <SYMBOLHASH : "#">
-}
-< DEFAULT,IN_DBL_BRACE >
- TOKEN :
-{
-    <LEFTBRACE : "{"> { pushState(); } : DEFAULT
-}
-< DEFAULT >
- TOKEN :
-{
-    <RIGHTBRACE : "}"> { popState("}"); }
-}
-< DEFAULT,IN_DBL_BRACE >
- TOKEN :
-{
-    <LEFTDBLBRACE : "{{"> { pushState(); } : IN_DBL_BRACE
-}
-< IN_DBL_BRACE >
- TOKEN :
-{
-    <RIGHTDBLBRACE : "}}"> { popState("}}"); }
-}
-< DEFAULT,IN_DBL_BRACE >
- TOKEN :
-{
-    <INTEGER_LITERAL : (<DIGIT>)+ >
-}
-< DEFAULT,IN_DBL_BRACE >
- TOKEN :
-{
-  < MISSING : "missing">
-  | <NULL : "null">
-  | <TRUE : "true">
-  | <FALSE : "false">
-}
-< DEFAULT,IN_DBL_BRACE >
- TOKEN :
-{
-    <#DIGIT : ["0" - "9"]>
-}
-< DEFAULT,IN_DBL_BRACE >
- TOKEN :
-{
-    < DOUBLE_LITERAL: <DIGITS>
-        | <DIGITS> ( "." <DIGITS> )?
-        | "." <DIGITS>
-    >
-  | < FLOAT_LITERAL: <DIGITS> ( "f" | "F" )
-        | <DIGITS> ( "." <DIGITS> ( "f" | "F" ) )?
-        | "." <DIGITS> ( "f" | "F" )
-    >
-  | <DIGITS : (<DIGIT>)+ >
-}
-< DEFAULT,IN_DBL_BRACE >
- TOKEN :
-{
-    <#LETTER : ["A" - "Z", "a" - "z"]>
-  | <SPECIALCHARS : ["$", "_", "-"]>
-}
-< DEFAULT,IN_DBL_BRACE >
- TOKEN :
-{
-    // backslash u + 4 hex digits escapes are handled in the underlying JavaCharStream
-    <STRING_LITERAL : ("\"" (
-          <EscapeQuot>
-        | <EscapeBslash>
-        | <EscapeSlash>
-        | <EscapeBspace>
-        | <EscapeFormf>
-        | <EscapeNl>
-        | <EscapeCr>
-        | <EscapeTab>
-        | ~["\"","\\"])* "\"")
-      | ("\'"(
-          <EscapeApos>
-        | <EscapeBslash>
-        | <EscapeSlash>
-        | <EscapeBspace>
-        | <EscapeFormf>
-        | <EscapeNl>
-        | <EscapeCr>
-        | <EscapeTab>
-        | ~["\'","\\"])* "\'")>
-  | < #EscapeQuot: "\\\"" >
-  | < #EscapeApos: "\\\'" >
-  | < #EscapeBslash: "\\\\" >
-  | < #EscapeSlash: "\\/" >
-  | < #EscapeBspace: "\\b" >
-  | < #EscapeFormf: "\\f" >
-  | < #EscapeNl: "\\n" >
-  | < #EscapeCr: "\\r" >
-  | < #EscapeTab: "\\t" >
-}
-< DEFAULT,IN_DBL_BRACE >
- TOKEN :
-{
-    <IDENTIFIER : <LETTER> (<LETTER> | <DIGIT> | <SPECIALCHARS>)*>
-}
-< DEFAULT,IN_DBL_BRACE >
- TOKEN :
-{
-    <VARIABLE : "$" <LETTER> (<LETTER> | <DIGIT> | "_")*>
-}
-< DEFAULT,IN_DBL_BRACE >
- SKIP :
-{
-    " "
-  | "\t"
-  | "\r"
-  | "\n"
-}
-< DEFAULT,IN_DBL_BRACE >
- SKIP :
-{
-    <"//" (~["\n"])* "\n">
-}
-< DEFAULT,IN_DBL_BRACE >
- SKIP :
-{
-    <"//" (~["\n","\r"])* ("\n"|"\r"|"\r\n")?>
-}
-< DEFAULT,IN_DBL_BRACE >
- SKIP :
-{
-    <"/*"> { pushState(); } : INSIDE_COMMENT
-}
-< INSIDE_COMMENT >
- SPECIAL_TOKEN :
-{
-    <"+"(" ")*(~["*"])*>
-}
-< INSIDE_COMMENT >
- SKIP :
-{
-    <"/*"> { pushState(); }
-}
-< INSIDE_COMMENT >
- SKIP :
-{
-    <"*/"> { popState("*/"); }
-  | <~[]>
-}