diff --git a/.github/workflows/database-bigquery-integration-test.yml b/.github/workflows/database-bigquery-integration-test.yml index fec7927a6d8..fd7b33cf79d 100644 --- a/.github/workflows/database-bigquery-integration-test.yml +++ b/.github/workflows/database-bigquery-integration-test.yml @@ -28,6 +28,9 @@ on: - master jobs: build: + # NOTE: we cannot run this action in fork because secrets are not accessible from forks + # See https://community.sonarsource.com/t/github-action-ci-build-fail-with-set-the-sonar-token-env-variable/38997 + if: github.repository == 'finos/legend-engine' runs-on: ubuntu-latest steps: - name: Checkout repo diff --git a/.github/workflows/database-databricks-integration-test.yml b/.github/workflows/database-databricks-integration-test.yml index b2a732b7fb2..3a54086718c 100644 --- a/.github/workflows/database-databricks-integration-test.yml +++ b/.github/workflows/database-databricks-integration-test.yml @@ -31,6 +31,9 @@ on: - master jobs: build: + # NOTE: we cannot run this action in fork because secrets are not accessible from forks + # See https://community.sonarsource.com/t/github-action-ci-build-fail-with-set-the-sonar-token-env-variable/38997 + if: github.repository == 'finos/legend-engine' runs-on: ubuntu-latest steps: - name: Configure databricks CLI diff --git a/.github/workflows/database-mssqlserver-integration-test.yml b/.github/workflows/database-mssqlserver-integration-test.yml index c282e11df07..5ed54333356 100644 --- a/.github/workflows/database-mssqlserver-integration-test.yml +++ b/.github/workflows/database-mssqlserver-integration-test.yml @@ -28,6 +28,9 @@ on: - master jobs: build: + # NOTE: we cannot run this action in fork because secrets are not accessible from forks + # See https://community.sonarsource.com/t/github-action-ci-build-fail-with-set-the-sonar-token-env-variable/38997 + if: github.repository == 'finos/legend-engine' runs-on: ubuntu-latest steps: - name: Checkout repo diff --git a/.github/workflows/database-redshift-integration-test.yml b/.github/workflows/database-redshift-integration-test.yml index 54668e897e8..a048aead042 100644 --- a/.github/workflows/database-redshift-integration-test.yml +++ b/.github/workflows/database-redshift-integration-test.yml @@ -29,6 +29,9 @@ on: jobs: build: name: Build + # NOTE: we cannot run this action in fork because secrets are not accessible from forks + # See https://community.sonarsource.com/t/github-action-ci-build-fail-with-set-the-sonar-token-env-variable/38997 + if: github.repository == 'finos/legend-engine' runs-on: ubuntu-latest steps: - name: Checkout repo diff --git a/.github/workflows/database-redshift-sql-generation-integration-test.yml b/.github/workflows/database-redshift-sql-generation-integration-test.yml index 34dbfb41013..f74a2a61938 100644 --- a/.github/workflows/database-redshift-sql-generation-integration-test.yml +++ b/.github/workflows/database-redshift-sql-generation-integration-test.yml @@ -29,6 +29,9 @@ on: jobs: build: name: Build + # NOTE: we cannot run this action in fork because secrets are not accessible from forks + # See https://community.sonarsource.com/t/github-action-ci-build-fail-with-set-the-sonar-token-env-variable/38997 + if: github.repository == 'finos/legend-engine' runs-on: ubuntu-latest steps: - name: Checkout repo diff --git a/.github/workflows/database-snowflake-integration-test.yml b/.github/workflows/database-snowflake-integration-test.yml index 418344cc5e8..e8a0ba10034 100644 --- a/.github/workflows/database-snowflake-integration-test.yml +++ b/.github/workflows/database-snowflake-integration-test.yml @@ -29,6 +29,9 @@ on: - refactor-integration-tests jobs: build: + # NOTE: we cannot run this action in fork because secrets are not accessible from forks + # See https://community.sonarsource.com/t/github-action-ci-build-fail-with-set-the-sonar-token-env-variable/38997 + if: github.repository == 'finos/legend-engine' runs-on: ubuntu-latest steps: - name: Checkout repo diff --git a/.github/workflows/database-snowflake-sql-generation-integration-test.yml b/.github/workflows/database-snowflake-sql-generation-integration-test.yml index a6aaa598700..2c100ce042b 100644 --- a/.github/workflows/database-snowflake-sql-generation-integration-test.yml +++ b/.github/workflows/database-snowflake-sql-generation-integration-test.yml @@ -28,6 +28,9 @@ on: - refactor-integration-tests jobs: build: + # NOTE: we cannot run this action in fork because secrets are not accessible from forks + # See https://community.sonarsource.com/t/github-action-ci-build-fail-with-set-the-sonar-token-env-variable/38997 + if: github.repository == 'finos/legend-engine' runs-on: ubuntu-latest steps: - name: Checkout repo diff --git a/legend-engine-external-shared-format-runtime/src/test/java/org/finos/legend/engine/external/shared/runtime/test/TestExternalFormatQueries.java b/legend-engine-external-shared-format-runtime/src/test/java/org/finos/legend/engine/external/shared/runtime/test/TestExternalFormatQueries.java index 401bb6c0700..b4b1d6c6421 100644 --- a/legend-engine-external-shared-format-runtime/src/test/java/org/finos/legend/engine/external/shared/runtime/test/TestExternalFormatQueries.java +++ b/legend-engine-external-shared-format-runtime/src/test/java/org/finos/legend/engine/external/shared/runtime/test/TestExternalFormatQueries.java @@ -93,7 +93,7 @@ protected String runTest(PureModelContextData generated, String grammar, String PureModel model = Compiler.compile(modelData, DeploymentMode.TEST, null); PureGrammarParser parser = PureGrammarParser.newInstance(); - Lambda lambdaProtocol = parser.parseLambda(query, "query", true); + Lambda lambdaProtocol = parser.parseLambda(query); LambdaFunction lambda = HelperValueSpecificationBuilder.buildLambda(lambdaProtocol.body, Lists.fixedSize.empty(), model.getContext()); ExecutionContext context = new Root_meta_pure_runtime_ExecutionContext_Impl(" ")._enableConstraints(true); diff --git a/legend-engine-language-pure-grammar-api/src/main/java/org/finos/legend/engine/language/pure/grammar/api/grammarToJson/GrammarToJson.java b/legend-engine-language-pure-grammar-api/src/main/java/org/finos/legend/engine/language/pure/grammar/api/grammarToJson/GrammarToJson.java index 869577827e0..20912b59e2e 100644 --- a/legend-engine-language-pure-grammar-api/src/main/java/org/finos/legend/engine/language/pure/grammar/api/grammarToJson/GrammarToJson.java +++ b/legend-engine-language-pure-grammar-api/src/main/java/org/finos/legend/engine/language/pure/grammar/api/grammarToJson/GrammarToJson.java @@ -14,7 +14,12 @@ import org.pac4j.core.profile.ProfileManager; import org.pac4j.jax.rs.annotations.Pac4JProfileManager; -import javax.ws.rs.*; +import javax.ws.rs.Consumes; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.util.Map; @@ -29,10 +34,14 @@ public class GrammarToJson extends GrammarAPI @ApiOperation(value = "Generates Pure protocol JSON from Pure language text") @Consumes({MediaType.TEXT_PLAIN, APPLICATION_ZLIB}) @Produces(MediaType.APPLICATION_JSON) - public Response model(String input, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm, @DefaultValue("true") @QueryParam("returnSourceInfo") boolean returnSourceInfo) + public Response model(String text, + @DefaultValue("") @ApiParam("The source ID to be used by the parser") @QueryParam("sourceId") String sourceId, + @DefaultValue("0") @ApiParam("The line number the parser will offset by") @QueryParam("lineOffset") int lineOffset, + @DefaultValue("true") @QueryParam("returnSourceInformation") boolean returnSourceInformation, + @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) { PureGrammarParserExtensions.logExtensionList(); - return grammarToJson(input, (a, b) -> PureGrammarParser.newInstance().parseModel(a, b), pm, returnSourceInfo, "Grammar to Json : Model"); + return grammarToJson(text, (a) -> PureGrammarParser.newInstance().parseModel(a, sourceId, lineOffset, 0, returnSourceInformation), pm, "Grammar to Json : Model"); } @POST @@ -40,10 +49,15 @@ public Response model(String input, @ApiParam(hidden = true) @Pac4JProfileManage @ApiOperation(value = "Generates Pure protocol JSON from Pure language text") @Consumes({MediaType.TEXT_PLAIN, APPLICATION_ZLIB}) @Produces(MediaType.APPLICATION_JSON) - public Response lambda(String input, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm, @DefaultValue ("true") @QueryParam("returnSourceInfo") boolean returnSourceInfo) + public Response lambda(String text, + @DefaultValue("") @ApiParam("The source ID to be used by the parser") @QueryParam("sourceId") String sourceId, + @DefaultValue("0") @ApiParam("The line number the parser will offset by") @QueryParam("lineOffset") int lineOffset, + @DefaultValue("0") @ApiParam("The column number the parser will offset by") @QueryParam("columnOffset") int columnOffset, + @DefaultValue("true") @QueryParam("returnSourceInformation") boolean returnSourceInformation, + @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) { PureGrammarParserExtensions.logExtensionList(); - return grammarToJson(input, (a, b) -> PureGrammarParser.newInstance().parseLambda(a, "", b), pm, returnSourceInfo, "Grammar to Json : Lambda"); + return grammarToJson(text, (a) -> PureGrammarParser.newInstance().parseLambda(a, sourceId, lineOffset, columnOffset, returnSourceInformation), pm, "Grammar to Json : Lambda"); } // Required so that Jackson properly includes _type for the top level element @@ -58,10 +72,10 @@ public TypedMap() @ApiOperation(value = "Generates Pure protocol JSON from Pure language text") @Consumes({MediaType.APPLICATION_JSON, APPLICATION_ZLIB}) @Produces(MediaType.APPLICATION_JSON) - public Response lambdaBatch(Map input, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm, @DefaultValue ("true") @QueryParam("returnSourceInfo") boolean returnSourceInfo) + public Response lambdaBatch(Map input, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) { PureGrammarParserExtensions.logExtensionList(); - return grammarToJsonBatch(input, (a, b)-> PureGrammarParser.newInstance().parseLambda(a, "", b), new TypedMap(), pm, returnSourceInfo, "Grammar to Json : Lambda Batch"); + return grammarToJsonBatch(input, (a, b, c, d, e)-> PureGrammarParser.newInstance().parseLambda(a, b, c, d, e), new TypedMap(), pm, "Grammar to Json : Lambda Batch"); } @POST @@ -69,10 +83,15 @@ public Response lambdaBatch(Map input, @ApiParam(hidden = true) @ApiOperation(value = "Generates Pure protocol JSON from Pure language text") @Consumes({MediaType.TEXT_PLAIN, APPLICATION_ZLIB}) @Produces(MediaType.APPLICATION_JSON) - public Response graphFetch(String input, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm, @DefaultValue ("true") @QueryParam("returnSourceInfo") boolean returnSourceInfo) + public Response graphFetch(String text, + @DefaultValue("") @ApiParam("The source ID to be used by the parser") @QueryParam("sourceId") String sourceId, + @DefaultValue("0") @ApiParam("The line number the parser will offset by") @QueryParam("lineOffset") int lineOffset, + @DefaultValue("0") @ApiParam("The column number the parser will offset by") @QueryParam("columnOffset") int columnOffset, + @DefaultValue("true") @QueryParam("returnSourceInformation") boolean returnSourceInformation, + @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) { PureGrammarParserExtensions.logExtensionList(); - return grammarToJson(input, (a, b) -> PureGrammarParser.newInstance().parseGraphFetch(a, "", b), pm, returnSourceInfo, "Grammar to Json : GraphFetch"); + return grammarToJson(text, (a) -> PureGrammarParser.newInstance().parseGraphFetch(a, sourceId, lineOffset, columnOffset, returnSourceInformation), pm, "Grammar to Json : GraphFetch"); } // Required so that Jackson properly includes _type for the top level element @@ -87,10 +106,10 @@ public TypedMapGraph() @ApiOperation(value = "Generates Pure protocol JSON from Pure language text") @Consumes({MediaType.APPLICATION_JSON, APPLICATION_ZLIB}) @Produces(MediaType.APPLICATION_JSON) - public Response graphFetchBatch(Map input, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm, @DefaultValue ("true") @QueryParam("returnSourceInfo") boolean returnSourceInfo) + public Response graphFetchBatch(Map input, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) { PureGrammarParserExtensions.logExtensionList(); - return grammarToJsonBatch(input, (a, b)-> PureGrammarParser.newInstance().parseGraphFetch(a, "", b), new TypedMapGraph(), pm, returnSourceInfo, "Grammar to Json : GraphFetch Batch"); + return grammarToJsonBatch(input, (a, b, c, d, e)-> PureGrammarParser.newInstance().parseGraphFetch(a, b, c, d, e), new TypedMapGraph(), pm, "Grammar to Json : GraphFetch Batch"); } @@ -99,10 +118,15 @@ public Response graphFetchBatch(Map input, @ApiParam(hidden = tr @ApiOperation(value = "Generates Pure protocol JSON from Pure language text") @Consumes({MediaType.TEXT_PLAIN, APPLICATION_ZLIB}) @Produces(MediaType.APPLICATION_JSON) - public Response valueSpecification(String input, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm, @DefaultValue ("true") @QueryParam("returnSourceInfo") boolean returnSourceInfo) + public Response valueSpecification(String text, + @DefaultValue("") @ApiParam("The source ID to be used by the parser") @QueryParam("sourceId") String sourceId, + @DefaultValue("0") @ApiParam("The line number the parser will offset by") @QueryParam("lineOffset") int lineOffset, + @DefaultValue("0") @ApiParam("The column number the parser will offset by") @QueryParam("columnOffset") int columnOffset, + @DefaultValue("true") @QueryParam("returnSourceInformation") boolean returnSourceInformation, + @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) { PureGrammarParserExtensions.logExtensionList(); - return grammarToJson(input, (a, b) -> PureGrammarParser.newInstance().parseValueSpecification(a, "", b), pm, returnSourceInfo, "Grammar to Json : Value Specification"); + return grammarToJson(text, (a) -> PureGrammarParser.newInstance().parseValueSpecification(a, sourceId, lineOffset, columnOffset, returnSourceInformation), pm, "Grammar to Json : Value Specification"); } // Required so that Jackson properly includes _type for the top level element @@ -117,9 +141,9 @@ public TypedMapVS() @ApiOperation(value = "Generates Pure protocol JSON from Pure language text") @Consumes({MediaType.APPLICATION_JSON, APPLICATION_ZLIB}) @Produces(MediaType.APPLICATION_JSON) - public Response valueSpecificationBatch(Map input, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm, @DefaultValue ("true") @QueryParam("returnSourceInfo") boolean returnSourceInfo) + public Response valueSpecificationBatch(Map input, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) { PureGrammarParserExtensions.logExtensionList(); - return grammarToJsonBatch(input, (a, b)-> PureGrammarParser.newInstance().parseValueSpecification(a, "", b), new TypedMapVS(), pm, returnSourceInfo, "Grammar to Json : Value Specification Batch"); + return grammarToJsonBatch(input, (a, b, c, d, e)-> PureGrammarParser.newInstance().parseValueSpecification(a, b, c, d, e), new TypedMapVS(), pm, "Grammar to Json : Value Specification Batch"); } } diff --git a/legend-engine-language-pure-grammar-api/src/main/java/org/finos/legend/engine/language/pure/grammar/api/grammarToJson/TransformGrammarToJson.java b/legend-engine-language-pure-grammar-api/src/main/java/org/finos/legend/engine/language/pure/grammar/api/grammarToJson/TransformGrammarToJson.java index 41e8543c5ef..235cb94ec5d 100644 --- a/legend-engine-language-pure-grammar-api/src/main/java/org/finos/legend/engine/language/pure/grammar/api/grammarToJson/TransformGrammarToJson.java +++ b/legend-engine-language-pure-grammar-api/src/main/java/org/finos/legend/engine/language/pure/grammar/api/grammarToJson/TransformGrammarToJson.java @@ -72,7 +72,7 @@ public Response transformGrammarToJson(GrammarToJsonInput grammarInput, @ApiPara { try { - Lambda lambda = parser.parseLambda(value, key, returnSourceInfo); + Lambda lambda = parser.parseLambda(value, key, 0, 0, returnSourceInfo); lambdas.put(key, lambda); } catch (Exception e) @@ -98,7 +98,7 @@ public Response transformGrammarToJson(GrammarToJsonInput grammarInput, @ApiPara { try { - symmetricResult.modelDataContext = parser.parseModel(grammarInput.code, returnSourceInfo); + symmetricResult.modelDataContext = parser.parseModel(grammarInput.code, "", 0, 0, returnSourceInfo); } catch (Exception e) { diff --git a/legend-engine-language-pure-grammar-api/src/main/java/org/finos/legend/engine/language/pure/grammar/api/jsonToGrammar/JsonToGrammar.java b/legend-engine-language-pure-grammar-api/src/main/java/org/finos/legend/engine/language/pure/grammar/api/jsonToGrammar/JsonToGrammar.java index 9b49d814265..70c36079968 100644 --- a/legend-engine-language-pure-grammar-api/src/main/java/org/finos/legend/engine/language/pure/grammar/api/jsonToGrammar/JsonToGrammar.java +++ b/legend-engine-language-pure-grammar-api/src/main/java/org/finos/legend/engine/language/pure/grammar/api/jsonToGrammar/JsonToGrammar.java @@ -17,7 +17,12 @@ import org.pac4j.core.profile.ProfileManager; import org.pac4j.jax.rs.annotations.Pac4JProfileManager; -import javax.ws.rs.*; +import javax.ws.rs.Consumes; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.util.Map; @@ -28,81 +33,95 @@ @Path("pure/v1/grammar/jsonToGrammar") public class JsonToGrammar extends GrammarAPI { + + @POST + @Path("model") + @ApiOperation(value = "Generates Pure language text from Pure protocol Pure Model Context Data") + @Consumes({MediaType.APPLICATION_JSON, APPLICATION_ZLIB}) + @Produces(MediaType.TEXT_PLAIN) + public Response model(PureModelContextData pureModelContext, + @QueryParam("renderStyle") @DefaultValue("PRETTY") RenderStyle renderStyle, + @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) + { + PureGrammarComposerExtensionLoader.logExtensionList(); + return jsonToGrammar(pureModelContext, renderStyle, (value, renderStyle1) -> PureGrammarComposer.newInstance(PureGrammarComposerContext.Builder.newInstance().withRenderStyle(renderStyle1).build()).renderPureModelContextData(value), pm, "Json to Grammar : Model"); + } + @POST - @Path("graphFetch/{renderStyle}") + @Path("graphFetch") @ApiOperation(value = "Generates Pure language text from Pure protocol GraphFetch fragment") @Consumes({MediaType.APPLICATION_JSON, APPLICATION_ZLIB}) @Produces(MediaType.TEXT_PLAIN) - public Response graphFetch(@PathParam("renderStyle") @DefaultValue("PRETTY") RenderStyle renderStyle, RootGraphFetchTree graphFetchTree, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) + public Response graphFetch(RootGraphFetchTree graphFetchTree, + @QueryParam("renderStyle") @DefaultValue("PRETTY") RenderStyle renderStyle, + @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) { PureGrammarComposerExtensionLoader.logExtensionList(); return jsonToGrammar(graphFetchTree, renderStyle, (vs, renderStyle1) -> vs.accept(DEPRECATED_PureGrammarComposerCore.Builder.newInstance().withRenderStyle(renderStyle1).build()), pm, "Json to Grammar : Graph Fetch"); } @POST - @Path("graphFetch/{renderStyle}/batch") + @Path("graphFetch/batch") @ApiOperation(value = "Generates Pure language text from Pure protocol GraphFetch fragment") @Consumes({MediaType.APPLICATION_JSON, APPLICATION_ZLIB}) @Produces(MediaType.APPLICATION_JSON) - public Response graphFetchBatch(@PathParam("renderStyle") @DefaultValue("PRETTY") RenderStyle renderStyle, Map graphFetchTrees, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) + public Response graphFetchBatch(Map graphFetchTrees, + @QueryParam("renderStyle") @DefaultValue("PRETTY") RenderStyle renderStyle, + @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) { PureGrammarComposerExtensionLoader.logExtensionList(); return jsonToGrammarBatch(renderStyle, graphFetchTrees, (vs, renderStyle1) -> vs.accept(DEPRECATED_PureGrammarComposerCore.Builder.newInstance().withRenderStyle(renderStyle1).build()), pm, "Json to Grammar : Graph Fetch Batch"); } @POST - @Path("valueSpecification/{renderStyle}") + @Path("valueSpecification") @ApiOperation(value = "Generates Pure language text from Pure protocol Value Specification fragment") @Consumes({MediaType.APPLICATION_JSON, APPLICATION_ZLIB}) @Produces(MediaType.TEXT_PLAIN) - public Response valueSpecification(@PathParam("renderStyle") @DefaultValue("PRETTY") RenderStyle renderStyle, ValueSpecification valueSpecification, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) + public Response valueSpecification(ValueSpecification valueSpecification, + @QueryParam("renderStyle") @DefaultValue("PRETTY") RenderStyle renderStyle, + @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) { PureGrammarComposerExtensionLoader.logExtensionList(); return jsonToGrammar(valueSpecification, renderStyle, (vs, renderStyle1) -> vs.accept(DEPRECATED_PureGrammarComposerCore.Builder.newInstance().withRenderStyle(renderStyle1).build()), pm, "Json to Grammar : Value Specification"); } @POST - @Path("valueSpecification/{renderStyle}/batch") + @Path("valueSpecification/batch") @ApiOperation(value = "Generates Pure language text from Pure protocol Value Specification fragment") @Consumes({MediaType.APPLICATION_JSON, APPLICATION_ZLIB}) @Produces(MediaType.APPLICATION_JSON) - public Response valueSpecificationBatch(@PathParam("renderStyle") @DefaultValue("PRETTY") RenderStyle renderStyle, Map valueSpecifications, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) + public Response valueSpecificationBatch(Map valueSpecifications, + @QueryParam("renderStyle") @DefaultValue("PRETTY") RenderStyle renderStyle, + @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) { PureGrammarComposerExtensionLoader.logExtensionList(); return jsonToGrammarBatch(renderStyle, valueSpecifications, (vs, renderStyle1) -> vs.accept(DEPRECATED_PureGrammarComposerCore.Builder.newInstance().withRenderStyle(renderStyle1).build()), pm, "Json to Grammar : Value Specification Batch"); } @POST - @Path("lambda/{renderStyle}") + @Path("lambda") @ApiOperation(value = "Generates Pure language text from Pure protocol Value Specification fragment") @Consumes({MediaType.APPLICATION_JSON, APPLICATION_ZLIB}) @Produces(MediaType.TEXT_PLAIN) - public Response lambda(@PathParam("renderStyle") @DefaultValue("PRETTY") RenderStyle renderStyle, Lambda lambda, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) + public Response lambda(Lambda lambda, + @QueryParam("renderStyle") @DefaultValue("PRETTY") RenderStyle renderStyle, + @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) { PureGrammarComposerExtensionLoader.logExtensionList(); return jsonToGrammar(lambda, renderStyle, (vs, renderStyle1) -> vs.accept(DEPRECATED_PureGrammarComposerCore.Builder.newInstance().withRenderStyle(renderStyle1).build()), pm, "Json to Grammar : Lambda"); } @POST - @Path("lambda/{renderStyle}/batch") + @Path("lambda/batch") @ApiOperation(value = "Generates Pure language text from Pure protocol Value Specification fragment") @Consumes({MediaType.APPLICATION_JSON, APPLICATION_ZLIB}) @Produces(MediaType.APPLICATION_JSON) - public Response lambdaBatch(@PathParam("renderStyle") @DefaultValue("PRETTY") RenderStyle renderStyle, Map lambdas, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) + public Response lambdaBatch(Map lambdas, + @QueryParam("renderStyle") @DefaultValue("PRETTY") RenderStyle renderStyle, + @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) { PureGrammarComposerExtensionLoader.logExtensionList(); return jsonToGrammarBatch(renderStyle, lambdas, (vs, renderStyle1) -> vs.accept(DEPRECATED_PureGrammarComposerCore.Builder.newInstance().withRenderStyle(renderStyle1).build()), pm, "Json to Grammar : Lambda Batch"); } - - @POST - @Path("model/{renderStyle}") - @ApiOperation(value = "Generates Pure language text from Pure protocol Pure Model Context Data") - @Consumes({MediaType.APPLICATION_JSON, APPLICATION_ZLIB}) - @Produces(MediaType.TEXT_PLAIN) - public Response model(@PathParam("renderStyle") @DefaultValue("PRETTY") RenderStyle renderStyle, PureModelContextData pureModelContext, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) - { - PureGrammarComposerExtensionLoader.logExtensionList(); - return jsonToGrammar(pureModelContext, renderStyle, (value, renderStyle1) -> PureGrammarComposer.newInstance(PureGrammarComposerContext.Builder.newInstance().withRenderStyle(renderStyle1).build()).renderPureModelContextData(value), pm, "Json to Grammar : Model"); - } - } diff --git a/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarGraphFetchApi.java b/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarGraphFetchApi.java index d5123f7cd05..37b13c310c4 100644 --- a/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarGraphFetchApi.java +++ b/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarGraphFetchApi.java @@ -1,5 +1,6 @@ package org.finos.legend.engine.language.pure.grammar.api.test; +import org.eclipse.collections.api.block.function.Function; import org.eclipse.collections.api.block.function.Function2; import org.eclipse.collections.impl.tuple.Tuples; import org.finos.legend.engine.language.pure.grammar.api.grammarToJson.GrammarToJson; @@ -8,7 +9,9 @@ import org.finos.legend.engine.protocol.pure.v1.model.valueSpecification.raw.graph.RootGraphFetchTree; import org.finos.legend.engine.shared.core.api.TestGrammar; import org.finos.legend.engine.shared.core.api.grammar.BatchResult; +import org.finos.legend.engine.shared.core.api.grammar.GrammarAPI; import org.finos.legend.engine.shared.core.api.grammar.RenderStyle; +import org.finos.legend.engine.shared.core.function.Function5; import org.junit.Test; import javax.ws.rs.core.Response; @@ -49,7 +52,7 @@ public void testSimpleParsingError() @Test public void testBatch() { - testBatch(with( Tuples.pair("1", "#{\n" + + testBatch(createBatchInput( Tuples.pair("1", "#{\n" + " demo::Query{\n" + " firms{\n" + " legalName,\n" + @@ -72,7 +75,7 @@ public void testBatch() @Test public void testBatchError() { - testBatchError(with(Tuples.pair("1", "#{\n" + + testBatchError(createBatchInput(Tuples.pair("1", "#{\n" + " demo::Query{\n" + " firms{\n" + " legalName,\n" + @@ -85,7 +88,7 @@ public void testBatchError() Tuples.pair("2", "#{\n" + " demo::Query" + "}#")), - with(Tuples.pair("1", "#{\n" + + createExpectedBatchResult(Tuples.pair("1", "#{\n" + " demo::Query{\n" + " firms{\n" + " legalName,\n" + @@ -118,25 +121,25 @@ public Class getBatchResultSpecializedClass() } @Override - public Function2 grammarToJson() + public Function5 grammarToJson() { - return (a, b) -> grammarToJson.graphFetch(a, null, b); + return (a, b, c, d, e) -> grammarToJson.graphFetch(a, b, c, d, e, null); } @Override - public Function2 jsonToGrammar() + public Function2 jsonToGrammar() { return (a, b) -> jsonToGrammar.graphFetch(a, b, null); } @Override - public Function2, Boolean, Response> grammarToJsonB() + public Function, Response> grammarToJsonB() { - return (a, b) -> grammarToJson.graphFetchBatch(a, null, b); + return (a) -> grammarToJson.graphFetchBatch(a, null); } @Override - public Function2, Response> jsonToGrammarB() + public Function2, RenderStyle, Response> jsonToGrammarB() { return (a, b) -> jsonToGrammar.graphFetchBatch(a, b, null); } diff --git a/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarLambdaApi.java b/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarLambdaApi.java index 1512ee57a20..e1b78646d4e 100644 --- a/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarLambdaApi.java +++ b/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarLambdaApi.java @@ -1,6 +1,8 @@ package org.finos.legend.engine.language.pure.grammar.api.test; +import org.eclipse.collections.api.block.function.Function; import org.eclipse.collections.api.block.function.Function2; +import org.eclipse.collections.api.block.function.Function3; import org.eclipse.collections.impl.tuple.Tuples; import org.finos.legend.engine.language.pure.grammar.api.grammarToJson.GrammarToJson; import org.finos.legend.engine.language.pure.grammar.api.jsonToGrammar.JsonToGrammar; @@ -8,7 +10,9 @@ import org.finos.legend.engine.protocol.pure.v1.model.valueSpecification.raw.Lambda; import org.finos.legend.engine.shared.core.api.TestGrammar; import org.finos.legend.engine.shared.core.api.grammar.BatchResult; +import org.finos.legend.engine.shared.core.api.grammar.GrammarAPI; import org.finos.legend.engine.shared.core.api.grammar.RenderStyle; +import org.finos.legend.engine.shared.core.function.Function5; import org.junit.Test; import javax.ws.rs.core.Response; @@ -52,7 +56,7 @@ public void testSimpleParsingError() @Test public void testBatch() { - testBatch(with(Tuples.pair("1", "a: String[1]|'hello'"), + testBatch(createBatchInput(Tuples.pair("1", "a: String[1]|'hello'"), Tuples.pair("2", "src: String[1]|$src"), Tuples.pair("3", "src: Integer[2]|$src->first()->toOne()"), Tuples.pair("4", "{src: Integer[1]|\n let a = 1;\n $a + 1;\n}")) @@ -62,9 +66,9 @@ public void testBatch() @Test public void testBatchError() { - testBatchError(with(Tuples.pair("1", "a: String[1]|'hello'"), + testBatchError(createBatchInput(Tuples.pair("1", "a: String[1]|'hello'"), Tuples.pair("2", "src: String[1]|$src,")), - with(Tuples.pair("1", "a: String[1]|'hello'"), + createExpectedBatchResult(Tuples.pair("1", "a: String[1]|'hello'"), Tuples.pair("2", "{\"message\":\"Unexpected token\",\"sourceInformation\":{\"endColumn\":20,\"endLine\":1,\"sourceId\":\"\",\"startColumn\":20,\"startLine\":1}}")) ); } @@ -90,25 +94,25 @@ public Class getBatchResultSpecializedClass() } @Override - public Function2 grammarToJson() + public Function5 grammarToJson() { - return (a, b) -> grammarToJson.lambda(a, null, b); + return (a, b, c, d, e) -> grammarToJson.lambda(a, b, c, d, e, null); } @Override - public Function2 jsonToGrammar() + public Function2 jsonToGrammar() { return (a, b) -> jsonToGrammar.lambda(a, b, null); } @Override - public Function2, Boolean, Response> grammarToJsonB() + public Function, Response> grammarToJsonB() { - return (a, b) -> grammarToJson.lambdaBatch(a, null, b); + return (a) -> grammarToJson.lambdaBatch(a, null); } @Override - public Function2, Response> jsonToGrammarB() + public Function2, RenderStyle, Response> jsonToGrammarB() { return (a, b) -> jsonToGrammar.lambdaBatch(a, b, null); } diff --git a/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarModelApi.java b/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarModelApi.java index fa37e986b82..75bf57de4c3 100644 --- a/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarModelApi.java +++ b/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarModelApi.java @@ -1,12 +1,15 @@ package org.finos.legend.engine.language.pure.grammar.api.test; +import org.eclipse.collections.api.block.function.Function; import org.eclipse.collections.api.block.function.Function2; import org.finos.legend.engine.language.pure.grammar.api.grammarToJson.GrammarToJson; import org.finos.legend.engine.language.pure.grammar.api.jsonToGrammar.JsonToGrammar; import org.finos.legend.engine.protocol.pure.v1.model.SourceInformation; import org.finos.legend.engine.protocol.pure.v1.model.context.PureModelContextData; import org.finos.legend.engine.shared.core.api.TestGrammar; +import org.finos.legend.engine.shared.core.api.grammar.GrammarAPI; import org.finos.legend.engine.shared.core.api.grammar.RenderStyle; +import org.finos.legend.engine.shared.core.function.Function5; import org.junit.Test; import javax.ws.rs.core.Response; @@ -19,18 +22,8 @@ public class TestGrammarModelApi extends TestGrammar public void testSimple() { test("Class A\n{\n}\n", true); - test("###Mapping\n" + - "Mapping meta::pure::mapping::modelToModel::test::simple::simpleModelMapping\n" + - "(\n" + - " *meta::pure::mapping::modelToModel::test::shared::dest::Person[meta_pure_mapping_modelToModel_test_shared_dest_Person]: Pure\n" + - " {\n" + - " ~src meta::pure::mapping::modelToModel::test::shared::src::_S_Person\n" + - " firstName: $src.fullName->substring(\n" + - " 0,\n" + - " $src.fullName->indexOf(' ')\n" + - ")\n" + - " }\n" + - ")\n", true); + test("###Mapping\n" + "Mapping meta::pure::mapping::modelToModel::test::simple::simpleModelMapping\n" + "(\n" + " *meta::pure::mapping::modelToModel::test::shared::dest::Person[meta_pure_mapping_modelToModel_test_shared_dest_Person]: Pure\n" + " {\n" + " ~src meta::pure::mapping::modelToModel::test::shared::src::_S_Person\n" + " firstName: $src.fullName->substring(\n" + " 0,\n" + " $src.fullName->indexOf(' ')\n" + ")\n" + " }\n" + ")\n", + true); } @Test @@ -49,7 +42,8 @@ public Class get_Class() } public static class MyClass extends LinkedHashMap - {} + { + } @Override public Class getBatchResultSpecializedClass() @@ -58,25 +52,25 @@ public Class getBatchResultSpecializedClass() } @Override - public Function2 grammarToJson() + public Function5 grammarToJson() { - return (a, b) -> grammarToJson.model(a, null, b); + return (a, b, c, d, e) -> grammarToJson.model(a, b, c, e, null); } @Override - public Function2 jsonToGrammar() + public Function2 jsonToGrammar() { return (a, b) -> jsonToGrammar.model(a, b, null); } @Override - public Function2, Boolean, Response> grammarToJsonB() + public Function, Response> grammarToJsonB() { throw new RuntimeException("Not supported here"); } @Override - public Function2, Response> jsonToGrammarB() + public Function2, RenderStyle, Response> jsonToGrammarB() { throw new RuntimeException("Not supported here"); } diff --git a/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarValueSpecificationApi.java b/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarValueSpecificationApi.java index 14774509953..331f9f1fd46 100644 --- a/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarValueSpecificationApi.java +++ b/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarValueSpecificationApi.java @@ -1,5 +1,6 @@ package org.finos.legend.engine.language.pure.grammar.api.test; +import org.eclipse.collections.api.block.function.Function; import org.eclipse.collections.api.block.function.Function2; import org.eclipse.collections.impl.tuple.Tuples; import org.finos.legend.engine.language.pure.grammar.api.grammarToJson.GrammarToJson; @@ -8,7 +9,9 @@ import org.finos.legend.engine.protocol.pure.v1.model.valueSpecification.ValueSpecification; import org.finos.legend.engine.shared.core.api.TestGrammar; import org.finos.legend.engine.shared.core.api.grammar.BatchResult; +import org.finos.legend.engine.shared.core.api.grammar.GrammarAPI; import org.finos.legend.engine.shared.core.api.grammar.RenderStyle; +import org.finos.legend.engine.shared.core.function.Function5; import org.junit.Test; import javax.ws.rs.core.Response; @@ -38,7 +41,7 @@ public void testSimpleError() @Test public void testBatch() { - testBatch(with(Tuples.pair("1", "1 + 1"), + testBatch(createBatchInput(Tuples.pair("1", "1 + 1"), Tuples.pair("2", "true->func(\n" + " 2,\n" + " 'www'\n" + @@ -48,12 +51,12 @@ public void testBatch() @Test public void testBatchError() { - testBatchError( with(Tuples.pair("1", "1 + 1"), + testBatchError( createBatchInput(Tuples.pair("1", "1 + 1"), Tuples.pair("2", "true->func(\n" + " 2\n" + " 'www'\n" + ")")), - with(Tuples.pair("1", "1 + 1"), + createExpectedBatchResult(Tuples.pair("1", "1 + 1"), Tuples.pair("2", "{\"message\":\"Unexpected token\",\"sourceInformation\":{\"endColumn\":7,\"endLine\":3,\"sourceId\":\"\",\"startColumn\":3,\"startLine\":3}}")) ); } @@ -78,25 +81,25 @@ public Class getBatchResultSpecializedClass() } @Override - public Function2 grammarToJson() + public Function5 grammarToJson() { - return (a, b) -> grammarToJson.valueSpecification(a, null, b); + return (a, b, c, d, e) -> grammarToJson.valueSpecification(a, b, c, d, e, null); } @Override - public Function2 jsonToGrammar() + public Function2 jsonToGrammar() { return (a, b) -> jsonToGrammar.valueSpecification(a, b, null); } @Override - public Function2, Boolean, Response> grammarToJsonB() + public Function, Response> grammarToJsonB() { - return (a, b) -> grammarToJson.valueSpecificationBatch(a, null, b); + return (a) -> grammarToJson.valueSpecificationBatch(a, null); } @Override - public Function2, Response> jsonToGrammarB() + public Function2, RenderStyle, Response> jsonToGrammarB() { return (a, b) -> jsonToGrammar.valueSpecificationBatch(a, b, null); } diff --git a/legend-engine-language-pure-grammar/src/main/java/org/finos/legend/engine/language/pure/grammar/from/ParseTreeWalkerSourceInformation.java b/legend-engine-language-pure-grammar/src/main/java/org/finos/legend/engine/language/pure/grammar/from/ParseTreeWalkerSourceInformation.java index 90acf97c576..7b287f01a73 100644 --- a/legend-engine-language-pure-grammar/src/main/java/org/finos/legend/engine/language/pure/grammar/from/ParseTreeWalkerSourceInformation.java +++ b/legend-engine-language-pure-grammar/src/main/java/org/finos/legend/engine/language/pure/grammar/from/ParseTreeWalkerSourceInformation.java @@ -57,10 +57,6 @@ public class ParseTreeWalkerSourceInformation private final boolean returnSourceInfo; - private static final ParseTreeWalkerSourceInformation defaultWalkerSourceInformation = new ParseTreeWalkerSourceInformation.Builder("", 0, 0).withReturnSourceInfo(true).build(); - - private static final ParseTreeWalkerSourceInformation defaultWalkerWithStubSourceInformation = new ParseTreeWalkerSourceInformation.Builder("", 0, 0).withReturnSourceInfo(false).build(); - private ParseTreeWalkerSourceInformation(ParseTreeWalkerSourceInformation.Builder builder) { this.sourceId = builder.sourceId; @@ -69,16 +65,6 @@ private ParseTreeWalkerSourceInformation(ParseTreeWalkerSourceInformation.Builde this.returnSourceInfo = builder.returnSourceInfo; } - public static ParseTreeWalkerSourceInformation DEFAULT_WALKER_SOURCE_INFORMATION(boolean returnSourceInfo) - { - return returnSourceInfo? defaultWalkerSourceInformation: defaultWalkerWithStubSourceInformation; - } - - public static ParseTreeWalkerSourceInformation DEFAULT_WALKER_SOURCE_INFORMATION() - { - return DEFAULT_WALKER_SOURCE_INFORMATION(true); - } - public String getSourceId() { return this.sourceId; diff --git a/legend-engine-language-pure-grammar/src/main/java/org/finos/legend/engine/language/pure/grammar/from/PureGrammarParser.java b/legend-engine-language-pure-grammar/src/main/java/org/finos/legend/engine/language/pure/grammar/from/PureGrammarParser.java index 098b56dc639..c464cbb743c 100644 --- a/legend-engine-language-pure-grammar/src/main/java/org/finos/legend/engine/language/pure/grammar/from/PureGrammarParser.java +++ b/legend-engine-language-pure-grammar/src/main/java/org/finos/legend/engine/language/pure/grammar/from/PureGrammarParser.java @@ -74,26 +74,31 @@ public static PureGrammarParser newInstance() return new PureGrammarParser(PureGrammarParserExtensions.fromAvailableExtensions()); } - public PureModelContextData parseModel(String code, boolean returnSourceInfo) + public PureModelContextData parseModel(String code, String sourceId, int lineOffset, int columnOffset, boolean returnSourceInfo) { - return this.parse(code, this.parsers, returnSourceInfo); + return this.parse(code, this.parsers, sourceId, lineOffset, columnOffset, returnSourceInfo); } public PureModelContextData parseModel(String code) { - return this.parse(code, this.parsers, true); + return this.parse(code, this.parsers, "", 0, 0, true); } - public Lambda parseLambda(String code, String lambdaId, boolean returnSourceInfo) + public Lambda parseLambda(String code) { - return new DomainParser().parseLambda(code, lambdaId, returnSourceInfo); + return this.parseLambda(code, "", 0, 0, true); } - private PureModelContextData parse(String code, DEPRECATED_PureGrammarParserLibrary parserLibrary, boolean returnSourceInfo) + public Lambda parseLambda(String code, String sourceId, int lineOffset, int columnOffset, boolean returnSourceInfo) + { + return new DomainParser().parseLambda(code, sourceId, lineOffset, columnOffset, returnSourceInfo); + } + + private PureModelContextData parse(String code, DEPRECATED_PureGrammarParserLibrary parserLibrary, String sourceId, int lineOffset, int columnOffset, boolean returnSourceInfo) { String fullCode = DEFAULT_SECTION_BEGIN + code; PureGrammarParserContext parserContext = new PureGrammarParserContext(this.extensions); - ParseTreeWalkerSourceInformation walkerSourceInformation = ParseTreeWalkerSourceInformation.DEFAULT_WALKER_SOURCE_INFORMATION(returnSourceInfo); + ParseTreeWalkerSourceInformation walkerSourceInformation = new ParseTreeWalkerSourceInformation.Builder(sourceId, lineOffset, columnOffset).withReturnSourceInfo(returnSourceInfo).build(); // init the parser ParserErrorListener errorListener = new ParserErrorListener(walkerSourceInformation); CodeLexerGrammar lexer = new CodeLexerGrammar(CharStreams.fromString(fullCode)); @@ -118,8 +123,10 @@ private Section visitSection(CodeParserGrammar.SectionContext ctx, DEPRECATED_Pu { String parserName = ctx.SECTION_START().getText().substring(4); // the prefix is `\n###` hence 4 characters SourceInformation parserNameSourceInformation = walkerSourceInformation.getSourceInformation(ctx.SECTION_START().getSymbol()); - int lineOffset = ctx.SECTION_START().getSymbol().getLine() - 2; // since the CODE_BLOCK_START is `\n###` we have to subtract 1 more line than usual - ParseTreeWalkerSourceInformation sectionWalkerSourceInformation = new ParseTreeWalkerSourceInformation.Builder("", lineOffset, 0).withReturnSourceInfo(returnSourceInfo).build(); + // since the CODE_BLOCK_START is `\n###` we have to subtract 1 more line than usual + // also, we account for the line offset + int lineOffset = ctx.SECTION_START().getSymbol().getLine() - 2 + walkerSourceInformation.getLineOffset(); + ParseTreeWalkerSourceInformation sectionWalkerSourceInformation = new ParseTreeWalkerSourceInformation.Builder(walkerSourceInformation.getSourceId(), lineOffset, 0).withReturnSourceInfo(returnSourceInfo).build(); SourceInformation sectionSourceInformation = walkerSourceInformation.getSourceInformation(ctx); if (ctx.sectionContent() != null) { @@ -176,13 +183,13 @@ private Section visitSection(CodeParserGrammar.SectionContext ctx, DEPRECATED_Pu return section; } - public RootGraphFetchTree parseGraphFetch(String input, String s, boolean returnSourceInfo) + public RootGraphFetchTree parseGraphFetch(String input, String sourceId, int lineOffset, int columnOffset, boolean returnSourceInfo) { - return new DomainParser().parseGraphFetch(input, s, returnSourceInfo); + return new DomainParser().parseGraphFetch(input, sourceId, lineOffset, columnOffset, returnSourceInfo); } - public ValueSpecification parseValueSpecification(String input, String s, boolean returnSourceInfo) + public ValueSpecification parseValueSpecification(String input, String sourceId, int lineOffset, int columnOffset, boolean returnSourceInfo) { - return new DomainParser().parseValueSpecification(input, s, returnSourceInfo); + return new DomainParser().parseValueSpecification(input, sourceId, lineOffset, columnOffset, returnSourceInfo); } } diff --git a/legend-engine-language-pure-grammar/src/main/java/org/finos/legend/engine/language/pure/grammar/from/domain/DomainParser.java b/legend-engine-language-pure-grammar/src/main/java/org/finos/legend/engine/language/pure/grammar/from/domain/DomainParser.java index d6e4aed19f1..7dda517fc51 100644 --- a/legend-engine-language-pure-grammar/src/main/java/org/finos/legend/engine/language/pure/grammar/from/domain/DomainParser.java +++ b/legend-engine-language-pure-grammar/src/main/java/org/finos/legend/engine/language/pure/grammar/from/domain/DomainParser.java @@ -78,21 +78,21 @@ public Section parse(SourceCodeParserInfo sectionParserInfo, Consumer Response grammarToJson(String input, Function2 func, ProfileManager pm, boolean returnSourceInfo, String spanText) + protected Response grammarToJson(String text, Function func, ProfileManager pm, String spanText) { MutableList profiles = ProfileManagerHelper.extractProfiles(pm); try (Scope scope = GlobalTracer.get().buildSpan(spanText).startActive(true)) { try { - T data = func.apply(input, returnSourceInfo); + T data = func.apply(text); return ManageConstantResult.manageResult(profiles, data, objectMapper); } catch (Exception e) @@ -41,7 +44,7 @@ protected Response grammarToJson(String input, Function2 } } - protected Response grammarToJsonBatch(Map input, Function2 func, Map result, ProfileManager pm, boolean returnSourceInfo, String spanText) + protected Response grammarToJsonBatch(Map input, Function5 func, Map result, ProfileManager pm, String spanText) { MutableList profiles = ProfileManagerHelper.extractProfiles(pm); try (Scope scope = GlobalTracer.get().buildSpan(spanText).startActive(true)) @@ -51,7 +54,8 @@ protected Response grammarToJsonBatch(Map input, Function2 Response jsonToGrammarBatch(RenderStyle renderStyle, Map + extends Serializable +{ + R value(T1 argument1, T2 argument2, T3 argument3, T4 argument4, T5 argument); +} \ No newline at end of file diff --git a/legend-engine-shared-core/src/test/java/org/finos/legend/engine/shared/core/api/TestGrammar.java b/legend-engine-shared-core/src/test/java/org/finos/legend/engine/shared/core/api/TestGrammar.java index cac453049d3..98630c21ff9 100644 --- a/legend-engine-shared-core/src/test/java/org/finos/legend/engine/shared/core/api/TestGrammar.java +++ b/legend-engine-shared-core/src/test/java/org/finos/legend/engine/shared/core/api/TestGrammar.java @@ -1,6 +1,7 @@ package org.finos.legend.engine.shared.core.api; import com.fasterxml.jackson.databind.ObjectMapper; +import org.eclipse.collections.api.block.function.Function; import org.eclipse.collections.api.block.function.Function2; import org.eclipse.collections.api.factory.Maps; import org.eclipse.collections.api.tuple.Pair; @@ -9,11 +10,12 @@ import org.finos.legend.engine.protocol.pure.v1.model.SourceInformation; import org.finos.legend.engine.shared.core.ObjectMapperFactory; import org.finos.legend.engine.shared.core.api.grammar.BatchResult; +import org.finos.legend.engine.shared.core.api.grammar.GrammarAPI; import org.finos.legend.engine.shared.core.api.grammar.RenderStyle; +import org.finos.legend.engine.shared.core.function.Function5; import org.finos.legend.engine.shared.core.operational.errorManagement.ExceptionError; import javax.ws.rs.core.Response; -import java.util.LinkedHashMap; import java.util.Map; import static org.junit.Assert.assertEquals; @@ -24,20 +26,24 @@ public abstract class TestGrammar private static final ObjectMapper objectMapper = ObjectMapperFactory.getNewStandardObjectMapperWithPureProtocolExtensionSupports(); public abstract Class get_Class(); + public abstract Class> getBatchResultSpecializedClass(); - public abstract Function2 grammarToJson(); - public abstract Function2 jsonToGrammar(); - public abstract Function2, Boolean, Response> grammarToJsonB(); - public abstract Function2, Response> jsonToGrammarB(); + + public abstract Function5 grammarToJson(); + + public abstract Function2 jsonToGrammar(); + + public abstract Function, Response> grammarToJsonB(); + + public abstract Function2, RenderStyle, Response> jsonToGrammarB(); protected void test(String str, boolean returnSourceInfo) { try { - Response result = grammarToJson().apply(str, returnSourceInfo); + Response result = grammarToJson().value(str, "", 0, 0, returnSourceInfo); String actual = result.getEntity().toString(); - Z lambda = objectMapper.readValue(actual, get_Class()); - Response newResult = jsonToGrammar().apply(RenderStyle.PRETTY, lambda); + Response newResult = jsonToGrammar().apply(objectMapper.readValue(actual, get_Class()), RenderStyle.PRETTY); assertEquals(str, newResult.getEntity().toString()); } catch (Exception e) @@ -50,7 +56,7 @@ protected void testError(String str, String expectedErrorMessage, SourceInformat { try { - Response result = grammarToJson().apply(str, true); + Response result = grammarToJson().value(str, "", 0, 0, true); Object errorObject = result.getEntity(); assertTrue(errorObject instanceof ExceptionError); ExceptionError error = (ExceptionError) errorObject; @@ -67,15 +73,16 @@ protected void testError(String str, String expectedErrorMessage, SourceInformat } } - protected void testBatch(Map str) + protected void testBatch(Map input) { try { - Response result = grammarToJsonB().apply(str, true); - String actual = result.getEntity().toString(); - Map lambda = objectMapper.readValue(actual, getBatchResultSpecializedClass()).result; - Response newResult = jsonToGrammarB().apply(RenderStyle.PRETTY, lambda); - assertEquals(objectMapper.writeValueAsString(str), newResult.getEntity().toString()); + Map fullResult = objectMapper.readValue(grammarToJsonB().apply(input).getEntity().toString(), getBatchResultSpecializedClass()).result; + MapIterate.forEachKeyValue(input, (a, b) -> { + assertEquals(b.value, jsonToGrammar().apply(fullResult.get(a), RenderStyle.PRETTY) + .getEntity() + .toString()); + }); } catch (Exception e) { @@ -83,24 +90,28 @@ protected void testBatch(Map str) } } - protected void testBatchError(Map str, Map expected) + protected void testBatchError(Map input, Map expected) { try { - Response result = grammarToJsonB().apply(str, true); - String actual = result.getEntity().toString(); - BatchResult fulLResult = objectMapper.readValue(actual, getBatchResultSpecializedClass()); - MapIterate.forEachKeyValue(expected, (a, b) -> { + Response result = grammarToJsonB().apply(input); + BatchResult fullResult = objectMapper.readValue(result.getEntity().toString(), getBatchResultSpecializedClass()); + MapIterate.forEachKeyValue(expected, (a, b) -> + { try { - Z val = fulLResult.result.get(a); + Z val = fullResult.result.get(a); if (val != null) { - assertEquals(b, jsonToGrammar().apply(RenderStyle.PRETTY, objectMapper.readValue(objectMapper.writeValueAsString(val), get_Class())).getEntity().toString()); + assertEquals(b, + jsonToGrammar() + .apply(objectMapper.readValue(objectMapper.writeValueAsString(val), get_Class()), RenderStyle.PRETTY) + .getEntity() + .toString()); } else { - assertEquals(b, objectMapper.writeValueAsString(fulLResult.errors.get(a))); + assertEquals(b, objectMapper.writeValueAsString(fullResult.errors.get(a))); } } catch (Exception e) @@ -115,10 +126,22 @@ protected void testBatchError(Map str, Map expec } } - protected Map with(Pair... pairs) + protected Map createExpectedBatchResult(Pair... pairs) { - Map res = Maps.mutable.empty(); + Map res = Maps.mutable.empty(); ArrayIterate.forEach(pairs, val -> res.put(val.getOne(), val.getTwo())); return res; } + + protected Map createBatchInput(Pair... pairs) + { + Map res = Maps.mutable.empty(); + ArrayIterate.forEach(pairs, val -> + { + GrammarAPI.ParserInput input = new GrammarAPI.ParserInput(); + input.value = val.getTwo(); + res.put(val.getOne(), input); + }); + return res; + } } diff --git a/legend-engine-xt-graphQL-query/src/main/java/org/finos/legend/engine/query/graphQL/api/grammar/GraphQLGrammar.java b/legend-engine-xt-graphQL-query/src/main/java/org/finos/legend/engine/query/graphQL/api/grammar/GraphQLGrammar.java index 172ca6ef370..9ce679173ce 100644 --- a/legend-engine-xt-graphQL-query/src/main/java/org/finos/legend/engine/query/graphQL/api/grammar/GraphQLGrammar.java +++ b/legend-engine-xt-graphQL-query/src/main/java/org/finos/legend/engine/query/graphQL/api/grammar/GraphQLGrammar.java @@ -31,7 +31,12 @@ import org.pac4j.core.profile.ProfileManager; import org.pac4j.jax.rs.annotations.Pac4JProfileManager; -import javax.ws.rs.*; +import javax.ws.rs.Consumes; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.util.Map; @@ -47,18 +52,23 @@ public class GraphQLGrammar extends GrammarAPI @ApiOperation(value = "Generates GraphQL protocol JSON from GraphQL language text") @Consumes({MediaType.TEXT_PLAIN, APPLICATION_ZLIB}) @Produces(MediaType.APPLICATION_JSON) - public Response grammarToJson(String grammar, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm, @DefaultValue("true") @QueryParam("returnSourceInfo") boolean returnSourceInfo) + public Response grammarToJson(String text, + @DefaultValue("") @ApiParam("The source ID to be used by the parser") @QueryParam("sourceId") String sourceId, + @DefaultValue("0") @ApiParam("The line number the parser will offset by") @QueryParam("lineOffset") int lineOffset, + @DefaultValue("0") @ApiParam("The column number the parser will offset by") @QueryParam("columnOffset") int columnOffset, + @DefaultValue("true") @QueryParam("returnSourceInformation") boolean returnSourceInformation, + @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) { - return grammarToJson(grammar, (a, b) -> { + return grammarToJson(text, (a) -> { try { - return GraphQLGrammarParser.newInstance().parseDocument(grammar); + return GraphQLGrammarParser.newInstance().parseDocument(a); } - catch (GraphQLParserException e) + catch (GraphQLParserException ex) { - throw new EngineException(e.getMessage(), e.getSourceInformation(), EngineErrorType.PARSER); + throw new EngineException(ex.getMessage(), ex.getSourceInformation(), EngineErrorType.PARSER); } - }, pm, returnSourceInfo, "Grammar to Json : GraphQL"); + }, pm, "Grammar to Json : GraphQL"); } // Required so that Jackson properly includes _type for the top level element @@ -70,36 +80,40 @@ static class TypedMap extends UnifiedMap @ApiOperation(value = "Generates GraphQL protocol JSON from GraphQL language text (for multiple elements)") @Consumes({MediaType.APPLICATION_JSON, APPLICATION_ZLIB}) @Produces(MediaType.APPLICATION_JSON) - public Response grammarToJsonBatch(Map grammars, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm, @DefaultValue("true") @QueryParam("returnSourceInfo") boolean returnSourceInfo) + public Response grammarToJsonBatch(Map input, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) { - return grammarToJsonBatch(grammars, (a, b) -> { + return grammarToJsonBatch(input, (a, b, c, d, e) -> { try { return GraphQLGrammarParser.newInstance().parseDocument(a); } - catch (GraphQLParserException e) + catch (GraphQLParserException ex) { - throw new EngineException(e.getMessage(), e.getSourceInformation(), EngineErrorType.PARSER); + throw new EngineException(ex.getMessage(), ex.getSourceInformation(), EngineErrorType.PARSER); } - }, new TypedMap(), pm, returnSourceInfo, "Grammar to Json : GraphQL Batch"); + }, new TypedMap(), pm, "Grammar to Json : GraphQL Batch"); } @POST - @Path("jsonToGrammar/{renderStyle}") + @Path("jsonToGrammar") @ApiOperation(value = "Generates GraphQL language text from GraphQL protocol JSON") @Consumes({MediaType.APPLICATION_JSON, APPLICATION_ZLIB}) @Produces(MediaType.TEXT_PLAIN) - public Response jsonToGrammar(@PathParam("renderStyle") @DefaultValue("PRETTY") RenderStyle renderStyle, ExecutableDocument document, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) + public Response jsonToGrammar(ExecutableDocument document, + @QueryParam("renderStyle") @DefaultValue("PRETTY") RenderStyle renderStyle, + @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) { return jsonToGrammar(document, renderStyle, (vs, renderStyle1) -> GraphQLGrammarComposer.newInstance().renderDocument(vs), pm, "Json to Grammar : GraphQL"); } @POST - @Path("jsonToGrammar/{renderStyle}/batch") + @Path("jsonToGrammar/batch") @ApiOperation(value = "Generates GraphQL language text from GraphQL protocol JSON") @Consumes({MediaType.APPLICATION_JSON, APPLICATION_ZLIB}) @Produces(MediaType.APPLICATION_JSON) - public Response jsonToGrammarBatch(@PathParam("renderStyle") @DefaultValue("PRETTY") RenderStyle renderStyle, Map documents, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) + public Response jsonToGrammarBatch(Map documents, + @QueryParam("renderStyle") @DefaultValue("PRETTY") RenderStyle renderStyle, + @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) { return jsonToGrammarBatch(renderStyle, documents, (vs, renderStyle1) -> GraphQLGrammarComposer.newInstance().renderDocument(vs), pm, "Json to Grammar : GraphQL Batch"); } diff --git a/legend-engine-xt-graphQL-query/src/test/java/org/finos/legend/engine/query/graphQL/api/grammar/test/TestGrammarApi.java b/legend-engine-xt-graphQL-query/src/test/java/org/finos/legend/engine/query/graphQL/api/grammar/test/TestGrammarApi.java index a18e30481f4..1c232fd0475 100644 --- a/legend-engine-xt-graphQL-query/src/test/java/org/finos/legend/engine/query/graphQL/api/grammar/test/TestGrammarApi.java +++ b/legend-engine-xt-graphQL-query/src/test/java/org/finos/legend/engine/query/graphQL/api/grammar/test/TestGrammarApi.java @@ -1,5 +1,6 @@ package org.finos.legend.engine.query.graphQL.api.grammar.test; +import org.eclipse.collections.api.block.function.Function; import org.eclipse.collections.api.block.function.Function2; import org.eclipse.collections.impl.tuple.Tuples; import org.finos.legend.engine.protocol.graphQL.metamodel.ExecutableDocument; @@ -7,7 +8,9 @@ import org.finos.legend.engine.query.graphQL.api.grammar.GraphQLGrammar; import org.finos.legend.engine.shared.core.api.TestGrammar; import org.finos.legend.engine.shared.core.api.grammar.BatchResult; +import org.finos.legend.engine.shared.core.api.grammar.GrammarAPI; import org.finos.legend.engine.shared.core.api.grammar.RenderStyle; +import org.finos.legend.engine.shared.core.function.Function5; import org.junit.Test; import javax.ws.rs.core.Response; @@ -40,7 +43,7 @@ public void testSimpleError() @Test public void testBatch() { - testBatch(with(Tuples.pair("1", "type Car implements Vehicle & X & Z {\n" + + testBatch(createBatchInput(Tuples.pair("1", "type Car implements Vehicle & X & Z {\n" + " id: ID!\n" + " name: String!\n" + " values: [String]\n" + @@ -57,7 +60,7 @@ public void testBatch() @Test public void testBatchError() { - testBatchError(with(Tuples.pair("1", "type Car implements Vehicle & X & Z {\n" + + testBatchError(createBatchInput(Tuples.pair("1", "type Car implements Vehicle & X & Z {\n" + " id: ID!\n" + " name: String!\n" + " values: [String]\n" + @@ -69,7 +72,7 @@ public void testBatchError() " EAST\n"+ " WEST\n"+ "}")), - with(Tuples.pair("1", "type Car implements Vehicle & X & Z {\n" + + createExpectedBatchResult(Tuples.pair("1", "type Car implements Vehicle & X & Z {\n" + " id: ID!\n" + " name: String!\n" + " values: [String]\n" + @@ -98,25 +101,25 @@ public Class getBatchResultSpecializedClass() } @Override - public Function2 grammarToJson() + public Function5 grammarToJson() { - return (a, b) -> graphQLGrammar.grammarToJson(a, null, b); + return (a, b, c, d, e) -> graphQLGrammar.grammarToJson(a, b, c, d, e, null); } @Override - public Function2 jsonToGrammar() + public Function2 jsonToGrammar() { return (a, b) -> graphQLGrammar.jsonToGrammar(a, b, null); } @Override - public Function2, Boolean, Response> grammarToJsonB() + public Function, Response> grammarToJsonB() { - return (a, b) -> graphQLGrammar.grammarToJsonBatch(a, null, b); + return (a) -> graphQLGrammar.grammarToJsonBatch(a, null); } @Override - public Function2, Response> jsonToGrammarB() + public Function2, RenderStyle, Response> jsonToGrammarB() { return (a, b) -> graphQLGrammar.jsonToGrammarBatch(a, b, null); } diff --git a/legend-engine-xt-relationalStore-api/src/main/java/org/finos/legend/engine/language/pure/grammar/api/relationalOperationElement/RelationalOperationElementGrammarToJson.java b/legend-engine-xt-relationalStore-api/src/main/java/org/finos/legend/engine/language/pure/grammar/api/relationalOperationElement/RelationalOperationElementGrammarToJson.java index 8f85018eaad..1a448df25ec 100644 --- a/legend-engine-xt-relationalStore-api/src/main/java/org/finos/legend/engine/language/pure/grammar/api/relationalOperationElement/RelationalOperationElementGrammarToJson.java +++ b/legend-engine-xt-relationalStore-api/src/main/java/org/finos/legend/engine/language/pure/grammar/api/relationalOperationElement/RelationalOperationElementGrammarToJson.java @@ -1,31 +1,23 @@ package org.finos.legend.engine.language.pure.grammar.api.relationalOperationElement; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.opentracing.Scope; -import io.opentracing.util.GlobalTracer; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.impl.map.mutable.UnifiedMap; -import org.finos.legend.engine.language.pure.grammar.from.PureGrammarParser; import org.finos.legend.engine.language.pure.grammar.from.RelationalGrammarParserExtension; import org.finos.legend.engine.language.pure.grammar.from.extension.PureGrammarParserExtensions; -import org.finos.legend.engine.protocol.pure.v1.model.context.EngineErrorType; import org.finos.legend.engine.protocol.pure.v1.model.packageableElement.store.relational.model.operation.RelationalOperationElement; -import org.finos.legend.engine.shared.core.ObjectMapperFactory; import org.finos.legend.engine.shared.core.api.grammar.GrammarAPI; -import org.finos.legend.engine.shared.core.api.grammar.ParserError; -import org.finos.legend.engine.shared.core.api.result.ManageConstantResult; -import org.finos.legend.engine.shared.core.kerberos.ProfileManagerHelper; -import org.finos.legend.engine.shared.core.operational.errorManagement.EngineException; -import org.finos.legend.engine.shared.core.operational.errorManagement.ExceptionTool; -import org.finos.legend.engine.shared.core.operational.logs.LoggingEventType; import org.pac4j.core.profile.CommonProfile; import org.pac4j.core.profile.ProfileManager; import org.pac4j.jax.rs.annotations.Pac4JProfileManager; -import javax.ws.rs.*; +import javax.ws.rs.Consumes; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.util.Map; @@ -41,10 +33,16 @@ public class RelationalOperationElementGrammarToJson extends GrammarAPI @ApiOperation(value = "Generates Pure protocol JSON from Pure language text for relational operation elements") @Consumes({MediaType.TEXT_PLAIN, APPLICATION_ZLIB}) @Produces(MediaType.APPLICATION_JSON) - public Response relationalOperationElement(String input, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm, @QueryParam("returnSourceInfo") boolean returnSourceInfo) + public Response relationalOperationElement(String text, + @DefaultValue("") @ApiParam("The source ID to be used by the parser") @QueryParam("sourceId") String sourceId, + @DefaultValue("0") @ApiParam("The line number the parser will offset by") @QueryParam("lineOffset") int lineOffset, + @DefaultValue("0") @ApiParam("The column number the parser will offset by") @QueryParam("columnOffset") int columnOffset, + @DefaultValue("true") @QueryParam("returnSourceInformation") boolean returnSourceInformation, + @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) { PureGrammarParserExtensions.logExtensionList(); - return grammarToJson(input, (a, b) -> RelationalGrammarParserExtension.parseRelationalOperationElement(a, b), pm, returnSourceInfo, "Grammar to Json : RelationalOperationElement"); + return grammarToJson(text, + (a) -> RelationalGrammarParserExtension.parseRelationalOperationElement(a, sourceId, lineOffset, columnOffset, returnSourceInformation), pm, "Grammar to Json : RelationalOperationElement"); } // Required so that Jackson properly includes _type for the top level element @@ -56,9 +54,10 @@ static class TypedMap extends UnifiedMap @ApiOperation(value = "Generates Pure protocol JSON from Pure language text for relational operation elements") @Consumes({MediaType.APPLICATION_JSON, APPLICATION_ZLIB}) @Produces(MediaType.APPLICATION_JSON) - public Response relationalOperationElementBatch(Map input, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm, @QueryParam("returnSourceInfo") boolean returnSourceInfo) + public Response relationalOperationElementBatch(Map input, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) { PureGrammarParserExtensions.logExtensionList(); - return grammarToJsonBatch(input, (a, b) -> RelationalGrammarParserExtension.parseRelationalOperationElement(a, b), new TypedMap(), pm, returnSourceInfo, "Grammar to Json : RelationalOperationElement Batch"); + return grammarToJsonBatch(input, + RelationalGrammarParserExtension::parseRelationalOperationElement, new TypedMap(), pm, "Grammar to Json : RelationalOperationElement Batch"); } } diff --git a/legend-engine-xt-relationalStore-api/src/main/java/org/finos/legend/engine/language/pure/grammar/api/relationalOperationElement/RelationalOperationElementJsonToGrammar.java b/legend-engine-xt-relationalStore-api/src/main/java/org/finos/legend/engine/language/pure/grammar/api/relationalOperationElement/RelationalOperationElementJsonToGrammar.java index e61766a8831..225b43e20c2 100644 --- a/legend-engine-xt-relationalStore-api/src/main/java/org/finos/legend/engine/language/pure/grammar/api/relationalOperationElement/RelationalOperationElementJsonToGrammar.java +++ b/legend-engine-xt-relationalStore-api/src/main/java/org/finos/legend/engine/language/pure/grammar/api/relationalOperationElement/RelationalOperationElementJsonToGrammar.java @@ -12,7 +12,6 @@ import org.eclipse.collections.impl.factory.Maps; import org.eclipse.collections.impl.tuple.Tuples; import org.eclipse.collections.impl.utility.MapIterate; -import org.finos.legend.engine.language.pure.grammar.to.PureGrammarComposerContext; import org.finos.legend.engine.language.pure.grammar.to.RelationalGrammarComposerExtension; import org.finos.legend.engine.language.pure.grammar.to.extension.PureGrammarComposerExtensionLoader; import org.finos.legend.engine.protocol.pure.v1.model.packageableElement.store.relational.model.operation.RelationalOperationElement; @@ -25,7 +24,12 @@ import org.pac4j.core.profile.ProfileManager; import org.pac4j.jax.rs.annotations.Pac4JProfileManager; -import javax.ws.rs.*; +import javax.ws.rs.Consumes; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.util.Map; @@ -37,11 +41,13 @@ public class RelationalOperationElementJsonToGrammar { @POST - @Path("relationalOperationElement/{renderStyle}") + @Path("relationalOperationElement") @ApiOperation(value = "Generates Pure language text from Pure protocol JSON for relational operation elements") @Consumes({MediaType.APPLICATION_JSON, APPLICATION_ZLIB}) @Produces(MediaType.TEXT_PLAIN) - public Response relationalOperationElement(@PathParam("renderStyle") @DefaultValue("PRETTY") RenderStyle renderStyle, RelationalOperationElement input, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) + public Response relationalOperationElement(RelationalOperationElement input, + @QueryParam("renderStyle") @DefaultValue("PRETTY") RenderStyle renderStyle, + @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) { MutableList profiles = ProfileManagerHelper.extractProfiles(pm); try (Scope scope = GlobalTracer.get().buildSpan("Service: jsonToGrammar relationalOperationElement").startActive(true)) @@ -56,11 +62,13 @@ public Response relationalOperationElement(@PathParam("renderStyle") @DefaultVal } @POST - @Path("relationalOperationElement/{renderStyle}/batch") + @Path("relationalOperationElement/batch") @ApiOperation(value = "Generates Pure language text from Pure protocol JSON for relational operation elements") @Consumes({MediaType.APPLICATION_JSON, APPLICATION_ZLIB}) @Produces(MediaType.APPLICATION_JSON) - public Response relationalOperationElementBatch(@PathParam("renderStyle") @DefaultValue("PRETTY") RenderStyle renderStyle, Map input, @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) + public Response relationalOperationElementBatch(Map input, + @QueryParam("renderStyle") @DefaultValue("PRETTY") RenderStyle renderStyle, + @ApiParam(hidden = true) @Pac4JProfileManager ProfileManager pm) { MutableList profiles = ProfileManagerHelper.extractProfiles(pm); try (Scope scope = GlobalTracer.get().buildSpan("Service: jsonToGrammar relationalOperationElement").startActive(true)) diff --git a/legend-engine-xt-relationalStore-api/src/main/java/org/finos/legend/engine/language/pure/grammar/api/relationalOperationElement/TransformRelationalOperationElementGrammarToJson.java b/legend-engine-xt-relationalStore-api/src/main/java/org/finos/legend/engine/language/pure/grammar/api/relationalOperationElement/TransformRelationalOperationElementGrammarToJson.java index 28200747b32..c6e405c6d7c 100644 --- a/legend-engine-xt-relationalStore-api/src/main/java/org/finos/legend/engine/language/pure/grammar/api/relationalOperationElement/TransformRelationalOperationElementGrammarToJson.java +++ b/legend-engine-xt-relationalStore-api/src/main/java/org/finos/legend/engine/language/pure/grammar/api/relationalOperationElement/TransformRelationalOperationElementGrammarToJson.java @@ -55,7 +55,7 @@ public Response transformRelationalOperationElementGrammarToJson(RelationalOpera { try { - RelationalOperationElement operation = RelationalGrammarParserExtension.parseRelationalOperationElement(value, returnSourceInfo); + RelationalOperationElement operation = RelationalGrammarParserExtension.parseRelationalOperationElement(value, key, 0, 0, returnSourceInfo); operations.put(key, operation); } catch (Exception e) diff --git a/legend-engine-xt-relationalStore-api/src/test/java/org.finos.legend.engine.language.pure.grammar.api.relationalOperationElement.test/TestRelationalOperationElementApi.java b/legend-engine-xt-relationalStore-api/src/test/java/org.finos.legend.engine.language.pure.grammar.api.relationalOperationElement.test/TestRelationalOperationElementApi.java index 05b75dbb611..a5624175ab6 100644 --- a/legend-engine-xt-relationalStore-api/src/test/java/org.finos.legend.engine.language.pure.grammar.api.relationalOperationElement.test/TestRelationalOperationElementApi.java +++ b/legend-engine-xt-relationalStore-api/src/test/java/org.finos.legend.engine.language.pure.grammar.api.relationalOperationElement.test/TestRelationalOperationElementApi.java @@ -1,5 +1,6 @@ package org.finos.legend.engine.language.pure.grammar.api.relationalOperationElement.test; +import org.eclipse.collections.api.block.function.Function; import org.eclipse.collections.api.block.function.Function2; import org.eclipse.collections.impl.tuple.Tuples; import org.finos.legend.engine.language.pure.grammar.api.relationalOperationElement.RelationalOperationElementGrammarToJson; @@ -8,7 +9,9 @@ import org.finos.legend.engine.protocol.pure.v1.model.packageableElement.store.relational.model.operation.RelationalOperationElement; import org.finos.legend.engine.shared.core.api.TestGrammar; import org.finos.legend.engine.shared.core.api.grammar.BatchResult; +import org.finos.legend.engine.shared.core.api.grammar.GrammarAPI; import org.finos.legend.engine.shared.core.api.grammar.RenderStyle; +import org.finos.legend.engine.shared.core.function.Function5; import org.junit.Test; import javax.ws.rs.core.Response; @@ -31,18 +34,19 @@ public void testSimpleError() @Test public void testBatch() { - testBatch(with(Tuples.pair("1", "add(1, 2)"), - Tuples.pair("2", "'4'"))); + testBatch(createBatchInput(Tuples.pair("1", "add(1, 2)"), + Tuples.pair("2", "'4'"))); } @Test public void testBatchError() { - testBatchError( with(Tuples.pair("1", "add(1"), - Tuples.pair("2", "'4'")), - with(Tuples.pair("1", "{\"message\":\"Unexpected token\",\"sourceInformation\":{\"endColumn\":10,\"endLine\":1,\"sourceId\":\"\",\"startColumn\":6,\"startLine\":1}}"), - Tuples.pair("2", "'4'")) - ); + testBatchError(createBatchInput(Tuples.pair("1", "add(1"), + Tuples.pair("2", "'4'")), + createExpectedBatchResult(Tuples.pair("1", + "{\"message\":\"Unexpected token\",\"sourceInformation\":{\"endColumn\":10,\"endLine\":1,\"sourceId\":\"\",\"startColumn\":6,\"startLine\":1}}"), + Tuples.pair("2", "'4'")) + ); } private static final RelationalOperationElementGrammarToJson grammarToJson = new RelationalOperationElementGrammarToJson(); @@ -55,7 +59,8 @@ public Class get_Class() } public static class MyClass extends BatchResult - {} + { + } @Override public Class getBatchResultSpecializedClass() @@ -64,25 +69,25 @@ public Class getBatchResultSpecializedClass() } @Override - public Function2 grammarToJson() + public Function5 grammarToJson() { - return (a, b) -> grammarToJson.relationalOperationElement(a, null, b); + return (a, b, c, d, e) -> grammarToJson.relationalOperationElement(a, b, c, d, e, null); } @Override - public Function2 jsonToGrammar() + public Function2 jsonToGrammar() { return (a, b) -> jsonToGrammar.relationalOperationElement(a, b, null); } @Override - public Function2, Boolean, Response> grammarToJsonB() + public Function, Response> grammarToJsonB() { - return (a, b) -> grammarToJson.relationalOperationElementBatch(a, null, b); + return (a) -> grammarToJson.relationalOperationElementBatch(a, null); } @Override - public Function2, Response> jsonToGrammarB() + public Function2, RenderStyle, Response> jsonToGrammarB() { return (a, b) -> jsonToGrammar.relationalOperationElementBatch(a, b, null); } diff --git a/legend-engine-xt-relationalStore-grammar/src/main/java/org/finos/legend/engine/language/pure/grammar/from/RelationalGrammarParserExtension.java b/legend-engine-xt-relationalStore-grammar/src/main/java/org/finos/legend/engine/language/pure/grammar/from/RelationalGrammarParserExtension.java index a9944ba001d..35d33bf82a9 100644 --- a/legend-engine-xt-relationalStore-grammar/src/main/java/org/finos/legend/engine/language/pure/grammar/from/RelationalGrammarParserExtension.java +++ b/legend-engine-xt-relationalStore-grammar/src/main/java/org/finos/legend/engine/language/pure/grammar/from/RelationalGrammarParserExtension.java @@ -345,10 +345,10 @@ private static SourceCodeParserInfo getRelationalDatabaseConnectionParserInfo(Co return new SourceCodeParserInfo(connectionValueSourceCode.code, input, connectionValueSourceCode.sourceInformation, connectionValueSourceCode.walkerSourceInformation, lexer, parser, parser.definition()); } - public static RelationalOperationElement parseRelationalOperationElement(String code, boolean returnSourceInfo) + public static RelationalOperationElement parseRelationalOperationElement(String code, String sourceId, int lineOffset, int columnOffset, boolean returnSourceInfo) { CharStream input = CharStreams.fromString(code); - ParseTreeWalkerSourceInformation parseTreeWalkerSourceInformation= new ParseTreeWalkerSourceInformation.Builder("", 0, 0).withReturnSourceInfo(returnSourceInfo).build(); + ParseTreeWalkerSourceInformation parseTreeWalkerSourceInformation = new ParseTreeWalkerSourceInformation.Builder(sourceId, lineOffset, columnOffset).withReturnSourceInfo(returnSourceInfo).build(); ParserErrorListener errorListener = new ParserErrorListener(parseTreeWalkerSourceInformation); RelationalLexerGrammar lexer = new RelationalLexerGrammar(input); lexer.removeErrorListeners(); diff --git a/legend-engine-xt-relationalStore-grammar/src/test/java/org/finos/legend/engine/language/pure/grammar/test/TestRelationalOperationElementGrammarRoundtrip.java b/legend-engine-xt-relationalStore-grammar/src/test/java/org/finos/legend/engine/language/pure/grammar/test/TestRelationalOperationElementGrammarRoundtrip.java index 97ea8e74f77..61623fd7fbc 100644 --- a/legend-engine-xt-relationalStore-grammar/src/test/java/org/finos/legend/engine/language/pure/grammar/test/TestRelationalOperationElementGrammarRoundtrip.java +++ b/legend-engine-xt-relationalStore-grammar/src/test/java/org/finos/legend/engine/language/pure/grammar/test/TestRelationalOperationElementGrammarRoundtrip.java @@ -38,7 +38,7 @@ protected static void test(String val, String expectedErrorMsg) RelationalOperationElement operation = null; try { - RelationalOperationElement op = RelationalGrammarParserExtension.parseRelationalOperationElement(val, true); + RelationalOperationElement op = RelationalGrammarParserExtension.parseRelationalOperationElement(val, "", 0, 0, true); String json = objectMapper.writeValueAsString(op); operation = objectMapper.readValue(json, RelationalOperationElement.class); if (expectedErrorMsg != null)