Review fix for between operators datetime fix
This commit is contained in:
parent
346df62287
commit
4ebb89e97f
@ -29,13 +29,8 @@ export function getRecordListFilterSql (filter) {
|
||||
|
||||
// Helper function that creates a query for a specific field kind
|
||||
export function getFieldFilter (name, kind, query = '', operator = '=') {
|
||||
let boolQuery = query
|
||||
let numQuery = query
|
||||
const numQuery = Number.parseFloat(query)
|
||||
|
||||
if (typeof query === 'object' && query !== null) {
|
||||
boolQuery = toBoolean(query)
|
||||
numQuery = Number.parseFloat(query)
|
||||
}
|
||||
const build = (op, left, right) => {
|
||||
switch (op.toUpperCase()) {
|
||||
case '!=':
|
||||
@ -47,7 +42,7 @@ export function getFieldFilter (name, kind, query = '', operator = '=') {
|
||||
return `'${right}' ${op} ${left}`
|
||||
case 'BETWEEN':
|
||||
case 'NOT BETWEEN':
|
||||
return `${name} ${op} ${query.start} ${query.end}`
|
||||
return `${left} ${op} ${right}`
|
||||
default:
|
||||
return `${left} ${op} ${right}`
|
||||
}
|
||||
@ -58,6 +53,8 @@ export function getFieldFilter (name, kind, query = '', operator = '=') {
|
||||
|
||||
if (kind === 'Bool') {
|
||||
const operation = operator === '=' ? 'is' : 'is not'
|
||||
const boolQuery = toBoolean(query)
|
||||
|
||||
if (boolQuery) {
|
||||
return `${name} ${operation} true`
|
||||
} else {
|
||||
@ -78,40 +75,52 @@ export function getFieldFilter (name, kind, query = '', operator = '=') {
|
||||
|
||||
if (['Number'].includes(kind)) {
|
||||
if (['BETWEEN', 'NOT BETWEEN'].includes(operator)) {
|
||||
return build(operator, name, numQuery)
|
||||
return build(operator, name, `${query.start} ${query.end}`)
|
||||
} else if (!isNaN(numQuery)) {
|
||||
return build(operator, name, numQuery)
|
||||
}
|
||||
}
|
||||
|
||||
if (['DateTime'].includes(kind)) {
|
||||
const dataFmtEntry = (date) => `TIMESTAMP(DATE_FORMAT('${date.format()}', '%Y-%m-%dT%H:%i:00.%f+00:00'))`
|
||||
|
||||
if (['BETWEEN', 'NOT BETWEEN'].includes(operator)) {
|
||||
const startDate = moment(query.start, ['YYYY-MM-DDTHH:mm:ssZ', 'YYYY-MM-DD'])
|
||||
const endDate = moment(query.end, ['YYYY-MM-DDTHH:mm:ssZ', 'YYYY-MM-DD'])
|
||||
const startDateTime = moment(query.start, 'YYYY-MM-DDTHH:mm:ssZ', true)
|
||||
const endDateTime = moment(query.end, 'YYYY-MM-DDTHH:mm:ssZ', true)
|
||||
|
||||
const startTime = moment(query.start, ['HH:mm'])
|
||||
const endTime = moment(query.end, ['HH:mm'])
|
||||
if (startDateTime.isValid() && endDateTime.isValid()) {
|
||||
return build(operator, `TIMESTAMP(DATE_FORMAT(${name}, '%Y-%m-%dT%H:%i:00.%f+00:00'))`, `${dataFmtEntry(startDateTime)} ${dataFmtEntry(endDateTime)}`)
|
||||
}
|
||||
|
||||
const dataFmtEntry = (date) => `TIMESTAMP(DATE_FORMAT('${date.format()}', '%Y-%m-%dT%H:%i:00.%f+00:00'))`
|
||||
const startDate = moment(query.start, 'YYYY-MM-DD', true)
|
||||
const endDate = moment(query.end, 'YYYY-MM-DD', true)
|
||||
|
||||
if (startDate.isValid() && endDate.isValid()) {
|
||||
return `TIMESTAMP(DATE_FORMAT(${name}, '%Y-%m-%dT%H:%i:00.%f+00:00')) ${operator} ${dataFmtEntry(startDate)} ${dataFmtEntry(endDate)}`
|
||||
} else if (startTime.isValid() && endTime.isValid()) {
|
||||
return `TIME(DATE_FORMAT(${name}, '%Y-%m-%dT%H:%i:00.%f+00:00')) ${operator} TIME('${query.start}') TIME('${query.end}')`
|
||||
return build(operator, name, `DATE('${query.start}') DATE('${query.end}')`)
|
||||
}
|
||||
|
||||
const startTime = moment(query.start, 'HH:mm', true)
|
||||
const endTime = moment(query.end, 'HH:mm', true)
|
||||
|
||||
if (startTime.isValid() && endTime.isValid()) {
|
||||
return build(operator, name, `TIME('${query.start}') TIME('${query.end}')`)
|
||||
}
|
||||
} else {
|
||||
// Build different querries if date, time or datetime
|
||||
const date = moment(query, ['YYYY-MM-DDTHH:mm:ssZ', 'YYYY-MM-DD'])
|
||||
const time = moment(query, ['HH:mm'])
|
||||
const dateTime = moment(query, 'YYYY-MM-DDTHH:mm:ssZ', true)
|
||||
const date = moment(query, 'YYYY-MM-DD', true)
|
||||
const time = moment(query, 'HH:mm', true)
|
||||
|
||||
// @note tweaking the template a bit:
|
||||
// * adding %f to include fractions; mysql sometimes forces them when formatting date
|
||||
// * changing Z to +00:00
|
||||
// * doing the same for time-only fields
|
||||
if (date.isValid()) {
|
||||
return `TIMESTAMP(DATE_FORMAT(${name}, '%Y-%m-%dT%H:%i:00.%f+00:00')) ${operator} TIMESTAMP(DATE_FORMAT('${date.format()}', '%Y-%m-%dT%H:%i:00.%f+00:00'))`
|
||||
if (dateTime.isValid()) {
|
||||
return build(operator, `TIMESTAMP(DATE_FORMAT(${name}, '%Y-%m-%dT%H:%i:00.%f+00:00'))`, dataFmtEntry(dateTime))
|
||||
} else if (date.isValid()) {
|
||||
return build(operator, name, `DATE('${query}')`)
|
||||
} else if (time.isValid()) {
|
||||
return `TIME(DATE_FORMAT(${name}, '%Y-%m-%dT%H:%i:00.%f+00:00')) ${operator} TIME('${query}')`
|
||||
return build(operator, name, `TIME('${query}')`)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user