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