get the longer string filters working

This commit is contained in:
jmosrael@gmail.com
2024-05-18 14:56:07 -07:00
parent f0de240b8a
commit 97aab587df
2 changed files with 41 additions and 32 deletions

View File

@@ -49,7 +49,9 @@ app.post('/api/game', jsonParser, async (req, res) => {
order: orderBy, order: orderBy,
where: filter where: filter
}) })
const pageCount = Math.ceil((await Character.count()) / count) const pageCount = Math.ceil((await Game.count({
where: filter
})) / count)
res.setHeader('Content-Type', 'application/json') res.setHeader('Content-Type', 'application/json')
res.send({ gameData, pageCount }) res.send({ gameData, pageCount })

View File

@@ -23,34 +23,35 @@ export class OrderByParser {
} }
parse(orderBy: string) { parse(orderBy: string) {
const output = [] const output = []
let holding = [] let holding = []
this.lexer this.lexer
.input(orderBy) .input(orderBy)
.tokens() .tokens()
.forEach((token) => { .forEach((token) => {
switch (token.type) { switch (token.type) {
case 'spacer': case 'spacer':
output.push(holding) output.push(holding)
holding = [] holding = []
break break
case 'column': case 'column':
case 'direction': case 'direction':
holding.push(token.value) holding.push(token.value)
break break
} }
}) })
if (holding) { if (holding) {
output.push(holding) output.push(holding)
} }
return output return output
} }
} }
const openGroupRegex = /\(/ const openGroupRegex = /\(/
const closeGroupRegex = /\)/ const closeGroupRegex = /\)/
const conjunctinoRegex = /AND|OR/ const conjunctinoRegex = /AND|OR/
const equalityRegex = /([a-zA-Z]+)\s?(=|!=|<|>|<=|>=|:)\s?([a-zA-Z\d"']+)/ const equalityRegex = /([a-zA-Z]+)\s?(=|!=|<|>|<=|>=|:)\s?([a-zA-Z\d]+)/
const stringEqualityRegex = /([a-zA-Z]+)\s?(=|!=|<|>|<=|>=|:)\s?\"([a-zA-Z\d\s]*)\"/
const spacerRegex = /\s/ const spacerRegex = /\s/
const opperatorMap = { const opperatorMap = {
@@ -89,6 +90,12 @@ export class FilterParser {
ctx.accept('value', m[3]) ctx.accept('value', m[3])
}) })
this.lexer.rule(stringEqualityRegex, (ctx, m) => {
ctx.accept('column', m[1])
ctx.accept('opperator', m[2])
ctx.accept('value', m[3])
})
this.lexer.rule(spacerRegex, (ctx, m) => { this.lexer.rule(spacerRegex, (ctx, m) => {
ctx.ignore() ctx.ignore()
}) })
@@ -141,18 +148,18 @@ export class FilterParser {
let opperatorToken = this.lexer.consume('opperator') let opperatorToken = this.lexer.consume('opperator')
let valueToken = this.lexer.consume('value') let valueToken = this.lexer.consume('value')
if (opperatorToken.value === ":") { if (opperatorToken.value === ':') {
return {
return { [columnToken.value]: {
[columnToken.value]: { [opperatorMap[opperatorToken.value]]: `%${valueToken.value.toString()}%` } [opperatorMap[opperatorToken.value]]: `%${valueToken.value.toString()}%`
} }
}
} else { } else {
return {
return { [columnToken.value]: { [opperatorMap[opperatorToken.value]]: valueToken.value.toString() }
[columnToken.value]: { [opperatorMap[opperatorToken.value]]: valueToken.value.toString() } }
} }
} }
}
private parseGroup() { private parseGroup() {
this.lexer.consume('opengroup') this.lexer.consume('opengroup')