Merge pull request #15609 from Budibase/budi-9055-provide-a-filtering-option-for-a-relationships-_id-when

Support filtering relationships by _id
This commit is contained in:
Sam Rose 2025-02-25 11:17:45 +00:00 committed by GitHub
commit 56cd24852b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 61 additions and 7 deletions

View File

@ -3553,6 +3553,31 @@ if (descriptions.length) {
limit: 1, limit: 1,
}).toContainExactly([row]) }).toContainExactly([row])
}) })
isInternal &&
describe("search by _id for relations", () => {
it("can filter by the related _id", async () => {
await expectSearch({
query: {
equal: { "rel._id": row.rel[0]._id },
},
}).toContainExactly([row])
await expectSearch({
query: {
equal: { "rel._id": row.rel[1]._id },
},
}).toContainExactly([row])
})
it("can filter by the related _id and find nothing", async () => {
await expectSearch({
query: {
equal: { "rel._id": "rel_none" },
},
}).toFindNothing()
})
})
}) })
!isInternal && !isInternal &&

View File

@ -7,6 +7,7 @@ import {
} from "@budibase/types" } from "@budibase/types"
import { cloneDeep } from "lodash/fp" import { cloneDeep } from "lodash/fp"
import sdk from "../../../sdk" import sdk from "../../../sdk"
import { isInternal } from "../tables/utils"
export const removeInvalidFilters = ( export const removeInvalidFilters = (
filters: SearchFilters, filters: SearchFilters,
@ -70,6 +71,10 @@ export const getQueryableFields = async (
opts?: { noRelationships?: boolean } opts?: { noRelationships?: boolean }
): Promise<string[]> => { ): Promise<string[]> => {
const result = [] const result = []
if (isInternal({ table })) {
result.push("_id")
}
for (const field of Object.keys(table.schema).filter( for (const field of Object.keys(table.schema).filter(
f => allowedFields.includes(f) && table.schema[f].visible !== false f => allowedFields.includes(f) && table.schema[f].visible !== false
)) { )) {
@ -113,14 +118,13 @@ export const getQueryableFields = async (
return result return result
} }
const result = [ // Querying by _id is always allowed, even if it's never part of the schema
"_id", // Querying by _id is always allowed, even if it's never part of the schema const result = ["_id"]
]
if (fields == null) { if (fields == null) {
fields = Object.keys(table.schema) fields = Object.keys(table.schema)
} }
result.push(...(await extractTableFields(table, fields, [table._id!]))) result.push(...(await extractTableFields(table, fields, [table._id!])))
return result return Array.from(new Set(result))
} }

View File

@ -250,6 +250,8 @@ describe("query utils", () => {
expect(result).toEqual([ expect(result).toEqual([
"_id", "_id",
"name", "name",
"aux._id",
"auxTable._id",
"aux.title", "aux.title",
"auxTable.title", "auxTable.title",
"aux.name", "aux.name",
@ -284,7 +286,14 @@ describe("query utils", () => {
const result = await config.doInContext(config.appId, () => { const result = await config.doInContext(config.appId, () => {
return getQueryableFields(table) return getQueryableFields(table)
}) })
expect(result).toEqual(["_id", "name", "aux.name", "auxTable.name"]) expect(result).toEqual([
"_id",
"name",
"aux._id",
"auxTable._id",
"aux.name",
"auxTable.name",
])
}) })
it("excludes all relationship fields if hidden", async () => { it("excludes all relationship fields if hidden", async () => {
@ -387,10 +396,14 @@ describe("query utils", () => {
"_id", "_id",
"name", "name",
// aux1 primitive props // aux1 primitive props
"aux1._id",
"aux1Table._id",
"aux1.name", "aux1.name",
"aux1Table.name", "aux1Table.name",
// aux2 primitive props // aux2 primitive props
"aux2._id",
"aux2Table._id",
"aux2.title", "aux2.title",
"aux2Table.title", "aux2Table.title",
]) ])
@ -405,14 +418,18 @@ describe("query utils", () => {
"name", "name",
// aux2_1 primitive props // aux2_1 primitive props
"aux2_1._id",
"aux2Table._id",
"aux2_1.title", "aux2_1.title",
"aux2Table.title", "aux2Table.title",
// aux2_2 primitive props // aux2_2 primitive props
"aux2_2._id",
"aux2_2.title", "aux2_2.title",
"aux2Table.title",
// table primitive props // table primitive props
"table._id",
"TestTable._id",
"table.name", "table.name",
"TestTable.name", "TestTable.name",
]) ])
@ -427,14 +444,18 @@ describe("query utils", () => {
"title", "title",
// aux1_1 primitive props // aux1_1 primitive props
"aux1_1._id",
"aux1Table._id",
"aux1_1.name", "aux1_1.name",
"aux1Table.name", "aux1Table.name",
// aux1_2 primitive props // aux1_2 primitive props
"aux1_2._id",
"aux1_2.name", "aux1_2.name",
"aux1Table.name",
// table primitive props // table primitive props
"table._id",
"TestTable._id",
"table.name", "table.name",
"TestTable.name", "TestTable.name",
]) ])
@ -481,6 +502,8 @@ describe("query utils", () => {
"name", "name",
// deep 1 aux primitive props // deep 1 aux primitive props
"aux._id",
"auxTable._id",
"aux.title", "aux.title",
"auxTable.title", "auxTable.title",
]) ])
@ -495,6 +518,8 @@ describe("query utils", () => {
"title", "title",
// deep 1 dependency primitive props // deep 1 dependency primitive props
"table._id",
"TestTable._id",
"table.name", "table.name",
"TestTable.name", "TestTable.name",
]) ])