Browse Source

Support for all ad-hoc filter operators on Elasticsearch (#7612)

tamayika 8 years ago
parent
commit
b01fd3d0b5

+ 22 - 1
public/app/plugins/datasource/elasticsearch/query_builder.js

@@ -120,7 +120,28 @@ function (queryDef) {
       filter = adhocFilters[i];
       condition = {};
       condition[filter.key] = filter.value;
-      query.query.bool.filter.push({"term": condition});
+      switch(filter.operator){
+        case "=":
+          query.query.bool.filter.push({"term": condition});
+          break;
+        case "!=":
+          query.query.bool.filter.push({"bool": {"must_not": {"term": condition}}});
+          break;
+        case "<":
+          condition[filter.key] = {"lt": filter.value};
+          query.query.bool.filter.push({"range": condition});
+          break;
+        case ">":
+          condition[filter.key] = {"gt": filter.value};
+          query.query.bool.filter.push({"range": condition});
+          break;
+        case "=~":
+          query.query.bool.filter.push({"regexp": condition});
+          break;
+        case "!~":
+          query.query.bool.filter.push({"bool": {"must_not": {"regexp": condition}}});
+          break;
+      }
     }
   };
 

+ 11 - 1
public/app/plugins/datasource/elasticsearch/specs/query_builder_specs.ts

@@ -255,9 +255,19 @@ describe('ElasticQueryBuilder', function() {
       timeField: '@timestamp',
       bucketAggs: [{type: 'date_histogram', field: '@timestamp', id: '3'}],
     }, [
-      {key: 'key1', operator: '=', value: 'value1'}
+      {key: 'key1', operator: '=', value: 'value1'},
+      {key: 'key2', operator: '!=', value: 'value2'},
+      {key: 'key3', operator: '<', value: 'value3'},
+      {key: 'key4', operator: '>', value: 'value4'},
+      {key: 'key5', operator: '=~', value: 'value5'},
+      {key: 'key6', operator: '!~', value: 'value6'},
     ]);
 
     expect(query.query.bool.filter[2].term["key1"]).to.be("value1");
+    expect(query.query.bool.filter[3].bool.must_not.term["key2"]).to.be("value2");
+    expect(query.query.bool.filter[4].range["key3"].lt).to.be("value3");
+    expect(query.query.bool.filter[5].range["key4"].gt).to.be("value4");
+    expect(query.query.bool.filter[6].regexp["key5"]).to.be("value5");
+    expect(query.query.bool.filter[7].bool.must_not.regexp["key6"]).to.be("value6");
   });
 });