3
0

Review fix for between operators datetime fix

This commit is contained in:
Kelani Tolulope 2023-02-08 21:01:12 +01:00
parent 346df62287
commit 4ebb89e97f

View File

@ -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}')`)
}
}
}