Merge pull request #14413 from Budibase/fix/missing-table-definition-search

SQS - broken relationship fix
This commit is contained in:
Michael Drury 2024-08-20 07:46:19 +01:00 committed by GitHub
commit cb67a24a13
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 29 additions and 15 deletions

View File

@ -151,7 +151,10 @@ export function buildExternalRelationships(
return relationships return relationships
} }
export function buildInternalRelationships(table: Table): RelationshipsJson[] { export function buildInternalRelationships(
table: Table,
allTables: Table[]
): RelationshipsJson[] {
const relationships: RelationshipsJson[] = [] const relationships: RelationshipsJson[] = []
const links = Object.values(table.schema).filter( const links = Object.values(table.schema).filter(
column => column.type === FieldType.LINK column => column.type === FieldType.LINK
@ -164,6 +167,10 @@ export function buildInternalRelationships(table: Table): RelationshipsJson[] {
const linkTableId = link.tableId! const linkTableId = link.tableId!
const junctionTableId = generateJunctionTableID(tableId, linkTableId) const junctionTableId = generateJunctionTableID(tableId, linkTableId)
const isFirstTable = tableId > linkTableId const isFirstTable = tableId > linkTableId
// skip relationships with missing table definitions
if (!allTables.find(table => table._id === linkTableId)) {
continue
}
relationships.push({ relationships.push({
through: junctionTableId, through: junctionTableId,
column: link.name, column: link.name,

View File

@ -71,20 +71,27 @@ export const getQueryableFields = async (
// avoid circular loops // avoid circular loops
continue continue
} }
const relatedTable = await sdk.tables.getTable(subSchema.tableId) try {
const relatedFields = await extractTableFields( const relatedTable = await sdk.tables.getTable(subSchema.tableId)
relatedTable, const relatedFields = await extractTableFields(
Object.keys(relatedTable.schema), relatedTable,
[...fromTables, subSchema.tableId] Object.keys(relatedTable.schema),
) [...fromTables, subSchema.tableId]
)
result.push( result.push(
...relatedFields.flatMap(f => [ ...relatedFields.flatMap(f => [
`${subSchema.name}.${f}`, `${subSchema.name}.${f}`,
// should be able to filter by relationship using table name // should be able to filter by relationship using table name
`${relatedTable.name}.${f}`, `${relatedTable.name}.${f}`,
]) ])
) )
} catch (err: any) {
// if related table is removed, ignore
if (err.status !== 404) {
throw err
}
}
} else { } else {
result.push(field) result.push(field)
} }

View File

@ -297,7 +297,7 @@ export async function search(
throw new Error("Unable to find table") throw new Error("Unable to find table")
} }
const relationships = buildInternalRelationships(table) const relationships = buildInternalRelationships(table, allTables)
const searchFilters: SearchFilters = { const searchFilters: SearchFilters = {
...cleanupFilters(query, table, allTables), ...cleanupFilters(query, table, allTables),