Val, agreed.
Let's add length(), value(index), and Iterable to the Tuple interface.

I've updated the ticket: https://issues.apache.org/jira/browse/IGNITE-14342

On Wed, Jun 30, 2021 at 11:17 PM Valentin Kulichenko <
valentin.kuliche...@gmail.com> wrote:

> Pavel,
>
> Thanks for your response, makes sense.
>
> Regarding the values() method: I would instead add the required methods to
> the Tuple itself. E.g., it can implement Iterable, and additionally have
> the value(int index) method, plus anything else that we might need.
> I don't like returning a collection, because in Java it's a much wider API.
> We will end up returning an implementation that throws
> UnsupportedOperationException for most of the methods. I know this approach
> is not uncommon in the Java world, but this doesn't make it good.
> In .NET and other languages, we can use other abstractions, of course.
> Every platform has its own specifics and practices, so APIs don't have to
> be identical.
>
> -Val
>
> On Wed, Jun 30, 2021 at 7:44 AM Pavel Tupitsyn <ptupit...@apache.org>
> wrote:
>
> > Hi Andrey,
> >
> > > This will force us to bother about interfaces/contracts and
> compatibility
> > > aspects in the future
> >
> > Schemas and versions are part of thin client wire protocol.
> > This protocol is a public API - we'll have to care about compatibility
> > anyway.
> >
> > Schema evolution is an important feature that users should understand.
> > I see no reason to hide it from the API.
> >
> >
> > > We already have a ticket [1]...
> > > Will 'idx -> column' mapping only be enough for your purposes?
> >
> > The ticket sounds reasonable, but there are no API details.
> > At the very least we need public access to column names, types, and
> > indexes.
> > I propose something like this:
> >
> > interface Tuple {
> >     TupleSchema getSchema();
> > }
> >
> > class TupleSchema {
> >     int getVersion();
> >     List<TupleSchemaColumn> getColumns();
> > }
> >
> > class TupleSchemaColumn {
> >     int index;
> >     String name;
> >     String typeName;
> >     bool isKey;
> > }
> >
> > On Wed, Jun 30, 2021 at 11:05 AM Andrey Mashenkov <
> > andrey.mashen...@gmail.com> wrote:
> >
> > > Hi Pavel,
> > >
> > > 2. Schema and its version are internal things and shouldn't be exposed,
> > > otherwise, eventually, it will lead to the user will manage schemas
> > > manually on his side for some purposes.
> > > This will force us to bother about interfaces/contracts and
> compatibility
> > > aspects in the future with uncertain benefits for a user.
> > >
> > > As SchemaDescriptor is an internal API and the user expects a public
> API.
> > > I don't think we want to convert the descriptor back into public API
> > terms
> > > and it may be impossible for some data.
> > >
> > > We already have a ticket [1] to support accessing a column by an index
> > and
> > > exposing some metadata.
> > > Will 'idx -> column' mapping only be enough for your purposes?
> > >
> > > > int Tuple.columnIndex(String)
> > >
> > >
> > >
> > >  [1] https://issues.apache.org/jira/browse/IGNITE-14342
> > >
> > > On Wed, Jun 30, 2021 at 9:34 AM Pavel Tupitsyn <ptupit...@apache.org>
> > > wrote:
> > >
> > > > Hi Val,
> > > >
> > > > Thanks for the comments, please see below:
> > > >
> > > >
> > > > > Users will identify tables using names, they will never use IDs
> > > >
> > > > Ok, let's keep it this way.
> > > >
> > > >
> > > > > Sounds like the Tuple should implement Iterable.
> > > >
> > > > I don't think Iterable is enough.
> > > > We should have a way to get values by column index: Tuple.value(int
> > > index),
> > > > where index is according to column order in schema.
> > > >
> > > > Combined with Tuple.schema(), it will provide an efficient way to
> > consume
> > > > data -
> > > > users will be able to read columns in any order, skip some of them,
> > etc.
> > > >
> > > > This is a common pattern in APIs like ODBC or System.Data [1],
> > > > which we'll need to implement on top of our thin clients later.
> > > >
> > > >
> > > > > However, whether a user might
> > > > > need to get a table schema for a particular version, I'm not sure.
> Do
> > > you
> > > > > have a use case in mind for this? If not, I would keep this
> internal
> > > >
> > > > Ok, we can keep the Table.schema(ver) method internal, as long as
> > > > Table.schemas() is public and includes schema versions.
> > > >
> > > >
> > > > > We already have async counterparts for all the methods where this
> is
> > > > applicable
> > > >
> > > > IgniteTables.createTable(), dropTable(), tables(), table() do not
> have
> > > > async counterparts,
> > > > while internally they perform blocking wait on some futures.
> > > >
> > > >
> > > > [1]
> > > >
> > > >
> > >
> >
> https://docs.microsoft.com/en-us/dotnet/api/system.data.idatareader?view=net-5.0
> > > >
> > > > On Wed, Jun 30, 2021 at 4:51 AM Valentin Kulichenko <
> > > > valentin.kuliche...@gmail.com> wrote:
> > > >
> > > > > Hi Pavel,
> > > > >
> > > > > Please see my comments below.
> > > > >
> > > > > -Val
> > > > >
> > > > > On Tue, Jun 29, 2021 at 2:23 PM Pavel Tupitsyn <
> ptupit...@apache.org
> > >
> > > > > wrote:
> > > > >
> > > > > > Igniters,
> > > > > >
> > > > > > While working on "IEP-76 Thin Client Protocol for Ignite 3.0" [1]
> > (to
> > > > be
> > > > > > discussed separately), the following suggestions for the Table
> API
> > > came
> > > > > up:
> > > > > >
> > > > > > 1. Expose table IDs: sending table name with every operation
> (e.g.
> > > GET)
> > > > > is
> > > > > > inefficient, string serialization is expensive by itself and
> names
> > > can
> > > > be
> > > > > > long.
> > > > > >     - Table.id()
> > > > > >     - IgniteTables.table(UUID)
> > > > > >     - IgniteTables.dropTable(UUID)
> > > > > >
> > > > >
> > > > > I don't think this should be a part of the public API. Users will
> > > > identify
> > > > > tables using names, they will never use IDs. As an internal
> > > optimization
> > > > > though - sure, we can have that. Sounds similar to the cache ID in
> > 2.x.
> > > > >
> > > > >
> > > > > >
> > > > > > 2. Expose tuple schemas: to reduce payload size when sending
> tuples
> > > to
> > > > > the
> > > > > > client, we'll write only the schema version and column values,
> then
> > > the
> > > > > > client can retrieve and cache schemas (ordered set of columns per
> > > > > version).
> > > > > >     - Tuple.schema()
> > > > > >     - Table.schemas()
> > > > > >     - Table.schema(ver)
> > > > > >
> > > > >
> > > > > Exposing the schema of a tuple makes sense. However, whether a user
> > > might
> > > > > need to get a table schema for a particular version, I'm not sure.
> Do
> > > you
> > > > > have a use case in mind for this? If not, I would keep this
> internal
> > as
> > > > > well.
> > > > >
> > > > >
> > > > > >
> > > > > > 3. Expose tuple values as a collection: to serialize tuples
> > > efficiently
> > > > > > (see p2) we need an API to get all values at once. Right now the
> > only
> > > > API
> > > > > > is to get values by column name, which involves a HashMap lookup
> on
> > > > every
> > > > > > call.
> > > > > >     - Tuple.values()
> > > > > >
> > > > >
> > > > > Sounds like the Tuple should implement Iterable.
> > > > >
> > > > >
> > > > > >
> > > > > > 4. Simplify createTable API: use POJO-based configuration.
> > > > > >     Creating a Consumer when some properties are optional seems
> to
> > be
> > > > > > non-trivial.
> > > > > >
> > > > >
> > > > > Yes, it's currently convoluted for sure. To my knowledge, there are
> > > plans
> > > > > to improve this, but I will let other folks chime in with more
> > details.
> > > > >
> > > > >
> > > > > >
> > > > > > 5. Add async methods to IgniteTables API (all methods are async
> > > inside
> > > > > > anyway)
> > > > > >
> > > > >
> > > > > We already have async counterparts for all the methods where this
> is
> > > > > applicable. E.g., for TableView#get, there is TableView#getAsync.
> Is
> > > > there
> > > > > anything else that you propose to add?
> > > > >
> > > > >
> > > > > >
> > > > > >
> > > > > > Thoughts, objections?
> > > > > >
> > > > > >
> > > > > > [1]
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> https://cwiki.apache.org/confluence/display/IGNITE/IEP-76+Thin+Client+Protocol+for+Ignite+3.0
> > > > > >
> > > > > > [2]
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> https://cwiki.apache.org/confluence/display/IGNITE/IEP-54%3A+Schema-first+Approach
> > > > > >
> > > > >
> > > >
> > >
> > >
> > > --
> > > Best regards,
> > > Andrey V. Mashenkov
> > >
> >
>

Reply via email to