Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Transition to python using native python time types instead of Java types #4388

Merged
merged 43 commits into from
Sep 1, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
fa56930
Implementing new time conversions.
chipkent Aug 22, 2023
aca48d2
Code formatting
chipkent Aug 22, 2023
7473493
Better error handling
chipkent Aug 23, 2023
01af7bc
Support string conversions.
chipkent Aug 23, 2023
47feee4
Added docs strings and removed deprecated methods.
chipkent Aug 23, 2023
6b97b11
Cleanup
chipkent Aug 23, 2023
549d5d7
Docs
chipkent Aug 23, 2023
ed8fc42
Cleanup
chipkent Aug 23, 2023
d81129b
Unit testing
chipkent Aug 25, 2023
66e199d
Unit testing
chipkent Aug 25, 2023
0ba8839
Unit testing
chipkent Aug 25, 2023
28ddac2
Unit testing
chipkent Aug 25, 2023
e94093e
Unit testing
chipkent Aug 25, 2023
af454eb
Unit testing
chipkent Aug 25, 2023
76e221f
Unit testing
chipkent Aug 28, 2023
37ceba4
Todos. Docs.
chipkent Aug 28, 2023
f5e7659
Todos. Docs.
chipkent Aug 28, 2023
69a78e0
Unit test fixes
chipkent Aug 28, 2023
f5640b8
Unit test fixes. Support other methods that accept other time types.
chipkent Aug 28, 2023
86501d3
Addressing review comments
chipkent Aug 30, 2023
1911a14
Addressing review comments
chipkent Aug 30, 2023
f285952
Addressing review comments
chipkent Aug 30, 2023
8a42dd3
Addressing review comments
chipkent Aug 30, 2023
aee85fa
Addressing review comments
chipkent Aug 30, 2023
bf75cc3
Addressing review comments
chipkent Aug 30, 2023
33deae6
Addressing review comments. Support more types.
chipkent Aug 31, 2023
4958636
Addressing review comments. Code format.
chipkent Aug 31, 2023
0aa2a15
Addressing review comments.
chipkent Aug 31, 2023
c34817b
Addressing review comments.
chipkent Aug 31, 2023
dd79ef6
Addressing review comments.
chipkent Aug 31, 2023
093c1ad
Update py/server/deephaven/time.py
chipkent Aug 31, 2023
f5f34eb
Addressing review comments.
chipkent Aug 31, 2023
366b301
Merge remote-tracking branch 'origin/native_py_time' into native_py_time
chipkent Aug 31, 2023
84e74dd
Addressing review comments.
chipkent Aug 31, 2023
9560317
Addressing review comments.
chipkent Aug 31, 2023
d8de71f
Addressing review comments.
chipkent Aug 31, 2023
e031a1e
Addressing review comments.
chipkent Aug 31, 2023
ab8bf4e
Rebase
chipkent Aug 31, 2023
7bd1a91
Addressing review comments.
chipkent Aug 31, 2023
9fad38b
Removed todos
chipkent Aug 31, 2023
aedc7b9
Addressing review. Removing unneeded jpy imports.
chipkent Sep 1, 2023
176f668
Addressing review.
chipkent Sep 1, 2023
cf56896
Addressing review. Reduce exception depth.
chipkent Sep 1, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
129 changes: 95 additions & 34 deletions py/server/deephaven/time.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ def dh_now(system: bool = False, resolution: str = 'ns') -> Instant:
Instant

Raises:
DHError
DHError, TypeError
"""
try:
if resolution == "ns":
Expand All @@ -64,7 +64,9 @@ def dh_now(system: bool = False, resolution: str = 'ns') -> Instant:
else:
return _JDateTimeUtils.nowMillisResolution()
else:
raise ValueError("Unsupported time resolution: " + resolution)
raise TypeError("Unsupported time resolution: " + resolution)
except TypeError as e:
raise e
Comment on lines +68 to +69
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a comment, could be a bit simpler:

except TypeError:
    raise

except Exception as e:
raise DHError(e) from e

Expand Down Expand Up @@ -180,7 +182,7 @@ def to_j_time_zone(tz: Union[None, TimeZone, str, datetime.tzinfo, datetime.date
TimeZone

Raises:
DHError
DHError, TypeError
"""
try:
if tz is None or pandas.isnull(tz):
Expand All @@ -197,7 +199,9 @@ def to_j_time_zone(tz: Union[None, TimeZone, str, datetime.tzinfo, datetime.date

return _JDateTimeUtils.parseTimeZone(tz.tzname())
else:
raise Exception("Unsupported conversion: " + str(type(tz)) + " -> TimeZone")
raise TypeError("Unsupported conversion: " + str(type(tz)) + " -> TimeZone")
except TypeError as e:
raise e
except Exception as e:
raise DHError(e) from e

Expand All @@ -219,7 +223,7 @@ def to_j_local_date(dt: Union[None, LocalDate, str, datetime.date, datetime.time
LocalDate

Raises:
DHError
DHError, TypeError
"""

try:
Expand All @@ -234,7 +238,9 @@ def to_j_local_date(dt: Union[None, LocalDate, str, datetime.date, datetime.time
elif isinstance(dt, numpy.datetime64):
return to_j_local_date(dt.astype(datetime.date))
else:
raise Exception("Unsupported conversion: " + str(type(dt)) + " -> LocalDate")
raise TypeError("Unsupported conversion: " + str(type(dt)) + " -> LocalDate")
except TypeError as e:
raise e
except Exception as e:
raise DHError(e) from e

Expand All @@ -258,7 +264,7 @@ def to_j_local_time(dt: Union[None, LocalTime, int, str, datetime.time, datetime
LocalTime

Raises:
DHError
DHError, TypeError
"""

try:
Expand All @@ -278,7 +284,9 @@ def to_j_local_time(dt: Union[None, LocalTime, int, str, datetime.time, datetime
# Conversion only supports micros resolution
return to_j_local_time(dt.astype(datetime.time))
else:
raise Exception("Unsupported conversion: " + str(type(dt)) + " -> LocalTime")
raise TypeError("Unsupported conversion: " + str(type(dt)) + " -> LocalTime")
except TypeError as e:
raise e
except Exception as e:
raise DHError(e) from e

Expand All @@ -302,7 +310,7 @@ def to_j_instant(dt: Union[None, Instant, int, str, datetime.datetime, numpy.dat
If None is provided, None is returned.

Returns:
Instant
Instant, TypeError

Raises:
DHError
Expand All @@ -328,7 +336,9 @@ def to_j_instant(dt: Union[None, Instant, int, str, datetime.datetime, numpy.dat
elif isinstance(dt, pandas.Timestamp):
return _JDateTimeUtils.epochNanosToInstant(dt.value)
else:
raise Exception("Unsupported conversion: " + str(type(dt)) + " -> Instant")
raise TypeError("Unsupported conversion: " + str(type(dt)) + " -> Instant")
except TypeError as e:
raise e
except Exception as e:
raise DHError(e) from e

Expand Down Expand Up @@ -356,7 +366,7 @@ def to_j_zdt(dt: Union[None, ZonedDateTime, str, datetime.datetime, numpy.dateti
ZonedDateTime

Raises:
DHError
DHError, TypeError
"""
try:
if dt is None or pandas.isnull(dt):
Expand All @@ -378,7 +388,9 @@ def to_j_zdt(dt: Union[None, ZonedDateTime, str, datetime.datetime, numpy.dateti
tz = _JDateTimeUtils.timeZone()
return _JZonedDateTime.ofInstant(instant, tz)
else:
raise Exception("Unsupported conversion: " + str(type(dt)) + " -> ZonedDateTime")
raise TypeError("Unsupported conversion: " + str(type(dt)) + " -> ZonedDateTime")
except TypeError as e:
raise e
except Exception as e:
raise DHError(e) from e

Expand Down Expand Up @@ -415,7 +427,7 @@ def to_j_duration(dt: Union[None, Duration, int, str, datetime.timedelta, numpy.
Duration

Raises:
DHError
DHError, TypeError
"""
try:
if dt is None or pandas.isnull(dt):
Expand All @@ -436,7 +448,9 @@ def to_j_duration(dt: Union[None, Duration, int, str, datetime.timedelta, numpy.
nanos = int(dt.astype('timedelta64[ns]').astype(numpy.int64))
return _JDuration.ofNanos(nanos)
else:
raise Exception("Unsupported conversion: " + str(type(dt)) + " -> Duration")
raise TypeError("Unsupported conversion: " + str(type(dt)) + " -> Duration")
except TypeError as e:
raise e
except Exception as e:
raise DHError(e) from e

Expand Down Expand Up @@ -468,6 +482,9 @@ def to_j_period(dt: Union[None, Period, str, datetime.timedelta, numpy.timedelta

Returns:
Period

Raises:
DHError, TypeError, ValueError
"""
try:
if dt is None or pandas.isnull(dt):
Expand All @@ -478,20 +495,20 @@ def to_j_period(dt: Union[None, Period, str, datetime.timedelta, numpy.timedelta
return _JDateTimeUtils.parsePeriod(dt)
elif isinstance(dt, pandas.Timedelta):
if dt.seconds or dt.microseconds or dt.nanoseconds:
raise Exception("Unsupported conversion: " + str(type(dt)) +
raise ValueError("Unsupported conversion: " + str(type(dt)) +
" -> Period: Periods must only be days or weeks")
elif dt.days:
return _JPeriod.ofDays(dt.days)
else:
raise Exception("Unsupported conversion: " + str(type(dt)) + " -> Period")
raise ValueError("Unsupported conversion: " + str(type(dt)) + " -> Period")
elif isinstance(dt, datetime.timedelta):
if dt.seconds or dt.microseconds:
raise Exception("Unsupported conversion: " + str(type(dt)) +
raise ValueError("Unsupported conversion: " + str(type(dt)) +
" -> Period: Periods must only be days or weeks")
elif dt.days:
return _JPeriod.ofDays(dt.days)
else:
raise Exception("Unsupported conversion: " + str(type(dt)) + " -> Period")
raise ValueError("Unsupported conversion: " + str(type(dt)) + " -> Period")
elif isinstance(dt, numpy.timedelta64):
data = numpy.datetime_data(dt)
units = data[0]
Expand All @@ -506,10 +523,14 @@ def to_j_period(dt: Union[None, Period, str, datetime.timedelta, numpy.timedelta
elif units == 'Y':
return _JPeriod.ofYears(value)
else:
raise Exception("Unsupported conversion: " + str(
raise ValueError("Unsupported conversion: " + str(
type(dt)) + " -> Period: numpy.datetime64 must have units of 'D', 'W', 'M', or 'Y'")
else:
raise Exception("Unsupported conversion: " + str(type(dt)) + " -> Period")
raise TypeError("Unsupported conversion: " + str(type(dt)) + " -> Period")
except ValueError as e:
raise e
except TypeError as e:
raise e
except Exception as e:
raise DHError(e) from e

Expand All @@ -530,6 +551,9 @@ def to_date(dt: Union[None, LocalDate, ZonedDateTime]) -> Optional[datetime.date

Returns:
datetime.date

Raises:
DHError, TypeError
"""
try:
if dt is None:
Expand All @@ -539,7 +563,9 @@ def to_date(dt: Union[None, LocalDate, ZonedDateTime]) -> Optional[datetime.date
if isinstance(dt, ZonedDateTime.j_type):
return datetime.date(dt.getYear(), dt.getMonthValue(), dt.getDayOfMonth())
else:
raise Exception("Unsupported conversion: " + str(type(dt)) + " -> datetime.date")
raise TypeError("Unsupported conversion: " + str(type(dt)) + " -> datetime.date")
except TypeError as e:
raise e
except Exception as e:
raise DHError(e) from e

Expand All @@ -554,6 +580,9 @@ def to_time(dt: Union[None, LocalTime, ZonedDateTime]) -> Optional[datetime.time

Returns:
datetime.time

Raises:
DHError, TypeError
"""
try:
if dt is None:
Expand All @@ -563,7 +592,9 @@ def to_time(dt: Union[None, LocalTime, ZonedDateTime]) -> Optional[datetime.time
elif isinstance(dt, ZonedDateTime.j_type):
return datetime.time(dt.getHour(), dt.getMinute(), dt.getSecond(), dt.getNano() // _nanos_per_micro)
else:
raise Exception("Unsupported conversion: " + str(type(dt)) + " -> datetime.time")
raise TypeError("Unsupported conversion: " + str(type(dt)) + " -> datetime.time")
except TypeError as e:
raise e
except Exception as e:
raise DHError(e) from e

Expand All @@ -578,6 +609,9 @@ def to_datetime(dt: Union[None, Instant, ZonedDateTime]) -> Optional[datetime.da

Returns:
datetime.datetime

Raises:
DHError, TypeError
"""
try:
if dt is None:
Expand All @@ -589,7 +623,9 @@ def to_datetime(dt: Union[None, Instant, ZonedDateTime]) -> Optional[datetime.da
ts = dt.toEpochSecond() + (dt.getNano() / _nanos_per_second)
return datetime.datetime.fromtimestamp(ts)
else:
raise Exception("Unsupported conversion: " + str(type(dt)) + " -> datetime.datetime")
raise TypeError("Unsupported conversion: " + str(type(dt)) + " -> datetime.datetime")
except TypeError as e:
raise e
except Exception as e:
raise DHError(e) from e

Expand All @@ -604,6 +640,9 @@ def to_pd_timestamp(dt: Union[None, Instant, ZonedDateTime]) -> Optional[pandas.

Returns:
pandas.Timestamp

Raises:
DHError, TypeError
"""
try:
if dt is None:
Expand All @@ -612,7 +651,9 @@ def to_pd_timestamp(dt: Union[None, Instant, ZonedDateTime]) -> Optional[pandas.
ts = _JDateTimeUtils.epochNanos(dt)
return pandas.Timestamp(ts_input=ts, unit='ns')
else:
raise Exception("Unsupported conversion: " + str(type(dt)) + " -> pandas.Timestamp")
raise TypeError("Unsupported conversion: " + str(type(dt)) + " -> pandas.Timestamp")
except TypeError as e:
raise e
except Exception as e:
raise DHError(e) from e

Expand All @@ -629,7 +670,7 @@ def to_np_datetime64(dt: Union[None, Instant, ZonedDateTime]) -> Optional[numpy.
numpy.datetime64

Raises:
DHError
DHError, TypeError
"""
try:
if dt is None:
Expand All @@ -641,7 +682,9 @@ def to_np_datetime64(dt: Union[None, Instant, ZonedDateTime]) -> Optional[numpy.
ts = dt.toEpochSecond() * _nanos_per_second + dt.getNano()
return numpy.datetime64(ts, 'ns')
else:
raise Exception("Unsupported conversion: " + str(type(dt)) + " -> datetime.datetime")
raise TypeError("Unsupported conversion: " + str(type(dt)) + " -> datetime.datetime")
except TypeError as e:
raise e
except Exception as e:
raise DHError(e) from e

Expand All @@ -655,6 +698,9 @@ def to_timedelta(dt: Union[None, Duration]) -> Optional[datetime.timedelta]:

Returns:
datetime.timedelta

Raises:
DHError, TypeError, ValueError
"""
try:
if dt is None:
Expand All @@ -667,12 +713,16 @@ def to_timedelta(dt: Union[None, Duration]) -> Optional[datetime.timedelta]:
d = dt.getDays()

if y or m:
raise Exception("Unsupported conversion: " + str(type(dt)) +
raise ValueError("Unsupported conversion: " + str(type(dt)) +
" -> datetime.timedelta: Periods must only be days or weeks")

return datetime.timedelta(days=d)
else:
raise Exception("Unsupported conversion: " + str(type(dt)) + " -> datetime.timedelta")
raise TypeError("Unsupported conversion: " + str(type(dt)) + " -> datetime.timedelta")
except ValueError as e:
raise e
except TypeError as e:
raise e
except Exception as e:
raise DHError(e) from e

Expand All @@ -686,6 +736,9 @@ def to_pd_timedelta(dt: Union[None, Duration]) -> Optional[pandas.Timedelta]:

Returns:
pandas.Timedelta

Raises:
DHError, TypeError, ValueError
"""
try:
if dt is None:
Expand All @@ -699,12 +752,16 @@ def to_pd_timedelta(dt: Union[None, Duration]) -> Optional[pandas.Timedelta]:
d = dt.getDays()

if y or m:
raise Exception("Unsupported conversion: " + str(type(dt)) +
raise ValueError("Unsupported conversion: " + str(type(dt)) +
" -> datetime.timedelta: Periods must only be days or weeks")

return pandas.Timedelta(days=d)
else:
raise Exception("Unsupported conversion: " + str(type(dt)) + " -> pandas.Timedelta")
raise TypeError("Unsupported conversion: " + str(type(dt)) + " -> pandas.Timedelta")
except ValueError as e:
raise e
except TypeError as e:
raise e
except Exception as e:
raise DHError(e) from e

Expand All @@ -720,7 +777,7 @@ def to_np_timedelta64(dt: Union[None, Duration, Period]) -> Optional[numpy.timed
numpy.timedelta64

Raises:
DHError
DHError, TypeError, ValueError
"""
try:
if dt is None:
Expand All @@ -737,7 +794,7 @@ def to_np_timedelta64(dt: Union[None, Duration, Period]) -> Optional[numpy.timed
if count == 0:
return numpy.timedelta64(0, 'D')
elif count > 1:
raise Exception("Unsupported conversion: " + str(type(dt)) +
raise ValueError("Unsupported conversion: " + str(type(dt)) +
" -> datetime.timedelta64: Periods must be days, months, or years")
elif y:
return numpy.timedelta64(y, 'Y')
Expand All @@ -746,9 +803,13 @@ def to_np_timedelta64(dt: Union[None, Duration, Period]) -> Optional[numpy.timed
elif d:
return numpy.timedelta64(d, 'D')
else:
raise Exception("Unsupported conversion: " + str(type(dt)) + " -> datetime.timedelta64: (" + dt + ")")
raise ValueError("Unsupported conversion: " + str(type(dt)) + " -> datetime.timedelta64: (" + dt + ")")
else:
raise Exception("Unsupported conversion: " + str(type(dt)) + " -> datetime.timedelta64")
raise TypeError("Unsupported conversion: " + str(type(dt)) + " -> datetime.timedelta64")
except ValueError as e:
raise e
except TypeError as e:
raise e
except Exception as e:
raise DHError(e) from e

Expand Down
2 changes: 1 addition & 1 deletion py/server/tests/test_column.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ def test_column_error(self):
with self.assertRaises(DHError) as cm:
_ = string_col(name="String", data=[1, -1.01])

with self.assertRaises(DHError) as cm:
with self.assertRaises(TypeError) as cm:
_ = datetime_col(name="Datetime", data=[round(time.time()), False])

with self.assertRaises(DHError) as cm:
Expand Down
Loading