2023-04-10 15:02:45 +03:00
|
|
|
// ** Helpers
|
2023-05-02 17:08:03 +03:00
|
|
|
import { GRAPH_TYPES } from 'container/NewDashboard/ComponentsSlider';
|
2023-06-16 13:38:39 +03:00
|
|
|
import { createIdFromObjectFields } from 'lib/createIdFromObjectFields';
|
2023-04-19 07:25:18 +03:00
|
|
|
import { createNewBuilderItemName } from 'lib/newQueryBuilder/createNewBuilderItemName';
|
2023-06-06 22:28:18 +03:00
|
|
|
import {
|
|
|
|
|
BaseAutocompleteData,
|
|
|
|
|
LocalDataType,
|
|
|
|
|
} from 'types/api/queryBuilder/queryAutocompleteResponse';
|
2023-04-19 07:25:18 +03:00
|
|
|
import {
|
2023-05-02 17:08:03 +03:00
|
|
|
HavingForm,
|
2023-04-19 07:25:18 +03:00
|
|
|
IBuilderFormula,
|
2023-05-02 17:08:03 +03:00
|
|
|
IBuilderQuery,
|
2023-05-23 16:47:52 +03:00
|
|
|
IClickHouseQuery,
|
|
|
|
|
IPromQLQuery,
|
2023-06-01 20:17:09 +03:00
|
|
|
Query,
|
2023-05-23 16:47:52 +03:00
|
|
|
QueryState,
|
2023-07-06 14:22:44 +03:00
|
|
|
TagFilter,
|
2023-04-19 07:25:18 +03:00
|
|
|
} from 'types/api/queryBuilder/queryBuilderData';
|
2023-05-23 16:47:52 +03:00
|
|
|
import { EQueryType } from 'types/common/dashboard';
|
2023-04-10 15:02:45 +03:00
|
|
|
import {
|
|
|
|
|
BoolOperators,
|
|
|
|
|
DataSource,
|
2023-06-16 13:38:39 +03:00
|
|
|
LogsAggregatorOperator,
|
2023-04-10 15:02:45 +03:00
|
|
|
MetricAggregateOperator,
|
|
|
|
|
NumberOperators,
|
2023-05-02 17:08:03 +03:00
|
|
|
PanelTypeKeys,
|
|
|
|
|
QueryAdditionalFilter,
|
2023-05-23 16:47:52 +03:00
|
|
|
QueryBuilderData,
|
2023-05-02 17:08:03 +03:00
|
|
|
ReduceOperators,
|
2023-04-10 15:02:45 +03:00
|
|
|
StringOperators,
|
2023-06-16 13:38:39 +03:00
|
|
|
TracesAggregatorOperator,
|
2023-04-10 15:02:45 +03:00
|
|
|
} from 'types/common/queryBuilder';
|
2023-05-02 17:08:03 +03:00
|
|
|
import { SelectOption } from 'types/common/select';
|
2023-05-18 14:14:34 +03:00
|
|
|
import { v4 as uuid } from 'uuid';
|
|
|
|
|
|
|
|
|
|
import {
|
|
|
|
|
logsAggregateOperatorOptions,
|
|
|
|
|
metricAggregateOperatorOptions,
|
|
|
|
|
tracesAggregateOperatorOptions,
|
|
|
|
|
} from './queryBuilderOperators';
|
2023-04-10 15:02:45 +03:00
|
|
|
|
2023-04-19 07:25:18 +03:00
|
|
|
export const MAX_FORMULAS = 20;
|
|
|
|
|
export const MAX_QUERIES = 26;
|
|
|
|
|
|
2023-06-06 22:28:18 +03:00
|
|
|
export const idDivider = '--';
|
|
|
|
|
export const selectValueDivider = '__';
|
|
|
|
|
|
|
|
|
|
export const baseAutoCompleteIdKeysOrder: (keyof Omit<
|
|
|
|
|
BaseAutocompleteData,
|
|
|
|
|
'id'
|
|
|
|
|
>)[] = ['key', 'dataType', 'type', 'isColumn'];
|
2023-05-18 14:14:34 +03:00
|
|
|
|
2023-04-19 07:25:18 +03:00
|
|
|
export const formulasNames: string[] = Array.from(
|
|
|
|
|
Array(MAX_FORMULAS),
|
|
|
|
|
(_, i) => `F${i + 1}`,
|
|
|
|
|
);
|
|
|
|
|
const alpha: number[] = Array.from(Array(MAX_QUERIES), (_, i) => i + 65);
|
|
|
|
|
export const alphabet: string[] = alpha.map((str) => String.fromCharCode(str));
|
|
|
|
|
|
2023-04-10 15:02:45 +03:00
|
|
|
export enum QueryBuilderKeys {
|
|
|
|
|
GET_AGGREGATE_ATTRIBUTE = 'GET_AGGREGATE_ATTRIBUTE',
|
|
|
|
|
GET_AGGREGATE_KEYS = 'GET_AGGREGATE_KEYS',
|
2023-05-12 12:30:00 +05:30
|
|
|
GET_ATTRIBUTE_KEY = 'GET_ATTRIBUTE_KEY',
|
2023-04-10 15:02:45 +03:00
|
|
|
}
|
|
|
|
|
|
2023-05-18 14:14:34 +03:00
|
|
|
export const mapOfOperators = {
|
|
|
|
|
metrics: metricAggregateOperatorOptions,
|
|
|
|
|
logs: logsAggregateOperatorOptions,
|
|
|
|
|
traces: tracesAggregateOperatorOptions,
|
2023-04-10 15:02:45 +03:00
|
|
|
};
|
|
|
|
|
|
2023-05-02 17:08:03 +03:00
|
|
|
export const mapOfFilters: Record<DataSource, QueryAdditionalFilter[]> = {
|
|
|
|
|
metrics: [
|
|
|
|
|
// eslint-disable-next-line sonarjs/no-duplicate-string
|
|
|
|
|
{ text: 'Aggregation interval', field: 'stepInterval' },
|
|
|
|
|
{ text: 'Having', field: 'having' },
|
|
|
|
|
],
|
|
|
|
|
logs: [
|
|
|
|
|
{ text: 'Order by', field: 'orderBy' },
|
|
|
|
|
{ text: 'Limit', field: 'limit' },
|
|
|
|
|
{ text: 'Having', field: 'having' },
|
|
|
|
|
{ text: 'Aggregation interval', field: 'stepInterval' },
|
|
|
|
|
],
|
|
|
|
|
traces: [
|
|
|
|
|
{ text: 'Order by', field: 'orderBy' },
|
|
|
|
|
{ text: 'Limit', field: 'limit' },
|
|
|
|
|
{ text: 'Having', field: 'having' },
|
|
|
|
|
{ text: 'Aggregation interval', field: 'stepInterval' },
|
|
|
|
|
],
|
2023-04-19 07:25:18 +03:00
|
|
|
};
|
|
|
|
|
|
2023-05-02 17:08:03 +03:00
|
|
|
export const REDUCE_TO_VALUES: SelectOption<ReduceOperators, string>[] = [
|
|
|
|
|
{ value: 'last', label: 'Latest of values in timeframe' },
|
|
|
|
|
{ value: 'sum', label: 'Sum of values in timeframe' },
|
|
|
|
|
{ value: 'avg', label: 'Average of values in timeframe' },
|
|
|
|
|
{ value: 'max', label: 'Max of values in timeframe' },
|
|
|
|
|
{ value: 'min', label: 'Min of values in timeframe' },
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
export const initialHavingValues: HavingForm = {
|
2023-04-19 07:25:18 +03:00
|
|
|
columnName: '',
|
|
|
|
|
op: '',
|
|
|
|
|
value: [],
|
2023-04-10 15:02:45 +03:00
|
|
|
};
|
|
|
|
|
|
2023-06-06 22:28:18 +03:00
|
|
|
export const initialAutocompleteData: BaseAutocompleteData = {
|
2023-06-16 13:38:39 +03:00
|
|
|
id: createIdFromObjectFields(
|
|
|
|
|
{ dataType: null, key: '', isColumn: null, type: null },
|
|
|
|
|
baseAutoCompleteIdKeysOrder,
|
|
|
|
|
),
|
2023-04-10 15:02:45 +03:00
|
|
|
dataType: null,
|
|
|
|
|
key: '',
|
|
|
|
|
isColumn: null,
|
|
|
|
|
type: null,
|
|
|
|
|
};
|
|
|
|
|
|
2023-07-06 14:22:44 +03:00
|
|
|
export const initialFilters: TagFilter = {
|
|
|
|
|
items: [],
|
|
|
|
|
op: 'AND',
|
|
|
|
|
};
|
|
|
|
|
|
2023-06-16 13:38:39 +03:00
|
|
|
const initialQueryBuilderFormValues: IBuilderQuery = {
|
2023-04-10 15:02:45 +03:00
|
|
|
dataSource: DataSource.METRICS,
|
2023-04-19 07:25:18 +03:00
|
|
|
queryName: createNewBuilderItemName({ existNames: [], sourceNames: alphabet }),
|
2023-05-10 19:40:27 +03:00
|
|
|
aggregateOperator: MetricAggregateOperator.NOOP,
|
2023-06-06 22:28:18 +03:00
|
|
|
aggregateAttribute: initialAutocompleteData,
|
2023-05-12 12:30:00 +05:30
|
|
|
filters: { items: [], op: 'AND' },
|
2023-05-02 17:08:03 +03:00
|
|
|
expression: createNewBuilderItemName({
|
|
|
|
|
existNames: [],
|
|
|
|
|
sourceNames: alphabet,
|
|
|
|
|
}),
|
2023-04-10 15:02:45 +03:00
|
|
|
disabled: false,
|
|
|
|
|
having: [],
|
2023-06-28 15:19:52 +05:30
|
|
|
stepInterval: 60,
|
2023-05-02 17:08:03 +03:00
|
|
|
limit: null,
|
2023-04-10 15:02:45 +03:00
|
|
|
orderBy: [],
|
|
|
|
|
groupBy: [],
|
|
|
|
|
legend: '',
|
2023-05-02 17:08:03 +03:00
|
|
|
reduceTo: 'sum',
|
2023-04-10 15:02:45 +03:00
|
|
|
};
|
|
|
|
|
|
2023-06-16 13:38:39 +03:00
|
|
|
const initialQueryBuilderFormLogsValues: IBuilderQuery = {
|
|
|
|
|
...initialQueryBuilderFormValues,
|
|
|
|
|
aggregateOperator: LogsAggregatorOperator.COUNT,
|
|
|
|
|
dataSource: DataSource.LOGS,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const initialQueryBuilderFormTracesValues: IBuilderQuery = {
|
|
|
|
|
...initialQueryBuilderFormValues,
|
|
|
|
|
aggregateOperator: TracesAggregatorOperator.COUNT,
|
|
|
|
|
dataSource: DataSource.TRACES,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const initialQueryBuilderFormValuesMap: Record<
|
|
|
|
|
DataSource,
|
|
|
|
|
IBuilderQuery
|
|
|
|
|
> = {
|
|
|
|
|
metrics: initialQueryBuilderFormValues,
|
|
|
|
|
logs: initialQueryBuilderFormLogsValues,
|
|
|
|
|
traces: initialQueryBuilderFormTracesValues,
|
|
|
|
|
};
|
|
|
|
|
|
2023-04-19 07:25:18 +03:00
|
|
|
export const initialFormulaBuilderFormValues: IBuilderFormula = {
|
2023-05-02 17:08:03 +03:00
|
|
|
queryName: createNewBuilderItemName({
|
2023-04-19 07:25:18 +03:00
|
|
|
existNames: [],
|
|
|
|
|
sourceNames: formulasNames,
|
|
|
|
|
}),
|
|
|
|
|
expression: '',
|
|
|
|
|
disabled: false,
|
|
|
|
|
legend: '',
|
|
|
|
|
};
|
|
|
|
|
|
2023-05-23 16:47:52 +03:00
|
|
|
export const initialQueryPromQLData: IPromQLQuery = {
|
|
|
|
|
name: createNewBuilderItemName({ existNames: [], sourceNames: alphabet }),
|
|
|
|
|
query: '',
|
|
|
|
|
legend: '',
|
|
|
|
|
disabled: false,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const initialClickHouseData: IClickHouseQuery = {
|
|
|
|
|
name: createNewBuilderItemName({ existNames: [], sourceNames: alphabet }),
|
|
|
|
|
legend: '',
|
|
|
|
|
disabled: false,
|
|
|
|
|
query: '',
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const initialQueryBuilderData: QueryBuilderData = {
|
|
|
|
|
queryData: [initialQueryBuilderFormValues],
|
|
|
|
|
queryFormulas: [],
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const initialSingleQueryMap: Record<
|
|
|
|
|
EQueryType.PROM | EQueryType.CLICKHOUSE,
|
|
|
|
|
IClickHouseQuery | IPromQLQuery
|
|
|
|
|
> = { clickhouse_sql: initialClickHouseData, promql: initialQueryPromQLData };
|
|
|
|
|
|
2023-06-16 13:38:39 +03:00
|
|
|
export const initialQueryState: QueryState = {
|
|
|
|
|
id: uuid(),
|
2023-05-23 16:47:52 +03:00
|
|
|
builder: initialQueryBuilderData,
|
|
|
|
|
clickhouse_sql: [initialClickHouseData],
|
|
|
|
|
promql: [initialQueryPromQLData],
|
|
|
|
|
};
|
|
|
|
|
|
2023-06-16 13:38:39 +03:00
|
|
|
const initialQueryWithType: Query = {
|
|
|
|
|
...initialQueryState,
|
2023-06-01 20:17:09 +03:00
|
|
|
queryType: EQueryType.QUERY_BUILDER,
|
|
|
|
|
};
|
|
|
|
|
|
2023-06-16 13:38:39 +03:00
|
|
|
const initialQueryLogsWithType: Query = {
|
|
|
|
|
...initialQueryWithType,
|
|
|
|
|
builder: {
|
|
|
|
|
...initialQueryWithType.builder,
|
|
|
|
|
queryData: [initialQueryBuilderFormValuesMap.logs],
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
const initialQueryTracesWithType: Query = {
|
|
|
|
|
...initialQueryWithType,
|
|
|
|
|
builder: {
|
|
|
|
|
...initialQueryWithType.builder,
|
|
|
|
|
queryData: [initialQueryBuilderFormValuesMap.traces],
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const initialQueriesMap: Record<DataSource, Query> = {
|
|
|
|
|
metrics: initialQueryWithType,
|
|
|
|
|
logs: initialQueryLogsWithType,
|
|
|
|
|
traces: initialQueryTracesWithType,
|
|
|
|
|
};
|
|
|
|
|
|
2023-04-10 15:02:45 +03:00
|
|
|
export const operatorsByTypes: Record<LocalDataType, string[]> = {
|
|
|
|
|
string: Object.values(StringOperators),
|
|
|
|
|
number: Object.values(NumberOperators),
|
|
|
|
|
bool: Object.values(BoolOperators),
|
|
|
|
|
};
|
2023-04-15 16:08:17 +05:30
|
|
|
|
2023-05-02 17:08:03 +03:00
|
|
|
export const PANEL_TYPES: Record<PanelTypeKeys, GRAPH_TYPES> = {
|
|
|
|
|
TIME_SERIES: 'graph',
|
|
|
|
|
VALUE: 'value',
|
|
|
|
|
TABLE: 'table',
|
|
|
|
|
LIST: 'list',
|
2023-06-23 21:39:59 +03:00
|
|
|
TRACE: 'trace',
|
2023-07-04 08:24:34 +03:00
|
|
|
EMPTY_WIDGET: 'EMPTY_WIDGET',
|
2023-05-02 17:08:03 +03:00
|
|
|
};
|
|
|
|
|
|
2023-04-15 16:08:17 +05:30
|
|
|
export type IQueryBuilderState = 'search';
|
|
|
|
|
|
|
|
|
|
export const QUERY_BUILDER_SEARCH_VALUES = {
|
|
|
|
|
MULTIPLY: 'MULTIPLY_VALUE',
|
|
|
|
|
SINGLE: 'SINGLE_VALUE',
|
|
|
|
|
NON: 'NON_VALUE',
|
|
|
|
|
NOT_VALID: 'NOT_VALID',
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const OPERATORS = {
|
|
|
|
|
IN: 'IN',
|
|
|
|
|
NIN: 'NOT_IN',
|
|
|
|
|
LIKE: 'LIKE',
|
|
|
|
|
NLIKE: 'NOT_LIKE',
|
2023-05-02 17:08:03 +03:00
|
|
|
'=': '=',
|
|
|
|
|
'!=': '!=',
|
2023-04-15 16:08:17 +05:30
|
|
|
EXISTS: 'EXISTS',
|
|
|
|
|
NOT_EXISTS: 'NOT_EXISTS',
|
|
|
|
|
CONTAINS: 'CONTAINS',
|
|
|
|
|
NOT_CONTAINS: 'NOT_CONTAINS',
|
2023-05-02 17:08:03 +03:00
|
|
|
'>=': '>=',
|
|
|
|
|
'>': '>',
|
|
|
|
|
'<=': '<=',
|
|
|
|
|
'<': '<',
|
2023-04-15 16:08:17 +05:30
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const QUERY_BUILDER_OPERATORS_BY_TYPES = {
|
|
|
|
|
string: [
|
2023-05-02 17:08:03 +03:00
|
|
|
OPERATORS['='],
|
|
|
|
|
OPERATORS['!='],
|
2023-04-15 16:08:17 +05:30
|
|
|
OPERATORS.IN,
|
|
|
|
|
OPERATORS.NIN,
|
|
|
|
|
OPERATORS.LIKE,
|
|
|
|
|
OPERATORS.NLIKE,
|
|
|
|
|
OPERATORS.CONTAINS,
|
|
|
|
|
OPERATORS.NOT_CONTAINS,
|
|
|
|
|
OPERATORS.EXISTS,
|
|
|
|
|
OPERATORS.NOT_EXISTS,
|
|
|
|
|
],
|
2023-05-12 12:30:00 +05:30
|
|
|
int64: [
|
2023-05-02 17:08:03 +03:00
|
|
|
OPERATORS['='],
|
|
|
|
|
OPERATORS['!='],
|
2023-04-15 16:08:17 +05:30
|
|
|
OPERATORS.IN,
|
|
|
|
|
OPERATORS.NIN,
|
|
|
|
|
OPERATORS.EXISTS,
|
|
|
|
|
OPERATORS.NOT_EXISTS,
|
2023-05-02 17:08:03 +03:00
|
|
|
OPERATORS['>='],
|
|
|
|
|
OPERATORS['>'],
|
|
|
|
|
OPERATORS['<='],
|
|
|
|
|
OPERATORS['<'],
|
2023-04-15 16:08:17 +05:30
|
|
|
],
|
2023-05-12 12:30:00 +05:30
|
|
|
float64: [
|
|
|
|
|
OPERATORS['='],
|
|
|
|
|
OPERATORS['!='],
|
|
|
|
|
OPERATORS.IN,
|
|
|
|
|
OPERATORS.NIN,
|
|
|
|
|
OPERATORS.EXISTS,
|
|
|
|
|
OPERATORS.NOT_EXISTS,
|
|
|
|
|
OPERATORS['>='],
|
|
|
|
|
OPERATORS['>'],
|
|
|
|
|
OPERATORS['<='],
|
|
|
|
|
OPERATORS['<'],
|
|
|
|
|
],
|
|
|
|
|
bool: [
|
2023-05-02 17:08:03 +03:00
|
|
|
OPERATORS['='],
|
|
|
|
|
OPERATORS['!='],
|
2023-04-15 16:08:17 +05:30
|
|
|
OPERATORS.EXISTS,
|
|
|
|
|
OPERATORS.NOT_EXISTS,
|
|
|
|
|
],
|
|
|
|
|
universal: [
|
2023-05-02 17:08:03 +03:00
|
|
|
OPERATORS['='],
|
|
|
|
|
OPERATORS['!='],
|
2023-04-15 16:08:17 +05:30
|
|
|
OPERATORS.IN,
|
|
|
|
|
OPERATORS.NIN,
|
|
|
|
|
OPERATORS.EXISTS,
|
|
|
|
|
OPERATORS.NOT_EXISTS,
|
|
|
|
|
OPERATORS.LIKE,
|
|
|
|
|
OPERATORS.NLIKE,
|
2023-05-02 17:08:03 +03:00
|
|
|
OPERATORS['>='],
|
|
|
|
|
OPERATORS['>'],
|
|
|
|
|
OPERATORS['<='],
|
|
|
|
|
OPERATORS['<'],
|
2023-04-15 16:08:17 +05:30
|
|
|
OPERATORS.CONTAINS,
|
|
|
|
|
OPERATORS.NOT_CONTAINS,
|
|
|
|
|
],
|
|
|
|
|
};
|
2023-04-19 07:25:18 +03:00
|
|
|
|
|
|
|
|
export const HAVING_OPERATORS: string[] = [
|
2023-05-02 17:08:03 +03:00
|
|
|
OPERATORS['='],
|
|
|
|
|
OPERATORS['!='],
|
2023-04-19 07:25:18 +03:00
|
|
|
OPERATORS.IN,
|
|
|
|
|
OPERATORS.NIN,
|
2023-05-02 17:08:03 +03:00
|
|
|
OPERATORS['>='],
|
|
|
|
|
OPERATORS['>'],
|
|
|
|
|
OPERATORS['<='],
|
|
|
|
|
OPERATORS['<'],
|
2023-04-19 07:25:18 +03:00
|
|
|
];
|