From 3fe327fc05e4d27e30094ce212fbb28e20c6e5f9 Mon Sep 17 00:00:00 2001 From: Ainur Yagudin Date: Mon, 28 Feb 2022 13:11:12 +0300 Subject: [PATCH] CB-1708 add parseQuery function --- .../schema/service.sql.graphqls | 6 +++++ .../service/sql/DBWServiceSQL.java | 3 +++ .../service/sql/WebServiceBindingSQL.java | 5 ++++ .../service/sql/impl/WebServiceSQL.java | 24 +++++++++++++++---- .../src/queries/fragments/SQLQueryInfo.gql | 4 ++++ .../src/queries/sql-editor/parseSQLQuery.gql | 13 ++++++++++ 6 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 webapp/packages/core-sdk/src/queries/fragments/SQLQueryInfo.gql create mode 100644 webapp/packages/core-sdk/src/queries/sql-editor/parseSQLQuery.gql diff --git a/server/bundles/io.cloudbeaver.server/schema/service.sql.graphqls b/server/bundles/io.cloudbeaver.server/schema/service.sql.graphqls index 2d10cea359..d31d936ca4 100644 --- a/server/bundles/io.cloudbeaver.server/schema/service.sql.graphqls +++ b/server/bundles/io.cloudbeaver.server/schema/service.sql.graphqls @@ -240,6 +240,12 @@ extend type Query { connectionId: ID!, script: String! ): SQLScriptInfo! + + sqlParseQuery( + connectionId: ID!, + script: String! + position: Int! + ): SQLScriptQuery! } extend type Mutation { diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/DBWServiceSQL.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/DBWServiceSQL.java index 110124d8db..bf5571c09e 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/DBWServiceSQL.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/DBWServiceSQL.java @@ -130,4 +130,7 @@ public interface DBWServiceSQL extends DBWService { @WebAction WebSQLScriptInfo parseSqlScript(@NotNull WebConnectionInfo connectionInfo, @NotNull String sqlScript) throws DBWebException; + + @WebAction + WebSQLQueryInfo parseSqlQuery(@NotNull WebConnectionInfo connectionInfo, @NotNull String sqlScript, int currentPosition) throws DBWebException; } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebServiceBindingSQL.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebServiceBindingSQL.java index 73df924dbe..825ab5333a 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebServiceBindingSQL.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebServiceBindingSQL.java @@ -91,6 +91,11 @@ public class WebServiceBindingSQL extends WebServiceBindingBase i env.getArgument("nodePathList")) ).dataFetcher("sqlParseScript", env -> getService(env).parseSqlScript(getWebConnection(env), env.getArgument("script")) + ).dataFetcher("sqlParseQuery", env -> + getService(env).parseSqlQuery( + getWebConnection(env), + env.getArgument("script"), + env.getArgument("position")) ) ; diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/impl/WebServiceSQL.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/impl/WebServiceSQL.java index 3d3dacb3b8..de814d3875 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/impl/WebServiceSQL.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/impl/WebServiceSQL.java @@ -38,16 +38,14 @@ import org.jkiss.dbeaver.model.exec.DBExecUtils; import org.jkiss.dbeaver.model.impl.sql.BasicSQLDialect; import org.jkiss.dbeaver.model.navigator.DBNNode; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; -import org.jkiss.dbeaver.model.sql.SQLDialect; -import org.jkiss.dbeaver.model.sql.SQLQuery; -import org.jkiss.dbeaver.model.sql.SQLScriptElement; -import org.jkiss.dbeaver.model.sql.SQLUtils; +import org.jkiss.dbeaver.model.sql.*; import org.jkiss.dbeaver.model.sql.completion.SQLCompletionAnalyzer; import org.jkiss.dbeaver.model.sql.completion.SQLCompletionProposalBase; import org.jkiss.dbeaver.model.sql.completion.SQLCompletionRequest; import org.jkiss.dbeaver.model.sql.format.SQLFormatUtils; import org.jkiss.dbeaver.model.sql.generator.SQLGenerator; import org.jkiss.dbeaver.model.sql.parser.SQLParserContext; +import org.jkiss.dbeaver.model.sql.parser.SQLRuleManager; import org.jkiss.dbeaver.model.sql.parser.SQLScriptParser; import org.jkiss.dbeaver.model.sql.registry.SQLGeneratorConfigurationRegistry; import org.jkiss.dbeaver.model.sql.registry.SQLGeneratorDescriptor; @@ -440,4 +438,22 @@ public class WebServiceSQL implements DBWServiceSQL { .collect(Collectors.toList()); return new WebSQLScriptInfo(queriesInfo); } + @Override + public WebSQLQueryInfo parseSqlQuery(@NotNull WebConnectionInfo connectionInfo, @NotNull String sqlScript, int cursorPosition) throws DBWebException { + SQLDialect dialect = getSqlDialectFromConnection(connectionInfo.getDataSourceContainer()); + SQLSyntaxManager syntaxManager = new SQLSyntaxManager(); + syntaxManager.init(dialect, connectionInfo.getDataSourceContainer().getPreferenceStore()); + SQLRuleManager ruleManager = new SQLRuleManager(syntaxManager); + ruleManager.loadRules(); + + Document sqlDocument = new Document(sqlScript); + + SQLParserContext parserContext = new SQLParserContext(null, syntaxManager, ruleManager, sqlDocument); + + SQLScriptElement query = SQLScriptParser.extractQueryAtPos(parserContext, cursorPosition); + if (query == null) { + return new WebSQLQueryInfo(0, 0); + } + return new WebSQLQueryInfo(query.getOffset(), query.getOffset() + query.getText().length()); + } } diff --git a/webapp/packages/core-sdk/src/queries/fragments/SQLQueryInfo.gql b/webapp/packages/core-sdk/src/queries/fragments/SQLQueryInfo.gql new file mode 100644 index 0000000000..eec42b0fbe --- /dev/null +++ b/webapp/packages/core-sdk/src/queries/fragments/SQLQueryInfo.gql @@ -0,0 +1,4 @@ +fragment SQLQueryInfo on SQLScriptQuery { + start + end +} \ No newline at end of file diff --git a/webapp/packages/core-sdk/src/queries/sql-editor/parseSQLQuery.gql b/webapp/packages/core-sdk/src/queries/sql-editor/parseSQLQuery.gql new file mode 100644 index 0000000000..f7f103fdcd --- /dev/null +++ b/webapp/packages/core-sdk/src/queries/sql-editor/parseSQLQuery.gql @@ -0,0 +1,13 @@ +query parseSQLQuery( + $connectionId: ID! + $script: String! + $position: Int! +) { + scriptInfo: sqlParseQuery( + connectionId: $connectionId + script: $script + position: $position + ) { + ...SQLQueryInfo + } +}