Repository: asterixdb Updated Branches: refs/heads/master 73715d878 -> 92c0bac18
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/92c0bac1/asterixdb/asterix-algebra/src/main/javacc/AQLPlus.jj ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-algebra/src/main/javacc/AQLPlus.jj b/asterixdb/asterix-algebra/src/main/javacc/AQLPlus.jj deleted file mode 100644 index b44e1bc..0000000 --- a/asterixdb/asterix-algebra/src/main/javacc/AQLPlus.jj +++ /dev/null @@ -1,1701 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -options { - - - STATIC = false; - -} - - -PARSER_BEGIN(AQLPlusParser) - -package org.apache.asterix.aqlplus.parser; - -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.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.asterix.common.exceptions.CompilationException; -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.clause.JoinClause; -import org.apache.asterix.lang.aql.clause.MetaVariableClause; -import org.apache.asterix.lang.aql.expression.FLWOGRExpression; -import org.apache.asterix.lang.aql.expression.MetaVariableExpr; -import org.apache.asterix.lang.aql.expression.UnionExpr; -import org.apache.asterix.lang.common.base.Clause; -import org.apache.asterix.lang.common.base.Expression; -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.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.IntegerLiteral; -import org.apache.asterix.lang.common.literal.LongIntegerLiteral; -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.DataverseDecl; -import org.apache.asterix.lang.common.statement.FunctionDecl; -import org.apache.asterix.lang.common.statement.LoadStatement; -import org.apache.asterix.lang.common.statement.Query; -import org.apache.asterix.lang.common.statement.SetStatement; -import org.apache.asterix.lang.common.statement.TypeDecl; -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.core.algebra.expressions.IndexedNLJoinExpressionAnnotation; - - -public class AQLPlusParser extends ScopeChecker { - -/* - private void printHints(Token t) { - //System.err.println("token="+t.image+"\t special="+t.specialToken); - if (t.specialToken == null) return; - Token tmp_t = t.specialToken; - while (tmp_t.specialToken != null) tmp_t = tmp_t.specialToken; - while (tmp_t != null) { - System.out.println(tmp_t.image); - tmp_t = tmp_t.next; - } - } -*/ - - private static final String HASH_GROUP_BY_HINT = "hash"; - private static final String BROADCAST_JOIN_HINT = "bcast"; - private static final String INMEMORY_HINT = "inmem"; - private static final String INDEXED_NESTED_LOOP_JOIN_HINT = "indexnl"; - - - - 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(); - } - - public static void main(String args[]) throws ParseException, TokenMgrError, IOException, FileNotFoundException, CompilationException { - File file = new File(args[0]); - Reader fis = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); - AQLPlusParser parser = new AQLPlusParser(fis); - List<Statement> st = parser.Statement(); - } - - public void initScope() { - scopeStack.push(RootScopeFactory.createRootScope(this)); - } -} - -PARSER_END(AQLPlusParser) - - -List<Statement> Statement() throws ParseException: -{ - Query query = null; - // scopeStack.push(RootScopeFactory.createRootScope(this)); - initScope(); - List<Statement> decls = new ArrayList<Statement>(); -} -{ - ( - ( - ( - "use" - { - decls.add(DataverseDeclaration()); - } - | "declare" - ( "function" { - decls.add(FunctionDeclaration()); - } - | "type" { - decls.add(TypeDeclaration()); - } - ) - | "load" { - decls.add(LoadStatement()); - } - - | "write" { - decls.add(WriteStatement()); - } - | "set" { - decls.add(SetStatement()); - } - | - { - decls.add(Query()) ; - } ";" - - - )* - ) - - <EOF> - ) - { - - return decls; - } -} - -Statement SetStatement() throws ParseException: -{ - String pn = null; - Statement stmt = null; -} -{ - <IDENTIFIER> { pn = token.image; } - <STRING_LITERAL> - { String pv = removeQuotesAndEscapes(token.image); } - ";" - { - return new SetStatement(pn, pv); - } -} - -Statement WriteStatement() throws ParseException: -{ - Identifier nodeName = null; - String fileName = null; - Identifier datasetName = null; - Statement stmt = null; - Query query; -} -{ - ( "output" "to" - <IDENTIFIER> { nodeName = new Identifier(token.image); } - ":" <STRING_LITERAL> { - fileName = removeQuotesAndEscapes(token.image); - stmt = new WriteStatement(nodeName, fileName, null); - } - ) ";" - { - return stmt; - } -} - -DataverseDecl DataverseDeclaration() throws ParseException: -{ - Identifier dvName = null; -} -{ - "dataverse" <IDENTIFIER> { defaultDataverse = token.image;} - ";" - { - return new DataverseDecl(new Identifier(defaultDataverse)); - } -} - -LoadStatement LoadStatement() throws ParseException: -{ - Identifier datasetName = null; - boolean alreadySorted = false; - String adapter; - Map<String,String> properties = new HashMap<String,String>(); - String name; - String value; -} -{ - <DATASET> <IDENTIFIER> { datasetName = new Identifier(token.image); } - - "using" - ( - <STRING_LITERAL> - { - adapter = removeQuotesAndEscapes(token.image); - } - <LEFTPAREN> - ( - ( - <LEFTPAREN> - ( - <STRING_LITERAL> - { - name = removeQuotesAndEscapes(token.image); - } - "=" <STRING_LITERAL> - { - value = removeQuotesAndEscapes(token.image); - } - ) - <RIGHTPAREN> - { - properties.put(name, value); - } - ) - ( - "," <LEFTPAREN> - ( - <STRING_LITERAL> - { - name = removeQuotesAndEscapes(token.image); - } - "=" <STRING_LITERAL> - { - value = removeQuotesAndEscapes(token.image); - } - ) - <RIGHTPAREN> - { - properties.put(name, value); - } - )* - )? - <RIGHTPAREN> - ) - - ("pre-sorted" - { alreadySorted = true; } - )? - - ";" - { - return new LoadStatement(null, datasetName, adapter, properties, alreadySorted); - } -} - -TypeDecl TypeDeclaration() throws ParseException: -{ - Identifier ident; - TypeExpression typeExpr; -} -{ - <IDENTIFIER> - { - ident = new Identifier(token.image.toString()); - } - "as" - ( typeExpr = TypeExpr() ) - { - return new TypeDecl(null, ident, typeExpr); - } -} - -TypeExpression TypeExpr() throws ParseException: -{ - TypeExpression typeExpr = null; -} -{ - ( - typeExpr = RecordTypeDef() - | typeExpr = TypeReference() - | typeExpr = OrderedListTypeDef() - | typeExpr = UnorderedListTypeDef() - ) - { - return typeExpr; - } -} - -RecordTypeDefinition RecordTypeDef() throws ParseException: -{ - RecordTypeDefinition recType = new RecordTypeDefinition(); - RecordTypeDefinition.RecordKind recordKind = null; -} -{ - ( "closed" { recordKind = RecordTypeDefinition.RecordKind.CLOSED; } - | "open" { recordKind = RecordTypeDefinition.RecordKind.OPEN; } )? - "{" - ( - RecordField(recType) - ( "," RecordField(recType) )* - )? - "}" - { - if (recordKind == null) { - recordKind = RecordTypeDefinition.RecordKind.OPEN; - } - recType.setRecordKind(recordKind); - return recType; - } -} - -void RecordField(RecordTypeDefinition recType) throws ParseException: -{ - String fieldName; - TypeExpression type = null; - boolean nullable = false; -} -{ - <IDENTIFIER> - { - Token t = getToken(0); - fieldName = t.toString(); - } - ":" - ( type = TypeExpr() ) - ("?" { nullable = true; } )? - { - - recType.addField(fieldName, type, nullable); - } -} - -TypeReferenceExpression TypeReference() throws ParseException: -{} -{ - <IDENTIFIER> - { - Token t = getToken(0); - Identifier id; - if (t.toString().equalsIgnoreCase("int")) { - id = new Identifier("int64"); - } else { - id = new Identifier(t.toString()); - } - return new TypeReferenceExpression(new Pair<Identifier,Identifier>(null,id)); - } -} - -OrderedListTypeDefinition OrderedListTypeDef() throws ParseException: -{ - TypeExpression type = null; -} -{ - "[" - ( type = TypeExpr() ) - "]" - { - return new OrderedListTypeDefinition(type); - } -} - - -UnorderedListTypeDefinition UnorderedListTypeDef() throws ParseException: -{ - TypeExpression type = null; -} -{ - "<" - ( type = TypeExpr() ) - ">" - { - return new UnorderedListTypeDefinition(type); - } -} - - -FunctionDecl FunctionDeclaration() throws ParseException: -{ - FunctionDecl funcDecl; - FunctionSignature signature; - String functionName; - int arity = 0; - List<VarIdentifier> paramList = new ArrayList<VarIdentifier>(); - Expression funcBody; - VarIdentifier var = null; - createNewScope(); -} -{ - - <IDENTIFIER> - { - Token t = getToken(0); - functionName = t.toString(); - if (functionName.equalsIgnoreCase("int")) { - functionName = "int64"; - } - } - <LEFTPAREN> (<VARIABLE> - { - var = new VarIdentifier(); - var.setValue(getToken(0).toString()); - paramList.add(var); - getCurrentScope().addNewVarSymbolToScope(var); - arity++; - } - ("," <VARIABLE> - { - var = new VarIdentifier(); - var.setValue(getToken(0).toString()); - paramList.add(var); - getCurrentScope().addNewVarSymbolToScope(var); - arity++; - })*)? <RIGHTPAREN> "{" funcBody = Expression() "}" - - { - signature = new FunctionSignature(defaultDataverse, functionName, arity); - getCurrentScope().addFunctionDescriptor(signature, false); - funcDecl = new FunctionDecl(signature, paramList, funcBody); - return funcDecl; - } -} - -Query Query()throws ParseException: -{ - Query query = new Query(false); - Expression expr; -} -{ - expr = Expression() - - { - query.setBody(expr); - return query; - } -} - - - -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; - } -} - - - -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); - } - Token t = getToken(0); - try{ - op.addOperator(t.toString()); - } catch (Exception e){ - throw new ParseException(e.getMessage()); - } - } - - operand = AndExpr() - { - op.addOperand(operand); - } - - )* - - { - return op==null? operand: op; - } -} - -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); - } - Token t = getToken(0); - try{ - op.addOperator(t.toString()); - } catch (Exception e){ - throw new ParseException(e.getMessage()); - } - } - - operand = RelExpr() - { - op.addOperand(operand); - } - - )* - - { - return op==null? operand: op; - } -} - - - -Expression RelExpr()throws ParseException: -{ - OperatorExpr op = null; - Expression operand = null; - boolean broadcast = false; -} -{ - operand = AddExpr() - { - if (operand instanceof VariableExpr) { - String hint = getHint(token); - if (hint != null && hint.equals(BROADCAST_JOIN_HINT)) { - broadcast = true; - } - } - } - - ( - LOOKAHEAD(2)( "<" | ">" | "<=" | ">=" | "=" | "!=" |"~=") - { - if (op == null) { - op = new OperatorExpr(); - op.addOperand(operand, broadcast); - op.setCurrentop(true); - broadcast = false; - } - Token t = getToken(0); - try{ - op.addOperator(t.toString()); - } catch (Exception 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); - } - )? - - { - return op==null? operand: op; - } -} - -Expression AddExpr()throws ParseException: -{ - OperatorExpr op = null; - Expression operand = null; -} -{ - operand = MultExpr() - - ( ("+" | "-") - { - if (op == null) { - op = new OperatorExpr(); - op.addOperand(operand); - op.setCurrentop(true); - } - Token t = getToken(0); - try{ - ((OperatorExpr)op).addOperator(t.toString()); - } catch (Exception e){ - throw new ParseException(e.getMessage()); - } - } - - operand = MultExpr() - { - op.addOperand(operand); - } - )* - - { - return op==null? operand: op; - } -} - -Expression MultExpr()throws ParseException: -{ - OperatorExpr op = null; - Expression operand = null; -} -{ - operand = UnionExpr() - - (( "*" | "/" | "%" | <CARET> | "idiv") - { - if (op == null) { - op = new OperatorExpr(); - op.addOperand(operand); - op.setCurrentop(true); - } - Token t = getToken(0); - try{ - op.addOperator(t.toString()); - } catch (CompilationException e){ - throw new ParseException(e.getMessage()); - } - } - operand = UnionExpr() - { - op.addOperand(operand); - } - )* - - { - return op==null?operand:op; - } -} - -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 UnaryExpr() throws ParseException: -{ - UnaryExpr uexpr = null; - Expression expr = null; -} -{ - ( ("+"|"-") - { - uexpr = new UnaryExpr(); - try{ - uexpr.setExprType(token.image); - } catch (CompilationException e){ - throw new ParseException(e.getMessage()); - } - } - )? - - expr = ValueExpr() - { - if(uexpr!=null){ - ((UnaryExpr)uexpr).setExpr(expr); - return uexpr; - } - else{ - return expr; - } - } -} - -Expression ValueExpr() throws ParseException: -{ - Expression expr; -} -{ - expr = FieldOrIndexAccessor() - { - return expr; - } -} - - -Expression FieldOrIndexAccessor()throws ParseException: -{ - Expression expr = null; - Identifier ident = null; - AbstractAccessor fa = null; - Expression indexExpr = null; - -} -{ - ( expr = PrimaryExpr() - - ) - - - ( - ( - ident = Field() - { - if(fa == null) - fa = new FieldAccessor(expr, ident); - else - fa = new FieldAccessor(fa, ident); - } - ) - | ( - indexExpr = Index() - { - if(fa == null) - fa = new IndexAccessor(expr, indexExpr); - else - fa = new IndexAccessor(fa, indexExpr); - } - ) - )* - - - { - return fa==null?expr:fa; - } -} - -Identifier Field() throws ParseException: -{ - Identifier ident = null; - -} -{ - "." < IDENTIFIER > - { - - ident = new Identifier(); - ident.setValue(getToken(0).toString()); - - return ident; - } -} - -Expression Index() throws ParseException: -{ - Expression expr = null; -} -{ - "[" ( 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"); - } - } - } - - | "?" // ANY - - ) - - "]" - { - return expr; - } -} - - -Expression PrimaryExpr()throws ParseException: -{ - Expression expr = null; -} -{ - //Literal | VariableRef | ListConstructor | RecordConstructor | FunctionCallExpr | ParenthesizedExpression - ( - expr =Literal() - | expr = FunctionCallExpr() - | expr =VariableRef() - - { - if(((VariableExpr)expr).getIsNewVar() == true) - throw new ParseException("can't find variable " + ((VariableExpr)expr).getVar()); - } - | expr = ListConstructor() - | expr = RecordConstructor() - | expr = ParenthesizedExpression() - | expr = MetaVariableRef() - ) - { - return expr; - } -} - -Expression Literal() throws ParseException: -{ - - LiteralExpr lit = new LiteralExpr(); - Token t; -} -{ -( - <STRING_LITERAL> - { - t= getToken(0); - lit.setValue( new StringLiteral(removeQuotesAndEscapes(t.image))); - } - - | <INTEGER_LITERAL> - { - t= getToken(0); - try { - lit.setValue(new IntegerLiteral(new Integer(t.image))); - } catch(NumberFormatException ex) { - lit.setValue(new LongIntegerLiteral(new Long(t.image))); - } - } - | < FLOAT_LITERAL > - { - t= getToken(0); - lit.setValue(new FloatLiteral(new Float(t.image))); - } - | < DOUBLE_LITERAL > - { - t= getToken(0); - lit.setValue(new DoubleLiteral(new Double(t.image))); - } - | <NULL> - { - t= getToken(0); - lit.setValue(NullLiteral.INSTANCE); - } - | <TRUE> - { - t= getToken(0); - lit.setValue(TrueLiteral.INSTANCE); - } - | <FALSE> - { - t= getToken(0); - lit.setValue(FalseLiteral.INSTANCE); - } -) - { - return lit; - } -} - - -VariableExpr VariableRef() throws ParseException: -{ - VariableExpr varExp = new VariableExpr(); - VarIdentifier var = new VarIdentifier(); - Token t; -} -{ - <VARIABLE> - { - t = getToken(0);//get current token - String varName = t.toString(); - 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(t.toString()); - return varExp; - } -} - - -VariableExpr Variable() throws ParseException: -{ - VariableExpr varExp = new VariableExpr(); - VarIdentifier var = new VarIdentifier(); - Token t; -} -{ - <VARIABLE> - { - t = getToken(0);//get current token - Identifier ident = lookupSymbol(t.toString()); - if(ident != null) { // exist such ident - varExp.setIsNewVar(false); - } - varExp.setVar(var); - var.setValue(t.toString()); - return varExp; - } -} - -MetaVariableExpr MetaVariableRef() throws ParseException: -{ - MetaVariableExpr metaVarExp = new MetaVariableExpr(); - VarIdentifier var = new VarIdentifier(); - Token t; -} -{ - <METAVARIABLE> - { - t = getToken(0);//get current token - metaVarExp.setVar(var); - var.setValue(t.toString()); - return metaVarExp; - } -} - -Expression ListConstructor() throws ParseException: -{ - Expression expr = null; -} -{ - ( - expr = OrderedListConstructor() | expr = UnorderedListConstructor() - ) - - { - return expr; - } -} - - -ListConstructor OrderedListConstructor() throws ParseException: -{ - ListConstructor expr = new ListConstructor(); - Expression tmp = null; - List<Expression> exprList = new ArrayList<Expression>(); - expr.setType(ListConstructor.Type.ORDERED_LIST_CONSTRUCTOR); -} -{ - - "[" - ( tmp = Expression() - { - exprList.add(tmp); - } - - ("," tmp = Expression() { exprList.add(tmp); })* - )? - - "]" - - { - expr.setExprList(exprList); - return expr; - } -} - -ListConstructor UnorderedListConstructor() throws ParseException: -{ - ListConstructor expr = new ListConstructor(); - Expression tmp = null; - List<Expression> exprList = new ArrayList<Expression>(); - expr.setType(ListConstructor.Type.UNORDERED_LIST_CONSTRUCTOR); -} -{ - - "{{" ( tmp = Expression() - { - exprList.add(tmp); - } - ("," tmp = Expression() { exprList.add(tmp); })*)? "}}" - { - expr.setExprList(exprList); - return expr; - } -} - -RecordConstructor RecordConstructor() throws ParseException: -{ - RecordConstructor expr = new RecordConstructor(); - FieldBinding tmp = null; - List<FieldBinding> fbList = new ArrayList<FieldBinding>(); -} -{ - "{" (tmp = FieldBinding() - { - fbList.add(tmp); - } - ("," tmp = FieldBinding() { fbList.add(tmp); })*)? "}" - { - expr.setFbList(fbList); - return expr; - } -} - -FieldBinding FieldBinding() throws ParseException: -{ - FieldBinding fb = new FieldBinding(); - Expression left, right; -} -{ - left = Expression() ":" right = Expression() - { - fb.setLeftExpr(left); - fb.setRightExpr(right); - return fb; - } -} - -Expression FunctionCallExpr() throws ParseException: -{ - CallExpr callExpr; - List<Expression> argList = new ArrayList<Expression>(); - Expression tmp; - int arity = 0; - String funcName; - String dataverse; - String hint=null; - String id1=null; - String id2=null; -} -{ - ( <IDENTIFIER> { dataverse = defaultDataverse; funcName = token.image;} - ("." <IDENTIFIER> { dataverse = funcName; funcName = token.image;})? - | - <DATASET> {dataverse = MetadataConstants.METADATA_DATAVERSE_NAME; funcName = getToken(0).toString();} - ) - { - hint=getHint(token); - } - <LEFTPAREN> (tmp = Expression() - { - argList.add(tmp); - arity ++; - } ("," tmp = Expression() { argList.add(tmp); arity++; })*)? <RIGHTPAREN> - - { - FunctionSignature signature = lookupFunctionSignature(dataverse, funcName.toString(), arity); - if(signature == null) - { - signature = new FunctionSignature(dataverse, funcName.toString(), arity); - } - callExpr = new CallExpr(signature,argList); - if (hint != null && hint.startsWith(INDEXED_NESTED_LOOP_JOIN_HINT)) { - callExpr.addHint(IndexedNLJoinExpressionAnnotation.INSTANCE); - } - return callExpr; - } -} - - -Expression ParenthesizedExpression() throws ParseException: -{ - Expression expr; -} -{ - <LEFTPAREN> expr = Expression() <RIGHTPAREN> - { - return expr; - } -} - -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; - } -} - -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 = MetaVariableClause() {clauseList.add(tmp);}) - (tmp = Clause() {clauseList.add(tmp);})* "return" returnExpr = Expression() - - { - flworg.setClauseList(clauseList); - flworg.setReturnExpr(returnExpr); - removeCurrentScope(); - return flworg; - } -} - -List<Clause> Clauses() throws ParseException: -{ - List<Clause> clauses = new ArrayList<Clause>(); - Clause c = null; -} -{ - ( - ( - c = Clause() { - clauses.add(c); - } - )* - ) - { - return clauses; - } -} - -Clause Clause() throws ParseException : -{ - Clause clause; -} -{ - ( - clause = ForClause() - | clause = LetClause() - | clause = WhereClause() - | clause = OrderbyClause() - | clause = GroupClause() - | clause = LimitClause() - | clause = DistinctClause() - | clause = MetaVariableClause() - | clause = JoinClause() - ) - { - return clause; - } -} - -Clause MetaVariableClause() throws ParseException : -{ - MetaVariableClause mc = new MetaVariableClause(); - VarIdentifier var = new VarIdentifier(); - Token t; -} -{ - <METAVARIABLECLAUSE> - { - t = getToken(0); - mc.setVar(var); - var.setValue(t.toString()); - return mc; - } -} - -Clause JoinClause() throws ParseException : -{ - Expression whereExpr; - List<Clause> leftClauses, rightClauses; - JoinClause.JoinKind kind = JoinClause.JoinKind.INNER; -} -{ - ("join" | "loj" { kind = JoinClause.JoinKind.LEFT_OUTER; } ) - <LEFTPAREN> <LEFTPAREN> leftClauses = Clauses() <RIGHTPAREN> "," - <LEFTPAREN> rightClauses = Clauses() <RIGHTPAREN> "," - whereExpr = Expression() <RIGHTPAREN> - { - JoinClause jc = new JoinClause(kind); - jc.setLeftClauses(leftClauses); - jc.setRightClauses(rightClauses); - jc.setWhereExpr(whereExpr); - return jc; - } -} - -Clause ForClause()throws ParseException : -{ - ForClause fc = new ForClause(); - VariableExpr varExp; - VariableExpr varPos = null; - Expression inExp; - extendCurrentScope(); -} -{ - "for" varExp = Variable() - { - getCurrentScope().addNewVarSymbolToScope(varExp.getVar()); - } - ("at" varPos = Variable() - { - getCurrentScope().addNewVarSymbolToScope(varPos.getVar()); - } - )? - "in" ( inExp = Expression() ) - { - fc.setVarExpr(varExp); - fc.setInExpr(inExp); - if (varPos != null) { - fc.setPosExpr(varPos); - } - return fc; - } -} - -Clause LetClause() throws ParseException: -{ - LetClause lc = new LetClause(); - VariableExpr varExp; - Expression beExp; - extendCurrentScope(); -} -{ - "let" varExp = Variable() ":=" beExp = Expression() - { - getCurrentScope().addNewVarSymbolToScope(varExp.getVar()); - lc.setVarExpr(varExp); - lc.setBindingExpr(beExp); - return lc; - } -} - -Clause WhereClause()throws ParseException : -{ - WhereClause wc = new WhereClause(); - Expression whereExpr; -} -{ - "where" whereExpr = Expression() - { - wc.setWhereExpr(whereExpr); - return wc; - } -} - -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 && 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); - } - } - "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); - } - - ("," 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; - } -} -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()); - } ":=")? - expr = Expression() - { - GbyVariableExpressionPair pair1 = new GbyVariableExpressionPair(var, expr); - vePairList.add(pair1); - } - ("," ( LOOKAHEAD(2) var = Variable() - { - newScope.addNewVarSymbolToScope(var.getVar()); - } ":=")? - expr = Expression() - { - GbyVariableExpressionPair pair2 = new GbyVariableExpressionPair(var, expr); - vePairList.add(pair2); - } - )* - ("decor" decorVar = Variable() ":=" decorExpr = Expression() - { - newScope.addNewVarSymbolToScope(decorVar.getVar()); - GbyVariableExpressionPair pair3 = new GbyVariableExpressionPair(decorVar, decorExpr); - decorPairList.add(pair3); - } - ("," "decor" decorVar = Variable() ":=" decorExpr = Expression() - { - newScope.addNewVarSymbolToScope(decorVar.getVar()); - GbyVariableExpressionPair pair4 = new GbyVariableExpressionPair(decorVar, decorExpr); - decorPairList.add(pair4); - } - )* - )? - "with" withVar = VariableRef() - { - if(withVar.getIsNewVar()==true) - throw new ParseException("can't find variable " + withVar.getVar()); - withVarMap.put(withVar, withVar); - newScope.addNewVarSymbolToScope(withVar.getVar()); - } - ("," 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; - } -} - - -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; - } -} - -DistinctClause DistinctClause() throws ParseException: -{ - List<Expression> exprs = new ArrayList<Expression>(); - Expression expr; -} -{ - "distinct" "by" expr = Expression() - { - exprs.add(expr); - } - ("," expr = Expression() - { - exprs.add(expr); - } - )* - { - return new DistinctClause(exprs); - } -} - - -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); - } - ( - "," 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; - } -} - -TOKEN_MGR_DECLS: -{ - public int commentDepth = 0; -} - -<DEFAULT> -TOKEN : -{ - <CARET : "^" > -} - -<DEFAULT> -TOKEN : -{ - <DATASET : "dataset" > -} - -<DEFAULT> -TOKEN : -{ - <LEFTPAREN : "(" > -} - -<DEFAULT> -TOKEN : -{ - <RIGHTPAREN : ")" > -} - - -<DEFAULT> -TOKEN : -{ - <INTEGER_LITERAL : (<DIGIT>)+ > -} - - -<DEFAULT> -TOKEN : -{ - <NULL : "null"> -} - -<DEFAULT> -TOKEN : -{ - <TRUE : "true"> -} - -<DEFAULT> -TOKEN : -{ - <FALSE : "false"> -} - -<DEFAULT> -TOKEN : -{ - <#DIGIT : ["0" - "9"]> -} - - -TOKEN: -{ - < DOUBLE_LITERAL: <INTEGER> - | <INTEGER> ( "." <INTEGER> )? - | "." <INTEGER> - > - | - < FLOAT_LITERAL: <INTEGER> ( "f" | "F" ) - | <INTEGER> ( "." <INTEGER> ( "f" | "F" ) )? - | "." <INTEGER> ( "f" | "F" ) - > - | - <INTEGER : (<DIGIT>)+ > -} - -<DEFAULT> -TOKEN : -{ - <#LETTER : ["A" - "Z", "a" - "z"]> -} - -<DEFAULT> -TOKEN : -{ - <SPECIALCHARS : ["$", "_", "-"] > -} - -<DEFAULT> -TOKEN : -{ - <STRING_LITERAL : ("\"" (<EscapeQuot> | ~["\""])* "\"") | ("\'"(<EscapeApos> | ~["\'"])* "\'")> - | - < #EscapeQuot: "\\\"" > - | - < #EscapeApos: "\\\'" > -} - -<DEFAULT> -TOKEN : -{ - <IDENTIFIER : (<LETTER>)+ (<LETTER> | <DIGIT> | <SPECIALCHARS>)*> -} - -<DEFAULT> -TOKEN : -{ - <VARIABLE : "$" <IDENTIFIER> > -} - -<DEFAULT> -TOKEN : -{ - <METAVARIABLECLAUSE : "#" <IDENTIFIER> > -} - -<DEFAULT> -TOKEN : -{ - <METAVARIABLE : "$$" <IDENTIFIER> > -} - -SKIP: -{ - " " -| "\t" -| "\r" -| "\n" -} - -SKIP: -{ - <"//" (~["\n"])* "\n"> -} - -SKIP: -{ - <"//" (~["\n","\r"])* ("\n"|"\r"|"\r\n")?> -} - - -SKIP: -{ - <"/*"> {commentDepth=1;}: INSIDE_COMMENT -} - -<INSIDE_COMMENT> -SPECIAL_TOKEN: -{ - <"+"(" ")*(~["/","*"])*> -} - -<INSIDE_COMMENT> -SKIP: -{ - <"/*"> {commentDepth++;} -} - -<INSIDE_COMMENT> -SKIP: -{ - <"*/"> {commentDepth--; if (commentDepth == 0) SwitchTo(DEFAULT);} -| <~[]> -} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/92c0bac1/asterixdb/asterix-algebra/src/main/javacc/AQLPlusExtension.jj ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-algebra/src/main/javacc/AQLPlusExtension.jj b/asterixdb/asterix-algebra/src/main/javacc/AQLPlusExtension.jj new file mode 100644 index 0000000..4024342 --- /dev/null +++ b/asterixdb/asterix-algebra/src/main/javacc/AQLPlusExtension.jj @@ -0,0 +1,175 @@ +// This is not a complete javacc file. +// This file is used by asterix-grammar-extension-maven-plugin to extend the AQL grammar to AQL+ grammar. +// For more details about how to use this plugin, refer to asterix-grammar-extension-maven-plugin. + +// If you want to put an additional import, just add import statements like the following. +// import package name +import org.apache.asterix.lang.aql.clause.JoinClause; +import org.apache.asterix.lang.aql.clause.MetaVariableClause; +import org.apache.asterix.lang.aql.expression.MetaVariableExpr; + +// To remove an import, use the keyword unimport +// unimport package name + +// If you want to add a method in the class definition (before PARSER_END), use the following phrase and attach +// new method right after the phrase. +// @new_at_the_end +@new_at_the_class_def + public void initScope() { + scopeStack.push(RootScopeFactory.createRootScope(this)); + } + +// Merging of non-terminals can only be done on non-terminals which conform to the following structure. +// Content will simply be prepended or appended to the base blocks. +// Note: refrain from using the strings "before:" and "after:" in the merge areas as that will break the merge. +// As a workaround, you can always override +// one additional possible change is direct replacement and it can be done through the followin syntax: +// @merge replace "base phrase" with "extension phrase" true/false +// Here, true/false tells whether the tool needs to process the three blocks. +// If true, like normal @merge case, before and after clause in each block will be processed +// after "base phrase" in the blocks have been replaced with "new phrase". +// If false, then it just expects the blank form that consists of three blocks and not process them. +// Only, "base phrase" in the blocks will be replaced with "new phrase". +@merge +Clause Clause() throws ParseException : +{ + // merge area 1 + before: + after: +} +{ + ( + // merge area 2 + before: + after: | clause = MetaVariableClause() + | clause = JoinClause()) + { + // merge area 3 + } +} + +@merge +Expression PrimaryExpr()throws ParseException: +{ + // merge area 1 + before: + after: +} +{ + ( + // merge area 2 + before: + after: | expr = MetaVariableRef()) + { + // merge area 3 + } +} + +// In the following case, all instances of "tmp = LetClause() {clauseList.add(tmp);}" will be replaced +// with "tmp = LetClause() {clauseList.add(tmp);} | tmp = MetaVariableClause() {clauseList.add(tmp);}". +// Also, we don't check "before:" and "after:" section of each area. That check will be ignored since +// the last parameter is set to false. +@merge replace "tmp = LetClause() {clauseList.add(tmp);}" with "tmp = LetClause() {clauseList.add(tmp);} | tmp = MetaVariableClause() {clauseList.add(tmp);}" false +Expression FLWOGR() throws ParseException: +{ + // merge area 1 +} +{ + ( + // merge area 2 + ) + { + // merge area 3 + } +} + +// The default option when you don't specify any @optiontype. +// Adding a new node. if a node exists, it will throw an exception. +@new +Clause MetaVariableClause() throws ParseException : +{ + MetaVariableClause mc = new MetaVariableClause(); + VarIdentifier var = new VarIdentifier(); +} +{ + <METAVARIABLECLAUSE> + { + mc.setVar(var); + var.setValue(token.image); + return mc; + } +} + +@new +MetaVariableExpr MetaVariableRef() throws ParseException: +{ + MetaVariableExpr metaVarExp = new MetaVariableExpr(); + VarIdentifier var = new VarIdentifier(); +} +{ + <METAVARIABLE> + { + metaVarExp.setVar(var); + var.setValue(token.image); + return metaVarExp; + } +} + +@new +Clause JoinClause() throws ParseException : +{ + Expression whereExpr; + List<Clause> leftClauses, rightClauses; + JoinClause.JoinKind kind = JoinClause.JoinKind.INNER; +} +{ + ("join" | "loj" { kind = JoinClause.JoinKind.LEFT_OUTER; } ) + <LEFTPAREN> <LEFTPAREN> leftClauses = Clauses() <RIGHTPAREN> <COMMA> + <LEFTPAREN> rightClauses = Clauses() <RIGHTPAREN> <COMMA> + whereExpr = Expression() <RIGHTPAREN> + { + JoinClause jc = new JoinClause(kind); + jc.setLeftClauses(leftClauses); + jc.setRightClauses(rightClauses); + jc.setWhereExpr(whereExpr); + return jc; + } +} + +@new +List<Clause> Clauses() throws ParseException: +{ + List<Clause> clauses = new ArrayList<Clause>(); + Clause c = null; +} +{ + ( + ( + c = Clause() { + clauses.add(c); + } + )* + ) + { + return clauses; + } +} + +// Overriding a non-terminal. if exists in base, it will be overriden, otherwise, it will be added. +// @override + + +// If something needs to be added at the end of file, you can use @new_at_the_end like the following. +@new_at_the_end +<DEFAULT,IN_DBL_BRACE> +TOKEN : +{ + <METAVARIABLE : "$$" <IDENTIFIER> > +} + +@new_at_the_end +<DEFAULT,IN_DBL_BRACE> +TOKEN : +{ + <METAVARIABLECLAUSE : "##" <IDENTIFIER> > +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/92c0bac1/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java index 5ae313d..dd7c8e4 100644 --- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java +++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java @@ -77,6 +77,8 @@ public class ErrorCode { public static final int COMPILATION_PRIMARY_KEY_CANNOT_BE_NULLABLE = 1021; public static final int COMPILATION_ILLEGAL_PRIMARY_KEY_TYPE = 1022; public static final int COMPILATION_CANT_DROP_ACTIVE_DATASET = 1023; + public static final int COMPILATION_AQLPLUS_IDENTIFIER_NOT_FOUND = 1024; + public static final int COMPILATION_AQLPLUS_NO_SUCH_JOIN_TYPE = 1025; // Feed errors public static final int DATAFLOW_ILLEGAL_STATE = 3001; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/92c0bac1/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties index 440e2d3..3e96972 100644 --- a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties +++ b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties @@ -62,6 +62,8 @@ 1021 = The primary key field \"%1$s\" cannot be nullable 1022 = Field of type %1$s cannot be used as a primary key field 1023 = Can't drop dataset %1$s since it is connected to active entity: %2$s +1024 = Identifier %1$s is not found in AQL+ meta-scope +1025 = There is no such join type in AQL+ # Feed Errors 3001 = Illegal state. http://git-wip-us.apache.org/repos/asf/asterixdb/blob/92c0bac1/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj b/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj index 4b2091c..e5af86f 100644 --- a/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj +++ b/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj @@ -2302,6 +2302,9 @@ Expression IfThenElse() throws ParseException: } } +// Note: if you modify this part: "tmp = LetClause() {clauseList.add(tmp);}", please also apply the necessary +// change to the AQLPlusExtension.jj file since it refers to this string part and may behave incorrectly if this +// part is modified. For more details, please refer to AQLPlusExtension.jj file. Expression FLWOGR() throws ParseException: { FLWOGRExpression flworg = new FLWOGRExpression();
