mirror of https://github.com/nocodb/nocodb
198 changed files with 15912 additions and 12394 deletions
File diff suppressed because it is too large
Load Diff
@ -1,49 +1,87 @@
|
||||
import {MapFnArgs} from "../mapFunctionName"; |
||||
import { MapFnArgs } from '../mapFunctionName'; |
||||
|
||||
export default { |
||||
// todo: handle default case
|
||||
SWITCH: (args: MapFnArgs) => { |
||||
const count = Math.floor((args.pt.arguments.length - 1) / 2) |
||||
const count = Math.floor((args.pt.arguments.length - 1) / 2); |
||||
let query = ''; |
||||
|
||||
const switchVal = args.fn(args.pt.arguments[0]).toQuery(); |
||||
|
||||
for (let i = 0; i < count; i++) { |
||||
query += args.knex.raw(`\n\tWHEN ${args.fn(args.pt.arguments[i * 2 + 1]).toQuery()} THEN ${args.fn(args.pt.arguments[i * 2 + 2]).toQuery()}`).toQuery() |
||||
query += args.knex |
||||
.raw( |
||||
`\n\tWHEN ${args |
||||
.fn(args.pt.arguments[i * 2 + 1]) |
||||
.toQuery()} THEN ${args.fn(args.pt.arguments[i * 2 + 2]).toQuery()}` |
||||
) |
||||
.toQuery(); |
||||
} |
||||
if (args.pt.arguments.length % 2 === 0) { |
||||
query += args.knex.raw(`\n\tELSE ${args.fn(args.pt.arguments[args.pt.arguments.length - 1]).toQuery()}`).toQuery() |
||||
query += args.knex |
||||
.raw( |
||||
`\n\tELSE ${args |
||||
.fn(args.pt.arguments[args.pt.arguments.length - 1]) |
||||
.toQuery()}` |
||||
) |
||||
.toQuery(); |
||||
} |
||||
return args.knex.raw(`CASE ${switchVal} ${query}\n END${args.colAlias}`) |
||||
return args.knex.raw(`CASE ${switchVal} ${query}\n END${args.colAlias}`); |
||||
}, |
||||
IF: (args: MapFnArgs) => { |
||||
let query = args.knex.raw(`\n\tWHEN ${args.fn(args.pt.arguments[0]).toQuery()} THEN ${args.fn(args.pt.arguments[1]).toQuery()}`).toQuery(); |
||||
let query = args.knex |
||||
.raw( |
||||
`\n\tWHEN ${args.fn(args.pt.arguments[0]).toQuery()} THEN ${args |
||||
.fn(args.pt.arguments[1]) |
||||
.toQuery()}` |
||||
) |
||||
.toQuery(); |
||||
if (args.pt.arguments[2]) { |
||||
query += args.knex.raw(`\n\tELSE ${args.fn(args.pt.arguments[2]).toQuery()}`).toQuery() |
||||
query += args.knex |
||||
.raw(`\n\tELSE ${args.fn(args.pt.arguments[2]).toQuery()}`) |
||||
.toQuery(); |
||||
} |
||||
return args.knex.raw(`CASE ${query}\n END${args.colAlias}`) |
||||
return args.knex.raw(`CASE ${query}\n END${args.colAlias}`); |
||||
}, |
||||
TRUE: (_args) => 1, |
||||
FALSE: (_args) => 0, |
||||
TRUE: _args => 1, |
||||
FALSE: _args => 0, |
||||
AND: (args: MapFnArgs) => { |
||||
return args.knex.raw(`${args.knex.raw(`${args.pt.arguments.map(ar => args.fn(ar).toQuery()).join(' AND ')}`).wrap('(', ')').toQuery()}${args.colAlias}`) |
||||
return args.knex.raw( |
||||
`${args.knex |
||||
.raw( |
||||
`${args.pt.arguments.map(ar => args.fn(ar).toQuery()).join(' AND ')}` |
||||
) |
||||
.wrap('(', ')') |
||||
.toQuery()}${args.colAlias}` |
||||
); |
||||
}, |
||||
OR: (args: MapFnArgs) => { |
||||
return args.knex.raw(`${args.knex.raw(`${args.pt.arguments.map(ar => args.fn(ar).toQuery()).join(' OR ')}`).wrap('(', ')').toQuery()}${args.colAlias}`) |
||||
return args.knex.raw( |
||||
`${args.knex |
||||
.raw( |
||||
`${args.pt.arguments.map(ar => args.fn(ar).toQuery()).join(' OR ')}` |
||||
) |
||||
.wrap('(', ')') |
||||
.toQuery()}${args.colAlias}` |
||||
); |
||||
}, |
||||
AVG: (args: MapFnArgs) => { |
||||
if (args.pt.arguments.length > 1) { |
||||
return args.fn({ |
||||
return args.fn( |
||||
{ |
||||
type: 'BinaryExpression', |
||||
operator: '/', |
||||
left: { ...args.pt, callee: { name: 'SUM' } }, |
||||
right: { type: 'Literal', value: args.pt.arguments.length } |
||||
}, args.a, args.prevBinaryOp) |
||||
}, |
||||
args.a, |
||||
args.prevBinaryOp |
||||
); |
||||
} else { |
||||
return args.fn(args.pt.arguments[0], args.a, args.prevBinaryOp) |
||||
return args.fn(args.pt.arguments[0], args.a, args.prevBinaryOp); |
||||
} |
||||
}, |
||||
FLOAT: (args: MapFnArgs) => { |
||||
return args.fn(args.pt?.arguments?.[0]).wrap('(', ')'); |
||||
} |
||||
} |
||||
}; |
||||
|
@ -1,59 +1,86 @@
|
||||
import {MapFnArgs} from "../mapFunctionName"; |
||||
import commonFns from "./commonFns"; |
||||
import { MapFnArgs } from '../mapFunctionName'; |
||||
import commonFns from './commonFns'; |
||||
|
||||
const mssql = { |
||||
...commonFns, |
||||
MIN: (args: MapFnArgs) => { |
||||
if (args.pt.arguments.length === 1) { |
||||
return args.fn(args.pt.arguments[0]) |
||||
return args.fn(args.pt.arguments[0]); |
||||
} |
||||
let query = ''; |
||||
for (const [i, arg] of Object.entries(args.pt.arguments)) { |
||||
if (+i === args.pt.arguments.length - 1) { |
||||
query += args.knex.raw(`\n\tElse ${args.fn(arg).toQuery()}`).toQuery() |
||||
query += args.knex.raw(`\n\tElse ${args.fn(arg).toQuery()}`).toQuery(); |
||||
} else { |
||||
query += args.knex.raw(`\n\tWhen ${args.pt.arguments.filter((_, j) => +i !== j).map(arg1 => `${args.fn(arg).toQuery()} < ${args.fn(arg1).toQuery()}`).join(' And ')} Then ${args.fn(arg).toQuery()}`).toQuery() |
||||
query += args.knex |
||||
.raw( |
||||
`\n\tWhen ${args.pt.arguments |
||||
.filter((_, j) => +i !== j) |
||||
.map( |
||||
arg1 => `${args.fn(arg).toQuery()} < ${args.fn(arg1).toQuery()}` |
||||
) |
||||
.join(' And ')} Then ${args.fn(arg).toQuery()}` |
||||
) |
||||
.toQuery(); |
||||
} |
||||
} |
||||
return args.knex.raw(`Case ${query}\n End${args.colAlias}`) |
||||
return args.knex.raw(`Case ${query}\n End${args.colAlias}`); |
||||
}, |
||||
MAX: (args: MapFnArgs) => { |
||||
if (args.pt.arguments.length === 1) { |
||||
return args.fn(args.pt.arguments[0]) |
||||
return args.fn(args.pt.arguments[0]); |
||||
} |
||||
let query = ''; |
||||
for (const [i, arg] of Object.entries(args.pt.arguments)) { |
||||
if (+i === args.pt.arguments.length - 1) { |
||||
query += args.knex.raw(`\nElse ${args.fn(arg).toQuery()}`).toQuery() |
||||
query += args.knex.raw(`\nElse ${args.fn(arg).toQuery()}`).toQuery(); |
||||
} else { |
||||
query += args.knex.raw(`\nWhen ${args.pt.arguments.filter((_, j) => +i !== j).map(arg1 => `${args.fn(arg).toQuery()} > ${args.fn(arg1).toQuery()}`).join(' And ')} Then ${args.fn(arg).toQuery()}`).toQuery() |
||||
query += args.knex |
||||
.raw( |
||||
`\nWhen ${args.pt.arguments |
||||
.filter((_, j) => +i !== j) |
||||
.map( |
||||
arg1 => `${args.fn(arg).toQuery()} > ${args.fn(arg1).toQuery()}` |
||||
) |
||||
.join(' And ')} Then ${args.fn(arg).toQuery()}` |
||||
) |
||||
.toQuery(); |
||||
} |
||||
} |
||||
|
||||
return args.knex.raw(`Case ${query}\n End${args.colAlias}`) |
||||
return args.knex.raw(`Case ${query}\n End${args.colAlias}`); |
||||
}, |
||||
MOD: (pt) => { |
||||
MOD: pt => { |
||||
Object.assign(pt, { |
||||
type: 'BinaryExpression', |
||||
operator: '%', |
||||
left: pt.arguments[0], |
||||
right: pt.arguments[1] |
||||
}) |
||||
}); |
||||
}, |
||||
REPEAT: 'REPLICATE', |
||||
NOW: 'getdate', |
||||
SEARCH: (args: MapFnArgs) => { |
||||
args.pt.callee.name = 'CHARINDEX'; |
||||
const temp = args.pt.arguments[0] |
||||
args.pt.arguments[0] = args.pt.arguments[1] |
||||
const temp = args.pt.arguments[0]; |
||||
args.pt.arguments[0] = args.pt.arguments[1]; |
||||
args.pt.arguments[1] = temp; |
||||
}, |
||||
INT: (args: MapFnArgs) => { |
||||
return args.knex.raw(`CASE WHEN ISNUMERIC(${args.fn(args.pt.arguments[0]).toQuery()}) = 1 THEN FLOOR(${args.fn(args.pt.arguments[0]).toQuery()}) ELSE 0 END${args.colAlias}`) |
||||
return args.knex.raw( |
||||
`CASE WHEN ISNUMERIC(${args |
||||
.fn(args.pt.arguments[0]) |
||||
.toQuery()}) = 1 THEN FLOOR(${args |
||||
.fn(args.pt.arguments[0]) |
||||
.toQuery()}) ELSE 0 END${args.colAlias}` |
||||
); |
||||
}, |
||||
MID: 'SUBSTR', |
||||
FLOAT: (args: MapFnArgs) => { |
||||
return args.knex.raw(`CAST(${args.fn(args.pt.arguments[0])} as FLOAT)${args.colAlias}`).wrap('(',')') |
||||
}} |
||||
return args.knex |
||||
.raw(`CAST(${args.fn(args.pt.arguments[0])} as FLOAT)${args.colAlias}`) |
||||
.wrap('(', ')'); |
||||
} |
||||
}; |
||||
|
||||
export default mssql; |
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,43 +1,67 @@
|
||||
export default function jsepTreeToFormula(node) { |
||||
if (node.type === 'BinaryExpression' || node.type === 'LogicalExpression') { |
||||
return '(' + jsepTreeToFormula(node.left) + ' ' + node.operator + ' ' + jsepTreeToFormula(node.right) + ')' |
||||
return ( |
||||
'(' + |
||||
jsepTreeToFormula(node.left) + |
||||
' ' + |
||||
node.operator + |
||||
' ' + |
||||
jsepTreeToFormula(node.right) + |
||||
')' |
||||
); |
||||
} |
||||
|
||||
if (node.type === 'UnaryExpression') { |
||||
return node.operator + jsepTreeToFormula(node.argument) |
||||
return node.operator + jsepTreeToFormula(node.argument); |
||||
} |
||||
|
||||
if (node.type === 'MemberExpression') { |
||||
return jsepTreeToFormula(node.object) + '[' + jsepTreeToFormula(node.property) + ']' |
||||
return ( |
||||
jsepTreeToFormula(node.object) + |
||||
'[' + |
||||
jsepTreeToFormula(node.property) + |
||||
']' |
||||
); |
||||
} |
||||
|
||||
if (node.type === 'Identifier') { |
||||
return node.name |
||||
return node.name; |
||||
} |
||||
|
||||
if (node.type === 'Literal') { |
||||
if (typeof node.value === 'string') { |
||||
return '"' + node.value + '"' |
||||
return '"' + node.value + '"'; |
||||
} |
||||
|
||||
return '' + node.value |
||||
return '' + node.value; |
||||
} |
||||
|
||||
if (node.type === 'CallExpression') { |
||||
return jsepTreeToFormula(node.callee) + '(' + node.arguments.map(jsepTreeToFormula).join(', ') + ')' |
||||
return ( |
||||
jsepTreeToFormula(node.callee) + |
||||
'(' + |
||||
node.arguments.map(jsepTreeToFormula).join(', ') + |
||||
')' |
||||
); |
||||
} |
||||
|
||||
if (node.type === 'ArrayExpression') { |
||||
return '[' + node.elements.map(jsepTreeToFormula).join(', ') + ']' |
||||
return '[' + node.elements.map(jsepTreeToFormula).join(', ') + ']'; |
||||
} |
||||
|
||||
if (node.type === 'Compound') { |
||||
return node.body.map(e => jsepTreeToFormula(e)).join(' ') |
||||
return node.body.map(e => jsepTreeToFormula(e)).join(' '); |
||||
} |
||||
|
||||
if (node.type === 'ConditionalExpression') { |
||||
return jsepTreeToFormula(node.test) + ' ? ' + jsepTreeToFormula(node.consequent) + ' : ' + jsepTreeToFormula(node.alternate) |
||||
return ( |
||||
jsepTreeToFormula(node.test) + |
||||
' ? ' + |
||||
jsepTreeToFormula(node.consequent) + |
||||
' : ' + |
||||
jsepTreeToFormula(node.alternate) |
||||
); |
||||
} |
||||
|
||||
return '' |
||||
return ''; |
||||
} |
File diff suppressed because it is too large
Load Diff
@ -1,19 +1,20 @@
|
||||
import axios from 'axios'; |
||||
|
||||
export default class Discord { |
||||
|
||||
public static async sendMessage(content: string, webhooks: Array<{ |
||||
webhook_url: string |
||||
}>): Promise<any> { |
||||
public static async sendMessage( |
||||
content: string, |
||||
webhooks: Array<{ |
||||
webhook_url: string; |
||||
}> |
||||
): Promise<any> { |
||||
for (const { webhook_url } of webhooks) { |
||||
try { |
||||
await axios.post(webhook_url, { |
||||
content |
||||
}) |
||||
}); |
||||
} catch (e) { |
||||
console.log(e) |
||||
console.log(e); |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
@ -1,19 +1,20 @@
|
||||
import axios from 'axios'; |
||||
|
||||
export default class Mattermost { |
||||
|
||||
public static async sendMessage(text: string, webhooks: Array<{ |
||||
webhook_url: string |
||||
}>): Promise<any> { |
||||
public static async sendMessage( |
||||
text: string, |
||||
webhooks: Array<{ |
||||
webhook_url: string; |
||||
}> |
||||
): Promise<any> { |
||||
for (const { webhook_url } of webhooks) { |
||||
try { |
||||
await axios.post(webhook_url, { |
||||
text |
||||
}) |
||||
}); |
||||
} catch (e) { |
||||
console.log(e) |
||||
console.log(e); |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
@ -1,19 +1,20 @@
|
||||
import axios from 'axios'; |
||||
|
||||
export default class Slack { |
||||
|
||||
public static async sendMessage(text: string, webhooks: Array<{ |
||||
webhook_url: string |
||||
}>): Promise<any> { |
||||
public static async sendMessage( |
||||
text: string, |
||||
webhooks: Array<{ |
||||
webhook_url: string; |
||||
}> |
||||
): Promise<any> { |
||||
for (const { webhook_url } of webhooks) { |
||||
try { |
||||
await axios.post(webhook_url, { |
||||
text |
||||
}) |
||||
}); |
||||
} catch (e) { |
||||
console.log(e) |
||||
console.log(e); |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue