Skip to content

Instantly share code, notes, and snippets.

@OrderAndCh4oS
Created September 25, 2024 23:57
Show Gist options
  • Save OrderAndCh4oS/a41c32a3d23121955931060dac1c2350 to your computer and use it in GitHub Desktop.
Save OrderAndCh4oS/a41c32a3d23121955931060dac1c2350 to your computer and use it in GitHub Desktop.
simple query parser
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