Skip to content

Commit 51a5a6e

Browse files
committed
Fix empty partially quoted
1 parent 7db861b commit 51a5a6e

3 files changed

Lines changed: 22 additions & 6 deletions

File tree

lib/index.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ const REGEX_CHAR = '*'
55
const RANGE_CHAR = '~'
66
const GROUP_START = '('
77
const GROUP_END = ')'
8-
const QUOTES = '"'
9-
const EMPTY_QUOTES_STR = '""'
8+
const VAL_TOKEN = '"'
9+
const EMPTY_VAL_GROUP = `${VAL_TOKEN}${VAL_TOKEN}`
1010
const KEY_SEPARATOR = '.'
1111
const NEGATED_PREFIX = 'not'
1212
const RANGE_REGEXP = /^[^-\d]*(-?\d+(\.\d+)?)?[^-\d]*-[^-\d]*(-?\d+(\.\d+)?)?[^-\d]*$/
13-
const TOKENIZER = new RegExp(` *(${NEGATED_PREFIX})? *(\\${GROUP_START})| *(${NEGATED_PREFIX} +)?(?:((?:\\\\.|[^ ${GROUP_START}${GROUP_END}\\\\${REGEX_CHAR}${RANGE_CHAR}${TOKEN_SEPARATOR}])+) *([${REGEX_CHAR}${RANGE_CHAR}]?${TOKEN_SEPARATOR}))? *(${QUOTES}((?:\\\\.|[^${QUOTES}\\\\])+)${QUOTES}?|(?:\\\\.|[^ ${GROUP_START}${GROUP_END}\\\\])+)? *(and|or|\\${GROUP_END}|$)`, 'g')
13+
const TOKENIZER = new RegExp(` *(${NEGATED_PREFIX})? *(\\${GROUP_START})| *(${NEGATED_PREFIX} +)?(?:((?:\\\\.|[^ ${GROUP_START}${GROUP_END}\\\\${REGEX_CHAR}${RANGE_CHAR}${TOKEN_SEPARATOR}])+) *([${REGEX_CHAR}${RANGE_CHAR}]?${TOKEN_SEPARATOR}))? *(${VAL_TOKEN}((?:\\\\.|[^${VAL_TOKEN}\\\\])+)${VAL_TOKEN}?|(?:\\\\.|[^ ${GROUP_START}${GROUP_END}\\\\])+)? *(and|or|\\${GROUP_END}|$)`, 'g')
1414
const TOKEN = { GROUP_NEGATED: 1, GROUP_START: 2, NEGATED: 3, KEY: 4, TYPE: 5, VALUE: 6, QUOTED_VALUE: 7, OPERATOR: 8 }
1515
const UNKNOWN = -1
1616
const EMPTY_STR = ''
@@ -208,9 +208,9 @@ function extractConditionsFromQuery(query: string, regex = new RegExp(TOKENIZER)
208208
let value = m[TOKEN.QUOTED_VALUE] || void 0
209209

210210
if (key === void 0) {
211-
key = value !== void 0 ? KEY_SEPARATOR : m[TOKEN.VALUE]
211+
key = value !== void 0 ? KEY_SEPARATOR : getUnquotedValue(m[TOKEN.VALUE])
212212
} else if (value === void 0) {
213-
value = m[TOKEN.VALUE] !== EMPTY_QUOTES_STR ? m[TOKEN.VALUE] : void 0
213+
value = getUnquotedValue(m[TOKEN.VALUE])
214214
}
215215

216216
if (key || value) {
@@ -317,6 +317,10 @@ function removeEscapeChar(str?: string): string | void {
317317
return str ? str.replace(/\\(.)/g, '$1') : str
318318
}
319319

320+
function getUnquotedValue(value: string): string {
321+
return value !== EMPTY_VAL_GROUP && value !== VAL_TOKEN ? value : void 0
322+
}
323+
320324
export default SearchEngine
321325

322326
module && (module.exports = SearchEngine)

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@ecromaneli/search-engine",
3-
"version": "2.1.0",
3+
"version": "2.1.1",
44
"description": "A powerful object search engine with advanced query syntax",
55
"main": "dist/npm/index.min.js",
66
"files": [ "dist/npm/index.min.*", "dist/npm/index.d.*", "LICENSE" ],

test/index.test.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,18 @@ describe('Search Engine', () => {
372372
expect(results[0].id).toBe(1)
373373
expect(results[1].id).toBe(2)
374374
})
375+
376+
test('Empty partially quoted values', () => {
377+
let query = 'name:"'
378+
let results = Search.search(testData, query)
379+
console.log(results)
380+
expect(results.length).toBe(6)
381+
382+
query = '"'
383+
results = Search.search(testData, query)
384+
console.log(results)
385+
expect(results.length).toBe(6)
386+
})
375387

376388
test('Quoted values with boolean operators inside', () => {
377389
const query = 'name:"and"' // Looking for literal "and" in name

0 commit comments

Comments
 (0)