[Tarantool-patches] [PATCH resend v2 08/11] lua, datetime: calculated attributes for datetimes
Oleg Babin
olegrok at tarantool.org
Sat Jul 31 09:31:03 MSK 2021
Thanks for your reply. See my comment below.
On 31.07.2021 01:30, Timur Safin wrote:
> Hello Oleg again!
>
> :
> :
> : On 28.07.2021 13:34, Timur Safin via Tarantool-patches wrote:
> : > * introduced a set of calculated attributes to data object, e.g.:
> : > - timestamp, seconds, microseconds, minute, or hours
> : >
> : > Part of #5941
> : > ---
> : > src/lua/datetime.lua | 51 ++++++++++++++++++++++------------
> : > test/app-tap/datetime.test.lua | 17 +++++++++++-
> : > 2 files changed, 50 insertions(+), 18 deletions(-)
> : >
> : > diff --git a/src/lua/datetime.lua b/src/lua/datetime.lua
> : > index 9ec06d8d8..7a208cef9 100644
> : > --- a/src/lua/datetime.lua
> : > +++ b/src/lua/datetime.lua
> : > @@ -224,6 +224,36 @@ local function interval_serialize(self)
> : > return { secs = self.secs, nsec = self.nsec }
> : > end
> : >
> : > +local datetime_index = function(self, key)
> : > + local attributes = {
> :
> : This change looks like pessimization because currently we need to
> : recreate "attributes" table
> :
> : for each function call. I suggest to use `attributes` as `__index` but
> : not such function.
>
> What would you say if I simply precache this attributes table in local,
> and then proceed this way?
> -----------------------------------------
> -local datetime_index = function(self, key)
> - local attributes = {
> +local datetime_index_handlers = {
> unixtime = function(self)
> return self.secs
> end,
> +
> timestamp = function(self)
> return tonumber(self.secs) + self.nsec / 1e9
> end,
> +
> nanoseconds = function(self)
> return self.secs * 1e9 + self.nsec
> end,
> +
> microseconds = function(self)
> return self.secs * 1e6 + self.nsec / 1e3
> end,
> +
> milliseconds = function(self)
> return self.secs * 1e3 + self.nsec / 1e6
> end,
> +
> seconds = function(self)
> return tonumber(self.secs) + self.nsec / 1e9
> end,
> +
> minutes = function(self)
> return (tonumber(self.secs) + self.nsec / 1e9) / 60
> end,
> +
> hours = function(self)
> return (tonumber(self.secs) + self.nsec / 1e9) / (60 * 60)
> end,
> +
> days = function(self)
> return (tonumber(self.secs) + self.nsec / 1e9) / (60 * 60) / 24
> end,
> +
> add = function(self)
> return function(self, o)
> return interval_increment(self, o, 1)
> end
> end,
> +
> sub = function(self)
> return function(self, o)
> return interval_increment(self, o, -1)
> end
> end,
> }
> - return attributes[key] ~= nil and attributes[key](self) or nil
> +
> +local datetime_index = function(self, key)
> + return datetime_index_handlers[key] ~= nil and
> + datetime_index_handlers[key](self) or nil
> end
> -----------------------------------------
>
> I mean we still carefully check existence of an asked key, and return nil if
> there is no such key at all. Is it much different than what you've meant?
>
It's again about temporary tables. I gave a benchmark in one of the
previous emails.
After changes it shoud be better. Thanks.
More information about the Tarantool-patches
mailing list