mirror of https://github.com/nocodb/nocodb
Browse Source
Added - 'MIN','MAX','CEILING', 'FLOOR', 'ROUND', 'MOD', 'REPEAT', 'LOG', 'EXP', 'POWER', 'SQRT', 'ABS', 'NOW', 'REPLACE Signed-off-by: Pranav C <61551451+pranavxc@users.noreply.github.com>pull/448/head
5 changed files with 131 additions and 49 deletions
@ -1,44 +0,0 @@
|
||||
import {XKnex} from "../../index"; |
||||
|
||||
const pg = { |
||||
LEN: 'length' |
||||
} |
||||
|
||||
const mssql = { |
||||
LEN: 'LEN' |
||||
} |
||||
|
||||
const mysql2 = { |
||||
LEN: 'CHAR_LENGTH' |
||||
} |
||||
|
||||
|
||||
const sqlite3 = { |
||||
LEN: 'LENGTH' |
||||
} |
||||
|
||||
|
||||
const getFunctionName = (name, knex: XKnex) => { |
||||
|
||||
switch (knex.clientType()) { |
||||
|
||||
case 'mysql': |
||||
case 'mysql2': |
||||
return mysql2[name] || name; |
||||
break; |
||||
case 'pg': |
||||
case 'postgre': |
||||
return pg[name] || name; |
||||
break; |
||||
case 'mssql': |
||||
return mssql[name] || name; |
||||
break; |
||||
case 'sqlite': |
||||
case 'sqlite3': |
||||
return sqlite3[name] || name; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
|
||||
export default getFunctionName; |
@ -0,0 +1,116 @@
|
||||
import {XKnex} from "../../index"; |
||||
|
||||
interface MapFnArgs { |
||||
pt: any, |
||||
aliasToCol: { [alias: string]: string }, |
||||
knex: XKnex, |
||||
alias: string, |
||||
fn: (...args: any) => any |
||||
} |
||||
|
||||
const MOD = (pt) => { |
||||
Object.assign(pt, { |
||||
type: 'BinaryExpression', |
||||
operator: '%', |
||||
left: pt.arguments[0], |
||||
right: pt.arguments[1] |
||||
}) |
||||
} |
||||
const mysql2 = { |
||||
LEN: 'CHAR_LENGTH', |
||||
MIN: 'LEAST', |
||||
MAX: 'GREATEST', |
||||
} |
||||
|
||||
const pg = { |
||||
LEN: 'length', |
||||
MIN: 'least', |
||||
MAX: 'greatest', |
||||
CEILING: 'ceil', |
||||
ROUND: 'round', |
||||
POWER: 'pow', |
||||
SQRT: 'sqrt' |
||||
} |
||||
|
||||
const mssql = { |
||||
MIN: (args: MapFnArgs) => { |
||||
if (args.pt.arguments.length === 1) { |
||||
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() |
||||
} 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() |
||||
} |
||||
} |
||||
|
||||
return args.knex.raw(`Case ${query}\n End as ${args.alias}`) |
||||
}, |
||||
MAX: (args: MapFnArgs) => { |
||||
if (args.pt.arguments.length === 1) { |
||||
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() |
||||
} 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() |
||||
} |
||||
} |
||||
|
||||
return args.knex.raw(`Case ${query}\n End as ${args.alias}`) |
||||
}, |
||||
MOD, |
||||
REPEAT: 'REPLICATE', |
||||
NOW: 'getdate' |
||||
} |
||||
|
||||
|
||||
const sqlite3 = { |
||||
LEN: 'LENGTH', |
||||
CEILING(_pt) { |
||||
// todo:
|
||||
}, FLOOR(_pt) { |
||||
// todo:
|
||||
}, |
||||
MOD, |
||||
REPEAT(args: MapFnArgs) { |
||||
return args.knex.raw(`replace(printf('%.' || ${args.fn(args.pt.arguments[1])} || 'c', '/'),'/',${args.fn(args.pt.arguments[0])}) ${args.alias}`) |
||||
}, |
||||
NOW: 'DATE' |
||||
} |
||||
|
||||
|
||||
const mapFunctionName = (args: MapFnArgs): any => { |
||||
const name = args.pt.callee.name; |
||||
let val; |
||||
switch (args.knex.clientType()) { |
||||
case 'mysql': |
||||
case 'mysql2': |
||||
val = mysql2[name] || name; |
||||
break; |
||||
case 'pg': |
||||
case 'postgre': |
||||
val = pg[name] || name; |
||||
break; |
||||
case 'mssql': |
||||
val = mssql[name] || name; |
||||
break; |
||||
case 'sqlite': |
||||
case 'sqlite3': |
||||
val = sqlite3[name] || name; |
||||
break; |
||||
} |
||||
|
||||
if (typeof val === 'function') { |
||||
return val(args) |
||||
} else if (typeof val === 'string') { |
||||
args.pt.callee.name = val; |
||||
} |
||||
} |
||||
|
||||
|
||||
export default mapFunctionName; |
Loading…
Reference in new issue