mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-10-17 12:51:26 +08:00
151 lines
3.4 KiB
TypeScript
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;
|