From b7f22b1896454b495f4a0412cf6beb11be78b466 Mon Sep 17 00:00:00 2001 From: Jason Cowley Date: Thu, 2 May 2024 04:31:23 -0700 Subject: [PATCH] Fix 'str' object has no attribute 'pop' error when parsing query (#6941) --- redash/query_runner/elasticsearch2.py | 2 ++ tests/query_runner/test_elasticsearch2.py | 13 ++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/redash/query_runner/elasticsearch2.py b/redash/query_runner/elasticsearch2.py index aa08ad955..3570d10b6 100644 --- a/redash/query_runner/elasticsearch2.py +++ b/redash/query_runner/elasticsearch2.py @@ -1,3 +1,4 @@ +import json import logging from typing import Optional, Tuple @@ -64,6 +65,7 @@ class ElasticSearch2(BaseHTTPQueryRunner): return data, error def _build_query(self, query: str) -> Tuple[dict, str, Optional[list]]: + query = json.loads(query) index_name = query.pop("index", "") result_fields = query.pop("result_fields", None) url = "/{}/_search".format(index_name) diff --git a/tests/query_runner/test_elasticsearch2.py b/tests/query_runner/test_elasticsearch2.py index 1a777b1a7..a4e71fc80 100644 --- a/tests/query_runner/test_elasticsearch2.py +++ b/tests/query_runner/test_elasticsearch2.py @@ -1,4 +1,4 @@ -from unittest import TestCase +from unittest import TestCase, mock from redash.query_runner.elasticsearch2 import ( ElasticSearch2, @@ -137,3 +137,14 @@ class TestXPackSQL(TestCase): ], } self.assertDictEqual(XPackSQLElasticSearch._parse_results(None, response), expected) + + +class TestElasticSearch2(TestCase): + @mock.patch("redash.query_runner.elasticsearch2.ElasticSearch2.__init__", return_value=None) + def test_build_query(self, mock_init): + query_runner = ElasticSearch2() + query_str = '{"index": "test_index", "result_fields": ["field1", "field2"]}' + query_dict, url, result_fields = query_runner._build_query(query_str) + self.assertEqual(query_dict, {}) + self.assertEqual(url, "/test_index/_search") + self.assertEqual(result_fields, ["field1", "field2"])