mirror of https://github.com/nocodb/nocodb
18 changed files with 418 additions and 57 deletions
@ -0,0 +1,34 @@
|
||||
export default function (args: { |
||||
virtualColumns, |
||||
columnName: string |
||||
}): void | boolean { |
||||
|
||||
let modified = false; |
||||
|
||||
const fn = (pt, virtualColumn) => { |
||||
if (pt.type === 'CallExpression') { |
||||
pt.arguments.map(arg => fn(arg, virtualColumn)) |
||||
} else if (pt.type === 'Literal') { |
||||
} else if (pt.type === 'Identifier') { |
||||
if (pt.name === args.columnName) { |
||||
virtualColumn.formula.error = virtualColumn.formula.error || []; |
||||
virtualColumn.formula.error.push(`Column '${args.columnName}' was deleted`) |
||||
modified = true; |
||||
} |
||||
} else if (pt.type === 'BinaryExpression') { |
||||
fn(pt.left, virtualColumn); |
||||
fn(pt.right, virtualColumn); |
||||
} |
||||
}; |
||||
|
||||
if (!args.virtualColumns) { |
||||
return |
||||
} |
||||
for (const v of args.virtualColumns) { |
||||
if (!v.formula?.tree) { |
||||
continue; |
||||
} |
||||
fn(v.formula.tree, v) |
||||
} |
||||
return modified; |
||||
} |
@ -0,0 +1,43 @@
|
||||
export default function jsepTreeToFormula(node) { |
||||
if (node.type === 'BinaryExpression' || node.type === 'LogicalExpression') { |
||||
return '(' + jsepTreeToFormula(node.left) + ' ' + node.operator + ' ' + jsepTreeToFormula(node.right) + ')' |
||||
} |
||||
|
||||
if (node.type === 'UnaryExpression') { |
||||
return node.operator + jsepTreeToFormula(node.argument) |
||||
} |
||||
|
||||
if (node.type === 'MemberExpression') { |
||||
return jsepTreeToFormula(node.object) + '[' + jsepTreeToFormula(node.property) + ']' |
||||
} |
||||
|
||||
if (node.type === 'Identifier') { |
||||
return node.name |
||||
} |
||||
|
||||
if (node.type === 'Literal') { |
||||
if (typeof node.value === 'string') { |
||||
return '"' + node.value + '"' |
||||
} |
||||
|
||||
return '' + node.value |
||||
} |
||||
|
||||
if (node.type === 'CallExpression') { |
||||
return jsepTreeToFormula(node.callee) + '(' + node.arguments.map(jsepTreeToFormula).join(', ') + ')' |
||||
} |
||||
|
||||
if (node.type === 'ArrayExpression') { |
||||
return '[' + node.elements.map(jsepTreeToFormula).join(', ') + ']' |
||||
} |
||||
|
||||
if (node.type === 'Compound') { |
||||
return node.body.map(e => jsepTreeToFormula(e)).join(' ') |
||||
} |
||||
|
||||
if (node.type === 'ConditionalExpression') { |
||||
return jsepTreeToFormula(node.test) + ' ? ' + jsepTreeToFormula(node.consequent) + ' : ' + jsepTreeToFormula(node.alternate) |
||||
} |
||||
|
||||
return '' |
||||
} |
@ -0,0 +1,37 @@
|
||||
import jsepTreeToFormula from "./jsepTreeToFormula"; |
||||
|
||||
export default function (args: { |
||||
virtualColumns, |
||||
oldColumnName: string, |
||||
newColumnName: string, |
||||
}): void | boolean { |
||||
|
||||
let modified = false; |
||||
|
||||
const fn = (pt) => { |
||||
if (pt.type === 'CallExpression') { |
||||
pt.arguments.map(arg => fn(arg)) |
||||
} else if (pt.type === 'Literal') { |
||||
} else if (pt.type === 'Identifier') { |
||||
if (pt.name === args.oldColumnName) { |
||||
pt.name = args.newColumnName; |
||||
modified = true; |
||||
} |
||||
} else if (pt.type === 'BinaryExpression') { |
||||
fn(pt.left); |
||||
fn(pt.right); |
||||
} |
||||
}; |
||||
|
||||
if (!args.virtualColumns) { |
||||
return |
||||
} |
||||
for (const v of args.virtualColumns) { |
||||
if (!v.formula?.tree) { |
||||
continue; |
||||
} |
||||
fn(v.formula.tree) |
||||
v.formula.value = jsepTreeToFormula(v.formula.tree) |
||||
} |
||||
return modified; |
||||
} |
Loading…
Reference in new issue