Skip to content

Commit e3f4822

Browse files
authored
Add raw query response to cursor class (#103)
1 parent eee1663 commit e3f4822

File tree

2 files changed

+123
-0
lines changed

2 files changed

+123
-0
lines changed

pinotdb/db.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,7 @@ def __init__(
315315
self.schema = None
316316
self.rowcount = -1
317317
self._results = None
318+
self.raw_query_response = None
318319
self.timeUsedMs = -1
319320
self._debug = debug
320321
self._preserve_types = preserve_types
@@ -396,7 +397,15 @@ def finalize_query_payload(
396397
def normalize_query_response(self, input_query, query_response):
397398
try:
398399
payload = query_response.json()
400+
self.raw_query_response = {
401+
"response" : payload,
402+
"status_code" : query_response.status_code
403+
}
399404
except Exception as e:
405+
self.raw_query_response = {
406+
"response" : query_response.text,
407+
"status_code" : query_response.status_code
408+
}
400409
raise exceptions.DatabaseError(
401410
f"Error when querying {input_query} from {self.url}, "
402411
f"raw response is:\n{query_response.text}"

tests/unit/test_db.py

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -678,6 +678,120 @@ def test_does_nothing_for_setoutputsizes(self):
678678
cursor.setoutputsizes(123)
679679

680680
# All good, nothing happened
681+
682+
def test_checks_raw_query_response_with_single_stage_and_status_code_200(self):
683+
cursor = self.create_cursor(
684+
{
685+
'dataSchema': {
686+
'columnNames': ['age'],
687+
'columnDataTypes': ['INT'],
688+
},
689+
'rows': [[1], [2], [3]],
690+
},
691+
status_code=200,
692+
extra_payload={'numGroupsLimitReached': True},
693+
use_multistage_engine=False
694+
)
695+
cursor.execute('some statement')
696+
raw_query_response = {
697+
'response': {
698+
'numServersResponded': 1,
699+
'numServersQueried': 1,
700+
'resultTable': {
701+
'dataSchema': {'columnNames': ['age'], 'columnDataTypes': ['INT']},
702+
'rows': [[1], [2], [3]],
703+
},
704+
'numGroupsLimitReached': True,
705+
},
706+
'status_code': 200,
707+
}
708+
self.assertEqual(cursor.raw_query_response, raw_query_response)
709+
710+
def test_checks_raw_query_response_with_multi_stage_and_status_code_200(self):
711+
cursor = self.create_cursor(
712+
{
713+
'dataSchema': {
714+
'columnNames': ['age'],
715+
'columnDataTypes': ['INT'],
716+
},
717+
'rows': [[1], [2], [3]],
718+
},
719+
status_code=200,
720+
extra_payload={'numGroupsLimitReached': True},
721+
use_multistage_engine=True
722+
)
723+
cursor.execute('some statement')
724+
raw_query_response = {
725+
'response': {
726+
'numServersResponded': 1,
727+
'numServersQueried': 1,
728+
'resultTable': {
729+
'dataSchema': {'columnNames': ['age'], 'columnDataTypes': ['INT']},
730+
'rows': [[1], [2], [3]],
731+
},
732+
'numGroupsLimitReached': True,
733+
},
734+
'status_code': 200,
735+
}
736+
self.assertEqual(cursor.raw_query_response, raw_query_response)
737+
738+
def test_checks_raw_query_response_with_single_stage_and_status_code_400(self):
739+
cursor = self.create_cursor(
740+
{
741+
'dataSchema': {
742+
'columnNames': ['age'],
743+
'columnDataTypes': ['INT'],
744+
},
745+
'rows': [[1], [2], [3]],
746+
},
747+
status_code=400,
748+
extra_payload={'exceptions': ['something', 'wrong']},
749+
use_multistage_engine=False
750+
)
751+
with self.assertRaises(exceptions.ProgrammingError):
752+
cursor.execute('some statement')
753+
raw_query_response = {
754+
'response': {
755+
'numServersResponded': 1,
756+
'numServersQueried': 1,
757+
'resultTable': {
758+
'dataSchema': {'columnNames': ['age'], 'columnDataTypes': ['INT']},
759+
'rows': [[1], [2], [3]],
760+
},
761+
'exceptions': ['something', 'wrong'],
762+
},
763+
'status_code': 400,
764+
}
765+
self.assertEqual(cursor.raw_query_response, raw_query_response)
766+
767+
def test_checks_raw_query_response_with_multi_stage_and_status_code_400(self):
768+
cursor = self.create_cursor(
769+
{
770+
'dataSchema': {
771+
'columnNames': ['age'],
772+
'columnDataTypes': ['INT'],
773+
},
774+
'rows': [[1], [2], [3]],
775+
},
776+
status_code=400,
777+
extra_payload={'exceptions': ['something', 'wrong']},
778+
use_multistage_engine=True
779+
)
780+
with self.assertRaises(exceptions.ProgrammingError):
781+
cursor.execute('some statement')
782+
raw_query_response = {
783+
'response': {
784+
'numServersResponded': 1,
785+
'numServersQueried': 1,
786+
'resultTable': {
787+
'dataSchema': {'columnNames': ['age'], 'columnDataTypes': ['INT']},
788+
'rows': [[1], [2], [3]],
789+
},
790+
'exceptions': ['something', 'wrong'],
791+
},
792+
'status_code': 400,
793+
}
794+
self.assertEqual(cursor.raw_query_response, raw_query_response)
681795

682796

683797
class AsyncCursorTest(IsolatedAsyncioTestCase):

0 commit comments

Comments
 (0)