fix(plugin-data-viewer): CB-1250 actions update

This commit is contained in:
Wroud
2021-10-03 14:41:16 +03:00
parent a3b579fb8d
commit eba325f002
6 changed files with 65 additions and 32 deletions
@@ -67,7 +67,11 @@ export class ContainerDataSource extends DatabaseDataSource<IDataContainerOption
let firstResultId: string | undefined;
if (prevResults.length === 1) {
if (
prevResults.length === 1
&& prevResults[0].contextId === executionContext.context!.id
&& prevResults[0].connectionId === executionContext.context?.connectionId
) {
firstResultId = prevResults[0].id;
}
@@ -107,9 +111,9 @@ export class ContainerDataSource extends DatabaseDataSource<IDataContainerOption
return prevResults;
}
await this.closeResults(executionContext.context!, prevResults);
await this.closeResults(prevResults);
return this.transformResults(response.results, limit);
return this.transformResults(executionContext.context!, response.results, limit);
} catch (exception) {
this.error = exception;
throw exception;
@@ -123,9 +127,10 @@ export class ContainerDataSource extends DatabaseDataSource<IDataContainerOption
try {
for (const result of prevResults) {
const executionContextInfo = executionContext.context!;
const updateVariables: UpdateResultsDataBatchMutationVariables = {
connectionId: executionContext.context!.connectionId,
contextId: executionContext.context!.id,
connectionId: executionContextInfo.connectionId,
contextId: executionContextInfo.id,
resultsId: result.id,
};
let editor: ResultSetEditAction | DocumentEditAction | undefined;
@@ -141,7 +146,7 @@ export class ContainerDataSource extends DatabaseDataSource<IDataContainerOption
const response = await this.graphQLService.sdk.updateResultsDataBatch(updateVariables);
if (editor) {
const responseResult = this.transformResults(response.result.results, 0)
const responseResult = this.transformResults(executionContextInfo, response.result.results, 0)
.find(newResult => newResult.id === result.id);
if (responseResult) {
@@ -166,19 +171,16 @@ export class ContainerDataSource extends DatabaseDataSource<IDataContainerOption
}
async dispose(): Promise<void> {
if (this.executionContext?.context) {
await this.closeResults(this.executionContext.context, this.results);
}
await this.closeResults(this.results);
await this.executionContext?.destroy();
}
private async closeResults(context: IConnectionExecutionContextInfo, results: IDatabaseResultSet[]) {
private async closeResults(results: IDatabaseResultSet[]) {
for (const result of results) {
try {
await this.graphQLService.sdk.closeResult({
connectionId: context.connectionId,
contextId: context.id,
connectionId: result.connectionId,
contextId: result.contextId,
resultId: result.id,
});
} catch (exception) {
@@ -187,9 +189,16 @@ export class ContainerDataSource extends DatabaseDataSource<IDataContainerOption
}
}
private transformResults(results: SqlQueryResults[], limit: number): IDatabaseResultSet[] {
private transformResults(
executionContextInfo: IConnectionExecutionContextInfo,
results: SqlQueryResults[],
limit: number
): IDatabaseResultSet[] {
return results.map<IDatabaseResultSet>(result => ({
id: result.resultSet?.id || '0',
uniqueResultId: `${executionContextInfo.connectionId}_${executionContextInfo.id}_${result.resultSet?.id || '0'}`,
connectionId: executionContextInfo.connectionId,
contextId: executionContextInfo.id,
dataFormat: result.dataFormat!,
updateRowCount: result.updateRowCount || 0,
loadedFully: (result.resultSet?.rows?.length || 0) < limit,
@@ -6,6 +6,8 @@
* you may not use this file except in compliance with the License.
*/
import { makeObservable, observable } from 'mobx';
import type { IDatabaseDataAction, IDatabaseDataActionClass, IDatabaseDataActionInterface } from './IDatabaseDataAction';
import type { IDatabaseDataResult } from './IDatabaseDataResult';
import type { IDatabaseDataSource } from './IDatabaseDataSource';
@@ -23,6 +25,10 @@ implements IDatabaseDataAction<TOptions, TResult> {
constructor(source: IDatabaseDataSource<TOptions, TResult>, result: TResult) {
this.result = result;
this.source = source;
makeObservable(this, {
result: observable.ref,
});
}
updateResult(result: TResult): void {
@@ -52,7 +52,7 @@ implements IDatabaseDataActions<TOptions, TResult> {
throw new Error('DataFormat unsupported');
}
const actions = this.getOrCreateActionsList(result.id);
const actions = this.getOrCreateActionsList(result.uniqueResultId);
return runInAction(() => {
let action = actions.find(action => action instanceof Action);
@@ -70,7 +70,7 @@ implements IDatabaseDataActions<TOptions, TResult> {
}
action = new Action(this.source, result, ...depends);
this.addActionToList(result.id, actions, action);
this.addActionToList(result.uniqueResultId, actions, action);
}
return action as T;
});
@@ -80,7 +80,7 @@ implements IDatabaseDataActions<TOptions, TResult> {
result: TResult,
Action: IDatabaseDataActionInterface<TOptions, TResult, T>
): T | undefined {
const actions = this.getActionsList(result.id);
const actions = this.getActionsList(result.uniqueResultId);
const action = actions?.find(action => action instanceof Action);
return action as T | undefined;
@@ -90,7 +90,7 @@ implements IDatabaseDataActions<TOptions, TResult> {
const actionsMap = Array.from(this.actions.entries());
for (const [key, actions] of actionsMap) {
const result = results.find(result => result.id === key);
const result = results.find(result => result.uniqueResultId === key);
if (!result) {
for (const action of actions) {
@@ -76,6 +76,7 @@ implements IDatabaseDataSource<TOptions, TResult> {
activeRequest: observable.ref,
activeSave: observable.ref,
activeTask: observable.ref,
setResults: action,
setSupportedDataFormats: action,
});
}
@@ -10,6 +10,9 @@ import type { ResultDataFormat } from '@cloudbeaver/core-sdk';
export interface IDatabaseDataResult {
id: string;
uniqueResultId: string;
connectionId: string;
contextId: string;
dataFormat: ResultDataFormat;
loadedFully: boolean;
updateRowCount: number;
@@ -62,9 +62,10 @@ export class QueryDataSource extends DatabaseDataSource<IDataQueryOptions, IData
try {
for (const result of prevResults) {
const executionContextInfo = this.executionContext.context;
const updateVariables: UpdateResultsDataBatchMutationVariables = {
connectionId: this.options.connectionId,
contextId: this.executionContext.context.id,
contextId: executionContextInfo.id,
resultsId: result.id,
};
let editor: ResultSetEditAction | DocumentEditAction | undefined;
@@ -80,7 +81,7 @@ export class QueryDataSource extends DatabaseDataSource<IDataQueryOptions, IData
const response = await this.graphQLService.sdk.updateResultsDataBatch(updateVariables);
if (editor) {
const responseResult = this.transformResults(response.result.results, 0)
const responseResult = this.transformResults(executionContextInfo, response.result.results, 0)
.find(newResult => newResult.id === result.id);
if (responseResult) {
@@ -108,7 +109,11 @@ export class QueryDataSource extends DatabaseDataSource<IDataQueryOptions, IData
return this;
}
getResults(response: SqlExecuteInfo, limit: number): IDatabaseResultSet[] | null {
getResults(
executionContextInfo: IConnectionExecutionContextInfo,
response: SqlExecuteInfo,
limit: number
): IDatabaseResultSet[] | null {
this.requestInfo = {
requestDuration: response.duration || 0,
requestMessage: response.statusMessage || '',
@@ -120,7 +125,7 @@ export class QueryDataSource extends DatabaseDataSource<IDataQueryOptions, IData
return null;
}
return this.transformResults(response.results, limit);
return this.transformResults(executionContextInfo, response.results, limit);
}
async request(
@@ -139,7 +144,11 @@ export class QueryDataSource extends DatabaseDataSource<IDataQueryOptions, IData
let firstResultId: string | undefined;
if (prevResults.length === 1) {
if (
prevResults.length === 1
&& prevResults[0].contextId === executionContext.context!.id
&& prevResults[0].connectionId === executionContext.context?.connectionId
) {
firstResultId = prevResults[0].id;
}
@@ -163,14 +172,14 @@ export class QueryDataSource extends DatabaseDataSource<IDataQueryOptions, IData
try {
const response = await this.currentTask;
const results = this.getResults(response, limit);
const results = this.getResults(executionContextInfo, response, limit);
this.clearError();
if (!results) {
return prevResults;
}
this.closeResults(executionContextInfo, prevResults);
this.closeResults(prevResults);
return results;
} catch (exception) {
@@ -179,12 +188,12 @@ export class QueryDataSource extends DatabaseDataSource<IDataQueryOptions, IData
}
}
private async closeResults(context: IConnectionExecutionContextInfo, results: IDatabaseResultSet[]) {
private async closeResults(results: IDatabaseResultSet[]) {
for (const result of results) {
try {
await this.graphQLService.sdk.closeResult({
connectionId: context.connectionId,
contextId: context.id,
connectionId: result.connectionId,
contextId: result.contextId,
resultId: result.id,
});
} catch (exception) {
@@ -193,9 +202,16 @@ export class QueryDataSource extends DatabaseDataSource<IDataQueryOptions, IData
}
}
private transformResults(results: SqlQueryResults[], limit: number): IDatabaseResultSet[] {
private transformResults(
executionContextInfo: IConnectionExecutionContextInfo,
results: SqlQueryResults[],
limit: number
): IDatabaseResultSet[] {
return results.map<IDatabaseResultSet>(result => ({
id: result.resultSet?.id || '0',
uniqueResultId: `${executionContextInfo.connectionId}_${executionContextInfo.id}_${result.resultSet?.id || '0'}`,
connectionId: executionContextInfo.connectionId,
contextId: executionContextInfo.id,
dataFormat: result.dataFormat!,
updateRowCount: result.updateRowCount || 0,
loadedFully: (result.resultSet?.rows?.length || 0) < limit,
@@ -206,9 +222,7 @@ export class QueryDataSource extends DatabaseDataSource<IDataQueryOptions, IData
}
async dispose(): Promise<void> {
if (this.executionContext?.context) {
await this.closeResults(this.executionContext.context, this.results);
}
await this.closeResults(this.results);
await this.cancel();
}
}