CB-1708 add parseQuery function

This commit is contained in:
Ainur Yagudin
2022-02-28 13:11:12 +03:00
parent 173aeb0038
commit 3fe327fc05
6 changed files with 51 additions and 4 deletions
@@ -240,6 +240,12 @@ extend type Query {
connectionId: ID!,
script: String!
): SQLScriptInfo!
sqlParseQuery(
connectionId: ID!,
script: String!
position: Int!
): SQLScriptQuery!
}
extend type Mutation {
@@ -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;
}
@@ -91,6 +91,11 @@ public class WebServiceBindingSQL extends WebServiceBindingBase<DBWServiceSQL> 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"))
)
;
@@ -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());
}
}
@@ -0,0 +1,4 @@
fragment SQLQueryInfo on SQLScriptQuery {
start
end
}
@@ -0,0 +1,13 @@
query parseSQLQuery(
$connectionId: ID!
$script: String!
$position: Int!
) {
scriptInfo: sqlParseQuery(
connectionId: $connectionId
script: $script
position: $position
) {
...SQLQueryInfo
}
}