Tarantool development patches archive
 help / color / mirror / Atom feed
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


  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