From aab100b130f54c23a202bdcdf99ed5661ab112ff Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Wed, 19 Jun 2024 14:28:22 +0100 Subject: [PATCH] Changing how counting is processed. --- .../api/controllers/row/ExternalRequest.ts | 19 +++++++++---------- .../server/src/sdk/app/rows/search/sqs.ts | 6 ++++-- packages/server/src/sdk/app/rows/sqlAlias.ts | 15 --------------- packages/server/src/sdk/app/rows/utils.ts | 11 +++++++++++ 4 files changed, 24 insertions(+), 27 deletions(-) diff --git a/packages/server/src/api/controllers/row/ExternalRequest.ts b/packages/server/src/api/controllers/row/ExternalRequest.ts index 89ad6c617a..619a1e9548 100644 --- a/packages/server/src/api/controllers/row/ExternalRequest.ts +++ b/packages/server/src/api/controllers/row/ExternalRequest.ts @@ -34,7 +34,10 @@ import { isManyToMany, sqlOutputProcessing, } from "./utils" -import { getDatasourceAndQuery } from "../../../sdk/app/rows/utils" +import { + getDatasourceAndQuery, + processRowCountResponse, +} from "../../../sdk/app/rows/utils" import { processObjectSync } from "@budibase/string-templates" import { cloneDeep } from "lodash/fp" import { db as dbCore } from "@budibase/backend-core" @@ -670,18 +673,14 @@ export class ExternalRequest { } // aliasing can be disabled fully if desired - let response const aliasing = new sdk.rows.AliasTables(Object.keys(this.tables)) + let response = env.SQL_ALIASING_DISABLE + ? await getDatasourceAndQuery(json) + : await aliasing.queryWithAliasing(json, makeExternalQuery) + // if it's a counting operation there will be no more processing, just return the number if (this.operation === Operation.COUNT) { - return (await aliasing.countWithAliasing( - json, - makeExternalQuery - )) as ExternalRequestReturnType - } else { - response = env.SQL_ALIASING_DISABLE - ? await getDatasourceAndQuery(json) - : await aliasing.queryWithAliasing(json, makeExternalQuery) + return processRowCountResponse(response) as ExternalRequestReturnType } const responseRows = Array.isArray(response) ? response : [] diff --git a/packages/server/src/sdk/app/rows/search/sqs.ts b/packages/server/src/sdk/app/rows/search/sqs.ts index 5b71b3c6f3..5d5fba820d 100644 --- a/packages/server/src/sdk/app/rows/search/sqs.ts +++ b/packages/server/src/sdk/app/rows/search/sqs.ts @@ -29,6 +29,7 @@ import { CONSTANT_INTERNAL_ROW_COLS } from "../../../../db/utils" import AliasTables from "../sqlAlias" import { outputProcessing } from "../../../../utilities/rowProcessor" import pick from "lodash/pick" +import { processRowCountResponse } from "../utils" const builder = new sql.Sql(SqlClient.SQL_LITE) @@ -141,10 +142,11 @@ async function runSqlQuery( const db = context.getAppDB() return await db.sql(sql, bindings) } + const response = await alias.queryWithAliasing(json, processSQLQuery) if (opts?.countTotalRows) { - return await alias.countWithAliasing(json, processSQLQuery) + return processRowCountResponse(response) } else { - return await alias.queryWithAliasing(json, processSQLQuery) + return response } } diff --git a/packages/server/src/sdk/app/rows/sqlAlias.ts b/packages/server/src/sdk/app/rows/sqlAlias.ts index 0eab2f68c8..bc8fc56d5e 100644 --- a/packages/server/src/sdk/app/rows/sqlAlias.ts +++ b/packages/server/src/sdk/app/rows/sqlAlias.ts @@ -242,19 +242,4 @@ export default class AliasTables { return response } } - - // handles getting the count out of the query - async countWithAliasing( - json: QueryJson, - queryFn: PerformQueryFunction - ): Promise { - json.endpoint.operation = Operation.COUNT - let response = await this.queryWithAliasing(json, queryFn) - if (response && response.length === 1 && "total" in response[0]) { - const total = response[0].total - return typeof total === "number" ? total : parseInt(total) - } else { - throw new Error("Unable to count rows in query - no count response") - } - } } diff --git a/packages/server/src/sdk/app/rows/utils.ts b/packages/server/src/sdk/app/rows/utils.ts index bb37fd99f3..cd1b663f6a 100644 --- a/packages/server/src/sdk/app/rows/utils.ts +++ b/packages/server/src/sdk/app/rows/utils.ts @@ -50,6 +50,17 @@ export function getSQLClient(datasource: Datasource): SqlClient { throw new Error("Unable to determine client for SQL datasource") } +export function processRowCountResponse( + response: DatasourcePlusQueryResponse +): number { + if (response && response.length === 1 && "total" in response[0]) { + const total = response[0].total + return typeof total === "number" ? total : parseInt(total) + } else { + throw new Error("Unable to count rows in query - no count response") + } +} + export async function getDatasourceAndQuery( json: QueryJson ): Promise {