From e3256cb005ec6f8517e5db995f8c555ba00f7b38 Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Tue, 24 Sep 2024 17:46:38 +0100 Subject: [PATCH] Fix row.spec.ts. --- packages/backend-core/src/db/lucene.ts | 1 - .../src/api/controllers/row/external.ts | 4 ++-- .../server/src/api/controllers/row/index.ts | 4 ++-- .../src/api/controllers/row/utils/utils.ts | 8 +++++++- .../server/src/api/controllers/table/index.ts | 9 ++------- .../server/src/api/routes/tests/row.spec.ts | 12 ++++++++--- packages/server/src/db/linkedRows/index.ts | 7 ++++--- packages/server/src/sdk/app/rows/internal.ts | 2 +- .../sdk/app/rows/search/internal/lucene.ts | 2 +- .../src/sdk/app/rows/search/internal/sqs.ts | 20 ++++++++----------- 10 files changed, 36 insertions(+), 33 deletions(-) diff --git a/packages/backend-core/src/db/lucene.ts b/packages/backend-core/src/db/lucene.ts index b17c3ddf0d..7f58c7068e 100644 --- a/packages/backend-core/src/db/lucene.ts +++ b/packages/backend-core/src/db/lucene.ts @@ -612,7 +612,6 @@ async function runQuery( * limit {number} The number of results to fetch * bookmark {string|null} Current bookmark in the recursive search * rows {array|null} Current results in the recursive search - * @returns {Promise<*[]|*>} */ async function recursiveSearch( dbName: string, diff --git a/packages/server/src/api/controllers/row/external.ts b/packages/server/src/api/controllers/row/external.ts index 11b6559896..18a9be5087 100644 --- a/packages/server/src/api/controllers/row/external.ts +++ b/packages/server/src/api/controllers/row/external.ts @@ -76,11 +76,11 @@ export async function patch(ctx: UserCtx) { }) const [enrichedRow, oldRow] = await Promise.all([ - outputProcessing(table, row, { + outputProcessing(source, row, { squash: true, preserveLinks: true, }), - outputProcessing(table, beforeRow, { + outputProcessing(source, beforeRow, { squash: true, preserveLinks: true, }), diff --git a/packages/server/src/api/controllers/row/index.ts b/packages/server/src/api/controllers/row/index.ts index ac2c09e7a6..84b5edcc12 100644 --- a/packages/server/src/api/controllers/row/index.ts +++ b/packages/server/src/api/controllers/row/index.ts @@ -207,7 +207,7 @@ export async function destroy(ctx: UserCtx) { } export async function search(ctx: Ctx) { - const { tableId } = utils.getSourceId(ctx) + const { tableId, viewId } = utils.getSourceId(ctx) await context.ensureSnippetContext(true) @@ -221,7 +221,7 @@ export async function search(ctx: Ctx) { const searchParams: RowSearchParams = { ...ctx.request.body, query: enrichedQuery, - sourceId: tableId, + sourceId: viewId || tableId, } ctx.status = 200 diff --git a/packages/server/src/api/controllers/row/utils/utils.ts b/packages/server/src/api/controllers/row/utils/utils.ts index 0f565b6951..45abd93930 100644 --- a/packages/server/src/api/controllers/row/utils/utils.ts +++ b/packages/server/src/api/controllers/row/utils/utils.ts @@ -112,7 +112,7 @@ function fixBooleanFields({ row, table }: { row: Row; table: Table }) { export async function sqlOutputProcessing( rows: DatasourcePlusQueryResponse, - table: Table, + source: Table | ViewV2, tables: Record, relationships: RelationshipsJson[], opts?: { sqs?: boolean; aggregations?: Aggregation[] } @@ -120,6 +120,12 @@ export async function sqlOutputProcessing( if (isKnexEmptyReadResponse(rows)) { return [] } + let table: Table + if (sdk.views.isView(source)) { + table = await sdk.views.getTable(source.id) + } else { + table = source + } let finalRows: { [key: string]: Row } = {} for (let row of rows as Row[]) { let rowId = row._id diff --git a/packages/server/src/api/controllers/table/index.ts b/packages/server/src/api/controllers/table/index.ts index 0e16077092..7bec1581b4 100644 --- a/packages/server/src/api/controllers/table/index.ts +++ b/packages/server/src/api/controllers/table/index.ts @@ -33,7 +33,7 @@ import { import sdk from "../../../sdk" import { jsonFromCsvString } from "../../../utilities/csv" import { builderSocket } from "../../../websockets" -import { cloneDeep, isEqual } from "lodash" +import { cloneDeep } from "lodash" import { helpers, PROTECTED_EXTERNAL_COLUMNS, @@ -149,12 +149,7 @@ export async function bulkImport( ctx: UserCtx ) { const tableId = ctx.params.tableId - let tableBefore = await sdk.tables.getTable(tableId) - let tableAfter = await pickApi({ tableId }).bulkImport(ctx) - - if (!isEqual(tableBefore, tableAfter)) { - await sdk.tables.saveTable(tableAfter) - } + await pickApi({ tableId }).bulkImport(ctx) // right now we don't trigger anything for bulk import because it // can only be done in the builder, but in the future we may need to diff --git a/packages/server/src/api/routes/tests/row.spec.ts b/packages/server/src/api/routes/tests/row.spec.ts index dc03a21d6d..467faa8e06 100644 --- a/packages/server/src/api/routes/tests/row.spec.ts +++ b/packages/server/src/api/routes/tests/row.spec.ts @@ -76,7 +76,7 @@ async function waitForEvent( } describe.each([ - ["internal", undefined], + ["lucene", undefined], ["sqs", undefined], [DatabaseName.POSTGRES, getDatasource(DatabaseName.POSTGRES)], [DatabaseName.MYSQL, getDatasource(DatabaseName.MYSQL)], @@ -2453,9 +2453,15 @@ describe.each([ let flagCleanup: (() => void) | undefined beforeAll(async () => { - flagCleanup = setCoreEnv({ + const env = { TENANT_FEATURE_FLAGS: `*:${FeatureFlag.ENRICHED_RELATIONSHIPS}`, - }) + } + if (isSqs) { + env.TENANT_FEATURE_FLAGS = `${env.TENANT_FEATURE_FLAGS},*:SQS` + } else { + env.TENANT_FEATURE_FLAGS = `${env.TENANT_FEATURE_FLAGS},*:!SQS` + } + flagCleanup = setCoreEnv(env) const aux2Table = await config.api.table.save(saveTableRequest()) const aux2Data = await config.api.row.save(aux2Table._id!, {}) diff --git a/packages/server/src/db/linkedRows/index.ts b/packages/server/src/db/linkedRows/index.ts index 6e65ab36d1..bc37fbef42 100644 --- a/packages/server/src/db/linkedRows/index.ts +++ b/packages/server/src/db/linkedRows/index.ts @@ -248,10 +248,11 @@ function getPrimaryDisplayValue(row: Row, table?: Table) { export type SquashTableFields = Record /** - * This function will take the given enriched rows and squash the links to only contain the primary display field. - * @param table The table from which the rows originated. + * This function will take the given enriched rows and squash the links to only + * contain the primary display field. + * + * @param source The table or view from which the rows originated. * @param enriched The pre-enriched rows (full docs) which are to be squashed. - * @param squashFields Per link column (key) define which columns are allowed while squashing. * @returns The rows after having their links squashed to only contain the ID and primary display. */ export async function squashLinks( diff --git a/packages/server/src/sdk/app/rows/internal.ts b/packages/server/src/sdk/app/rows/internal.ts index f51bcc37a4..13054f43f4 100644 --- a/packages/server/src/sdk/app/rows/internal.ts +++ b/packages/server/src/sdk/app/rows/internal.ts @@ -56,7 +56,7 @@ export async function save( table, })) as Row - return finaliseRow(table, row, { updateFormula: true }) + return finaliseRow(source, row, { updateFormula: true }) } export async function find(sourceId: string, rowId: string): Promise { diff --git a/packages/server/src/sdk/app/rows/search/internal/lucene.ts b/packages/server/src/sdk/app/rows/search/internal/lucene.ts index 24a7de1307..65cf4053d7 100644 --- a/packages/server/src/sdk/app/rows/search/internal/lucene.ts +++ b/packages/server/src/sdk/app/rows/search/internal/lucene.ts @@ -31,7 +31,7 @@ export async function search( const { paginate, query } = options const params: RowSearchParams = { - sourceId: options.sourceId, + sourceId: table._id!, sort: options.sort, sortOrder: options.sortOrder, sortType: options.sortType, diff --git a/packages/server/src/sdk/app/rows/search/internal/sqs.ts b/packages/server/src/sdk/app/rows/search/internal/sqs.ts index 90fb082214..5a9e1ddf24 100644 --- a/packages/server/src/sdk/app/rows/search/internal/sqs.ts +++ b/packages/server/src/sdk/app/rows/search/internal/sqs.ts @@ -308,8 +308,8 @@ export async function search( const allTables = await sdk.tables.getAllInternalTables() const allTablesMap = buildTableMap(allTables) // make sure we have the mapped/latest table - if (table?._id) { - table = allTablesMap[table?._id] + if (table._id) { + table = allTablesMap[table._id] } if (!table) { throw new Error("Unable to find table") @@ -322,13 +322,6 @@ export async function search( documentType: DocumentType.ROW, } - let fields = options.fields - if (fields === undefined) { - fields = buildInternalFieldList(table, allTables, { relationships }) - } else { - fields = fields.map(f => mapToUserColumn(f)) - } - if (options.aggregations) { options.aggregations = options.aggregations.map(a => { a.field = mapToUserColumn(a.field) @@ -350,7 +343,10 @@ export async function search( tables: allTablesMap, columnPrefix: USER_COLUMN_PREFIX, }, - resource: { fields, aggregations: options.aggregations }, + resource: { + fields: buildInternalFieldList(table, allTables, { relationships }), + aggregations: options.aggregations, + }, relationships, } @@ -394,7 +390,7 @@ export async function search( // make sure JSON columns corrected const processed = builder.convertJsonStringColumns( table, - await sqlOutputProcessing(rows, table, allTablesMap, relationships, { + await sqlOutputProcessing(rows, source, allTablesMap, relationships, { sqs: true, aggregations: options.aggregations, }) @@ -411,7 +407,7 @@ export async function search( } // get the rows - let finalRows = await outputProcessing(table, processed, { + let finalRows = await outputProcessing(source, processed, { preserveLinks: true, squash: true, aggregations: options.aggregations,