diff --git a/server/bundles/io.cloudbeaver.server/schema/service.sql.graphqls b/server/bundles/io.cloudbeaver.server/schema/service.sql.graphqls index 7acec7816ef..8202671c7e0 100644 --- a/server/bundles/io.cloudbeaver.server/schema/service.sql.graphqls +++ b/server/bundles/io.cloudbeaver.server/schema/service.sql.graphqls @@ -337,14 +337,17 @@ extend type Query { columnNames: [String!], functions: [String!], showDuplicatesOnly: Boolean - ): String! @deprecated (reason: "use sqlGropingResultSet (25.3.1)") + ): String! @deprecated (reason: "use asyncSqlGroupingResultSet (25.3.1)") "Creates async task to get grouped SQL results" - sqlGropingResultSet( + asyncSqlGroupingResultSet( projectId: ID, contextId: ID!, connectionId: ID!, - resultsId: ID!, + "Original results ID to group" + originalResultsId: ID!, + "Current results ID is needed to apply filters/sorting on top of grouping" + currentResultsId: ID, columnNames: [String!], functions: [String!], showDuplicatesOnly: Boolean, 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 33a6a9d5365..1c5adb3995e 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 @@ -210,8 +210,10 @@ String generateGroupByQuery(@NotNull WebSQLContextInfo contextInfo, @WebAction WebAsyncTaskInfo getGroupingSqlResultSet( + @NotNull WebSession webSession, @NotNull WebSQLContextInfo contextInfo, - @NotNull String resultsId, + @NotNull String originalResultsId, + @Nullable String currentResultsId, @NotNull List columnsList, @Nullable List functions, @Nullable Boolean showDuplicatesOnly, 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 3e3edb78a18..3a5770c918d 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 @@ -106,10 +106,12 @@ public void bindWiring(DBWBindingContext model) throws DBWebException { getArgument(env, "showDuplicatesOnly")) ) .dataFetcher( - "sqlGropingResultSet", env -> + "asyncSqlGroupingResultSet", env -> getService(env).getGroupingSqlResultSet( + getWebSession(env), getSQLContext(env), - getArgumentVal(env, "resultsId"), + getArgumentVal(env, "originalResultsId"), + getArgument(env, "currentResultsId"), getArgumentVal(env, "columnNames"), getArgument(env, "functions"), getArgument(env, "showDuplicatesOnly"), 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 9c45362f1cd..9324d70f90a 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 @@ -649,8 +649,10 @@ public String generateGroupByQuery( @Override public WebAsyncTaskInfo getGroupingSqlResultSet( + @NotNull WebSession webSession, @NotNull WebSQLContextInfo contextInfo, - @NotNull String resultsId, + @NotNull String originalResultsId, + @Nullable String currentResultsId, @NotNull List columnsList, @Nullable List functions, @Nullable Boolean showDuplicatesOnly, @@ -658,13 +660,11 @@ public WebAsyncTaskInfo getGroupingSqlResultSet( @Nullable WebDataFormat dataFormat, boolean isInteractive ) throws DBException { - String generateGroupByQuery = generateGroupByQuery(contextInfo, resultsId, columnsList, functions, showDuplicatesOnly); - return asyncExecuteQuery( - contextInfo.getProcessor().getWebSession(), - contextInfo.getProjectId(), + return WebSQLUtils.createAsyncTaskExecuteSqlQuery( + webSession, contextInfo, - generateGroupByQuery, - resultsId, + generateGroupByQuery(contextInfo, originalResultsId, columnsList, functions, showDuplicatesOnly), + currentResultsId, filter, dataFormat, false, diff --git a/webapp/packages/core-sdk/src/queries/grid/asyncSqlGroupingResultSet.gql b/webapp/packages/core-sdk/src/queries/grid/asyncSqlGroupingResultSet.gql new file mode 100644 index 00000000000..11d2b80ef42 --- /dev/null +++ b/webapp/packages/core-sdk/src/queries/grid/asyncSqlGroupingResultSet.gql @@ -0,0 +1,29 @@ +query asyncSqlGroupingResultSet( + $projectId: ID + $contextId: ID! + $connectionId: ID! + $originalResultsId: ID! + $currentResultsId: ID + $columnNames: [String!] + $functions: [String!] + $showDuplicatesOnly: Boolean + $filter: SQLDataFilter + $dataFormat: ResultDataFormat + $isInteractive: Boolean +) { + taskInfo: asyncSqlGroupingResultSet( + projectId: $projectId + contextId: $contextId + connectionId: $connectionId + originalResultsId: $originalResultsId + currentResultsId: $currentResultsId + columnNames: $columnNames + functions: $functions + showDuplicatesOnly: $showDuplicatesOnly + filter: $filter + dataFormat: $dataFormat + isInteractive: $isInteractive + ) { + ...AsyncTaskInfo + } +} diff --git a/webapp/packages/core-sdk/src/queries/grid/getResultsetGroupingQuery.gql b/webapp/packages/core-sdk/src/queries/grid/getResultsetGroupingQuery.gql deleted file mode 100644 index 8b5065d31c7..00000000000 --- a/webapp/packages/core-sdk/src/queries/grid/getResultsetGroupingQuery.gql +++ /dev/null @@ -1,19 +0,0 @@ -query getResultsetGroupingQuery( - $projectId: ID! - $contextId: ID! - $connectionId: ID! - $resultsId: ID! - $columnNames: [ String! ]! - $functions: [ String! ] - $showDuplicatesOnly: Boolean -) { - query: sqlGenerateGroupingQuery( - projectId: $projectId, - contextId: $contextId, - connectionId: $connectionId, - resultsId: $resultsId, - columnNames: $columnNames - functions: $functions - showDuplicatesOnly: $showDuplicatesOnly - ) -} \ No newline at end of file diff --git a/webapp/packages/plugin-data-viewer-result-set-grouping/src/GroupingDataSource.ts b/webapp/packages/plugin-data-viewer-result-set-grouping/src/GroupingDataSource.ts index a946f265981..03ccaf7e331 100644 --- a/webapp/packages/plugin-data-viewer-result-set-grouping/src/GroupingDataSource.ts +++ b/webapp/packages/plugin-data-viewer-result-set-grouping/src/GroupingDataSource.ts @@ -1,11 +1,12 @@ /* * CloudBeaver - Cloud Database Manager - * Copyright (C) 2020-2024 DBeaver Corp and others + * Copyright (C) 2020-2026 DBeaver Corp and others * * Licensed under the Apache License, Version 2.0. * you may not use this file except in compliance with the License. */ -import type { IDatabaseResultSet } from '@cloudbeaver/plugin-data-viewer'; +import type { IConnectionExecutionContextInfo } from '@cloudbeaver/core-connections'; +import type { AsyncTaskInfo } from '@cloudbeaver/core-sdk'; import { type IDataQueryOptions, QueryDataSource } from '@cloudbeaver/plugin-sql-editor'; export interface IDataGroupingOptions extends IDataQueryOptions { @@ -17,34 +18,30 @@ export interface IDataGroupingOptions extends IDataQueryOptions { } export class GroupingDataSource extends QueryDataSource { - override async request(prevResults: IDatabaseResultSet[]): Promise { - await this.generateQuery(); - return await super.request(prevResults); - } - - private async generateQuery(): Promise { - const options = this.options; - const executionContextInfo = this.executionContext?.context; - - if (!options || !executionContextInfo) { - return; - } - - try { - const { query } = await this.graphQLService.sdk.getResultsetGroupingQuery({ - projectId: executionContextInfo.projectId, - connectionId: executionContextInfo.connectionId, - contextId: executionContextInfo.id, - resultsId: options.sourceResultId, - columnNames: options.columns, - functions: options.functions, - showDuplicatesOnly: options.showDuplicatesOnly || false, - }); + protected override async executeQuery( + executionContextInfo: IConnectionExecutionContextInfo, + options: IDataGroupingOptions, + currentResultsId: string | undefined, + limit: number, + ): Promise { + const { taskInfo } = await this.graphQLService.sdk.asyncSqlGroupingResultSet({ + projectId: executionContextInfo.projectId, + connectionId: executionContextInfo.connectionId, + contextId: executionContextInfo.id, + originalResultsId: options.sourceResultId, + currentResultsId: currentResultsId, + columnNames: options.columns, + functions: options.functions, + showDuplicatesOnly: options.showDuplicatesOnly, + filter: { + offset: this.offset, + limit, + constraints: options.constraints, + where: options.whereFilter || undefined, + }, + dataFormat: this.dataFormat, + }); - this.setOptions({ ...options, query }); - } catch (exception: any) { - this.error = exception; - throw exception; - } + return taskInfo; } }