feat: support SQL query formatting in WebServiceSQL.

This commit is contained in:
Nikita Makarov
2021-12-02 16:15:45 +03:00
parent e658037548
commit b6ac71ffd5
2 changed files with 116 additions and 100 deletions
@@ -49,108 +49,117 @@ public class WebServiceBindingSQL extends WebServiceBindingBase<DBWServiceSQL> i
@Override
public void bindWiring(DBWBindingContext model) throws DBWebException {
model.getQueryType()
.dataFetcher("sqlDialectInfo", env ->
getService(env).getDialectInfo(getSQLProcessor(env))
)
.dataFetcher("sqlListContexts", env ->
getService(env).listContexts(getWebSession(env),
env.getArgument("connectionId"),
env.getArgument("contextId"))
)
.dataFetcher("sqlCompletionProposals", env ->
getService(env).getCompletionProposals(
getSQLContext(env),
env.getArgument("query"),
env.getArgument("position"),
env.getArgument("maxResults"),
env.getArgument("simpleMode")
.dataFetcher("sqlDialectInfo", env ->
getService(env).getDialectInfo(getSQLProcessor(env))
)
.dataFetcher("sqlListContexts", env ->
getService(env).listContexts(getWebSession(env),
env.getArgument("connectionId"),
env.getArgument("contextId"))
)
.dataFetcher("sqlCompletionProposals", env ->
getService(env).getCompletionProposals(
getSQLContext(env),
env.getArgument("query"),
env.getArgument("position"),
env.getArgument("maxResults"),
env.getArgument("simpleMode")
)
)
.dataFetcher("sqlFormatQuery", env ->
getService(env).formatQuery(
getSQLContext(env),
env.getArgument("query")
)
)
.dataFetcher("sqlSupportedOperations", env ->
getService(env).getSupportedOperations(
getSQLContext(env),
env.getArgument("resultsId"),
env.getArgument("attributeIndex"))
)
.dataFetcher("sqlEntityQueryGenerators", env ->
getService(env).getEntityQueryGenerators(
getWebSession(env),
env.getArgument("nodePathList"))
)
.dataFetcher("sqlGenerateEntityQuery", env ->
getService(env).generateEntityQuery(
getWebSession(env),
env.getArgument("generatorId"),
env.getArgument("options"),
env.getArgument("nodePathList"))
)
)
.dataFetcher("sqlSupportedOperations", env ->
getService(env).getSupportedOperations(
getSQLContext(env),
env.getArgument("resultsId"),
env.getArgument("attributeIndex"))
)
.dataFetcher("sqlEntityQueryGenerators", env ->
getService(env).getEntityQueryGenerators(
getWebSession(env),
env.getArgument("nodePathList"))
)
.dataFetcher("sqlGenerateEntityQuery", env ->
getService(env).generateEntityQuery(
getWebSession(env),
env.getArgument("generatorId"),
env.getArgument("options"),
env.getArgument("nodePathList"))
)
;
model.getMutationType()
.dataFetcher("sqlContextCreate", env -> getService(env).createContext(
getSQLProcessor(env),
env.getArgument("defaultCatalog"),
env.getArgument("defaultSchema")))
.dataFetcher("sqlContextDestroy", env -> { getService(env).destroyContext(getSQLContext(env)); return true; } )
.dataFetcher("sqlContextSetDefaults", env -> {
getService(env).setContextDefaults(
getSQLContext(env),
env.getArgument("defaultCatalog"),
env.getArgument("defaultSchema"));
.dataFetcher("sqlContextCreate", env -> getService(env).createContext(
getSQLProcessor(env),
env.getArgument("defaultCatalog"),
env.getArgument("defaultSchema")))
.dataFetcher("sqlContextDestroy", env -> {
getService(env).destroyContext(getSQLContext(env));
return true;
})
})
.dataFetcher("sqlContextSetDefaults", env -> {
getService(env).setContextDefaults(
getSQLContext(env),
env.getArgument("defaultCatalog"),
env.getArgument("defaultSchema"));
return true;
})
.dataFetcher("sqlResultClose", env ->
getService(env).closeResult(
getSQLContext(env),
env.getArgument("resultId")))
.dataFetcher("sqlResultClose", env ->
getService(env).closeResult(
getSQLContext(env),
env.getArgument("resultId")))
.dataFetcher("updateResultsDataBatch", env ->
getService(env).updateResultsDataBatch(
getSQLContext(env),
env.getArgument("resultsId"),
getResultsRow(env, "updatedRows"),
getResultsRow(env, "deletedRows"),
getResultsRow(env, "addedRows"),
getDataFormat(env)))
.dataFetcher("updateResultsDataBatchScript", env ->
getService(env).updateResultsDataBatchScript(
getSQLContext(env),
env.getArgument("resultsId"),
getResultsRow(env, "updatedRows"),
getResultsRow(env, "deletedRows"),
getResultsRow(env, "addedRows"),
getDataFormat(env)))
.dataFetcher("updateResultsDataBatch", env ->
getService(env).updateResultsDataBatch(
getSQLContext(env),
env.getArgument("resultsId"),
getResultsRow(env, "updatedRows"),
getResultsRow(env, "deletedRows"),
getResultsRow(env, "addedRows"),
getDataFormat(env)))
.dataFetcher("updateResultsDataBatchScript", env ->
getService(env).updateResultsDataBatchScript(
getSQLContext(env),
env.getArgument("resultsId"),
getResultsRow(env, "updatedRows"),
getResultsRow(env, "deletedRows"),
getResultsRow(env, "addedRows"),
getDataFormat(env)))
.dataFetcher("asyncSqlExecuteQuery", env ->
getService(env).asyncExecuteQuery(
getSQLContext(env),
env.getArgument("sql"),
env.getArgument("resultId"),
getDataFilter(env),
getDataFormat(env)))
.dataFetcher("asyncReadDataFromContainer", env ->
getService(env).asyncReadDataFromContainer(
getSQLContext(env),
env.getArgument("containerNodePath"),
env.getArgument("resultId"),
getDataFilter(env),
getDataFormat(env)
))
.dataFetcher("asyncSqlExecuteResults", env ->
getService(env).asyncGetQueryResults(
getWebSession(env), env.getArgument("taskId")
))
.dataFetcher("asyncSqlExplainExecutionPlan", env ->
getService(env).asyncSqlExplainExecutionPlan(
getSQLContext(env),
env.getArgument("query"),
env.getArgument("configuration")
))
.dataFetcher("asyncSqlExplainExecutionPlanResult", env ->
getService(env).asyncSqlExplainExecutionPlanResult(
getWebSession(env), env.getArgument("taskId")
));
.dataFetcher("asyncSqlExecuteQuery", env ->
getService(env).asyncExecuteQuery(
getSQLContext(env),
env.getArgument("sql"),
env.getArgument("resultId"),
getDataFilter(env),
getDataFormat(env)))
.dataFetcher("asyncReadDataFromContainer", env ->
getService(env).asyncReadDataFromContainer(
getSQLContext(env),
env.getArgument("containerNodePath"),
env.getArgument("resultId"),
getDataFilter(env),
getDataFormat(env)
))
.dataFetcher("asyncSqlExecuteResults", env ->
getService(env).asyncGetQueryResults(
getWebSession(env), env.getArgument("taskId")
))
.dataFetcher("asyncSqlExplainExecutionPlan", env ->
getService(env).asyncSqlExplainExecutionPlan(
getSQLContext(env),
env.getArgument("query"),
env.getArgument("configuration")
))
.dataFetcher("asyncSqlExplainExecutionPlanResult", env ->
getService(env).asyncSqlExplainExecutionPlanResult(
getWebSession(env), env.getArgument("taskId")
));
}
@NotNull
@@ -199,8 +208,8 @@ public class WebServiceBindingSQL extends WebServiceBindingBase<DBWServiceSQL> i
@Override
public void addServlets(CBApplication application, ServletContextHandler servletContextHandler) {
servletContextHandler.addServlet(
new ServletHolder("sqlResultValueViewer", new WebSQLResultServlet(application, getServiceImpl())),
application.getServicesURI() + "sql-result-value/*");
new ServletHolder("sqlResultValueViewer", new WebSQLResultServlet(application, getServiceImpl())),
application.getServicesURI() + "sql-result-value/*");
}
private static class WebSQLConfiguration {
@@ -35,13 +35,11 @@ import org.jkiss.dbeaver.model.exec.DBCLogicalOperator;
import org.jkiss.dbeaver.model.exec.DBExecUtils;
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.SQLScriptParser;
@@ -151,6 +149,15 @@ public class WebServiceSQL implements DBWServiceSQL {
}
}
@NotNull
public String formatQuery(@NotNull WebSQLContextInfo sqlContext, @NotNull String query) throws DBWebException {
DBPDataSource dataSource = sqlContext.getProcessor().getConnection().getDataSourceContainer().getDataSource();
if (dataSource == null) {
throw new DBWebException("DataSource is null: can't format SQL query");
}
return SQLFormatUtils.formatSQL(dataSource, query);
}
@Override
public DBCLogicalOperator[] getSupportedOperations(@NotNull WebSQLContextInfo contextInfo, @NotNull String resultsId, int attributeIndex) throws DBWebException {
WebSQLResultsInfo results = contextInfo.getResults(resultsId);