Merge pull request #14542 from Budibase/fix/google-sheets-filtering

Fix to accommodate filtering updates for GoogleSheets
This commit is contained in:
Michael Drury 2024-09-09 16:49:25 +01:00 committed by GitHub
commit 3e4d6b39b7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 8 additions and 19 deletions

View File

@ -566,24 +566,20 @@ class GoogleSheetsIntegration implements DatasourcePlus {
query.filters.equal[`_${GOOGLE_SHEETS_PRIMARY_KEY}`] = id
}
}
let filtered = dataFilters.runQuery(
rows,
query.filters || {},
(row: GoogleSpreadsheetRow, headerKey: string) => {
return row.get(headerKey)
}
)
if (hasFilters && query.paginate) {
filtered = filtered.slice(offset, offset + limit)
rows = rows.slice(offset, offset + limit)
}
const headerValues = sheet.headerValues
let response = []
for (let row of filtered) {
for (let row of rows) {
response.push(
this.buildRowObject(headerValues, row.toObject(), row._rowNumber)
this.buildRowObject(headerValues, row.toObject(), row.rowNumber)
)
}
response = dataFilters.runQuery(response, query.filters || {})
if (query.sort) {
if (Object.keys(query.sort).length !== 1) {
console.warn("Googlesheets does not support multiple sorting", {

View File

@ -471,15 +471,8 @@ export const search = (
* Performs a client-side search on an array of data
* @param docs the data
* @param query the JSON query
* @param findInDoc optional fn when trying to extract a value
* from custom doc type e.g. Google Sheets
*
*/
export const runQuery = (
docs: Record<string, any>[],
query: SearchFilters,
findInDoc: Function = deepGet
) => {
export const runQuery = (docs: Record<string, any>[], query: SearchFilters) => {
if (!docs || !Array.isArray(docs)) {
return []
}
@ -506,7 +499,7 @@ export const runQuery = (
for (const [key, testValue] of Object.entries(query[type] || {})) {
const valueToCheck = isLogicalSearchOperator(type)
? doc
: findInDoc(doc, removeKeyNumbering(key))
: deepGet(doc, removeKeyNumbering(key))
const result = test(valueToCheck, testValue)
if (query.allOr && result) {
return true