Skip to content

Commit 37d70fe

Browse files
authored
Merge pull request #90 from quickwit-oss/ddelemeny/fix-editor-autocomplete
Minor fixes to editor autocomplete
2 parents bd0169b + 7775bbd commit 37d70fe

File tree

3 files changed

+26
-17
lines changed

3 files changed

+26
-17
lines changed

src/components/LuceneQueryEditor.tsx

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,23 @@ export function LuceneQueryEditor(props: LuceneQueryEditorProps){
3636

3737
const {autocompleter} = props;
3838
const datasourceCompletions = useCallback(async (context: CompletionContext)=>{
39+
let suggestions;
3940
let word = context.matchBefore(/\S*/);
4041
if (!word){ return null }
41-
const suggestions = await autocompleter(word?.text);
42-
return {
43-
from: word.from + suggestions.from,
44-
options: suggestions.options
42+
suggestions = await autocompleter(word?.text);
43+
if (suggestions && suggestions.options.length > 0 ) {
44+
return {
45+
from: word.from + suggestions.from,
46+
options: suggestions.options
47+
}
4548
}
49+
return null
4650
}, [autocompleter])
4751

4852

49-
const autocomplete = autocompletion({ override: [datasourceCompletions] })
53+
const autocomplete = autocompletion({
54+
override: [datasourceCompletions]
55+
})
5056

5157
return (<CodeMirror
5258
ref={editorRef}

src/datasource/index.ts

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -277,14 +277,15 @@ export class QuickwitDataSource
277277
getTerms(queryDef: TermsQuery, range = getDefaultTimeRange()): Observable<MetricFindValue[]> {
278278
const dataquery = this.getDataQueryRequest(queryDef, range)
279279
return super.query(dataquery).pipe(
280-
mergeMap(res=> res.data.map((df: DataFrame)=>{
281-
282-
return df.fields[0]!.values.map((bucket)=>({
283-
text: bucket,
284-
value: bucket,
285-
}))
280+
mergeMap(res=> {
281+
return res.data.map((df: DataFrame)=>{
282+
if (df.fields.length === 0) { return [] }
283+
return df.fields[0].values.map((bucket)=>({
284+
text: bucket,
285+
value: bucket,
286+
}))
287+
})
286288
})
287-
)
288289
)
289290
}
290291

@@ -335,15 +336,17 @@ export class QuickwitDataSource
335336
* Get tag keys for adhoc filters
336337
*/
337338
getTagKeys(spec?: FieldCapsSpec) {
338-
return lastValueFrom(this.getFields(spec));
339+
const fields = this.getFields(spec)
340+
return lastValueFrom(fields, {defaultValue:[]});
339341
}
340342

341343
/**
342344
* Get tag values for adhoc filters
343345
*/
344346
getTagValues(options: any) {
345347
const range = getDefaultTimeRange();
346-
return lastValueFrom(this.getTerms({ field: options.key }, range));
348+
const terms = this.getTerms({ field: options.key }, range)
349+
return lastValueFrom(terms, {defaultValue:[]});
347350
}
348351

349352
/**
@@ -436,12 +439,12 @@ export class QuickwitDataSource
436439
if (query) {
437440
if (parsedQuery.find === 'fields') {
438441
parsedQuery.type = this.interpolateLuceneQuery(parsedQuery.type);
439-
return lastValueFrom(this.getFields({aggregatable:true, type:parsedQuery.type, _range:range}));
442+
return lastValueFrom(this.getFields({aggregatable:true, type:parsedQuery.type, _range:range}), {defaultValue:[]});
440443
}
441444
if (parsedQuery.find === 'terms') {
442445
parsedQuery.field = this.interpolateLuceneQuery(parsedQuery.field);
443446
parsedQuery.query = this.interpolateLuceneQuery(parsedQuery.query);
444-
return lastValueFrom(this.getTerms(parsedQuery, range));
447+
return lastValueFrom(this.getTerms(parsedQuery, range), {defaultValue:[]});
445448
}
446449
}
447450
return Promise.resolve([]);

src/datasource/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export function useDatasourceFields(datasource: QuickwitDataSource) {
2727
const getSuggestions = useCallback(async (word: string): Promise<Suggestion> => {
2828
let suggestions: Suggestion = { from: 0, options: [] };
2929

30-
const wordIsField = word.match(/([\w\.]+):"?(\S*)/);
30+
const wordIsField = word.match(/([^:\s]+):"?([^"\s]*)"?/);
3131
if (wordIsField?.length) {
3232
const [_match, fieldName, _fieldValue] = wordIsField;
3333
const candidateValues = await datasource.getTagValues({ key: fieldName });

0 commit comments

Comments
 (0)