Keep views up to date with table schema changes
This commit is contained in:
parent
c9abb0148e
commit
0f2b50b9f1
|
@ -13,6 +13,8 @@ const {
|
|||
isExternalTable,
|
||||
breakExternalTableId,
|
||||
} = require("../../../integrations/utils")
|
||||
const { getViews, saveView } = require("../view/utils")
|
||||
const viewTemplate = require("../view/viewBuilder")
|
||||
|
||||
exports.checkForColumnUpdates = async (db, oldTable, updatedTable) => {
|
||||
let updatedRows = []
|
||||
|
@ -25,6 +27,7 @@ exports.checkForColumnUpdates = async (db, oldTable, updatedTable) => {
|
|||
}
|
||||
// check for renaming of columns or deleted columns
|
||||
if (rename || deletedColumns.length !== 0) {
|
||||
// Update all rows
|
||||
const rows = await db.allDocs(
|
||||
getRowParams(updatedTable._id, null, {
|
||||
include_docs: true,
|
||||
|
@ -39,6 +42,9 @@ exports.checkForColumnUpdates = async (db, oldTable, updatedTable) => {
|
|||
}
|
||||
return doc
|
||||
})
|
||||
|
||||
// Update views
|
||||
await exports.checkForViewUpdates(db, updatedTable, rename, deletedColumns)
|
||||
delete updatedTable._rename
|
||||
}
|
||||
return { rows: updatedRows, table: updatedTable }
|
||||
|
@ -237,4 +243,74 @@ exports.getTable = async (appId, tableId) => {
|
|||
}
|
||||
}
|
||||
|
||||
exports.checkForViewUpdates = async (db, table, rename, deletedColumns) => {
|
||||
const views = await getViews(db)
|
||||
const tableViews = views.filter(view => view.meta.tableId === table._id)
|
||||
|
||||
// Check each table view to see if impacted by this table action
|
||||
for (let view of tableViews) {
|
||||
let needsUpdated = false
|
||||
|
||||
// First check for renames, otherwise check for deletions
|
||||
if (rename) {
|
||||
// Update calculation field if required
|
||||
if (view.meta.field === rename.old) {
|
||||
view.meta.field = rename.updated
|
||||
needsUpdated = true
|
||||
}
|
||||
|
||||
// Update group by field if required
|
||||
if (view.meta.groupBy === rename.old) {
|
||||
view.meta.groupBy = rename.updated
|
||||
needsUpdated = true
|
||||
}
|
||||
|
||||
// Update filters if required
|
||||
view.meta.filters?.forEach(filter => {
|
||||
if (filter.key === rename.old) {
|
||||
filter.key = rename.updated
|
||||
needsUpdated = true
|
||||
}
|
||||
})
|
||||
} else if (deletedColumns?.length) {
|
||||
deletedColumns.forEach(column => {
|
||||
// Remove calculation statement if required
|
||||
if (view.meta.field === column) {
|
||||
delete view.meta.field
|
||||
delete view.meta.calculation
|
||||
delete view.meta.groupBy
|
||||
needsUpdated = true
|
||||
}
|
||||
|
||||
// Remove group by field if required
|
||||
if (view.meta.groupBy === column) {
|
||||
delete view.meta.groupBy
|
||||
needsUpdated = true
|
||||
}
|
||||
|
||||
// Remove filters referencing deleted field if required
|
||||
if (view.meta.filters?.length) {
|
||||
const initialLength = view.meta.filters.length
|
||||
view.meta.filters = view.meta.filters.filter(filter => {
|
||||
return filter.key !== column
|
||||
})
|
||||
if (initialLength !== view.meta.filters.length) {
|
||||
needsUpdated = true
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// Update view if required
|
||||
if (needsUpdated) {
|
||||
const newViewTemplate = viewTemplate(view.meta)
|
||||
await saveView(db, null, view.name, newViewTemplate)
|
||||
if (!newViewTemplate.meta.schema) {
|
||||
newViewTemplate.meta.schema = table.schema
|
||||
}
|
||||
table.views[view.name] = newViewTemplate.meta
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
exports.TableSaveFunctions = TableSaveFunctions
|
||||
|
|
Loading…
Reference in New Issue