فهرست منبع

Loki: getHighlighterExpressionsFromQuery Returns null if filter term is not quoted (#17852)

Closes #17687
kay delaney 6 سال پیش
والد
کامیت
0a1bb97a2f
2فایلهای تغییر یافته به همراه17 افزوده شده و 2 حذف شده
  1. 8 0
      public/app/plugins/datasource/loki/query_utils.test.ts
  2. 9 2
      public/app/plugins/datasource/loki/query_utils.ts

+ 8 - 0
public/app/plugins/datasource/loki/query_utils.test.ts

@@ -71,17 +71,25 @@ describe('getHighlighterExpressionsFromQuery', () => {
   it('returns no expressions for empty query', () => {
     expect(getHighlighterExpressionsFromQuery('')).toEqual([]);
   });
+
   it('returns a single expressions for legacy query', () => {
     expect(getHighlighterExpressionsFromQuery('{} x')).toEqual(['(?i)x']);
     expect(getHighlighterExpressionsFromQuery('{foo="bar"} x')).toEqual(['(?i)x']);
   });
+
   it('returns an expression for query with filter', () => {
     expect(getHighlighterExpressionsFromQuery('{foo="bar"} |= "x"')).toEqual(['x']);
   });
+
   it('returns expressions for query with filter chain', () => {
     expect(getHighlighterExpressionsFromQuery('{foo="bar"} |= "x" |~ "y"')).toEqual(['x', 'y']);
   });
+
   it('returns drops expressions for query with negative filter chain', () => {
     expect(getHighlighterExpressionsFromQuery('{foo="bar"} |= "x" != "y"')).toEqual(['x']);
   });
+
+  it('returns null if filter term is not wrapped in double quotes', () => {
+    expect(getHighlighterExpressionsFromQuery('{foo="bar"} |= x')).toEqual(null);
+  });
 });

+ 9 - 2
public/app/plugins/datasource/loki/query_utils.ts

@@ -59,12 +59,19 @@ export function getHighlighterExpressionsFromQuery(input: string): string[] {
     if (filterEnd === -1) {
       filterTerm = expression.trim();
     } else {
-      filterTerm = expression.substr(0, filterEnd);
+      filterTerm = expression.substr(0, filterEnd).trim();
       expression = expression.substr(filterEnd);
     }
 
     // Unwrap the filter term by removing quotes
-    results.push(filterTerm.replace(/^\s*"/g, '').replace(/"\s*$/g, ''));
+    const quotedTerm = filterTerm.match(/^"((?:[^\\"]|\\")*)"$/);
+
+    if (quotedTerm) {
+      const unwrappedFilterTerm = quotedTerm[1];
+      results.push(unwrappedFilterTerm);
+    } else {
+      return null;
+    }
   }
   return results;
 }