From: Timur Safin via Tarantool-patches <tarantool-patches@dev.tarantool.org> To: "'Serge Petrenko'" <sergepetrenko@tarantool.org>, <v.shpilevoy@tarantool.org>, <olegrok@tarantool.org> Cc: <tarantool-patches@dev.tarantool.org> Subject: Re: [Tarantool-patches] [PATCH v3 6/9] box, datetime: datetime comparison for indices Date: Tue, 3 Aug 2021 15:59:44 +0300 [thread overview] Message-ID: <0e7001d78867$6eb23220$4c169660$@tarantool.org> (raw) In-Reply-To: <588cd867-94bf-f470-c99a-593ae589247b@tarantool.org> > From: Serge Petrenko <sergepetrenko@tarantool.org> > Subject: Re: [Tarantool-patches] [PATCH v3 6/9] box, datetime: datetime > comparison for indices > > > > 02.08.2021 03:41, Timur Safin via Tarantool-patches пишет: > > * storage hints implemented for datetime_t values; > > * proper comparison for indices of datetime type. > > > > Part of #5941 > > Part of #5946 > > Hi! Thanks for the patch! > > Please find 2 comments below. > ... > > @@ -1538,6 +1540,21 @@ func_index_compare_with_key(struct tuple *tuple, > hint_t tuple_hint, > > #define HINT_VALUE_DOUBLE_MAX (exp2(HINT_VALUE_BITS - 1) - 1) > > #define HINT_VALUE_DOUBLE_MIN (-exp2(HINT_VALUE_BITS - 1)) > > > > +/** > > + * We need to squeeze 64 bits of seconds and 32 bits of nanoseconds > > + * into 60 bits of hint value. The idea is to represent wide enough > > + * years range, and leave the rest of bits occupied from nanoseconds > part: > > + * - 36 bits is enough for time range of [208BC..4147] > > + * - for nanoseconds there is left 24 bits, which are MSB part of > > + * 32-bit value > > + */ > > +#define HINT_VALUE_SECS_BITS 36 > > +#define HINT_VALUE_NSEC_BITS (HINT_VALUE_BITS - HINT_VALUE_SECS_BITS) > > +#define HINT_VALUE_SECS_MAX ((1LL << HINT_VALUE_SECS_BITS) - 1) > > +#define HINT_VALUE_SECS_MIN (-(1LL << HINT_VALUE_SECS_BITS)) > > +#define HINT_VALUE_NSEC_SHIFT (sizeof(int) * CHAR_BIT - > HINT_VALUE_NSEC_BITS) > > +#define HINT_VALUE_NSEC_MAX ((1ULL << HINT_VALUE_NSEC_BITS) - 1) > > + > > /* > > * HINT_CLASS_BITS should be big enough to store any mp_class value. > > * Note, ((1 << HINT_CLASS_BITS) - 1) is reserved for HINT_NONE. > > @@ -1630,6 +1647,24 @@ hint_uuid_raw(const char *data) > > return hint_create(MP_CLASS_UUID, val); > > } > > > > +static inline hint_t > > +hint_datetime(struct datetime_t *date) > > +{ > > + /* > > + * Use at most HINT_VALUE_SECS_BITS from datetime > > + * seconds field as a hint value, and at MSB part > > + * of HINT_VALUE_NSEC_BITS from nanoseconds. > > + */ > > + int64_t secs = date->secs; > > + int32_t nsec = date->nsec; > > + uint64_t val = secs <= HINT_VALUE_SECS_MIN ? 0 : > > + secs - HINT_VALUE_SECS_MIN; > > + val &= HINT_VALUE_SECS_MAX; > > + val <<= HINT_VALUE_NSEC_BITS; > > + val |= (nsec >> HINT_VALUE_NSEC_SHIFT) & HINT_VALUE_NSEC_MAX; > > + return hint_create(MP_CLASS_DATETIME, val); > > +} > > + > I like the idea with having hints for some "near" dates. > > You just need to assign the same HINT_VALUE_MAX hint to every datetime value > with date->secs >= HINT_VALUE_SECS_MAX. Otherwise the comparison would > make mistakes (judging by hint values only) for such far away dates. Yes, thanks for the note, will make sure that values which exceed selected 36-bit will stick to the maximum value. > > > static inline uint64_t > > hint_str_raw(const char *s, uint32_t len) > > { > > @@ -1812,6 +1858,11 @@ field_hint_scalar(const char *field, struct coll > *coll) > > } > > case MP_UUID: > > return hint_uuid_raw(field); > > + case MP_DATETIME: > > + { > > + struct datetime_t date; > > + return hint_datetime(datetime_unpack(&field, len, &date)); > > + } > > But you don't allow datetime in SCALAR fields, as I see in the previous > commit. > So you don't need to account for datetime in scalar hints. That's bug - every type is scalar type, unless it's collection (map or array) so datetime should be considered as scalar. That was oversight if not. Thanks! > > > default: > > unreachable(); > > } > -- > Serge Petrenko Thanks, Timur
next prev parent reply other threads:[~2021-08-03 12:59 UTC|newest] Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-08-02 0:40 [Tarantool-patches] [PATCH v3 0/9] Initial datetime support Timur Safin via Tarantool-patches 2021-08-02 0:40 ` [Tarantool-patches] [PATCH v3 1/9] build: add Christian Hansen c-dt to the build Timur Safin via Tarantool-patches 2021-08-04 23:58 ` Vladislav Shpilevoy via Tarantool-patches 2021-08-05 8:55 ` Safin Timur via Tarantool-patches 2021-08-08 14:34 ` Vladislav Shpilevoy via Tarantool-patches 2021-08-02 0:40 ` [Tarantool-patches] [PATCH v3 2/9] lua: built-in module datetime Timur Safin via Tarantool-patches 2021-08-04 23:58 ` Vladislav Shpilevoy via Tarantool-patches 2021-08-06 0:23 ` Safin Timur via Tarantool-patches 2021-08-06 1:30 ` Oleg Babin via Tarantool-patches 2021-08-06 13:00 ` Safin Timur via Tarantool-patches 2021-08-06 17:24 ` Safin Timur via Tarantool-patches 2021-08-08 11:26 ` Vladislav Shpilevoy via Tarantool-patches 2021-08-08 16:35 ` Safin Timur via Tarantool-patches 2021-08-10 12:20 ` Vladislav Shpilevoy via Tarantool-patches 2021-08-10 12:21 ` Igor Munkin via Tarantool-patches 2021-08-12 20:47 ` Safin Timur via Tarantool-patches 2021-08-15 20:52 ` Safin Timur via Tarantool-patches 2021-08-06 0:26 ` Safin Timur via Tarantool-patches 2021-08-08 14:34 ` Vladislav Shpilevoy via Tarantool-patches 2021-08-08 16:47 ` Safin Timur via Tarantool-patches 2021-08-02 0:40 ` [Tarantool-patches] [PATCH v3 3/9] lua, datetime: datetime tests Timur Safin via Tarantool-patches 2021-08-06 0:25 ` Safin Timur via Tarantool-patches 2021-08-02 0:41 ` [Tarantool-patches] [PATCH v3 4/9] lua, datetime: display datetime Timur Safin via Tarantool-patches 2021-08-02 0:41 ` [Tarantool-patches] [PATCH v3 5/9] box, datetime: messagepack support for datetime Timur Safin via Tarantool-patches 2021-08-03 13:38 ` Timur Safin via Tarantool-patches 2021-08-02 0:41 ` [Tarantool-patches] [PATCH v3 6/9] box, datetime: datetime comparison for indices Timur Safin via Tarantool-patches 2021-08-03 12:02 ` Serge Petrenko via Tarantool-patches 2021-08-03 12:59 ` Timur Safin via Tarantool-patches [this message] 2021-08-04 10:12 ` Timur Safin via Tarantool-patches 2021-08-02 0:41 ` [Tarantool-patches] [PATCH v3 7/9] lua, datetime: time intervals support Timur Safin via Tarantool-patches 2021-08-02 0:41 ` [Tarantool-patches] [PATCH v3 8/9] datetime: changelog for datetime module Timur Safin via Tarantool-patches 2021-08-02 0:41 ` [Tarantool-patches] [PATCH v3 9/9] lua, box, datetime: rename struct datetime_t Timur Safin via Tarantool-patches 2021-08-06 0:27 ` Safin Timur via Tarantool-patches 2021-08-03 21:23 ` [Tarantool-patches] [PATCH v3 1/2] datetime: update tests for macosx Timur Safin via Tarantool-patches 2021-08-06 0:28 ` Safin Timur via Tarantool-patches 2021-08-03 21:23 ` [Tarantool-patches] [PATCH v3 2/2] lua, datetime: introduce ctime, strftime wrappers Timur Safin via Tarantool-patches 2021-08-06 0:30 ` Safin Timur via Tarantool-patches 2021-08-03 21:26 ` [Tarantool-patches] [PATCH v3 0/9] Initial datetime support Timur Safin via Tarantool-patches
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to='0e7001d78867$6eb23220$4c169660$@tarantool.org' \ --to=tarantool-patches@dev.tarantool.org \ --cc=olegrok@tarantool.org \ --cc=sergepetrenko@tarantool.org \ --cc=tsafin@tarantool.org \ --cc=v.shpilevoy@tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH v3 6/9] box, datetime: datetime comparison for indices' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox