Skip to content

Commit 6522e43

Browse files
committed
Polish datetime conversion implementation
- Naming things - Slight structural changes - Use iterator instead of generator for column type flagging - Improve inline documentation
1 parent 6a5c61c commit 6522e43

File tree

1 file changed

+25
-24
lines changed

1 file changed

+25
-24
lines changed

src/crate/client/cursor.py

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -51,44 +51,45 @@ def execute(self, sql, parameters=None, bulk_parameters=None):
5151
self._result = self.connection.client.sql(sql, parameters,
5252
bulk_parameters)
5353

54-
if "rows" in self._result:
55-
transformed_result = False
56-
if "col_types" in self._result:
57-
transformed_result = True
58-
self.rows = self.result_set_transformed()
54+
if "rows" not in self._result:
55+
return
56+
57+
if "col_types" in self._result:
58+
self.rows = iter(self._transform_result_types())
5959

60-
if not transformed_result:
61-
self.rows = iter(self._result["rows"])
60+
else:
61+
self.rows = iter(self._result["rows"])
6262

63-
def result_set_transformed(self):
63+
def _transform_result_types(self):
6464
"""
65-
Generator that iterates over each row from the result set
65+
Generate row items with column values converted to their corresponding
66+
native Python types, based on information from `col_types`.
67+
68+
Currently, only converting to native `datetime` objects is implemented.
6669
"""
67-
rows_to_convert = [True if col_type == 11 or col_type == 15 else False for col_type in
68-
self._result["col_types"]]
70+
datetime_column_types = [11, 15]
71+
datetime_columns_mask = [
72+
True if col_type in datetime_column_types else False
73+
for col_type in self._result["col_types"]
74+
]
6975
for row in self._result["rows"]:
70-
gen_flags = (flag for flag in rows_to_convert)
71-
yield [t_row for t_row in self._transform_date_columns(row, gen_flags)]
76+
yield list(self._transform_datetime_columns(row, iter(datetime_columns_mask)))
7277

7378
@staticmethod
74-
def _transform_date_columns(row, gen_flags):
79+
def _transform_datetime_columns(row, column_flags):
7580
"""
76-
Generates iterates over each value from a row and converts timestamps to pandas TIMESTAMP
81+
Convert all designated columns to native Python `datetime` objects.
7782
"""
7883
for value in row:
7984
try:
80-
flag = next(gen_flags)
85+
flag = next(column_flags)
8186
except StopIteration:
8287
break
8388

84-
if not flag or value is None:
85-
yield value
86-
else:
87-
if value < 0:
88-
yield None
89-
else:
90-
value = datetime.fromtimestamp(value / 1000)
91-
yield value
89+
if flag and value is not None:
90+
value = datetime.fromtimestamp(value / 1e3)
91+
92+
yield value
9293

9394
def executemany(self, sql, seq_of_parameters):
9495
"""

0 commit comments

Comments
 (0)