Files
Gábor Farkas 3e59ae7e56 InfluxDB: Convert the InfluxQL query editor from Angular to React (#32168)
Co-authored-by: Giordano Ricci <me@giordanoricci.com>
2021-05-11 08:15:44 +02:00

92 lines
3.3 KiB
TypeScript

import { cloneDeep } from 'lodash';
import InfluxQueryModel from '../influx_query_model';
import { InfluxQuery } from '../types';
// FIXME: these functions are a beginning of a refactoring of influx_query_model.ts
// into a simpler approach with full typescript types.
// later we should be able to migrate the unit-tests
// that relate to these functions here, and then perhaps even move the implementation
// to this place
export function buildRawQuery(query: InfluxQuery): string {
const queryCopy = cloneDeep(query); // the query-model mutates the query
const model = new InfluxQueryModel(queryCopy);
return model.render(false);
}
export function normalizeQuery(query: InfluxQuery): InfluxQuery {
// we return the original query if there is no need to update it
if (
query.policy !== undefined &&
query.resultFormat !== undefined &&
query.orderByTime !== undefined &&
query.tags !== undefined &&
query.groupBy !== undefined &&
query.select !== undefined
) {
return query;
}
// FIXME: we should move the whole normalizeQuery logic here,
// and then have influxQueryModel call this function,
// to concentrate the whole logic here
const queryCopy = cloneDeep(query); // the query-model mutates the query
return new InfluxQueryModel(queryCopy).target;
}
export function addNewSelectPart(query: InfluxQuery, type: string, index: number): InfluxQuery {
const queryCopy = cloneDeep(query); // the query-model mutates the query
const model = new InfluxQueryModel(queryCopy);
model.addSelectPart(model.selectModels[index], type);
return model.target;
}
export function removeSelectPart(query: InfluxQuery, partIndex: number, index: number): InfluxQuery {
const queryCopy = cloneDeep(query); // the query-model mutates the query
const model = new InfluxQueryModel(queryCopy);
const selectModel = model.selectModels[index];
model.removeSelectPart(selectModel, selectModel[partIndex]);
return model.target;
}
export function changeSelectPart(
query: InfluxQuery,
listIndex: number,
partIndex: number,
newParams: string[]
): InfluxQuery {
// we need to make shallow copy of `query.select` down to `query.select[listIndex][partIndex]`
const newSel = [...(query.select ?? [])];
newSel[listIndex] = [...newSel[listIndex]];
newSel[listIndex][partIndex] = {
...newSel[listIndex][partIndex],
params: newParams,
};
return { ...query, select: newSel };
}
export function addNewGroupByPart(query: InfluxQuery, type: string): InfluxQuery {
const queryCopy = cloneDeep(query); // the query-model mutates the query
const model = new InfluxQueryModel(queryCopy);
model.addGroupBy(type);
return model.target;
}
export function removeGroupByPart(query: InfluxQuery, partIndex: number): InfluxQuery {
const queryCopy = cloneDeep(query); // the query-model mutates the query
const model = new InfluxQueryModel(queryCopy);
model.removeGroupByPart(model.groupByParts[partIndex], partIndex);
return model.target;
}
export function changeGroupByPart(query: InfluxQuery, partIndex: number, newParams: string[]): InfluxQuery {
// we need to make shallow copy of `query.groupBy` down to `query.groupBy[partIndex]`
const newGroupBy = [...(query.groupBy ?? [])];
newGroupBy[partIndex] = {
...newGroupBy[partIndex],
params: newParams,
};
return { ...query, groupBy: newGroupBy };
}