Created
September 25, 2024 23:57
-
-
Save OrderAndCh4oS/a41c32a3d23121955931060dac1c2350 to your computer and use it in GitHub Desktop.
simple query parser
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const one = '{one}'; | |
const two = '{two}'; | |
const three = '{three}'; | |
const oneAndTwoAndThree = '{one} + {two} + {three}'; | |
const oneNotTwo = '{one} - {two}'; | |
const oneAndTwoNotThree = '{one} + {two} - {three}'; | |
const oneOrTwoOrThree = '{one} | {two} | {three}'; | |
const quoteAnalysisParser = (query: string, values: string[]) => { | |
if(!values.length) return false; | |
const valuesLowercase = values.map(v => v.toLowerCase()); | |
const params = []; | |
const operators = []; | |
for (let i = 0; i < query.length; i++) { | |
if(query[i] === '{') { | |
let param = ''; | |
i++ | |
while (query[i] !== '}') { | |
param += query[i]; | |
i++; | |
} | |
params.push(param.toLowerCase()); | |
continue; | |
} | |
if(['+', '-', '|'].includes(query[i])) operators.push(query[i]); | |
} | |
if(!params.length) throw new Error('No params found, could not parse'); | |
if(!operators.length) return valuesLowercase.includes(params[0]); | |
for (let i = 0; i < operators.length; i++) { | |
switch(operators[i]) { | |
case '+': | |
if( | |
!(valuesLowercase.includes(params[i]) | |
&& valuesLowercase.includes(params[i+1])) | |
) return false; | |
break; | |
case '-': | |
if(!valuesLowercase.includes(params[i])) return false; | |
if(valuesLowercase.includes(params[i + 1])) return false; | |
break; | |
case '|': | |
if(valuesLowercase.includes(params[i]) || valuesLowercase.includes(params[i+1])) return true; | |
if(i === operators.length - 1) return false; | |
break; | |
} | |
} | |
return true; | |
}; | |
console.log('Single Item Examples'); | |
console.log('Expect true:', quoteAnalysisParser(one, ['one', 'two'])); | |
console.log('Expect true:', quoteAnalysisParser(two, ['one', 'two'])); | |
console.log('Expect false:', quoteAnalysisParser(three, ['one', 'two'])); | |
console.log('--------------'); | |
console.log('And Examples'); | |
console.log('Expect true:', quoteAnalysisParser(oneAndTwoAndThree, ['one', 'two', 'three'])); | |
console.log('Expect false:', quoteAnalysisParser(oneAndTwoAndThree, ['one', 'two'])); | |
console.log('--------------'); | |
console.log('Not Examples'); | |
console.log('Expect true:', quoteAnalysisParser(oneAndTwoNotThree, ['one', 'two'])); // true | |
console.log('Expect false:', quoteAnalysisParser(oneAndTwoNotThree, ['one', 'two', 'three'])); | |
console.log('Expect true:', quoteAnalysisParser(oneNotTwo, ['one'])); | |
console.log('--------------'); | |
console.log('Or Examples'); | |
console.log('Expect true:', quoteAnalysisParser(oneOrTwoOrThree, ['one', 'two', 'three'])); | |
console.log('Expect true:', quoteAnalysisParser(oneOrTwoOrThree, ['one'])); | |
console.log('Expect true:', quoteAnalysisParser(oneOrTwoOrThree, ['two'])); | |
console.log('Expect true:', quoteAnalysisParser(oneOrTwoOrThree, ['three'])); | |
console.log('Expect false:', quoteAnalysisParser(oneOrTwoOrThree, ['four', 'five', 'six'])); | |
console.log('--------------'); | |
console.log('Demo of actual names') | |
console.log('Expect true:', quoteAnalysisParser( | |
'{Tempo Budgets} + {Tempo Timesheets-Time Tracking & Reports}', | |
['Tempo Budgets', 'Tempo Timesheets-Time Tracking & Reports'] | |
)); | |
console.log('Expect false:', quoteAnalysisParser( | |
'{Tempo Budgets} + {Tempo Timesheets-Time Tracking & Reports}', | |
['Tempo Budgets'] | |
)); | |
console.log('Expect false:', quoteAnalysisParser('{Structure - Project Management at Scale} - {Structure.Gantt - Planning at Scale}', [ | |
"Tempo Budgets", | |
"Tempo Planner: Resource Planning", | |
"Extension for Jira Service Desk Data Center", | |
"Extension for Jira Service Desk" | |
])); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment