abdullah alamoudi has submitted this change and it was merged. Change subject: Add Maven Plugin for Grammar Extension ......................................................................
Add Maven Plugin for Grammar Extension This change introduces a new asterix maven plugin for grammar extension. The plugin takes a base grammar file and an extension file and combine them to generate an extended grammar. A base grammar can be extended by overriding production nodes, adding extending existing nodes, or introducing new terminals and non terminals. In addition, a mvn verify goal was added to generate the parser java files from the grammar generated by the test. Change-Id: Iaa2d11782d43dd8f27d69e347ed0fc8797d79dad Reviewed-on: https://asterix-gerrit.ics.uci.edu/1011 Tested-by: Jenkins <[email protected]> Integration-Tests: Jenkins <[email protected]> Reviewed-by: Michael Blow <[email protected]> --- M asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AbstractLangTranslator.java M asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/CompiledStatements.java M asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java M asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java M asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/AQLAPIServlet.java M asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/DDLAPIServlet.java M asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/QueryAPIServlet.java M asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/UpdateAPIServlet.java M asterixdb/asterix-app/src/main/java/org/apache/asterix/aql/translator/QueryTranslator.java M asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java M asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java M asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/statement/SubscribeFeedStatement.java M asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/util/RangeMapBuilder.java M asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Statement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CompactStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/ConnectFeedStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateDataverseStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFeedPolicyStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFeedStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFunctionStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateIndexStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreatePrimaryFeedStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateSecondaryFeedStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDecl.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDropStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DeleteStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DisconnectFeedStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DropStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FeedDropStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FeedPolicyDropStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FunctionDecl.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FunctionDropStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IndexDecl.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IndexDropStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/InsertStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/LoadStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/NodeGroupDropStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/NodegroupDecl.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/Query.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/RefreshExternalDatasetStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/RunStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/SetStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/TypeDecl.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/TypeDropStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpdateStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpsertStatement.java M asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/WriteStatement.java A asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/pom.xml A asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/src/main/java/org/apache/asterix/extension/grammar/GrammarExtensionMojo.java A asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/src/test/java/org/apache/asterix/extension/grammar/GrammarExtensionMojoTest.java A asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/src/test/java/org/apache/asterix/lang/extension/EchoStatement.java A asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/src/test/resources/lang/extension.jj A asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/src/test/resources/unit/basic-test/basic-test-plugin-config.xml M asterixdb/asterix-maven-plugins/pom.xml M asterixdb/asterix-tools/src/main/java/org/apache/asterix/tools/translator/ADGenDmlTranslator.java 57 files changed, 1,388 insertions(+), 205 deletions(-) Approvals: Michael Blow: Looks good to me, approved Jenkins: Verified; Verified Objections: Jenkins: Violations found diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AbstractLangTranslator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AbstractLangTranslator.java index 83e4375..9030da9 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AbstractLangTranslator.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AbstractLangTranslator.java @@ -107,7 +107,7 @@ String message = null; String dataverse = defaultDataverse != null ? defaultDataverse.getDataverseName() : null; switch (stmt.getKind()) { - case Statement.INSERT: + case Statement.Kind.INSERT: InsertStatement insertStmt = (InsertStatement) stmt; if (insertStmt.getDataverseName() != null) { dataverse = insertStmt.getDataverseName().getValue(); @@ -119,7 +119,7 @@ } break; - case Statement.DELETE: + case Statement.Kind.DELETE: DeleteStatement deleteStmt = (DeleteStatement) stmt; if (deleteStmt.getDataverseName() != null) { dataverse = deleteStmt.getDataverseName().getValue(); @@ -131,7 +131,7 @@ } break; - case Statement.NODEGROUP_DROP: + case Statement.Kind.NODEGROUP_DROP: String nodegroupName = ((NodeGroupDropStatement) stmt).getNodeGroupName().getValue(); invalidOperation = MetadataConstants.METADATA_DEFAULT_NODEGROUP_NAME.equals(nodegroupName); if (invalidOperation) { @@ -139,7 +139,7 @@ } break; - case Statement.DATAVERSE_DROP: + case Statement.Kind.DATAVERSE_DROP: DataverseDropStatement dvDropStmt = (DataverseDropStatement) stmt; invalidOperation = MetadataConstants.METADATA_DATAVERSE_NAME.equals(dvDropStmt.getDataverseName().getValue()); @@ -148,7 +148,7 @@ } break; - case Statement.DATASET_DROP: + case Statement.Kind.DATASET_DROP: DropStatement dropStmt = (DropStatement) stmt; if (dropStmt.getDataverseName() != null) { dataverse = dropStmt.getDataverseName().getValue(); @@ -159,7 +159,7 @@ + MetadataConstants.METADATA_DATAVERSE_NAME; } break; - case Statement.DATASET_DECL: + case Statement.Kind.DATASET_DECL: DatasetDecl datasetStmt = (DatasetDecl) stmt; Map<String, String> hints = datasetStmt.getHints(); if (hints != null && !hints.isEmpty()) { diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/CompiledStatements.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/CompiledStatements.java index 7a3b2a4..b184774 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/CompiledStatements.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/CompiledStatements.java @@ -60,7 +60,7 @@ @Override public byte getKind() { - return Statement.DATASET_DROP; + return Statement.Kind.DATASET_DROP; } } @@ -84,7 +84,7 @@ @Override public byte getKind() { - return Statement.CREATE_DATAVERSE; + return Statement.Kind.CREATE_DATAVERSE; } } @@ -101,7 +101,7 @@ @Override public byte getKind() { - return Statement.NODEGROUP_DROP; + return Statement.Kind.NODEGROUP_DROP; } } @@ -130,7 +130,7 @@ @Override public byte getKind() { - return Statement.INDEX_DROP; + return Statement.Kind.INDEX_DROP; } } @@ -153,7 +153,7 @@ @Override public byte getKind() { - return Statement.DATAVERSE_DROP; + return Statement.Kind.DATAVERSE_DROP; } } @@ -170,7 +170,7 @@ @Override public byte getKind() { - return Statement.TYPE_DROP; + return Statement.Kind.TYPE_DROP; } } @@ -242,7 +242,7 @@ @Override public byte getKind() { - return Statement.CREATE_INDEX; + return Statement.Kind.CREATE_INDEX; } } @@ -286,7 +286,7 @@ @Override public byte getKind() { - return Statement.LOAD; + return Statement.Kind.LOAD; } } @@ -323,7 +323,7 @@ @Override public byte getKind() { - return Statement.INSERT; + return Statement.Kind.INSERT; } } @@ -335,7 +335,7 @@ @Override public byte getKind() { - return Statement.UPSERT; + return Statement.Kind.UPSERT; } } @@ -381,7 +381,7 @@ @Override public byte getKind() { - return Statement.CONNECT_FEED; + return Statement.Kind.CONNECT_FEED; } public String getPolicyName() { @@ -419,7 +419,7 @@ @Override public byte getKind() { - return Statement.SUBSCRIBE_FEED; + return Statement.Kind.SUBSCRIBE_FEED; } } @@ -450,7 +450,7 @@ @Override public byte getKind() { - return Statement.DISCONNECT_FEED; + return Statement.Kind.DISCONNECT_FEED; } } @@ -495,7 +495,7 @@ @Override public byte getKind() { - return Statement.DELETE; + return Statement.Kind.DELETE; } } @@ -519,7 +519,7 @@ @Override public byte getKind() { - return Statement.COMPACT; + return Statement.Kind.COMPACT; } } diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java index 3689357..1894cc3 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java @@ -372,23 +372,23 @@ Mutable<ILogicalExpression> varRef = new MutableObject<>(new VariableReferenceExpression(resVar)); ILogicalOperator leafOperator; switch (stmt.getKind()) { - case Statement.INSERT: + case Statement.Kind.INSERT: leafOperator = translateInsert(targetDatasource, varRef, varRefsForLoading, additionalFilteringExpressions, assign); break; - case Statement.UPSERT: + case Statement.Kind.UPSERT: leafOperator = translateUpsert(targetDatasource, varRef, varRefsForLoading, additionalFilteringExpressions, assign, additionalFilteringField); break; - case Statement.DELETE: + case Statement.Kind.DELETE: leafOperator = translateDelete(targetDatasource, varRef, varRefsForLoading, additionalFilteringExpressions, assign); break; - case Statement.CONNECT_FEED: + case Statement.Kind.CONNECT_FEED: leafOperator = translateConnectFeed(targetDatasource, varRef, varRefsForLoading, additionalFilteringExpressions, assign); break; - case Statement.SUBSCRIBE_FEED: + case Statement.Kind.SUBSCRIBE_FEED: leafOperator = translateSubscribeFeed((CompiledSubscribeFeedStatement) stmt, targetDatasource, unnestVar, project, exprs, resVar, varRefsForLoading, varRef, assign, additionalFilteringField, additionalFilteringAssign, additionalFilteringExpressions); diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java index bef8a3a..af17c05 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java @@ -209,7 +209,7 @@ ILogicalPlan plan; // statement = null when it's a query - if (statement == null || statement.getKind() != Statement.LOAD) { + if (statement == null || statement.getKind() != Statement.Kind.LOAD) { plan = t.translate(rwQ, outputDatasetName, statement); } else { plan = t.translateLoad(statement); @@ -219,7 +219,7 @@ conf.out().println(); printPlanPrefix(conf, "Logical plan"); - if (rwQ != null || (statement != null && statement.getKind() == Statement.LOAD)) { + if (rwQ != null || (statement != null && statement.getKind() == Statement.Kind.LOAD)) { LogicalOperatorPrettyPrintVisitor pvisitor = new LogicalOperatorPrettyPrintVisitor(conf.out()); PlanPrettyPrinter.printPlan(plan, pvisitor, 0); } @@ -271,7 +271,7 @@ PlanPrettyPrinter.printPhysicalOps(plan, buffer, 0); } else { printPlanPrefix(conf, "Optimized logical plan"); - if (rwQ != null || (statement != null && statement.getKind() == Statement.LOAD)) { + if (rwQ != null || (statement != null && statement.getKind() == Statement.Kind.LOAD)) { LogicalOperatorPrettyPrintVisitor pvisitor = new LogicalOperatorPrettyPrintVisitor(conf.out()); PlanPrettyPrinter.printPlan(plan, pvisitor, 0); } diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/AQLAPIServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/AQLAPIServlet.java index e799dd0..de19715 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/AQLAPIServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/AQLAPIServlet.java @@ -29,7 +29,7 @@ private static final long serialVersionUID = 1L; private static final String AQL_STMT_PARAM_NAME = "aql"; - private static final List<Byte> allowedStatements = Statement.VALUES; + private static final List<Byte> ALLOWED_STATEMENTS = Statement.KINDS; public AQLAPIServlet(ILangCompilationProvider compilationProvider) { super(compilationProvider); @@ -42,7 +42,7 @@ @Override protected List<Byte> getAllowedStatements() { - return allowedStatements; + return ALLOWED_STATEMENTS; } @Override diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/DDLAPIServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/DDLAPIServlet.java index ec47276..0f9c537 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/DDLAPIServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/DDLAPIServlet.java @@ -28,6 +28,13 @@ public class DDLAPIServlet extends RESTAPIServlet { private static final long serialVersionUID = 1L; + private static final List<Byte> STATEMENTS = Arrays.asList(new Byte[] { Statement.Kind.DATAVERSE_DECL, + Statement.Kind.DATAVERSE_DROP, Statement.Kind.DATASET_DECL, Statement.Kind.NODEGROUP_DECL, + Statement.Kind.NODEGROUP_DROP, Statement.Kind.TYPE_DECL, Statement.Kind.TYPE_DROP, + Statement.Kind.CREATE_INDEX, Statement.Kind.INDEX_DECL, Statement.Kind.CREATE_DATAVERSE, + Statement.Kind.DATASET_DROP, Statement.Kind.INDEX_DROP, Statement.Kind.CREATE_FUNCTION, + Statement.Kind.FUNCTION_DROP, Statement.Kind.CREATE_PRIMARY_FEED, Statement.Kind.CREATE_SECONDARY_FEED, + Statement.Kind.DROP_FEED, Statement.Kind.CREATE_FEED_POLICY, Statement.Kind.DROP_FEED_POLICY }); public DDLAPIServlet(ILangCompilationProvider compilationProvider) { super(compilationProvider); @@ -40,13 +47,7 @@ @Override protected List<Byte> getAllowedStatements() { - Byte[] statementsArray = { Statement.DATAVERSE_DECL, Statement.DATAVERSE_DROP, Statement.DATASET_DECL, - Statement.NODEGROUP_DECL, Statement.NODEGROUP_DROP, Statement.TYPE_DECL, Statement.TYPE_DROP, - Statement.CREATE_INDEX, Statement.INDEX_DECL, Statement.CREATE_DATAVERSE, Statement.DATASET_DROP, - Statement.INDEX_DROP, Statement.CREATE_FUNCTION, Statement.FUNCTION_DROP, Statement.CREATE_PRIMARY_FEED, - Statement.CREATE_SECONDARY_FEED, Statement.DROP_FEED, Statement.CREATE_FEED_POLICY, - Statement.DROP_FEED_POLICY }; - return Arrays.asList(statementsArray); + return STATEMENTS; } @Override diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/QueryAPIServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/QueryAPIServlet.java index 040ac1a..7262b59 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/QueryAPIServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/QueryAPIServlet.java @@ -28,6 +28,9 @@ public class QueryAPIServlet extends RESTAPIServlet { private static final long serialVersionUID = 1L; + private static final List<Byte> STATEMENTS = + Arrays.asList(new Byte[] { Statement.Kind.DATAVERSE_DECL, Statement.Kind.FUNCTION_DECL, + Statement.Kind.QUERY, Statement.Kind.SET, Statement.Kind.WRITE, Statement.Kind.RUN }); public QueryAPIServlet(ILangCompilationProvider compilationProvider) { super(compilationProvider); @@ -40,9 +43,7 @@ @Override protected List<Byte> getAllowedStatements() { - Byte[] statementsArray = { Statement.DATAVERSE_DECL, Statement.FUNCTION_DECL, Statement.QUERY, Statement.SET, - Statement.WRITE, Statement.RUN }; - return Arrays.asList(statementsArray); + return STATEMENTS; } @Override diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/UpdateAPIServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/UpdateAPIServlet.java index 9f762f8..22cd963 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/UpdateAPIServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/UpdateAPIServlet.java @@ -28,6 +28,11 @@ public class UpdateAPIServlet extends RESTAPIServlet { private static final long serialVersionUID = 1L; + private static final List<Byte> STATEMENTS = + Arrays.asList(new Byte[] { Statement.Kind.DATAVERSE_DECL, Statement.Kind.DELETE, Statement.Kind.INSERT, + Statement.Kind.UPSERT, Statement.Kind.UPDATE, Statement.Kind.DML_CMD_LIST, Statement.Kind.LOAD, + Statement.Kind.CONNECT_FEED, Statement.Kind.DISCONNECT_FEED, Statement.Kind.SET, + Statement.Kind.COMPACT, Statement.Kind.EXTERNAL_DATASET_REFRESH, Statement.Kind.RUN }); public UpdateAPIServlet(ILangCompilationProvider compilationProvider) { super(compilationProvider); @@ -40,11 +45,7 @@ @Override protected List<Byte> getAllowedStatements() { - Byte[] statementsArray = - { Statement.DATAVERSE_DECL, Statement.DELETE, Statement.INSERT, Statement.UPSERT, Statement.UPDATE, - Statement.DML_CMD_LIST, Statement.LOAD, Statement.CONNECT_FEED, Statement.DISCONNECT_FEED, - Statement.SET, Statement.COMPACT, Statement.EXTERNAL_DATASET_REFRESH, Statement.RUN }; - return Arrays.asList(statementsArray); + return STATEMENTS; } @Override diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/aql/translator/QueryTranslator.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/aql/translator/QueryTranslator.java index 4df4468..05d9b3d 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/aql/translator/QueryTranslator.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/aql/translator/QueryTranslator.java @@ -234,7 +234,7 @@ private List<FunctionDecl> getDeclaredFunctions(List<Statement> statements) { List<FunctionDecl> functionDecls = new ArrayList<>(); for (Statement st : statements) { - if (st.getKind() == Statement.FUNCTION_DECL) { + if (st.getKind() == Statement.Kind.FUNCTION_DECL) { functionDecls.add((FunctionDecl) st); } } @@ -284,98 +284,98 @@ metadataProvider.setOutputFile(outputFile); metadataProvider.setConfig(config); switch (stmt.getKind()) { - case Statement.SET: + case Statement.Kind.SET: handleSetStatement(stmt, config); break; - case Statement.DATAVERSE_DECL: + case Statement.Kind.DATAVERSE_DECL: activeDefaultDataverse = handleUseDataverseStatement(metadataProvider, stmt); break; - case Statement.CREATE_DATAVERSE: + case Statement.Kind.CREATE_DATAVERSE: handleCreateDataverseStatement(metadataProvider, stmt); break; - case Statement.DATASET_DECL: + case Statement.Kind.DATASET_DECL: handleCreateDatasetStatement(metadataProvider, stmt, hcc); break; - case Statement.CREATE_INDEX: + case Statement.Kind.CREATE_INDEX: handleCreateIndexStatement(metadataProvider, stmt, hcc); break; - case Statement.TYPE_DECL: + case Statement.Kind.TYPE_DECL: handleCreateTypeStatement(metadataProvider, stmt); break; - case Statement.NODEGROUP_DECL: + case Statement.Kind.NODEGROUP_DECL: handleCreateNodeGroupStatement(metadataProvider, stmt); break; - case Statement.DATAVERSE_DROP: + case Statement.Kind.DATAVERSE_DROP: handleDataverseDropStatement(metadataProvider, stmt, hcc); break; - case Statement.DATASET_DROP: + case Statement.Kind.DATASET_DROP: handleDatasetDropStatement(metadataProvider, stmt, hcc); break; - case Statement.INDEX_DROP: + case Statement.Kind.INDEX_DROP: handleIndexDropStatement(metadataProvider, stmt, hcc); break; - case Statement.TYPE_DROP: + case Statement.Kind.TYPE_DROP: handleTypeDropStatement(metadataProvider, stmt); break; - case Statement.NODEGROUP_DROP: + case Statement.Kind.NODEGROUP_DROP: handleNodegroupDropStatement(metadataProvider, stmt); break; - case Statement.CREATE_FUNCTION: + case Statement.Kind.CREATE_FUNCTION: handleCreateFunctionStatement(metadataProvider, stmt); break; - case Statement.FUNCTION_DROP: + case Statement.Kind.FUNCTION_DROP: handleFunctionDropStatement(metadataProvider, stmt); break; - case Statement.LOAD: + case Statement.Kind.LOAD: handleLoadStatement(metadataProvider, stmt, hcc); break; - case Statement.INSERT: - case Statement.UPSERT: + case Statement.Kind.INSERT: + case Statement.Kind.UPSERT: handleInsertUpsertStatement(metadataProvider, stmt, hcc); break; - case Statement.DELETE: + case Statement.Kind.DELETE: handleDeleteStatement(metadataProvider, stmt, hcc); break; - case Statement.CREATE_PRIMARY_FEED: - case Statement.CREATE_SECONDARY_FEED: + case Statement.Kind.CREATE_PRIMARY_FEED: + case Statement.Kind.CREATE_SECONDARY_FEED: handleCreateFeedStatement(metadataProvider, stmt, hcc); break; - case Statement.DROP_FEED: + case Statement.Kind.DROP_FEED: handleDropFeedStatement(metadataProvider, stmt, hcc); break; - case Statement.DROP_FEED_POLICY: + case Statement.Kind.DROP_FEED_POLICY: handleDropFeedPolicyStatement(metadataProvider, stmt, hcc); break; - case Statement.CONNECT_FEED: + case Statement.Kind.CONNECT_FEED: handleConnectFeedStatement(metadataProvider, stmt, hcc); break; - case Statement.DISCONNECT_FEED: + case Statement.Kind.DISCONNECT_FEED: handleDisconnectFeedStatement(metadataProvider, stmt, hcc); break; - case Statement.SUBSCRIBE_FEED: + case Statement.Kind.SUBSCRIBE_FEED: handleSubscribeFeedStatement(metadataProvider, stmt, hcc); break; - case Statement.CREATE_FEED_POLICY: + case Statement.Kind.CREATE_FEED_POLICY: handleCreateFeedPolicyStatement(metadataProvider, stmt, hcc); break; - case Statement.QUERY: + case Statement.Kind.QUERY: metadataProvider.setResultSetId(new ResultSetId(resultSetIdCounter++)); metadataProvider.setResultAsyncMode(resultDelivery == ResultDelivery.ASYNC || resultDelivery == ResultDelivery.ASYNC_DEFERRED); handleQuery(metadataProvider, (Query) stmt, hcc, hdc, resultDelivery, stats); break; - case Statement.COMPACT: + case Statement.Kind.COMPACT: handleCompactStatement(metadataProvider, stmt, hcc); break; - case Statement.EXTERNAL_DATASET_REFRESH: + case Statement.Kind.EXTERNAL_DATASET_REFRESH: handleExternalDatasetRefreshStatement(metadataProvider, stmt, hcc); break; - case Statement.WRITE: + case Statement.Kind.WRITE: Pair<IAWriterFactory, FileSplit> result = handleWriteStatement(stmt); writerFactory = (result.first != null) ? result.first : writerFactory; outputFile = result.second; break; - case Statement.RUN: + case Statement.Kind.RUN: handleRunStatement(metadataProvider, stmt, hcc); break; default: @@ -1856,11 +1856,11 @@ metadataProvider.setWriteTransaction(true); CompiledInsertStatement clfrqs = null; switch (stmtInsertUpsert.getKind()) { - case Statement.INSERT: + case Statement.Kind.INSERT: clfrqs = new CompiledInsertStatement(dataverseName, stmtInsertUpsert.getDatasetName().getValue(), query, stmtInsertUpsert.getVarCounter()); break; - case Statement.UPSERT: + case Statement.Kind.UPSERT: clfrqs = new CompiledUpsertStatement(dataverseName, stmtInsertUpsert.getDatasetName().getValue(), query, stmtInsertUpsert.getVarCounter()); break; @@ -1963,13 +1963,13 @@ } switch (stmt.getKind()) { - case Statement.CREATE_PRIMARY_FEED: + case Statement.Kind.CREATE_PRIMARY_FEED: CreatePrimaryFeedStatement cpfs = (CreatePrimaryFeedStatement) stmt; String adaptorName = cpfs.getAdaptorName(); feed = new Feed(dataverseName, feedName, cfs.getAppliedFunction(), FeedType.PRIMARY, feedName, adaptorName, cpfs.getAdaptorConfiguration()); break; - case Statement.CREATE_SECONDARY_FEED: + case Statement.Kind.CREATE_SECONDARY_FEED: CreateSecondaryFeedStatement csfs = (CreateSecondaryFeedStatement) stmt; feed = new Feed(dataverseName, feedName, csfs.getAppliedFunction(), FeedType.SECONDARY, csfs.getSourceFeedName(), null, null); @@ -3102,4 +3102,4 @@ rewriter.rewrite(stmt); } -} +} \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java index 6bddfa5..05a7dce 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java @@ -128,7 +128,7 @@ when(aqlMetadataProvider.findDataset(anyString(), anyString())).thenReturn(mock(Dataset.class)); for (Statement st : statements) { - if (st.getKind() == Statement.QUERY) { + if (st.getKind() == Statement.Kind.QUERY) { Query query = (Query) st; IQueryRewriter rewriter = sqlppRewriterFactory.createQueryRewriter(); rewrite(rewriter, functions, query, aqlMetadataProvider, @@ -156,7 +156,7 @@ private List<FunctionDecl> getDeclaredFunctions(List<Statement> statements) { List<FunctionDecl> functionDecls = new ArrayList<FunctionDecl>(); for (Statement st : statements) { - if (st.getKind() == Statement.FUNCTION_DECL) { + if (st.getKind() == Statement.Kind.FUNCTION_DECL) { functionDecls.add((FunctionDecl) st); } } @@ -166,7 +166,7 @@ // Gets the default dataverse for the input statements. private String getDefaultDataverse(List<Statement> statements) { for (Statement st : statements) { - if (st.getKind() == Statement.DATAVERSE_DECL) { + if (st.getKind() == Statement.Kind.DATAVERSE_DECL) { DataverseDecl dv = (DataverseDecl) st; return dv.getDataverseName().getValue(); } diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java index 6e1b9e8..9c378a0 100644 --- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java +++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java @@ -64,7 +64,7 @@ SPILL, // Memory budget has been consumed. Now we're writing to disk DISCARD // Memory and Disk space budgets have been consumed. Now we're discarding } - + private FeedUtils() { } diff --git a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/statement/SubscribeFeedStatement.java b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/statement/SubscribeFeedStatement.java index 14f229a..9e6f857 100644 --- a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/statement/SubscribeFeedStatement.java +++ b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/statement/SubscribeFeedStatement.java @@ -52,7 +52,7 @@ * Represents the AQL statement for subscribing to a feed. * This AQL statement is private and may not be used by the end-user. */ -public class SubscribeFeedStatement extends Statement { +public class SubscribeFeedStatement implements Statement { private static final Logger LOGGER = Logger.getLogger(SubscribeFeedStatement.class.getName()); private final FeedConnectionRequest connectionRequest; @@ -158,7 +158,7 @@ @Override public byte getKind() { - return Statement.SUBSCRIBE_FEED; + return Statement.Kind.SUBSCRIBE_FEED; } public String getPolicy() { diff --git a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/util/RangeMapBuilder.java b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/util/RangeMapBuilder.java index f30d4a6..2ee70bc 100644 --- a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/util/RangeMapBuilder.java +++ b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/util/RangeMapBuilder.java @@ -70,7 +70,7 @@ } // Translate the query into a Range Map - if (hintStatements.get(0).getKind() != Statement.QUERY) { + if (hintStatements.get(0).getKind() != Statement.Kind.QUERY) { throw new AsterixException("Not a proper query for the range hint."); } Query q = (Query) hintStatements.get(0); diff --git a/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj b/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj index 586464c..7701278 100644 --- a/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj +++ b/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj @@ -504,12 +504,14 @@ String datasetName = null; } { + ( <REFRESH> <EXTERNAL> <DATASET> nameComponents = QualifiedName() { redss.setDataverseName(nameComponents.first); redss.setDatasetName(nameComponents.second); return redss; } + ) } RunStatement RunStatement() throws ParseException: @@ -1537,7 +1539,6 @@ setDatasets(null); return query; } - } @@ -2201,7 +2202,7 @@ } } -Expression FLWOGR() throws ParseException: +Expression FLWOGR() throws ParseException: { FLWOGRExpression flworg = new FLWOGRExpression(); List<Clause> clauseList = new ArrayList<Clause>(); @@ -2353,9 +2354,9 @@ } Clause GroupClause()throws ParseException : { - GroupbyClause gbc = new GroupbyClause(); - // GbyVariableExpressionPair pair = new GbyVariableExpressionPair(); - List<GbyVariableExpressionPair> vePairList = new ArrayList<GbyVariableExpressionPair>(); + GroupbyClause gbc = new GroupbyClause(); + // GbyVariableExpressionPair pair = new GbyVariableExpressionPair(); + List<GbyVariableExpressionPair> vePairList = new ArrayList<GbyVariableExpressionPair>(); List<GbyVariableExpressionPair> decorPairList = new ArrayList<GbyVariableExpressionPair>(); List<VariableExpr> withVarList= new ArrayList<VariableExpr>(); VariableExpr var = null; diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Statement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Statement.java index 6f0f1f1..fcc1080 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Statement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Statement.java @@ -18,52 +18,75 @@ */ package org.apache.asterix.lang.common.base; -import java.util.Arrays; +import java.util.ArrayList; import java.util.Collections; import java.util.List; -public abstract class Statement implements ILangExpression { - public static final byte DATASET_DECL = 0x00; - public static final byte DATAVERSE_DECL = 0x01; - public static final byte DATAVERSE_DROP = 0x02; - public static final byte DATASET_DROP = 0x03; - public static final byte DELETE = 0x04; - public static final byte INSERT = 0x05; - public static final byte UPSERT = 0x06; - public static final byte UPDATE = 0x07; - public static final byte DML_CMD_LIST = 0x08; - public static final byte FUNCTION_DECL = 0x09; - public static final byte LOAD = 0x0a; - public static final byte NODEGROUP_DECL = 0x0b; - public static final byte NODEGROUP_DROP = 0x0c; - public static final byte QUERY = 0x0d; - public static final byte SET = 0x0e; - public static final byte TYPE_DECL = 0x0f; - public static final byte TYPE_DROP = 0x10; - public static final byte WRITE = 0x11; - public static final byte CREATE_INDEX = 0x12; - public static final byte INDEX_DECL = 0x13; - public static final byte CREATE_DATAVERSE = 0x14; - public static final byte INDEX_DROP = 0x15; - public static final byte CREATE_PRIMARY_FEED = 0x16; - public static final byte CREATE_SECONDARY_FEED = 0x17; - public static final byte DROP_FEED = 0x18; - public static final byte CONNECT_FEED = 0x19; - public static final byte DISCONNECT_FEED = 0x1a; - public static final byte SUBSCRIBE_FEED = 0x1b; - public static final byte CREATE_FEED_POLICY = 0x1c; - public static final byte DROP_FEED_POLICY = 0x1d; - public static final byte CREATE_FUNCTION = 0x1e; - public static final byte FUNCTION_DROP = 0x1f; - public static final byte COMPACT = 0x20; - public static final byte EXTERNAL_DATASET_REFRESH = 0x21; - public static final byte RUN = 0x22; - public static final List<Byte> VALUES = Collections.unmodifiableList( - Arrays.asList(DATASET_DECL, DATAVERSE_DECL, DATAVERSE_DROP, DATASET_DROP, DELETE, INSERT, UPSERT, UPDATE, - DML_CMD_LIST, FUNCTION_DECL, LOAD, NODEGROUP_DECL, NODEGROUP_DROP, QUERY, SET, TYPE_DECL, TYPE_DROP, - WRITE, CREATE_INDEX, INDEX_DECL, CREATE_DATAVERSE, INDEX_DROP, CREATE_PRIMARY_FEED, - CREATE_SECONDARY_FEED, DROP_FEED, CONNECT_FEED, DISCONNECT_FEED, SUBSCRIBE_FEED, CREATE_FEED_POLICY, - DROP_FEED_POLICY, CREATE_FUNCTION, FUNCTION_DROP, COMPACT, EXTERNAL_DATASET_REFRESH, RUN)); +public interface Statement extends ILangExpression { + public static final List<Byte> KINDS = Collections.unmodifiableList(Kind.range(Kind.DATASET_DECL, Kind.RUN)); - public abstract byte getKind(); + /** + * get a byte representing the statement kind + * Note: bytes 0x00 - 0x7f are reserved for core asterix statements + * Use negative bytes for extension statements + * + * @return kind byte + */ + public byte getKind(); + + public class Kind { + public static final byte DATASET_DECL = 0x00; + public static final byte DATAVERSE_DECL = 0x01; + public static final byte DATAVERSE_DROP = 0x02; + public static final byte DATASET_DROP = 0x03; + public static final byte DELETE = 0x04; + public static final byte INSERT = 0x05; + public static final byte UPSERT = 0x06; + public static final byte UPDATE = 0x07; + public static final byte DML_CMD_LIST = 0x08; + public static final byte FUNCTION_DECL = 0x09; + public static final byte LOAD = 0x0a; + public static final byte NODEGROUP_DECL = 0x0b; + public static final byte NODEGROUP_DROP = 0x0c; + public static final byte QUERY = 0x0d; + public static final byte SET = 0x0e; + public static final byte TYPE_DECL = 0x0f; + public static final byte TYPE_DROP = 0x10; + public static final byte WRITE = 0x11; + public static final byte CREATE_INDEX = 0x12; + public static final byte INDEX_DECL = 0x13; + public static final byte CREATE_DATAVERSE = 0x14; + public static final byte INDEX_DROP = 0x15; + public static final byte CREATE_PRIMARY_FEED = 0x16; + public static final byte CREATE_SECONDARY_FEED = 0x17; + public static final byte DROP_FEED = 0x18; + public static final byte CONNECT_FEED = 0x19; + public static final byte DISCONNECT_FEED = 0x1a; + public static final byte SUBSCRIBE_FEED = 0x1b; + public static final byte CREATE_FEED_POLICY = 0x1c; + public static final byte DROP_FEED_POLICY = 0x1d; + public static final byte CREATE_FUNCTION = 0x1e; + public static final byte FUNCTION_DROP = 0x1f; + public static final byte COMPACT = 0x20; + public static final byte EXTERNAL_DATASET_REFRESH = 0x21; + public static final byte RUN = 0x22; + + private Kind() { + } + + /** + * Generate a list of Bytes from start to end + * + * @param start + * @param end + * @return + */ + private static List<Byte> range(byte start, byte end) { + ArrayList<Byte> bytes = new ArrayList<>(); + for (byte b = start; b <= end; b++) { + bytes.add(b); + } + return bytes; + } + } } diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CompactStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CompactStatement.java index 531957f..912ac6f 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CompactStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CompactStatement.java @@ -23,7 +23,7 @@ import org.apache.asterix.lang.common.struct.Identifier; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -public class CompactStatement extends Statement { +public class CompactStatement implements Statement { private final Identifier dataverseName; private final Identifier datasetName; @@ -35,7 +35,7 @@ @Override public byte getKind() { - return Statement.COMPACT; + return Statement.Kind.COMPACT; } public Identifier getDataverseName() { diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/ConnectFeedStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/ConnectFeedStatement.java index 33e3340..48bc59e 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/ConnectFeedStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/ConnectFeedStatement.java @@ -25,7 +25,7 @@ import org.apache.asterix.metadata.feeds.BuiltinFeedPolicies; import org.apache.hyracks.algebricks.common.utils.Pair; -public class ConnectFeedStatement extends Statement { +public class ConnectFeedStatement implements Statement { private final Identifier dataverseName; private final Identifier datasetName; @@ -78,7 +78,7 @@ @Override public byte getKind() { - return Statement.CONNECT_FEED; + return Statement.Kind.CONNECT_FEED; } public String getPolicy() { diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateDataverseStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateDataverseStatement.java index 7a5b722..c6dff3f 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateDataverseStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateDataverseStatement.java @@ -24,7 +24,7 @@ import org.apache.asterix.lang.common.visitor.base.ILangVisitor; import org.apache.asterix.runtime.formats.NonTaggedDataFormat; -public class CreateDataverseStatement extends Statement { +public class CreateDataverseStatement implements Statement { private Identifier dataverseName; private String format; @@ -50,7 +50,7 @@ @Override public byte getKind() { - return Statement.CREATE_DATAVERSE; + return Statement.Kind.CREATE_DATAVERSE; } @Override diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFeedPolicyStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFeedPolicyStatement.java index e972cad..dfc6c7e 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFeedPolicyStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFeedPolicyStatement.java @@ -24,7 +24,7 @@ import org.apache.asterix.lang.common.base.Statement; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -public class CreateFeedPolicyStatement extends Statement { +public class CreateFeedPolicyStatement implements Statement { private final String policyName; private final String sourcePolicyName; @@ -59,7 +59,7 @@ @Override public byte getKind() { - return Statement.CREATE_FEED_POLICY; + return Statement.Kind.CREATE_FEED_POLICY; } @Override diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFeedStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFeedStatement.java index 9635836..c4f9efb 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFeedStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFeedStatement.java @@ -25,7 +25,7 @@ import org.apache.asterix.lang.common.visitor.base.ILangVisitor; import org.apache.hyracks.algebricks.common.utils.Pair; -public abstract class CreateFeedStatement extends Statement { +public abstract class CreateFeedStatement implements Statement { private final Pair<Identifier, Identifier> qName; private final FunctionSignature appliedFunction; diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFunctionStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFunctionStatement.java index f7d0363..02a2b0c 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFunctionStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFunctionStatement.java @@ -27,7 +27,7 @@ import org.apache.asterix.lang.common.struct.VarIdentifier; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -public class CreateFunctionStatement extends Statement { +public class CreateFunctionStatement implements Statement { private final FunctionSignature signature; private final String functionBody; @@ -59,7 +59,7 @@ @Override public byte getKind() { - return Statement.CREATE_FUNCTION; + return Statement.Kind.CREATE_FUNCTION; } public List<String> getParamList() { diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateIndexStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateIndexStatement.java index a2337e1..fd787ab 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateIndexStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateIndexStatement.java @@ -29,7 +29,7 @@ import org.apache.asterix.lang.common.visitor.base.ILangVisitor; import org.apache.hyracks.algebricks.common.utils.Pair; -public class CreateIndexStatement extends Statement { +public class CreateIndexStatement implements Statement { private Identifier indexName; private Identifier dataverseName; @@ -120,7 +120,7 @@ @Override public byte getKind() { - return Statement.CREATE_INDEX; + return Statement.Kind.CREATE_INDEX; } public boolean hasMetaField() { diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreatePrimaryFeedStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreatePrimaryFeedStatement.java index 9dac0c4..6c4d84e 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreatePrimaryFeedStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreatePrimaryFeedStatement.java @@ -49,7 +49,7 @@ @Override public byte getKind() { - return Statement.CREATE_PRIMARY_FEED; + return Statement.Kind.CREATE_PRIMARY_FEED; } @Override diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateSecondaryFeedStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateSecondaryFeedStatement.java index 7ef0a56..6787426 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateSecondaryFeedStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateSecondaryFeedStatement.java @@ -51,7 +51,7 @@ @Override public byte getKind() { - return Statement.CREATE_SECONDARY_FEED; + return Statement.Kind.CREATE_SECONDARY_FEED; } @Override diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java index fa88a9a..b2f3fe1 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java @@ -27,7 +27,7 @@ import org.apache.asterix.lang.common.struct.Identifier; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -public class DatasetDecl extends Statement { +public class DatasetDecl implements Statement { protected final Identifier name; protected final Identifier dataverse; protected final Identifier itemTypeDataverse; @@ -142,7 +142,7 @@ @Override public byte getKind() { - return Statement.DATASET_DECL; + return Statement.Kind.DATASET_DECL; } public IDatasetDetailsDecl getDatasetDetailsDecl() { diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDecl.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDecl.java index ae183e3..89933e5 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDecl.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDecl.java @@ -23,7 +23,7 @@ import org.apache.asterix.lang.common.struct.Identifier; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -public class DataverseDecl extends Statement { +public class DataverseDecl implements Statement { private Identifier dataverseName; @@ -37,7 +37,7 @@ @Override public byte getKind() { - return Statement.DATAVERSE_DECL; + return Statement.Kind.DATAVERSE_DECL; } @Override diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDropStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDropStatement.java index fe828fa..0054140 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDropStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DataverseDropStatement.java @@ -23,7 +23,7 @@ import org.apache.asterix.lang.common.struct.Identifier; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -public class DataverseDropStatement extends Statement { +public class DataverseDropStatement implements Statement { private Identifier dataverseName; private boolean ifExists; @@ -35,7 +35,7 @@ @Override public byte getKind() { - return Statement.DATAVERSE_DROP; + return Statement.Kind.DATAVERSE_DROP; } public Identifier getDataverseName() { diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DeleteStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DeleteStatement.java index c660d68..ffe2c0d 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DeleteStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DeleteStatement.java @@ -28,7 +28,7 @@ import org.apache.asterix.lang.common.visitor.base.ILangVisitor; import org.apache.commons.lang3.ObjectUtils; -public class DeleteStatement extends Statement { +public class DeleteStatement implements Statement { private VariableExpr vars; private Identifier dataverseName; @@ -52,7 +52,7 @@ @Override public byte getKind() { - return Statement.DELETE; + return Statement.Kind.DELETE; } public VariableExpr getVariableExpr() { diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DisconnectFeedStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DisconnectFeedStatement.java index 61ccc7a..9d8cb9d 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DisconnectFeedStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DisconnectFeedStatement.java @@ -24,7 +24,7 @@ import org.apache.asterix.lang.common.visitor.base.ILangVisitor; import org.apache.hyracks.algebricks.common.utils.Pair; -public class DisconnectFeedStatement extends Statement { +public class DisconnectFeedStatement implements Statement { private final Identifier dataverseName; private final Identifier feedName; @@ -62,7 +62,7 @@ @Override public byte getKind() { - return Statement.DISCONNECT_FEED; + return Statement.Kind.DISCONNECT_FEED; } @Override diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DropStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DropStatement.java index f8becae..f4189dd 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DropStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DropStatement.java @@ -23,7 +23,7 @@ import org.apache.asterix.lang.common.struct.Identifier; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -public class DropStatement extends Statement { +public class DropStatement implements Statement { private final Identifier dataverseName; private final Identifier datasetName; @@ -37,7 +37,7 @@ @Override public byte getKind() { - return Statement.DATASET_DROP; + return Statement.Kind.DATASET_DROP; } public Identifier getDataverseName() { diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FeedDropStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FeedDropStatement.java index 88f96ec..878fc49 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FeedDropStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FeedDropStatement.java @@ -23,7 +23,7 @@ import org.apache.asterix.lang.common.struct.Identifier; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -public class FeedDropStatement extends Statement { +public class FeedDropStatement implements Statement { private final Identifier dataverseName; private final Identifier feedName; @@ -37,7 +37,7 @@ @Override public byte getKind() { - return Statement.DROP_FEED; + return Statement.Kind.DROP_FEED; } public Identifier getDataverseName() { diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FeedPolicyDropStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FeedPolicyDropStatement.java index 73535fa..c217690 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FeedPolicyDropStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FeedPolicyDropStatement.java @@ -23,7 +23,7 @@ import org.apache.asterix.lang.common.struct.Identifier; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -public class FeedPolicyDropStatement extends Statement { +public class FeedPolicyDropStatement implements Statement { private final Identifier dataverseName; private final Identifier policyName; @@ -37,7 +37,7 @@ @Override public byte getKind() { - return Statement.DROP_FEED_POLICY; + return Statement.Kind.DROP_FEED_POLICY; } public Identifier getDataverseName() { diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FunctionDecl.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FunctionDecl.java index 57a68f5..c71f7f2 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FunctionDecl.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FunctionDecl.java @@ -27,7 +27,7 @@ import org.apache.asterix.lang.common.struct.VarIdentifier; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -public class FunctionDecl extends Statement { +public class FunctionDecl implements Statement { private FunctionSignature signature; private List<VarIdentifier> paramList; private Expression funcBody; @@ -74,7 +74,7 @@ @Override public byte getKind() { - return Statement.FUNCTION_DECL; + return Statement.Kind.FUNCTION_DECL; } @Override diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FunctionDropStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FunctionDropStatement.java index 9560180..ae1a29b 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FunctionDropStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/FunctionDropStatement.java @@ -23,7 +23,7 @@ import org.apache.asterix.lang.common.base.Statement; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -public class FunctionDropStatement extends Statement { +public class FunctionDropStatement implements Statement { private final FunctionSignature signature; private boolean ifExists; @@ -35,7 +35,7 @@ @Override public byte getKind() { - return Statement.FUNCTION_DROP; + return Statement.Kind.FUNCTION_DROP; } public FunctionSignature getFunctionSignature() { diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IndexDecl.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IndexDecl.java index 06def0f..74cf0af 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IndexDecl.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IndexDecl.java @@ -23,6 +23,6 @@ public class IndexDecl extends CreateIndexStatement { @Override public byte getKind() { - return Statement.INDEX_DECL; + return Statement.Kind.INDEX_DECL; } } diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IndexDropStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IndexDropStatement.java index e96a9d5..1e3f6b0 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IndexDropStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IndexDropStatement.java @@ -23,7 +23,7 @@ import org.apache.asterix.lang.common.struct.Identifier; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -public class IndexDropStatement extends Statement { +public class IndexDropStatement implements Statement { private Identifier dataverseName; private Identifier datasetName; @@ -40,7 +40,7 @@ @Override public byte getKind() { - return Statement.INDEX_DROP; + return Statement.Kind.INDEX_DROP; } public Identifier getDataverseName() { diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/InsertStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/InsertStatement.java index 6d2c4f7..1e69a68 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/InsertStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/InsertStatement.java @@ -24,7 +24,7 @@ import org.apache.asterix.lang.common.visitor.base.ILangVisitor; import org.apache.commons.lang3.ObjectUtils; -public class InsertStatement extends Statement { +public class InsertStatement implements Statement { private final Identifier dataverseName; private final Identifier datasetName; @@ -40,7 +40,7 @@ @Override public byte getKind() { - return Statement.INSERT; + return Statement.Kind.INSERT; } public Identifier getDataverseName() { diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/LoadStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/LoadStatement.java index efea76c..849b0bd 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/LoadStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/LoadStatement.java @@ -25,7 +25,7 @@ import org.apache.asterix.lang.common.struct.Identifier; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -public class LoadStatement extends Statement { +public class LoadStatement implements Statement { private Identifier datasetName; private Identifier dataverseName; @@ -68,7 +68,7 @@ @Override public byte getKind() { - return Statement.LOAD; + return Statement.Kind.LOAD; } public Identifier getDatasetName() { diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/NodeGroupDropStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/NodeGroupDropStatement.java index 5f6a0a2..710bedd 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/NodeGroupDropStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/NodeGroupDropStatement.java @@ -23,7 +23,7 @@ import org.apache.asterix.lang.common.struct.Identifier; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -public class NodeGroupDropStatement extends Statement { +public class NodeGroupDropStatement implements Statement { private Identifier nodeGroupName; private boolean ifExists; @@ -35,7 +35,7 @@ @Override public byte getKind() { - return Statement.NODEGROUP_DROP; + return Statement.Kind.NODEGROUP_DROP; } public Identifier getNodeGroupName() { diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/NodegroupDecl.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/NodegroupDecl.java index 25244ad..4232584 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/NodegroupDecl.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/NodegroupDecl.java @@ -25,7 +25,7 @@ import org.apache.asterix.lang.common.struct.Identifier; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -public class NodegroupDecl extends Statement { +public class NodegroupDecl implements Statement { private Identifier nodegroupName; private List<Identifier> nodeControllerNames; @@ -55,7 +55,7 @@ @Override public byte getKind() { - return Statement.NODEGROUP_DECL; + return Statement.Kind.NODEGROUP_DECL; } @Override diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/Query.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/Query.java index 8a40ae9..80853c8 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/Query.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/Query.java @@ -27,7 +27,7 @@ import org.apache.asterix.lang.common.visitor.base.ILangVisitor; import org.apache.commons.lang3.ObjectUtils; -public class Query extends Statement { +public class Query implements Statement { private boolean topLevel = true; private Expression body; private int varCounter; @@ -72,7 +72,7 @@ @Override public byte getKind() { - return Statement.QUERY; + return Statement.Kind.QUERY; } @Override diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/RefreshExternalDatasetStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/RefreshExternalDatasetStatement.java index 47c4ca0..277b4bf 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/RefreshExternalDatasetStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/RefreshExternalDatasetStatement.java @@ -23,7 +23,7 @@ import org.apache.asterix.lang.common.struct.Identifier; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -public class RefreshExternalDatasetStatement extends Statement { +public class RefreshExternalDatasetStatement implements Statement { private Identifier dataverseName; private Identifier datasetName; @@ -51,7 +51,7 @@ @Override public byte getKind() { - return Statement.EXTERNAL_DATASET_REFRESH; + return Statement.Kind.EXTERNAL_DATASET_REFRESH; } } diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/RunStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/RunStatement.java index bfdc4a0..6b33078 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/RunStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/RunStatement.java @@ -25,7 +25,7 @@ import org.apache.asterix.lang.common.struct.Identifier; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -public class RunStatement extends Statement { +public class RunStatement implements Statement { private String system; private List<String> parameters; @@ -75,7 +75,7 @@ @Override public byte getKind() { - return Statement.RUN; + return Statement.Kind.RUN; } } diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/SetStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/SetStatement.java index 044e42a..54ba599 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/SetStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/SetStatement.java @@ -22,7 +22,7 @@ import org.apache.asterix.lang.common.base.Statement; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -public class SetStatement extends Statement { +public class SetStatement implements Statement { private String propName; private String propValue; @@ -42,7 +42,7 @@ @Override public byte getKind() { - return Statement.SET; + return Statement.Kind.SET; } @Override diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/TypeDecl.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/TypeDecl.java index 6d41640..e25688e 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/TypeDecl.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/TypeDecl.java @@ -25,7 +25,7 @@ import org.apache.asterix.lang.common.struct.Identifier; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -public class TypeDecl extends Statement { +public class TypeDecl implements Statement { private final Identifier dataverseName; private final Identifier ident; @@ -64,7 +64,7 @@ @Override public byte getKind() { - return Statement.TYPE_DECL; + return Statement.Kind.TYPE_DECL; } @Override diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/TypeDropStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/TypeDropStatement.java index a4bbe96..d675054 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/TypeDropStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/TypeDropStatement.java @@ -23,7 +23,7 @@ import org.apache.asterix.lang.common.struct.Identifier; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -public class TypeDropStatement extends Statement { +public class TypeDropStatement implements Statement { private final Identifier dataverseName; private Identifier typeName; @@ -37,7 +37,7 @@ @Override public byte getKind() { - return Statement.TYPE_DROP; + return Statement.Kind.TYPE_DROP; } public Identifier getDataverseName() { diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpdateStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpdateStatement.java index da74549..8ccc694 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpdateStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpdateStatement.java @@ -28,7 +28,7 @@ import org.apache.asterix.lang.common.visitor.base.ILangVisitor; import org.apache.commons.lang3.ObjectUtils; -public class UpdateStatement extends Statement { +public class UpdateStatement implements Statement { private VariableExpr vars; private Expression target; @@ -44,7 +44,7 @@ @Override public byte getKind() { - return Statement.UPDATE; + return Statement.Kind.UPDATE; } public VariableExpr getVariableExpr() { diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpsertStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpsertStatement.java index f562927..1fb1de2 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpsertStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpsertStatement.java @@ -29,12 +29,12 @@ @Override public byte getKind() { - return Statement.UPSERT; + return Statement.Kind.UPSERT; } @Override public int hashCode() { - return super.hashCode() + Statement.UPSERT; + return super.hashCode() + Statement.Kind.UPSERT; } @Override diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/WriteStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/WriteStatement.java index 1c49b9d..a755a54 100644 --- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/WriteStatement.java +++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/WriteStatement.java @@ -23,7 +23,7 @@ import org.apache.asterix.lang.common.struct.Identifier; import org.apache.asterix.lang.common.visitor.base.ILangVisitor; -public class WriteStatement extends Statement { +public class WriteStatement implements Statement { private final Identifier ncName; private final String fileName; @@ -49,7 +49,7 @@ @Override public byte getKind() { - return Statement.WRITE; + return Statement.Kind.WRITE; } @Override diff --git a/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/pom.xml b/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/pom.xml new file mode 100644 index 0000000..d3e4a41 --- /dev/null +++ b/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/pom.xml @@ -0,0 +1,102 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.apache.asterix</groupId> + <artifactId>asterix-maven-plugins</artifactId> + <version>0.8.9-SNAPSHOT</version> + </parent> + <artifactId>asterix-grammar-extension-maven-plugin</artifactId> + <packaging>maven-plugin</packaging> + <dependencies> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-plugin-api</artifactId> + <version>3.2.5</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-core</artifactId> + <version>3.2.5</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-compat</artifactId> + <version>3.2.5</version> + </dependency> + <!-- dependencies to annotations --> + <dependency> + <groupId>org.apache.maven.plugin-tools</groupId> + <artifactId>maven-plugin-annotations</artifactId> + <version>3.4</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.apache.asterix</groupId> + <artifactId>asterix-external-data</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.apache.maven.plugin-testing</groupId> + <artifactId>maven-plugin-testing-harness</artifactId> + <version>3.3.0</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.asterix</groupId> + <artifactId>asterix-lang-common</artifactId> + <version>${project.version}</version> + </dependency> + </dependencies> + <build> + <plugins> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>javacc-maven-plugin</artifactId> + <version>2.6</version> + <executions> + <execution> + <id>javacc</id> + <goals> + <goal>javacc</goal> + </goals> + <phase>verify</phase> + <configuration> + <isStatic>false</isStatic> + <javaUnicodeEscape>true</javaUnicodeEscape> + <sourceDirectory>${project.build.directory}/generated-sources/lang</sourceDirectory> + <outputDirectory>${project.build.directory}/generated-sources/javacc</outputDirectory> + </configuration> + </execution> + <execution> + <id>javacc-jjdoc</id> + <goals> + <goal>jjdoc</goal> + </goals> + <phase>verify</phase> + </execution> + </executions> + </plugin> + </plugins> + <pluginManagement> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-plugin-plugin</artifactId> + <version>3.3</version> + <configuration> + <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound> + </configuration> + <executions> + <execution> + <id>mojo-descriptor</id> + <phase>process-classes</phase> + <goals> + <goal>descriptor</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </pluginManagement> + </build> +</project> \ No newline at end of file diff --git a/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/src/main/java/org/apache/asterix/extension/grammar/GrammarExtensionMojo.java b/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/src/main/java/org/apache/asterix/extension/grammar/GrammarExtensionMojo.java new file mode 100644 index 0000000..8f263f7 --- /dev/null +++ b/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/src/main/java/org/apache/asterix/extension/grammar/GrammarExtensionMojo.java @@ -0,0 +1,841 @@ +/* + * 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. + */ +package org.apache.asterix.extension.grammar; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.asterix.external.input.record.CharArrayRecord; +import org.apache.asterix.external.util.ExternalDataConstants; +import org.apache.commons.lang3.StringUtils; +import org.apache.hyracks.algebricks.common.utils.Pair; +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; + +/** + * a Mojo for creating a grammar extension + */ +@Mojo(name = "grammarix") +public class GrammarExtensionMojo extends AbstractMojo { + + private static final String PARSER_BEGIN = "PARSER_BEGIN"; + private static final String PARSER_END = "PARSER_END"; + private static final char OPEN_BRACE = '{'; + private static final char CLOSE_BRACE = '}'; + private static final char OPEN_ANGULAR = '<'; + private static final char CLOSE_ANGULAR = '>'; + private static final char OPEN_PAREN = '('; + private static final char CLOSE_PAREN = ')'; + private static final char SEMICOLON = ';'; + private static final List<Character> SIG_SPECIAL_CHARS = + Arrays.asList(new Character[] { '(', ')', ':', '<', '>', ';', '.' }); + private static final String KWCLASS = "class"; + private static final String KWIMPORT = "import"; + private static final String KWPACKAGE = "package"; + private static final String NEWPRODUCTION = "@new"; + private static final String MERGEPRODUCTION = "@merge"; + private static final String OVERRIDEPRODUCTION = "@override"; + private static final String BEFORE = "before:"; + private static final String AFTER = "after:"; + private static final List<String> KEYWORDS = + Arrays.asList(new String[] { KWCLASS, KWIMPORT, KWPACKAGE, PARSER_BEGIN, PARSER_END }); + private static final List<String> EXTENSIONKEYWORDS = + Arrays.asList(new String[] { KWIMPORT, NEWPRODUCTION, OVERRIDEPRODUCTION, MERGEPRODUCTION }); + private static final String REGEX_WS_DOT_SEMICOLON = "\\s|[.]|[;]"; + private static final String REGEX_WS_PAREN = "\\s|[(]|[)]"; + private static final String OPTIONS = "options"; + private CharArrayRecord record = new CharArrayRecord(); + private Position position = new Position(); + private Map<String, Pair<String, String>> extensibles = new HashMap<>(); + private Map<String, String[]> mergeElements = new HashMap<>(); + private List<Pair<String, String>> finals = new ArrayList<>(); + private List<List<String>> imports = new ArrayList<>(); + private String baseClassName; + private String baseClassDef; + private String optionsBlock; + private boolean read = false; + + @Parameter(property = "grammarix.base") + private String base; + + @Parameter(property = "grammarix.extension") + private String extension; + + @Parameter(property = "grammarix.output") + private String output; + + @Parameter(property = "grammarix.packageName") + private String packageName; + + @Parameter(property = "grammarix.parserClassName") + private String parserClassName; + private String lastIdentifier; + + @Override + public void execute() throws MojoExecutionException { + getLog().info("Current dir: " + System.getProperty("user.dir")); + getLog().info("base: " + base); + getLog().info("extension: " + extension); + processBase(); + processExtension(); + generateOutput(); + } + + private void generateOutput() throws MojoExecutionException { + File outputFile = prepareOutputFile(); + try (BufferedWriter writer = Files.newBufferedWriter(outputFile.toPath(), StandardCharsets.UTF_8)) { + // Options + if (optionsBlock != null) { + writer.write(OPTIONS); + writer.write(optionsBlock); + } + writer.newLine(); + + // Parser Begin + writer.write(PARSER_BEGIN); + writer.write(OPEN_PAREN); + writer.write(parserClassName); + writer.write(CLOSE_PAREN); + writer.newLine(); + writer.newLine(); + + // Package + writer.write(KWPACKAGE); + writer.write(" "); + writer.write(packageName); + writer.write(SEMICOLON); + writer.newLine(); + writer.newLine(); + + // Imports + List<String> importList = new ArrayList<>(); + for (List<String> importTokens : imports) { + importList.add(importToString(importTokens)); + } + Collections.sort(importList); + for (String importStatement : importList) { + writer.write(importStatement); + writer.newLine(); + } + + writer.newLine(); + + // Class definition + writer.write(baseClassDef.replaceAll(baseClassName, parserClassName)); + writer.newLine(); + + // Parser End + writer.write(PARSER_END); + writer.write(OPEN_PAREN); + writer.write(parserClassName); + writer.write(CLOSE_PAREN); + writer.newLine(); + writer.newLine(); + + // Extinsibles + for (Entry<String, Pair<String, String>> entry : extensibles.entrySet()) { + writer.newLine(); + String signature = entry.getKey(); + if (mergeElements.containsKey(signature)) { + writer.write("// Merged Non-terminal"); + writer.newLine(); + } + writer.write(extensibleSignatureToOutput(signature)); + writer.newLine(); + if (mergeElements.containsKey(signature)) { + merge(writer, entry.getValue(), mergeElements.get(signature)); + } else { + writer.write(entry.getValue().first); + writer.newLine(); + if (entry.getValue().second != null) { + writer.write(entry.getValue().second); + writer.newLine(); + } + } + } + + for (Pair<String, String> element : finals) { + writer.write(toOutput(element.first)); + writer.newLine(); + writer.write(element.second); + writer.newLine(); + } + + } catch (Exception e) { + getLog().error(e); + throw new MojoExecutionException(e.getMessage(), e); + } + } + + private String extensibleSignatureToOutput(String signature) { + StringBuilder aString = new StringBuilder(); + String[] tokens = signature.split(" "); + aString.append(tokens[0]); + for (int i = 1; i < tokens.length; i++) { + if (tokens[i - 1].charAt(tokens[i - 1].length() - 1) == CLOSE_PAREN + || (!SIG_SPECIAL_CHARS.contains(tokens[i].charAt(0)) + && !SIG_SPECIAL_CHARS.contains(tokens[i - 1].charAt(tokens[i - 1].length() - 1)))) { + aString.append(" "); + } + aString.append(tokens[i]); + } + return aString.toString(); + } + + private String toOutput(String signature) { + if (signature.indexOf(OPEN_ANGULAR) == 0) { + // a final + StringBuilder aString = new StringBuilder(); + aString.append(signature.substring(0, signature.indexOf(CLOSE_ANGULAR) + 1)); + aString.append('\n'); + aString.append(signature.substring(signature.indexOf(CLOSE_ANGULAR) + 1)); + return aString.toString(); + } else { + return signature; + } + } + + private void merge(BufferedWriter writer, Pair<String, String> baseBlocks, String[] extensions) + throws IOException, MojoExecutionException { + String errorMessage = "Merged base node doesn't conform to expected mergable node structure"; + int block1Open = baseBlocks.first.indexOf(OPEN_BRACE); + int block1Close = baseBlocks.first.lastIndexOf(CLOSE_BRACE); + // first block + writer.write(OPEN_BRACE); + if (extensions[0] != null) { + writer.write(extensions[0]); + } + writer.write(baseBlocks.first.substring(block1Open + 1, block1Close)); + if (extensions[1] != null) { + writer.write(extensions[1]); + } + writer.write(CLOSE_BRACE); + writer.newLine(); + // second block + writer.write(OPEN_BRACE); + writer.newLine(); + writer.write(" "); + writer.write(OPEN_PAREN); + if (extensions[2] != null) { + writer.write(extensions[2]); + } + String innerBlock2String = null; + if (baseBlocks.second != null) { + BufferedReader blockReader = stringToReader(baseBlocks.second); + Position blockPosition = new Position(); + blockPosition.index = 0; + blockPosition.line = blockReader.readLine(); + while (blockPosition.line != null && blockPosition.line.trim().length() == 0) { + blockPosition.line = blockReader.readLine(); + } + int block2Open = blockPosition.line.indexOf(OPEN_BRACE); + if (block2Open < 0) { + throw new MojoExecutionException(errorMessage); + } + blockPosition.line = blockPosition.line.substring(block2Open + 1); + while (blockPosition.line != null && blockPosition.line.trim().length() == 0) { + blockPosition.line = blockReader.readLine(); + } + int innerBlock1Open = blockPosition.line.indexOf(OPEN_PAREN); + if (innerBlock1Open < 0) { + throw new MojoExecutionException(errorMessage); + } + blockPosition.index = innerBlock1Open; + readBlock(blockReader, OPEN_PAREN, CLOSE_PAREN, blockPosition); + String innerBlock1String = record.toString(); + writer.newLine(); + writer.write(" "); + writer.write(innerBlock1String + .substring(innerBlock1String.indexOf(OPEN_PAREN) + 1, innerBlock1String.lastIndexOf(CLOSE_PAREN)) + .trim()); + writer.newLine(); + record.reset(); + // read second inner block + blockPosition.line = blockReader.readLine(); + while (blockPosition.line != null && blockPosition.line.trim().length() == 0) { + blockPosition.line = blockReader.readLine(); + } + int innerBlock2Open = blockPosition.line.indexOf(OPEN_BRACE); + if (innerBlock2Open < 0) { + throw new MojoExecutionException(errorMessage); + } + blockPosition.index = innerBlock2Open; + readBlock(blockReader, OPEN_BRACE, CLOSE_BRACE, blockPosition); + innerBlock2String = record.toString(); + record.reset(); + } + if (extensions[3] != null) { + writer.write(extensions[3]); + } + writer.newLine(); + writer.write(" "); + writer.write(CLOSE_PAREN); + writer.newLine(); + writer.write(" "); + writer.write(OPEN_BRACE); + if (extensions[4] != null) { + writer.write(extensions[4]); + } + if (innerBlock2String != null) { + writer.newLine(); + writer.write(" "); + writer.write(innerBlock2String + .substring(innerBlock2String.indexOf(OPEN_BRACE) + 1, innerBlock2String.lastIndexOf(CLOSE_BRACE)) + .trim()); + writer.newLine(); + } + if (extensions[5] != null) { + writer.write(extensions[5]); + } + // Close inner second block + writer.write(" "); + writer.write(CLOSE_BRACE); + writer.newLine(); + // Close second block + writer.write(CLOSE_BRACE); + writer.newLine(); + } + + class Position { + String line; + int index; + } + + private void readBlock(BufferedReader reader, char start, char end) throws IOException, MojoExecutionException { + readBlock(reader, start, end, position); + } + + private void readBlock(BufferedReader reader, char start, char end, Position position) + throws IOException, MojoExecutionException { + record.reset(); + char[] chars = position.line.toCharArray(); + if (chars[position.index] != start) { + throw new MojoExecutionException( + "attempt to read a non terminal that doesn't start with a brace. @Line: " + position.line); + } + boolean prevCharEscape = false; + boolean inString = false; + boolean hasFinished = false; + int depth = 0; + int bufferPosn = position.index; + int bufferLength = chars.length; + do { + int startPosn = bufferPosn; + if (bufferPosn >= bufferLength) { + startPosn = bufferPosn = 0; + record.append("\n".toCharArray()); + position.line = reader.readLine(); + chars = position.line.toCharArray(); + bufferLength = chars.length; + } + for (; bufferPosn < bufferLength; ++bufferPosn) { + if (inString) { + // we are in a string, we only care about the string end + if (chars[bufferPosn] == ExternalDataConstants.QUOTE && !prevCharEscape) { + inString = false; + } + if (prevCharEscape) { + prevCharEscape = false; + } else { + prevCharEscape = chars[bufferPosn] == ExternalDataConstants.ESCAPE; + } + } else { + if (chars[bufferPosn] == ExternalDataConstants.QUOTE) { + inString = true; + } else if (chars[bufferPosn] == start) { + depth += 1; + } else if (chars[bufferPosn] == end) { + depth -= 1; + if (depth == 0) { + hasFinished = true; + bufferPosn++; + position.index = bufferPosn; + break; + } + } + } + } + int appendLength = bufferPosn - startPosn; + if (appendLength > 0) { + record.append(chars, startPosn, appendLength); + } + } while (!hasFinished); + record.endRecord(); + } + + private void processBase() throws MojoExecutionException { + try (BufferedReader reader = Files.newBufferedReader(Paths.get(base), StandardCharsets.UTF_8)) { + StringBuilder identifier = new StringBuilder(); + while ((position.line = reader.readLine()) != null) { + if (position.line.trim().startsWith("//")) { + // skip comments + continue; + } + String[] tokens = position.line.split(REGEX_WS_PAREN); + position.index = 0; + int openBraceIndex = position.line.indexOf(OPEN_BRACE); + int openAngularIndex = position.line.trim().indexOf(OPEN_ANGULAR); + if (tokens.length > 0 && identifier.length() == 0 && KEYWORDS.contains(tokens[0])) { + handleSpecialToken(tokens[0], reader); + } else if (openBraceIndex >= 0 && openAngularIndex < 0) { + String beforeBrace = position.line.substring(0, openBraceIndex); + if (beforeBrace.trim().length() > 0) { + identifier.append(beforeBrace); + } else if (identifier.length() == 0) { + identifier.append(lastIdentifier); + } + position.index = openBraceIndex; + readBlock(reader, OPEN_BRACE, CLOSE_BRACE); + // if next non-white space character is an open brace, then we need to append + addExtensibleProduction(identifier); + } else if (openAngularIndex == 0) { + position.index = position.line.indexOf(OPEN_ANGULAR); + readFinalProduction(identifier, reader); + addFinalProduction(identifier); + } else if (identifier.length() > 0 || position.line.trim().length() > 0) { + identifier.append(position.line); + identifier.append('\n'); + } + } + } catch (Exception e) { + getLog().error(e); + throw new MojoExecutionException(e.getMessage(), e); + } + } + + private void handleSpecialToken(String token, BufferedReader reader) throws IOException, MojoExecutionException { + switch (token) { + case PARSER_BEGIN: + // parser begin. duh! + parserBegin(reader); + break; + case PARSER_END: + // parser end + parserEnd(reader); + break; + case KWCLASS: + // class declaration + handleClassDeclaration(reader); + break; + case KWPACKAGE: + // package declaration + skipPackageDeclaration(reader); + break; + case KWIMPORT: + handleImport(reader); + // import statement + break; + default: + break; + } + } + + private void addFinalProduction(StringBuilder identifier) { + String sig = toSignature(identifier.toString()); + finals.add(new Pair<String, String>(sig, record.toString())); + record.reset(); + identifier.setLength(0); + lastIdentifier = null; + } + + private void handleImport(BufferedReader reader) throws IOException { + // will not work on two imports on a single line + ArrayList<String> importList = new ArrayList<>(); + String[] tokens = position.line.split(REGEX_WS_DOT_SEMICOLON); + importList.addAll(Arrays.asList(tokens)); + while (position.line.indexOf(SEMICOLON) < 0) { + position.line = reader.readLine(); + tokens = position.line.split(REGEX_WS_DOT_SEMICOLON); + importList.addAll(Arrays.asList(tokens)); + } + imports.add(importList); + } + + private String importToString(List<String> importTokens) { + return "import " + StringUtils.join(importTokens.subList(1, importTokens.size()), '.') + ";"; + } + + private void skipPackageDeclaration(BufferedReader reader) throws IOException { + while (position.line.indexOf(SEMICOLON) < 0) { + position.line = reader.readLine(); + } + } + + private void handleClassDeclaration(BufferedReader reader) throws IOException, MojoExecutionException { + StringBuilder parserDef = new StringBuilder(); + int classPosition = position.line.indexOf(KWCLASS); + int startIndex = position.line.indexOf(OPEN_BRACE, classPosition); + if (startIndex < 0) { + position.line = position.line.substring(classPosition).replace(baseClassName, parserClassName); + while (startIndex < 0) { + parserDef.append(position.line); + parserDef.append('\n'); + position.line = reader.readLine(); + startIndex = position.line.indexOf(OPEN_BRACE); + } + parserDef.append(position.line, 0, startIndex); + } else { + parserDef.append(position.line, classPosition, startIndex); + } + position.index = startIndex; + readBlock(reader, OPEN_BRACE, CLOSE_BRACE); + String classBody = record.toString(); + parserDef.append(classBody); + parserDef.append('\n'); + baseClassDef = parserDef.toString(); + } + + private void parserEnd(BufferedReader reader) throws IOException { + int endIndex = position.line.indexOf(CLOSE_PAREN, position.index); + while (endIndex < 0) { + position.line = reader.readLine(); + endIndex = position.line.indexOf(CLOSE_PAREN); + } + position.index = endIndex; + } + + private void parserBegin(BufferedReader reader) throws IOException { + StringBuilder aStringBuilder = new StringBuilder(); + int startIndex = position.line.indexOf(OPEN_PAREN, position.index); + while (startIndex < 0) { + position.line = reader.readLine(); + startIndex = position.line.indexOf(OPEN_PAREN); + } + int endIndex = position.line.indexOf(CLOSE_PAREN, startIndex); + if (endIndex < 0) { + // start and end on different lines + position.line = position.line.substring(startIndex + 1); + while (endIndex < 0) { + aStringBuilder.append(position.line); + position.line = reader.readLine(); + endIndex = position.line.indexOf(CLOSE_PAREN); + } + aStringBuilder.append(position.line, 0, endIndex); + } else { + // start and end on the same line + aStringBuilder.append(position.line.substring(startIndex + 1, endIndex)); + } + position.index = endIndex; + baseClassName = aStringBuilder.toString().trim(); + } + + private void readFinalProduction(StringBuilder identifier, BufferedReader reader) + throws IOException, MojoExecutionException { + int blockStart = position.line.indexOf(OPEN_BRACE); + if (blockStart < 0) { + position.line = position.line.substring(position.index); + while (blockStart < 0) { + identifier.append(position.line); + identifier.append('\n'); + position.line = reader.readLine(); + blockStart = position.line.indexOf(OPEN_BRACE); + } + identifier.append(position.line.substring(0, blockStart)); + } else { + identifier.append(position.line.substring(position.index, blockStart)); + } + position.index = blockStart; + readBlock(reader, OPEN_BRACE, CLOSE_BRACE); + } + + private void addExtensibleProduction(StringBuilder identifier) { + if (identifier.toString().trim().equals(OPTIONS)) { + optionsBlock = record.toString(); + } else { + String sig = toSignature(identifier.toString()); + Pair<String, String> pair = extensibles.get(sig); + if (pair == null) { + pair = new Pair<>(record.toString(), null); + extensibles.put(sig, pair); + } else { + pair.second = record.toString(); + } + lastIdentifier = identifier.toString(); + } + record.reset(); + identifier.setLength(0); + } + + private void processExtension() throws MojoExecutionException { + try (BufferedReader reader = Files.newBufferedReader(Paths.get(extension), StandardCharsets.UTF_8)) { + StringBuilder identifier = new StringBuilder(); + String nextOperation = OVERRIDEPRODUCTION; + while (read || (position.line = reader.readLine()) != null) { + read = false; + if (position.line.trim().startsWith("//")) { + // skip comments + continue; + } + String[] tokens = position.line.split(REGEX_WS_PAREN); + position.index = 0; + int openBraceIndex = position.line.indexOf(OPEN_BRACE); + int openAngularIndex = position.line.trim().indexOf(OPEN_ANGULAR); + if (tokens.length > 0 && identifier.length() == 0 && EXTENSIONKEYWORDS.contains(tokens[0])) { + switch (tokens[0]) { + case KWIMPORT: + handleImport(reader); + // import statement + break; + case NEWPRODUCTION: + nextOperation = NEWPRODUCTION; + break; + case MERGEPRODUCTION: + nextOperation = MERGEPRODUCTION; + break; + case OVERRIDEPRODUCTION: + nextOperation = OVERRIDEPRODUCTION; + break; + default: + break; + } + } else if (openBraceIndex >= 0 && openAngularIndex < 0) { + String beforeBrace = position.line.substring(0, openBraceIndex); + if (beforeBrace.trim().length() > 0) { + identifier.append(beforeBrace); + } else if (identifier.length() == 0) { + identifier.append(lastIdentifier); + } + position.index = openBraceIndex; + switch (nextOperation) { + case NEWPRODUCTION: + handleNew(identifier, reader); + break; + case OVERRIDEPRODUCTION: + handleOverride(identifier, reader); + break; + case MERGEPRODUCTION: + handleMerge(identifier, reader); + break; + default: + throw new MojoExecutionException("Malformed extention file"); + } + nextOperation = NEWPRODUCTION; + } else if (openAngularIndex == 0) { + if (nextOperation != NEWPRODUCTION) { + throw new MojoExecutionException("Can only add new REGEX production kind"); + } + position.index = position.line.indexOf(OPEN_ANGULAR); + readFinalProduction(identifier, reader); + addFinalProduction(identifier); + } else if (identifier.length() > 0 || position.line.trim().length() > 0) { + identifier.append(position.line); + identifier.append('\n'); + } + } + } catch (Exception e) { + getLog().error(e); + throw new MojoExecutionException(e.getMessage(), e); + } + } + + private void handleOverride(StringBuilder identifier, BufferedReader reader) + throws MojoExecutionException, IOException { + readBlock(reader, OPEN_BRACE, CLOSE_BRACE); + Pair<String, String> pair = new Pair<>(record.toString(), null); + String sig = toSignature(identifier.toString()); + extensibles.put(sig, pair); + record.reset(); + identifier.setLength(0); + // will read ahead of loop cycle + read = true; + position.index = 0; + position.line = reader.readLine(); + while (position.line != null && position.line.trim().length() == 0) { + position.line = reader.readLine(); + } + int openBraceIndex = position.line.indexOf(OPEN_BRACE); + if (openBraceIndex > -1) { + // consume + read = false; + position.index = openBraceIndex; + readBlock(reader, OPEN_BRACE, CLOSE_BRACE); + pair.second = record.toString(); + record.reset(); + } + } + + private void handleNew(StringBuilder identifier, BufferedReader reader) throws MojoExecutionException, IOException { + String sig = toSignature(identifier.toString()); + if (extensibles.containsKey(sig)) { + throw new MojoExecutionException(identifier.toString() + " already exists in base grammar"); + } + handleOverride(identifier, reader); + } + + private void handleMerge(StringBuilder identifier, BufferedReader reader) + throws MojoExecutionException, IOException { + String sig = toSignature(identifier.toString()); + if (!extensibles.containsKey(sig)) { + throw new MojoExecutionException(identifier.toString() + " doesn't exist in base grammar"); + } + String[] amendments = new String[6]; + mergeElements.put(sig, amendments); + // we don't need the identifier anymore + identifier.setLength(0); + readBlock(reader, OPEN_BRACE, CLOSE_BRACE); + String block = record.toString(); + extractBeforeAndAfter(block, amendments, 0, 1); + record.reset(); + position.index = 0; + position.line = reader.readLine(); + while (position.line != null && position.line.trim().length() == 0) { + position.line = reader.readLine(); + } + int openBraceIndex = position.line.indexOf(OPEN_BRACE); + if (openBraceIndex > -1) { + position.index = openBraceIndex; + readBlock(reader, OPEN_BRACE, CLOSE_BRACE); + } else { + throw new MojoExecutionException("merge element doesn't have a second block"); + } + block = record.toString(); + BufferedReader blockReader = stringToReader(block); + String line = blockReader.readLine(); + while (line != null && line.indexOf(OPEN_BRACE) < 0) { + line = blockReader.readLine(); + } + if (line == null) { + throw new MojoExecutionException("merge element doesn't have a correct second block"); + } + line = line.substring(line.indexOf(OPEN_BRACE) + 1); + while (line != null && line.trim().length() == 0) { + line = blockReader.readLine(); + } + if (line == null) { + throw new MojoExecutionException("merge element doesn't have a correct second block"); + } + int openParenIndex = line.indexOf(OPEN_PAREN); + if (openParenIndex < 0) { + throw new MojoExecutionException("second block in merge element doesn't have a correct () block"); + } + Position blockPosition = new Position(); + blockPosition.line = line; + blockPosition.index = openParenIndex; + readBlock(blockReader, OPEN_PAREN, CLOSE_PAREN, blockPosition); + extractBeforeAndAfter(record.toString(), amendments, 2, 3); + record.reset(); + // process third block: + blockPosition.index = 0; + blockPosition.line = blockReader.readLine(); + while (blockPosition.line != null && blockPosition.line.trim().length() == 0) { + blockPosition.line = blockReader.readLine(); + } + openBraceIndex = blockPosition.line.indexOf(OPEN_BRACE); + if (openBraceIndex > -1) { + blockPosition.index = openBraceIndex; + readBlock(blockReader, OPEN_BRACE, CLOSE_BRACE, blockPosition); + } else { + throw new MojoExecutionException("merge element doesn't have a second block"); + } + extractBeforeAndAfter(record.toString(), amendments, 4, 5); + record.reset(); + } + + private void extractBeforeAndAfter(String block, String[] amendments, int beforeIndex, int afterIndex) { + int before = block.indexOf(BEFORE); + int after = block.indexOf(AFTER); + if (before >= 0) { + // before exists + amendments[beforeIndex] = + block.substring(before + BEFORE.length(), (after >= 0) ? after : block.length() - 1); + if (amendments[beforeIndex].trim().length() == 0) { + amendments[beforeIndex] = null; + } + } + if (after >= 0) { + // after exists + amendments[afterIndex] = block.substring(after + AFTER.length(), block.length() - 1); + if (amendments[afterIndex].trim().length() == 0) { + amendments[afterIndex] = null; + } + } + } + + private BufferedReader stringToReader(String aString) { + InputStream is = new ByteArrayInputStream(aString.getBytes(StandardCharsets.UTF_8)); + return new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); + } + + private File prepareOutputFile() throws MojoExecutionException { + // write output + File outputFile = new File(output); + if (outputFile.exists() && (!outputFile.delete())) { + throw new MojoExecutionException("Unable to delete file " + output); + } + try { + outputFile.getParentFile().mkdirs(); + if (!outputFile.createNewFile()) { + throw new MojoExecutionException("Unable to create file " + output); + } + } catch (IOException ioe) { + throw new MojoExecutionException("Unable to create file " + output, ioe); + } + return outputFile; + } + + private String toSignature(String identifier) { + StringBuilder aString = new StringBuilder(); + char[] chars = identifier.toCharArray(); + int index = 0; + boolean first = true; + while (index < chars.length) { + int begin; + while (Character.isWhitespace(chars[index])) { + index++; + if (index == chars.length) { + break; + } + } + if (index == chars.length) { + break; + } + begin = index; + while (!Character.isWhitespace(chars[index])) { + index++; + if ((index == chars.length) || SIG_SPECIAL_CHARS.contains(chars[index - 1]) + || ((index < chars.length - 1) && SIG_SPECIAL_CHARS.contains(chars[index]))) { + break; + } + } + if (!first) { + aString.append(' '); + } + aString.append(new String(chars, begin, index - begin)); + first = false; + } + return aString.toString(); + } +} diff --git a/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/src/test/java/org/apache/asterix/extension/grammar/GrammarExtensionMojoTest.java b/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/src/test/java/org/apache/asterix/extension/grammar/GrammarExtensionMojoTest.java new file mode 100644 index 0000000..386c4f3 --- /dev/null +++ b/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/src/test/java/org/apache/asterix/extension/grammar/GrammarExtensionMojoTest.java @@ -0,0 +1,40 @@ +/* + * 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. + */ +package org.apache.asterix.extension.grammar; + +import java.io.File; + +import org.apache.maven.plugin.testing.AbstractMojoTestCase; +import org.junit.Test; + +public class GrammarExtensionMojoTest extends AbstractMojoTestCase { + + /** + * @throws Exception + */ + @Test + public void testMojoGoal() throws Exception { + File testPom = + new File(getBasedir(), "src" + File.separator + "test" + File.separator + "resources" + File.separator + + "unit" + File.separator + "basic-test" + File.separator + "basic-test-plugin-config.xml"); + GrammarExtensionMojo mojo = (GrammarExtensionMojo) lookupMojo("grammarix", testPom); + assertNotNull(mojo); + mojo.execute(); + } +} diff --git a/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/src/test/java/org/apache/asterix/lang/extension/EchoStatement.java b/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/src/test/java/org/apache/asterix/lang/extension/EchoStatement.java new file mode 100644 index 0000000..7c6e882 --- /dev/null +++ b/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/src/test/java/org/apache/asterix/lang/extension/EchoStatement.java @@ -0,0 +1,47 @@ +/* + * 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. + */ +package org.apache.asterix.lang.extension; + +import org.apache.asterix.common.exceptions.AsterixException; +import org.apache.asterix.lang.common.base.Statement; +import org.apache.asterix.lang.common.visitor.base.ILangVisitor; + +public class EchoStatement implements Statement { + + private final String arg; + + public EchoStatement(String arg) { + this.arg = arg; + } + + @Override + public <R, T> R accept(ILangVisitor<R, T> visitor, T arg) throws AsterixException { + return null; + } + + @Override + public byte getKind() { + return -1; + } + + public String getArg() { + return arg; + } + +} diff --git a/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/src/test/resources/lang/extension.jj b/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/src/test/resources/lang/extension.jj new file mode 100644 index 0000000..2106e4d --- /dev/null +++ b/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/src/test/resources/lang/extension.jj @@ -0,0 +1,45 @@ +import org.apache.asterix.lang.extension.EchoStatement; + +// 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 +@merge +Statement SingleStatement() throws ParseException: +{ + // merge area 1 + before: + after: +} +{ + ( + // merge area 2 + before: + after: | stmt = EchoStatement()) + { + // merge area 3 + } +} + +// The default +// Adding a new node. if a node exists, it will throw an exception. +@new +Statement EchoStatement() throws ParseException: +{ + String arg = null; +} +{ + <ECHO> arg = Identifier() + { + return new EchoStatement(arg); + } +} + +<DEFAULT,IN_DBL_BRACE> +TOKEN : +{ + <ECHO : "echo"> +} + +// Overriding a non-terminal. if exists in base, it will be overriden, otherwise, it will be added +// @override diff --git a/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/src/test/resources/unit/basic-test/basic-test-plugin-config.xml b/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/src/test/resources/unit/basic-test/basic-test-plugin-config.xml new file mode 100644 index 0000000..b8253bb --- /dev/null +++ b/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/src/test/resources/unit/basic-test/basic-test-plugin-config.xml @@ -0,0 +1,80 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.apache.asterix</groupId> + <artifactId>asterix-opt</artifactId> + <version>0.1-SNAPSHOT</version> + </parent> + <groupId>org.apache.extension</groupId> + <artifactId>grammar-extension</artifactId> + <dependencies> + <dependency> + <groupId>org.apache.asterix</groupId> + <artifactId>asterix-external-data</artifactId> + <version>0.8.9-SNAPSHOT</version> + </dependency> + <dependency> + <groupId>com.couchbase.client</groupId> + <artifactId>core-io</artifactId> + <version>1.2.8</version> + </dependency> + <dependency> + <groupId>io.reactivex</groupId> + <artifactId>rxjava</artifactId> + <version>1.0.15</version> + </dependency> + </dependencies> + <build> + <plugins> + <plugin> + <groupId>org.apache.asterix</groupId> + <artifactId>asterix-grammar-extension-maven-plugin</artifactId> + <version>0.8.9-SNAPSHOT</version> + <configuration> + <base>../../asterix-lang-aql/src/main/javacc/AQL.jj</base> + <extension>src/test/resources/lang/extension.jj</extension> + <output>target/generated-sources/lang/grammar.jj</output> + <parserClassName>ExtendedParser</parserClassName> + <packageName>org.apache.asterix.lang.extension.parser</packageName> + </configuration> + <executions> + <execution> + <phase>generate-sources</phase> + <goals> + <goal>grammarix</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + <pluginManagement> + <plugins> + <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.--> + <plugin> + <groupId>org.eclipse.m2e</groupId> + <artifactId>lifecycle-mapping</artifactId> + <version>1.0.0</version> + <configuration> + <lifecycleMappingMetadata> + <pluginExecutions> + <pluginExecution> + <pluginExecutionFilter> + <groupId>org.apache.asterix</groupId> + <artifactId>asterix-grammar-extension-maven-plugin</artifactId> + <versionRange>[0.8.9-SNAPSHOT,)</versionRange> + <goals> + <goal>grammarix</goal> + </goals> + </pluginExecutionFilter> + <action> + <ignore></ignore> + </action> + </pluginExecution> + </pluginExecutions> + </lifecycleMappingMetadata> + </configuration> + </plugin> + </plugins> + </pluginManagement> + </build> +</project> \ No newline at end of file diff --git a/asterixdb/asterix-maven-plugins/pom.xml b/asterixdb/asterix-maven-plugins/pom.xml index 2623c64..9207abe 100644 --- a/asterixdb/asterix-maven-plugins/pom.xml +++ b/asterixdb/asterix-maven-plugins/pom.xml @@ -56,5 +56,6 @@ <module>record-manager-generator-maven-plugin</module> <module>asterix-evaluator-generator-maven-plugin</module> <module>asterix-test-datagenerator-maven-plugin</module> + <module>asterix-grammar-extension-maven-plugin</module> </modules> </project> \ No newline at end of file diff --git a/asterixdb/asterix-tools/src/main/java/org/apache/asterix/tools/translator/ADGenDmlTranslator.java b/asterixdb/asterix-tools/src/main/java/org/apache/asterix/tools/translator/ADGenDmlTranslator.java index a5b8f48..a525b1b 100644 --- a/asterixdb/asterix-tools/src/main/java/org/apache/asterix/tools/translator/ADGenDmlTranslator.java +++ b/asterixdb/asterix-tools/src/main/java/org/apache/asterix/tools/translator/ADGenDmlTranslator.java @@ -53,7 +53,7 @@ typeDataGenMap = new HashMap<TypeSignature, TypeDataGen>(); for (Statement stmt : aqlStatements) { - if (stmt.getKind() == Statement.TYPE_DECL) { + if (stmt.getKind() == Statement.Kind.TYPE_DECL) { TypeDecl td = (TypeDecl) stmt; String typeDataverse = td.getDataverseName() == null ? defaultDataverse : td.getDataverseName().getValue(); @@ -73,7 +73,7 @@ private String getDefaultDataverse() { for (Statement stmt : aqlStatements) { - if (stmt.getKind() == Statement.DATAVERSE_DECL) { + if (stmt.getKind() == Statement.Kind.DATAVERSE_DECL) { return ((DataverseDecl) stmt).getDataverseName().getValue(); } } -- To view, visit https://asterix-gerrit.ics.uci.edu/1011 To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-MessageType: merged Gerrit-Change-Id: Iaa2d11782d43dd8f27d69e347ed0fc8797d79dad Gerrit-PatchSet: 5 Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Owner: abdullah alamoudi <[email protected]> Gerrit-Reviewer: Jenkins <[email protected]> Gerrit-Reviewer: Michael Blow <[email protected]> Gerrit-Reviewer: Till Westmann <[email protected]> Gerrit-Reviewer: abdullah alamoudi <[email protected]>
