Skip to content

Commit 9524b4f

Browse files
authored
Merge pull request #64 from quickwit-oss/ddelemeny/revamp_querybuilder
Don't send index metadata, revamp Elastic querybuilder
2 parents c660038 + a14578b commit 9524b4f

File tree

8 files changed

+94
-221
lines changed

8 files changed

+94
-221
lines changed

Diff for: src/QueryBuilder/elastic.ts

+52-69
Original file line numberDiff line numberDiff line change
@@ -1,84 +1,67 @@
11
import {
2+
BucketAggregation,
3+
ElasticsearchQuery,
4+
MetricAggregation,
25
TermsQuery,
36
} from '../types';
47

5-
export class ElasticQueryBuilder {
6-
timeField: string;
78

8-
constructor(options: { timeField: string }) {
9-
this.timeField = options.timeField;
10-
}
11-
12-
getRangeFilter() {
13-
const filter: any = {};
14-
filter[this.timeField] = {
15-
gte: '$timeFrom',
16-
lte: '$timeTo',
17-
// FIXME when Quickwit supports format.
18-
// format: 'epoch_millis',
19-
};
20-
21-
return filter;
22-
}
23-
24-
getTermsQuery(queryDef: TermsQuery) {
25-
const query: any = {
26-
size: 0,
27-
query: {
28-
bool: {
29-
filter: [{ range: this.getRangeFilter() }],
30-
},
31-
},
32-
};
33-
34-
if (queryDef.query) {
35-
query.query.bool.filter.push({
36-
query_string: {
37-
// FIXME when Quickwit supports analyze_wildcard.
38-
// analyze_wildcard: true,
39-
query: queryDef.query,
40-
},
41-
});
42-
}
9+
type OrderByType = '_key' | '_term' | '_count'
4310

44-
let size = 500;
45-
if (queryDef.size) {
46-
size = queryDef.size;
11+
function getTermsAgg(
12+
fieldName: string,
13+
size: number,
14+
orderBy: OrderByType = "_key",
15+
order: 'asc'|'desc' = 'asc'
16+
): BucketAggregation {
17+
return {
18+
type: 'terms',
19+
id: "",
20+
field: fieldName,
21+
settings:{
22+
size: size.toString(),
23+
order: order,
24+
orderBy: orderBy,
4725
}
26+
}
27+
}
4828

49-
query.aggs = {
50-
'1': {
51-
terms: {
52-
field: queryDef.field,
53-
size: size,
54-
order: {},
55-
},
56-
},
57-
};
29+
export function getDataQuery(queryDef: TermsQuery, refId: string): ElasticsearchQuery {
30+
const metrics: MetricAggregation[] = [
31+
{id:"count1", type:'count'}
32+
];
5833

59-
// Default behaviour is to order results by { _key: asc }
60-
// queryDef.order allows selection of asc/desc
61-
// queryDef.orderBy allows selection of doc_count ordering (defaults desc)
34+
// Default behaviour is to order results by { _key: asc }
35+
// queryDef.order allows selection of asc/desc
36+
// queryDef.orderBy allows selection of doc_count ordering (defaults desc)
6237

63-
const { orderBy = 'key', order = orderBy === 'doc_count' ? 'desc' : 'asc' } = queryDef;
38+
let orderBy: OrderByType;
39+
switch (queryDef.orderBy || 'key') {
40+
case 'key':
41+
case 'term':
42+
orderBy = '_key'
43+
break;
44+
case 'doc_count':
45+
orderBy = '_count'
46+
break;
47+
default:
48+
throw { message: `Invalid query sort type ${queryDef.orderBy}` };
49+
}
6450

65-
if (['asc', 'desc'].indexOf(order) < 0) {
66-
throw { message: `Invalid query sort order ${order}` };
67-
}
51+
const {order = orderBy === '_count' ? 'desc' : 'asc' } = queryDef;
52+
if (['asc', 'desc'].indexOf(order) < 0) {
53+
throw { message: `Invalid query sort order ${order}` };
54+
}
6855

69-
switch (orderBy) {
70-
case 'key':
71-
case 'term':
72-
const keyname = '_key';
73-
query.aggs['1'].terms.order[keyname] = order;
74-
break;
75-
case 'doc_count':
76-
query.aggs['1'].terms.order['_count'] = order;
77-
break;
78-
default:
79-
throw { message: `Invalid query sort type ${orderBy}` };
80-
}
56+
const bucketAggs: BucketAggregation[] = [];
57+
if (queryDef.field) {
58+
bucketAggs.push(getTermsAgg(queryDef.field, 500, orderBy, order))
59+
}
8160

82-
return query;
61+
return {
62+
refId,
63+
metrics,
64+
bucketAggs,
65+
query: queryDef.query,
8366
}
8467
}

Diff for: src/components/QueryEditor/BucketAggregationsEditor/state/reducer.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717
} from './actions';
1818

1919
export const createReducer =
20-
(defaultTimeField: string) =>
20+
(defaultTimeField = "") =>
2121
(state: ElasticsearchQuery['bucketAggs'], action: Action): ElasticsearchQuery['bucketAggs'] => {
2222
if (addBucketAggregation.match(action)) {
2323
const newAgg: Terms = {

Diff for: src/components/QueryEditor/ElasticsearchQueryContext.test.tsx

-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ describe('ElasticsearchQueryContext', () => {
3838
expect(changedQuery.alias).toBeDefined();
3939
expect(changedQuery.metrics).toBeDefined();
4040
expect(changedQuery.bucketAggs).toBeDefined();
41-
4241
// Should also set timeField to the configured `timeField` option in datasource configuration
4342
expect(changedQuery.timeField).toBe(datasource.timeField);
4443

Diff for: src/components/QueryEditor/ElasticsearchQueryContext.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ export const ElasticsearchProvider = ({
5454
});
5555

5656
const dispatch = useStatelessReducer(
57-
// timeField is part of the query model, but its value is always set to be the one from datasource settings.
58-
(newState) => onStateChange({ ...query, ...newState, timeField: datasource.timeField }),
57+
// timeField is part of the query model, but its value is always set to be the one from datasource settings.
58+
(newState) => onStateChange({ ...query, ...newState, timeField: datasource.timeField }),
5959
query,
6060
reducer
6161
);

Diff for: src/configuration/mocks.ts

-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import { QuickwitOptions } from 'quickwit';
55
export function createDefaultConfigOptions(): DataSourceSettings<QuickwitOptions> {
66
return createDatasourceSettings<QuickwitOptions>({
77
timeField: 'timestamp',
8-
timeOutputFormat: 'unix_timestamp_millisecs',
98
logMessageField: 'test.message',
109
logLevelField: 'test.level',
1110
index: 'test',

0 commit comments

Comments
 (0)