151 lines
3.4 KiB
TypeScript

/* eslint-disable */
// @ts-ignore
// @ts-nocheck
import {
ErrorConvertToFullText,
ErrorInvalidQueryPair,
} from 'lib/logql/errors';
import splitter from 'lib/logql/splitter';
import {
ConditionalOperators,
QueryOperatorsMultiVal,
QueryOperatorsSingleVal,
QueryTypes,
} from 'lib/logql/tokens';
const validateMultiValue = (queryToken: string): boolean => {
const queryValues = [];
let start;
let isQuoteStart = false;
if (queryToken[0] === '(' && queryToken[queryToken.length - 1] === ')') {
for (let idx = 1; idx < queryToken.length - 1; idx += 1) {
if (queryToken[idx] === "'") {
if (queryToken[idx - 1] === '\\') {
// skip
} else if (isQuoteStart) {
isQuoteStart = false;
queryValues.push(queryToken.slice(start, idx));
} else {
isQuoteStart = true;
start = idx + 1;
}
}
}
} else {
return false;
}
return queryValues;
};
export const parseQuery = (queryString) => {
let parsedRaw = [];
const generateQuery = (queryToken) => {
const prevToken = parsedRaw[parsedRaw.length - 1];
// Is a QUERY_KEY
if (
prevToken === undefined ||
prevToken.type === QueryTypes.CONDITIONAL_OPERATOR
) {
parsedRaw.push({
type: QueryTypes.QUERY_KEY,
value: queryToken,
});
}
// Is a QUERY_OPERATOR
else if (prevToken && prevToken.type === QueryTypes.QUERY_KEY) {
if (
Object.values({
...QueryOperatorsMultiVal,
...QueryOperatorsSingleVal,
}).find((op) => op.toLowerCase() === queryToken.toLowerCase())
)
parsedRaw.push({
type: QueryTypes.QUERY_OPERATOR,
value: queryToken,
});
else {
throw new ErrorInvalidQueryPair(
'Expected conditional operator received',
queryToken,
);
}
}
// Is a QUERY_VALUE
else if (prevToken && prevToken.type === QueryTypes.QUERY_OPERATOR) {
// Check for multi value
let value = queryToken;
// if (
// typeof queryToken === 'string' &&
// queryToken.length >= 2 &&
// queryToken[0] === "'" &&
// queryToken[queryToken.length - 1] === "'"
// ) {
// value = queryToken.slice(1, queryToken.length - 1);
// }
if (
Object.values(QueryOperatorsMultiVal).some(
(operator) => operator.toLowerCase() === prevToken.value.toLowerCase(),
)
) {
value = validateMultiValue(queryToken);
if (value === false) {
throw new ErrorConvertToFullText();
}
}
parsedRaw.push({
type: QueryTypes.QUERY_VALUE,
value,
});
} else if (prevToken && prevToken.type === QueryTypes.QUERY_VALUE) {
if (
Object.values(ConditionalOperators).find(
(op) => op.toLowerCase() === queryToken.toLowerCase(),
)
)
parsedRaw.push({
type: QueryTypes.CONDITIONAL_OPERATOR,
value: queryToken,
});
else {
throw new ErrorInvalidQueryPair(
'Expected conditional operator received',
queryToken,
);
}
} else {
// Not a Key
}
};
try {
const spaceSplittedQUery = splitter(queryString);
spaceSplittedQUery.forEach((q) => {
generateQuery(q);
});
} catch (e: Error) {
if (e instanceof ErrorInvalidQueryPair) {
//
} else if (e instanceof ErrorConvertToFullText) {
parsedRaw = [
{
type: QueryTypes.QUERY_KEY,
value: 'FULLTEXT',
},
{
type: QueryTypes.QUERY_OPERATOR,
value: 'CONTAINS',
},
{
type: QueryTypes.QUERY_VALUE,
value: String.raw`${queryString}`,
},
];
}
}
return parsedRaw;
};
export default parseQuery;