I have pushed "zero" version of JDBC updates support, currently
without batching (working on it).
Sergi, also to make you happy here's another doc with changes to
public API: http://goo.gl/FvGKUs

- Alex

2016-08-01 20:06 GMT+03:00 Sergi Vladykin <sergi.vlady...@gmail.com>:
> Ok, I think you don't really understand what public API really is, so let
> me clarify. What you have described are all internal classes, public API is
> what end user will see and work with, like Ignite, IgniteCache,
> QueryCursor, etc... All the internal changes do not require any special
> discussion, until they are really complex or big or important, so you think
> it makes sense to notify everyone about them.
>
> Here we should not have any public API changes for now and I don't see any
> in your doc, so it looks fine to me.
>
> The only possible issue I see is origKeyClass and origValueClass. These
> classes can be unavailable on nodes and most of the time we will have to
> work with binary format. Please make sure that this case is correctly
> handled.
>
> Sergi
>
> 2016-08-01 18:14 GMT+03:00 Alexander Paschenko <
> alexander.a.pasche...@gmail.com>:
>
>> Guys,
>>
>> Here's documented version of current API changes - it's quite modest
>> https://goo.gl/Y6Cv1b
>>
>> - Alex
>>
>> 2016-07-28 20:34 GMT+03:00 Alexander Paschenko
>> <alexander.a.pasche...@gmail.com>:
>> > Sergi,
>> >
>> > OK, I've done it as you said, thanks.
>> > Now working on binary marshaller support.
>> >
>> > - Alex
>> >
>> > 2016-07-28 9:08 GMT+03:00 Sergi Vladykin <sergi.vlady...@gmail.com>:
>> >> I had a quick look at the PR.
>> >>
>> >> I don't like this @QueryCacheKey and setKeyProp method on public API.
>> They
>> >> solve nothing but add complexity and make key to be stored twice in
>> cache,
>> >> which is wrong. Please remove this.
>> >>
>> >> If you want to do some public API changes you have to discuss them
>> publicly
>> >> before implementing them, ok?
>> >>
>> >> I did not look deeper yet, lets fix the obvious issue first.
>> >>
>> >> Sergi
>> >>
>> >> 2016-07-27 21:44 GMT+03:00 Alexander Paschenko <
>> >> alexander.a.pasche...@gmail.com>:
>> >>
>> >>> Sergi,
>> >>>
>> >>> I've made changes to the API according to your valuable
>> >>> recommendations, thank you very much for giving them. Please refer to
>> >>> PR to see current state of the work.
>> >>> Will surely look into ODBC, .NET and Visor. Though they will most
>> >>> likely have to support a new feature rather than considerably change
>> >>> existing logic.
>> >>>
>> >>> - Alex
>> >>>
>> >>> 2016-07-27 14:23 GMT+03:00 Sergi Vladykin <sergi.vlady...@gmail.com>:
>> >>> > Please don't forget about ODBC, .NET and Visor. They all have to
>> work in
>> >>> > the same way.
>> >>> >
>> >>> > Sergi
>> >>> >
>> >>> > 2016-07-27 14:15 GMT+03:00 Alexander Paschenko <
>> >>> > alexander.a.pasche...@gmail.com>:
>> >>> >
>> >>> >> OK, I've found that bold cast to QueryCursor<R> in IgniteCacheProxy
>> >>> >> and had a look at how SqlFieldsQuery is used in JDBC driver. Thanks.
>> >>> >>
>> >>> >> - Alex
>> >>> >>
>> >>> >> 2016-07-27 13:02 GMT+03:00 Sergi Vladykin <sergi.vlady...@gmail.com
>> >:
>> >>> >> > Where did you see R in SqlFieldsQuery?
>> >>> >> >
>> >>> >> > Sergi
>> >>> >> >
>> >>> >> > 2016-07-27 12:59 GMT+03:00 Alexander Paschenko <
>> >>> >> > alexander.a.pasche...@gmail.com>:
>> >>> >> >
>> >>> >> >> Sergi,
>> >>> >> >>
>> >>> >> >> But current signature of query() method returns not just some
>> >>> >> >> iterator, but rather iterator of R which is type param of Query -
>> >>> >> >> i.e., we won't be able to return an int inside a QueryCursor<R>.
>> At
>> >>> >> >> least without API change (signature of query() method will have
>> to be
>> >>> >> >> changed to drop genericness, or in some other weird way). Is this
>> >>> what
>> >>> >> >> we really want? Or am I missing something in your point?
>> >>> >> >>
>> >>> >> >> - Alex
>> >>> >> >>
>> >>> >> >> 2016-07-27 12:51 GMT+03:00 Sergi Vladykin <
>> sergi.vlady...@gmail.com
>> >>> >:
>> >>> >> >> > Exactly. This will allow our Jdbc driver to work transparently.
>> >>> >> >> >
>> >>> >> >> > Sergi
>> >>> >> >> >
>> >>> >> >> > 2016-07-27 12:40 GMT+03:00 Alexander Paschenko <
>> >>> >> >> > alexander.a.pasche...@gmail.com>:
>> >>> >> >> >
>> >>> >> >> >> Sergi,
>> >>> >> >> >>
>> >>> >> >> >> You wrote:
>> >>> >> >> >> > I'd prefer to return the same information, so it will not be
>> >>> empty
>> >>> >> >> >>
>> >>> >> >> >> Do you mean return iterator with single element that denotes
>> >>> number
>> >>> >> of
>> >>> >> >> >> rows?
>> >>> >> >> >>
>> >>> >> >> >> Dmitriy,
>> >>> >> >> >>
>> >>> >> >> >> You wrote:
>> >>> >> >> >> > What is the ticket number for this. Is the new API
>> documented
>> >>> >> there?
>> >>> >> >> >>
>> >>> >> >> >> Overall issue number is 2294. There's no particular issue on
>> API
>> >>> >> >> >> changes, but creating one seems to be a good idea, I will do
>> it.
>> >>> >> >> >>
>> >>> >> >> >> - Alex
>> >>> >> >> >>
>> >>> >> >> >> 2016-07-27 9:20 GMT+03:00 Dmitriy Setrakyan <
>> >>> dsetrak...@apache.org>:
>> >>> >> >> >> > What is the ticket number for this. Is the new API
>> documented
>> >>> >> there?
>> >>> >> >> >> >
>> >>> >> >> >> > On Tue, Jul 26, 2016 at 11:36 AM, Sergi Vladykin <
>> >>> >> >> >> sergi.vlady...@gmail.com>
>> >>> >> >> >> > wrote:
>> >>> >> >> >> >
>> >>> >> >> >> >> I don't see anything ugly in empty iterator, sorry if I
>> >>> insulted
>> >>> >> your
>> >>> >> >> >> taste
>> >>> >> >> >> >> of beauty.
>> >>> >> >> >> >>
>> >>> >> >> >> >> If you will take a look at Jdbc, you will see that
>> >>> >> >> >> Statement.executeUpdate
>> >>> >> >> >> >> method returns number of updated rows, I'd prefer to
>> return the
>> >>> >> same
>> >>> >> >> >> >> information, so it will not be empty (beauty is restored!).
>> >>> >> >> >> >>
>> >>> >> >> >> >> Sergi
>> >>> >> >> >> >>
>> >>> >> >> >> >>
>> >>> >> >> >> >>
>> >>> >> >> >> >> 2016-07-26 18:24 GMT+03:00 Alexander Paschenko <
>> >>> >> >> >> >> alexander.a.pasche...@gmail.com>:
>> >>> >> >> >> >>
>> >>> >> >> >> >> > I see your point. But what about my concerns from initial
>> >>> post?
>> >>> >> >> >> >> > Particularly about signatures of existing methods? I
>> >>> personally
>> >>> >> >> don't
>> >>> >> >> >> >> > like an option of query() method always returning an
>> empty
>> >>> >> iterator
>> >>> >> >> >> >> > for any non-select query, it seems ugly design wise.
>> >>> >> >> >> >> >
>> >>> >> >> >> >> > - Alex
>> >>> >> >> >> >> >
>> >>> >> >> >> >> > 2016-07-26 18:15 GMT+03:00 Sergi Vladykin <
>> >>> >> >> sergi.vlady...@gmail.com>:
>> >>> >> >> >> >> > > BTW, the simplest way to solve this issue is to allow
>> >>> running
>> >>> >> SQL
>> >>> >> >> >> >> > commands
>> >>> >> >> >> >> > > inside of SqlFieldsQuery.
>> >>> >> >> >> >> > >
>> >>> >> >> >> >> > > We may add some additional convenience API for updates
>> if
>> >>> we
>> >>> >> >> want,
>> >>> >> >> >> but
>> >>> >> >> >> >> > JDBC
>> >>> >> >> >> >> > > client will always call it like this:
>> >>> >> >> >> >> > >
>> >>> >> >> >> >> > > cache.query(new SqlFieldsQuery("INSERT INTO MY_TABLE
>> >>> >> >> >> >> > > VALUES(?,?)").setArgs(1,2));
>> >>> >> >> >> >> > >
>> >>> >> >> >> >> > > This will resolve any ambiguity.
>> >>> >> >> >> >> > >
>> >>> >> >> >> >> > > Sergi
>> >>> >> >> >> >> > >
>> >>> >> >> >> >> > > 2016-07-26 17:56 GMT+03:00 Sergi Vladykin <
>> >>> >> >> sergi.vlady...@gmail.com
>> >>> >> >> >> >:
>> >>> >> >> >> >> > >
>> >>> >> >> >> >> > >> I don't like any pre-parsing, especially with some
>> >>> libraries
>> >>> >> >> other
>> >>> >> >> >> >> than
>> >>> >> >> >> >> > >> H2. H2 itself has enough quirks to multiply it on
>> quirks
>> >>> of
>> >>> >> >> another
>> >>> >> >> >> >> > library.
>> >>> >> >> >> >> > >>
>> >>> >> >> >> >> > >> This is exactly what I was talking about - we need
>> some
>> >>> >> single
>> >>> >> >> >> entry
>> >>> >> >> >> >> > point
>> >>> >> >> >> >> > >> on API for all the SQL commands and queries. Thats
>> why I
>> >>> >> >> suggested
>> >>> >> >> >> >> > >> SqlUpdate to extend Query. To me its is the cleanest
>> >>> >> approach.
>> >>> >> >> May
>> >>> >> >> >> be
>> >>> >> >> >> >> we
>> >>> >> >> >> >> > >> need to change in some backward compatible way this
>> Query
>> >>> >> >> >> hierarchy to
>> >>> >> >> >> >> > get
>> >>> >> >> >> >> > >> rid of extra methods but the idea is still the same.
>> >>> >> >> >> >> > >>
>> >>> >> >> >> >> > >> Sergi
>> >>> >> >> >> >> > >>
>> >>> >> >> >> >> > >> 2016-07-26 14:34 GMT+03:00 Alexander Paschenko <
>> >>> >> >> >> >> > >> alexander.a.pasche...@gmail.com>:
>> >>> >> >> >> >> > >>
>> >>> >> >> >> >> > >>> Guys,
>> >>> >> >> >> >> > >>>
>> >>> >> >> >> >> > >>> I would like to advance the discussion further.
>> There's
>> >>> one
>> >>> >> >> quite
>> >>> >> >> >> >> > >>> important question that arose based on current state
>> of
>> >>> >> work on
>> >>> >> >> >> this
>> >>> >> >> >> >> > >>> issue. If we use some kind of interactive console,
>> like
>> >>> >> Visor,
>> >>> >> >> >> then
>> >>> >> >> >> >> > >>> how should it know whether SQL query it is requested
>> to
>> >>> >> execute
>> >>> >> >> >> >> > >>> returns a result set or not? In JDBC world, solution
>> is
>> >>> >> quite
>> >>> >> >> >> simple
>> >>> >> >> >> >> -
>> >>> >> >> >> >> > >>> there's base interface called Statement that all
>> commands
>> >>> >> >> >> implement,
>> >>> >> >> >> >> > >>> and it has magic isResultSet method that tells
>> whether
>> >>> >> >> statement
>> >>> >> >> >> is a
>> >>> >> >> >> >> > >>> query or an update command. The API proposed now has
>> >>> >> separate
>> >>> >> >> >> Query
>> >>> >> >> >> >> > >>> and Update operations which I believe to be a right
>> >>> thing by
>> >>> >> >> the
>> >>> >> >> >> >> > >>> reasons I outlined in the beginning of this thread.
>> >>> However,
>> >>> >> >> their
>> >>> >> >> >> >> > >>> lack of common ancestor prevents possible console
>> clients
>> >>> >> from
>> >>> >> >> >> >> running
>> >>> >> >> >> >> > >>> text SQL commands in a fully transparent manner -
>> like
>> >>> >> >> >> >> > >>> IgniteCache.execute(String sql). Therefore I see two
>> >>> >> possible
>> >>> >> >> >> ways of
>> >>> >> >> >> >> > >>> solving this:
>> >>> >> >> >> >> > >>>
>> >>> >> >> >> >> > >>> - we change API so that it includes new class or
>> >>> interface
>> >>> >> >> >> parenting
>> >>> >> >> >> >> > >>> both Query and Update, and clients use it to
>> communicate
>> >>> >> with
>> >>> >> >> >> cache
>> >>> >> >> >> >> > >>> - we let (or make :) ) the client determine command
>> type
>> >>> >> >> >> >> independently
>> >>> >> >> >> >> > >>> and behave accordingly - for it to work it will have
>> some
>> >>> >> kind
>> >>> >> >> of
>> >>> >> >> >> >> > >>> command parsing by itself just to determine its type.
>> >>> Visor
>> >>> >> >> >> console
>> >>> >> >> >> >> > >>> may use simple library like JSqlParser
>> >>> >> >> >> >> > >>> (https://github.com/JSQLParser/JSqlParser; dual LGPL
>> >>> >> 2.1/ASF
>> >>> >> >> 2.0
>> >>> >> >> >> >> > >>> licensed) to determine request type in terms of
>> JDBC, and
>> >>> >> >> behave
>> >>> >> >> >> >> > >>> accordingly.
>> >>> >> >> >> >> > >>>
>> >>> >> >> >> >> > >>> Personally, I think that the second approach is
>> better -
>> >>> and
>> >>> >> >> >> here's
>> >>> >> >> >> >> > why.
>> >>> >> >> >> >> > >>>
>> >>> >> >> >> >> > >>> First, it does not seem wise to change API simply to
>> make
>> >>> >> >> console
>> >>> >> >> >> (or
>> >>> >> >> >> >> > >>> any other) clients simpler. Programmatic APIs should
>> be
>> >>> >> concise
>> >>> >> >> >> and
>> >>> >> >> >> >> > >>> short for programmatic use, console clients should be
>> >>> easy
>> >>> >> to
>> >>> >> >> use
>> >>> >> >> >> >> from
>> >>> >> >> >> >> > >>> console - and that's it: after all, console client
>> >>> exists to
>> >>> >> >> free
>> >>> >> >> >> a
>> >>> >> >> >> >> > >>> user from burden of doing things programmatically,
>> so its
>> >>> >> aim
>> >>> >> >> is
>> >>> >> >> >> to
>> >>> >> >> >> >> > >>> adapt API to console or whatever UI.
>> >>> >> >> >> >> > >>> Second, possible complications in client implied by
>> such
>> >>> >> >> approach
>> >>> >> >> >> >> > >>> certainly won't be dramatic - I don't think that
>> >>> additional
>> >>> >> >> single
>> >>> >> >> >> >> > >>> query parsing operation in client code will make it
>> much
>> >>> >> >> harder to
>> >>> >> >> >> >> > >>> develop.
>> >>> >> >> >> >> > >>> Third, as I see it now, adding a new "synthetic"
>> entity
>> >>> and
>> >>> >> new
>> >>> >> >> >> >> method
>> >>> >> >> >> >> > >>> would take more effort to adapting the client to new
>> API.
>> >>> >> >> >> >> > >>>
>> >>> >> >> >> >> > >>> Dmitry, Sergi, I would like to hear what you think
>> about
>> >>> it
>> >>> >> >> all.
>> >>> >> >> >> >> > Thanks.
>> >>> >> >> >> >> > >>>
>> >>> >> >> >> >> > >>> - Alex
>> >>> >> >> >> >> > >>>
>> >>> >> >> >> >> > >>> 2016-07-21 21:17 GMT+03:00 Dmitriy Setrakyan <
>> >>> >> >> >> dsetrak...@apache.org
>> >>> >> >> >> >> >:
>> >>> >> >> >> >> > >>> > OK, then using your analogy, the current behavior
>> in
>> >>> >> Ignite
>> >>> >> >> is
>> >>> >> >> >> >> MERGE
>> >>> >> >> >> >> > for
>> >>> >> >> >> >> > >>> > the most part.
>> >>> >> >> >> >> > >>> >
>> >>> >> >> >> >> > >>> > My preference is that Ignite SQL should work no
>> >>> different
>> >>> >> >> from
>> >>> >> >> >> >> > >>> traditional
>> >>> >> >> >> >> > >>> > databases, which means:
>> >>> >> >> >> >> > >>> >
>> >>> >> >> >> >> > >>> > - INSERT is translated into *putIfAbsent()* call in
>> >>> Ignite
>> >>> >> >> >> >> > >>> > - UPDATE is translated into *replace()* call in
>> Ignite
>> >>> >> >> >> >> > >>> > - MERGE is translated into *put()* call in Ignite
>> >>> >> >> >> >> > >>> > - For SQL BATCH calls we should delegate to Ignite
>> >>> batch
>> >>> >> >> >> >> operations,
>> >>> >> >> >> >> > >>> e.g.
>> >>> >> >> >> >> > >>> > *putAll()*
>> >>> >> >> >> >> > >>> >
>> >>> >> >> >> >> > >>> > The above should hold true for atomic and
>> transactional
>> >>> >> >> >> put/putAll
>> >>> >> >> >> >> > >>> calls,
>> >>> >> >> >> >> > >>> > as well as for the data streamer.
>> >>> >> >> >> >> > >>> >
>> >>> >> >> >> >> > >>> > Does this make sense?
>> >>> >> >> >> >> > >>> >
>> >>> >> >> >> >> > >>> > D.
>> >>> >> >> >> >> > >>> >
>> >>> >> >> >> >> > >>> > On Thu, Jul 21, 2016 at 4:06 AM, Sergi Vladykin <
>> >>> >> >> >> >> > >>> sergi.vlady...@gmail.com>
>> >>> >> >> >> >> > >>> > wrote:
>> >>> >> >> >> >> > >>> >
>> >>> >> >> >> >> > >>> >> No, this does not make sense.
>> >>> >> >> >> >> > >>> >>
>> >>> >> >> >> >> > >>> >> There is no upsert mode in databases. There are
>> >>> >> operations:
>> >>> >> >> >> >> INSERT,
>> >>> >> >> >> >> > >>> UPDATE,
>> >>> >> >> >> >> > >>> >> DELETE, MERGE.
>> >>> >> >> >> >> > >>> >>
>> >>> >> >> >> >> > >>> >> I want to have clear understanding of how they
>> have to
>> >>> >> >> behave
>> >>> >> >> >> in
>> >>> >> >> >> >> SQL
>> >>> >> >> >> >> > >>> >> databases and how they will actually behave in
>> Ignite
>> >>> in
>> >>> >> >> >> different
>> >>> >> >> >> >> > >>> >> scenarios. Also I want to have clear
>> understanding of
>> >>> >> >> >> performance
>> >>> >> >> >> >> > >>> >> implications of each decision here.
>> >>> >> >> >> >> > >>> >>
>> >>> >> >> >> >> > >>> >> Anything wrong with that?
>> >>> >> >> >> >> > >>> >>
>> >>> >> >> >> >> > >>> >> Sergi
>> >>> >> >> >> >> > >>> >>
>> >>> >> >> >> >> > >>> >> On Thu, Jul 21, 2016 at 1:04 PM, Dmitriy
>> Setrakyan <
>> >>> >> >> >> >> > >>> dsetrak...@apache.org>
>> >>> >> >> >> >> > >>> >> wrote:
>> >>> >> >> >> >> > >>> >>
>> >>> >> >> >> >> > >>> >> > Serj, are you asking what will happen as of
>> today?
>> >>> Then
>> >>> >> >> the
>> >>> >> >> >> >> answer
>> >>> >> >> >> >> > >>> to all
>> >>> >> >> >> >> > >>> >> > your questions is that duplicate keys are not an
>> >>> issue,
>> >>> >> >> and
>> >>> >> >> >> >> Ignite
>> >>> >> >> >> >> > >>> always
>> >>> >> >> >> >> > >>> >> > operates in **upsert** mode (which is
>> essentially a
>> >>> >> >> *“put(…)”
>> >>> >> >> >> >> > >>> *method).
>> >>> >> >> >> >> > >>> >> >
>> >>> >> >> >> >> > >>> >> > However, the *“insert”* that is suggested by
>> Alex
>> >>> would
>> >>> >> >> >> delegate
>> >>> >> >> >> >> > to
>> >>> >> >> >> >> > >>> >> > *“putIfAbsent(…)”*, which in database world
>> makes
>> >>> more
>> >>> >> >> sense.
>> >>> >> >> >> >> > >>> However, in
>> >>> >> >> >> >> > >>> >> > this case, the *“update”* syntax should
>> delegate to
>> >>> >> >> >> >> > *“replace(…)”*,
>> >>> >> >> >> >> > >>> as
>> >>> >> >> >> >> > >>> >> > update should fail in case if a key is absent.
>> >>> >> >> >> >> > >>> >> >
>> >>> >> >> >> >> > >>> >> > Considering the above, a notion of “*upsert”* or
>> >>> >> “*merge”
>> >>> >> >> >> >> > *operation
>> >>> >> >> >> >> > >>> is
>> >>> >> >> >> >> > >>> >> > very much needed, as it will give a user an
>> option
>> >>> to
>> >>> >> >> perform
>> >>> >> >> >> >> > >>> >> > “insert-or-update” in 1 call.
>> >>> >> >> >> >> > >>> >> >
>> >>> >> >> >> >> > >>> >> > Does this make sense?
>> >>> >> >> >> >> > >>> >> >
>> >>> >> >> >> >> > >>> >> > D.
>> >>> >> >> >> >> > >>> >> >
>> >>> >> >> >> >> > >>> >> > On Wed, Jul 20, 2016 at 9:39 PM, Sergi Vladykin
>> <
>> >>> >> >> >> >> > >>> >> sergi.vlady...@gmail.com>
>> >>> >> >> >> >> > >>> >> > wrote:
>> >>> >> >> >> >> > >>> >> >
>> >>> >> >> >> >> > >>> >> > > I'd prefer to do MERGE operation last because
>> in
>> >>> H2
>> >>> >> it
>> >>> >> >> is
>> >>> >> >> >> not
>> >>> >> >> >> >> > >>> standard
>> >>> >> >> >> >> > >>> >> > ANSI
>> >>> >> >> >> >> > >>> >> > > SQL MERGE. Or may be not implement it at all,
>> or
>> >>> may
>> >>> >> be
>> >>> >> >> >> >> > contribute
>> >>> >> >> >> >> > >>> ANSI
>> >>> >> >> >> >> > >>> >> > > correct version to H2, then implement it on
>> >>> Ignite.
>> >>> >> >> Need to
>> >>> >> >> >> >> > >>> investigate
>> >>> >> >> >> >> > >>> >> > the
>> >>> >> >> >> >> > >>> >> > > semantics deeper before making any decisions
>> here.
>> >>> >> >> >> >> > >>> >> > >
>> >>> >> >> >> >> > >>> >> > > Lets start with simple scenarios for INSERT
>> and go
>> >>> >> >> through
>> >>> >> >> >> all
>> >>> >> >> >> >> > the
>> >>> >> >> >> >> > >>> >> > possible
>> >>> >> >> >> >> > >>> >> > > cases and answer the questions:
>> >>> >> >> >> >> > >>> >> > > - What will happen on key conflict in TX
>> cache?
>> >>> >> >> >> >> > >>> >> > > - What will happen on key conflict in Atomic
>> >>> cache?
>> >>> >> >> >> >> > >>> >> > > - What will happen with the previous two if
>> we use
>> >>> >> >> >> DataLoader?
>> >>> >> >> >> >> > >>> >> > > - How to make these operations efficient (it
>> will
>> >>> be
>> >>> >> >> simple
>> >>> >> >> >> >> > enough
>> >>> >> >> >> >> > >>> to
>> >>> >> >> >> >> > >>> >> > > implement them with separate put/putIfAbsent
>> >>> >> operations
>> >>> >> >> but
>> >>> >> >> >> >> > >>> probably we
>> >>> >> >> >> >> > >>> >> > > will need some batching like putAllIfAbsent
>> for
>> >>> >> >> >> efficiency)?
>> >>> >> >> >> >> > >>> >> > >
>> >>> >> >> >> >> > >>> >> > > As for API, we still will need to have a
>> single
>> >>> entry
>> >>> >> >> point
>> >>> >> >> >> >> for
>> >>> >> >> >> >> > >>> all SQL
>> >>> >> >> >> >> > >>> >> > > queries/commands to allow any console work
>> with it
>> >>> >> >> >> >> > transparently.
>> >>> >> >> >> >> > >>> It
>> >>> >> >> >> >> > >>> >> > would
>> >>> >> >> >> >> > >>> >> > > be great if we will be able to come up with
>> >>> something
>> >>> >> >> >> >> consistent
>> >>> >> >> >> >> > >>> with
>> >>> >> >> >> >> > >>> >> > this
>> >>> >> >> >> >> > >>> >> > > idea on public API.
>> >>> >> >> >> >> > >>> >> > >
>> >>> >> >> >> >> > >>> >> > > Sergi
>> >>> >> >> >> >> > >>> >> > >
>> >>> >> >> >> >> > >>> >> > >
>> >>> >> >> >> >> > >>> >> > >
>> >>> >> >> >> >> > >>> >> > >
>> >>> >> >> >> >> > >>> >> > >
>> >>> >> >> >> >> > >>> >> > >
>> >>> >> >> >> >> > >>> >> > >
>> >>> >> >> >> >> > >>> >> > >
>> >>> >> >> >> >> > >>> >> > > On Wed, Jul 20, 2016 at 2:23 PM, Dmitriy
>> >>> Setrakyan <
>> >>> >> >> >> >> > >>> >> > > dsetrak...@gridgain.com>
>> >>> >> >> >> >> > >>> >> > > wrote:
>> >>> >> >> >> >> > >>> >> > >
>> >>> >> >> >> >> > >>> >> > > > Like the idea of merge and insert. I need
>> more
>> >>> >> time to
>> >>> >> >> >> think
>> >>> >> >> >> >> > >>> about
>> >>> >> >> >> >> > >>> >> the
>> >>> >> >> >> >> > >>> >> > > API
>> >>> >> >> >> >> > >>> >> > > > changes.
>> >>> >> >> >> >> > >>> >> > > >
>> >>> >> >> >> >> > >>> >> > > > Sergi, what do you think?
>> >>> >> >> >> >> > >>> >> > > >
>> >>> >> >> >> >> > >>> >> > > > Dmitriy
>> >>> >> >> >> >> > >>> >> > > >
>> >>> >> >> >> >> > >>> >> > > >
>> >>> >> >> >> >> > >>> >> > > >
>> >>> >> >> >> >> > >>> >> > > > On Jul 20, 2016, at 12:36 PM, Alexander
>> >>> Paschenko <
>> >>> >> >> >> >> > >>> >> > > > alexander.a.pasche...@gmail.com> wrote:
>> >>> >> >> >> >> > >>> >> > > >
>> >>> >> >> >> >> > >>> >> > > > >> Thus, I suggest that we implement MERGE
>> as a
>> >>> >> >> separate
>> >>> >> >> >> >> > >>> operation
>> >>> >> >> >> >> > >>> >> > backed
>> >>> >> >> >> >> > >>> >> > > > by putIfAbsent operation, while INSERT will
>> be
>> >>> >> >> >> implemented
>> >>> >> >> >> >> via
>> >>> >> >> >> >> > >>> put.
>> >>> >> >> >> >> > >>> >> > > > >
>> >>> >> >> >> >> > >>> >> > > > > Sorry, of course I meant that MERGE has
>> to be
>> >>> >> >> >> put-based,
>> >>> >> >> >> >> > while
>> >>> >> >> >> >> > >>> >> INSERT
>> >>> >> >> >> >> > >>> >> > > > > has to be putIfAbsent-based.
>> >>> >> >> >> >> > >>> >> > > > >
>> >>> >> >> >> >> > >>> >> > > > > 2016-07-20 12:30 GMT+03:00 Alexander
>> Paschenko
>> >>> >> >> >> >> > >>> >> > > > > <alexander.a.pasche...@gmail.com>:
>> >>> >> >> >> >> > >>> >> > > > >> Hell Igniters,
>> >>> >> >> >> >> > >>> >> > > > >>
>> >>> >> >> >> >> > >>> >> > > > >> In this thread I would like to share and
>> >>> discuss
>> >>> >> >> some
>> >>> >> >> >> >> > >>> thoughts on
>> >>> >> >> >> >> > >>> >> > DML
>> >>> >> >> >> >> > >>> >> > > > >> operations' implementation, so let's
>> start
>> >>> and
>> >>> >> >> keep it
>> >>> >> >> >> >> > here.
>> >>> >> >> >> >> > >>> >> > Everyone
>> >>> >> >> >> >> > >>> >> > > > >> is of course welcome to share their
>> >>> suggestions.
>> >>> >> >> >> >> > >>> >> > > > >>
>> >>> >> >> >> >> > >>> >> > > > >> For starters, I was thinking about
>> semantics
>> >>> of
>> >>> >> >> >> INSERT.
>> >>> >> >> >> >> In
>> >>> >> >> >> >> > >>> >> > traditional
>> >>> >> >> >> >> > >>> >> > > > >> RDBMSs, INSERT works only for records
>> whose
>> >>> >> primary
>> >>> >> >> >> keys
>> >>> >> >> >> >> > don't
>> >>> >> >> >> >> > >>> >> > > > >> conflict with those of records that are
>> >>> already
>> >>> >> >> >> >> persistent
>> >>> >> >> >> >> > -
>> >>> >> >> >> >> > >>> you
>> >>> >> >> >> >> > >>> >> > can't
>> >>> >> >> >> >> > >>> >> > > > >> try to insert the same key more than once
>> >>> >> because
>> >>> >> >> >> you'll
>> >>> >> >> >> >> > get
>> >>> >> >> >> >> > >>> an
>> >>> >> >> >> >> > >>> >> > error.
>> >>> >> >> >> >> > >>> >> > > > >> However, semantics of cache put is
>> obviously
>> >>> >> >> >> different -
>> >>> >> >> >> >> it
>> >>> >> >> >> >> > >>> does
>> >>> >> >> >> >> > >>> >> not
>> >>> >> >> >> >> > >>> >> > > > >> have anything about duplicate keys, it
>> just
>> >>> >> quietly
>> >>> >> >> >> >> updates
>> >>> >> >> >> >> > >>> values
>> >>> >> >> >> >> > >>> >> > in
>> >>> >> >> >> >> > >>> >> > > > >> case of keys' duplication. Still, cache
>> has
>> >>> >> >> >> putIfAbsent
>> >>> >> >> >> >> > >>> operation
>> >>> >> >> >> >> > >>> >> > that
>> >>> >> >> >> >> > >>> >> > > > >> is closer to traditional notion of
>> INSERT,
>> >>> and
>> >>> >> H2's
>> >>> >> >> >> SQL
>> >>> >> >> >> >> > >>> dialect
>> >>> >> >> >> >> > >>> >> has
>> >>> >> >> >> >> > >>> >> > > > >> MERGE operation which corresponds to
>> >>> semantics
>> >>> >> of
>> >>> >> >> >> cache
>> >>> >> >> >> >> > put.
>> >>> >> >> >> >> > >>> >> Thus, I
>> >>> >> >> >> >> > >>> >> > > > >> suggest that we implement MERGE as a
>> separate
>> >>> >> >> >> operation
>> >>> >> >> >> >> > >>> backed by
>> >>> >> >> >> >> > >>> >> > > > >> putIfAbsent operation, while INSERT will
>> be
>> >>> >> >> >> implemented
>> >>> >> >> >> >> via
>> >>> >> >> >> >> > >>> put.
>> >>> >> >> >> >> > >>> >> > > > >>
>> >>> >> >> >> >> > >>> >> > > > >> And one more, probably more important
>> thing:
>> >>> I
>> >>> >> >> suggest
>> >>> >> >> >> >> > that we
>> >>> >> >> >> >> > >>> >> > create
>> >>> >> >> >> >> > >>> >> > > > >> separate class Update and corresponding
>> >>> >> operation
>> >>> >> >> >> >> update()
>> >>> >> >> >> >> > in
>> >>> >> >> >> >> > >>> >> > > > >> IgniteCache. The reasons are as follows:
>> >>> >> >> >> >> > >>> >> > > > >>
>> >>> >> >> >> >> > >>> >> > > > >> - Query bears some flags that are clearly
>> >>> >> redundant
>> >>> >> >> >> for
>> >>> >> >> >> >> > Update
>> >>> >> >> >> >> > >>> >> (page
>> >>> >> >> >> >> > >>> >> > > > >> size, locality)
>> >>> >> >> >> >> > >>> >> > > > >> - query() method in IgniteCache (one that
>> >>> >> accepts
>> >>> >> >> >> Query)
>> >>> >> >> >> >> > and
>> >>> >> >> >> >> > >>> >> query()
>> >>> >> >> >> >> > >>> >> > > > >> methods in GridQueryIndexing return
>> >>> iterators.
>> >>> >> So,
>> >>> >> >> if
>> >>> >> >> >> we
>> >>> >> >> >> >> > >>> strive to
>> >>> >> >> >> >> > >>> >> > > > >> leave interfaces unchanged, we still will
>> >>> >> introduce
>> >>> >> >> >> some
>> >>> >> >> >> >> > >>> design
>> >>> >> >> >> >> > >>> >> > > > >> ugliness like query methods returning
>> empty
>> >>> >> >> iterators
>> >>> >> >> >> for
>> >>> >> >> >> >> > >>> certain
>> >>> >> >> >> >> > >>> >> > > > >> queries, and/or query flags that indicate
>> >>> >> whether
>> >>> >> >> >> it's an
>> >>> >> >> >> >> > >>> update
>> >>> >> >> >> >> > >>> >> > query
>> >>> >> >> >> >> > >>> >> > > > >> or not, etc.
>> >>> >> >> >> >> > >>> >> > > > >> - If some Queries are update queries,
>> then
>> >>> >> >> continuous
>> >>> >> >> >> >> > queries
>> >>> >> >> >> >> > >>> >> can't
>> >>> >> >> >> >> > >>> >> > be
>> >>> >> >> >> >> > >>> >> > > > >> based on them - more design-wise ugly
>> checks
>> >>> and
>> >>> >> >> stuff
>> >>> >> >> >> >> like
>> >>> >> >> >> >> > >>> that.
>> >>> >> >> >> >> > >>> >> > > > >> - I'm pretty sure there's more I don't
>> know
>> >>> >> about.
>> >>> >> >> >> >> > >>> >> > > > >>
>> >>> >> >> >> >> > >>> >> > > > >> Comments and suggestions are welcome.
>> Sergi
>> >>> >> >> Vladykin,
>> >>> >> >> >> >> > Dmitry
>> >>> >> >> >> >> > >>> >> > > > >> Setrakyan, your opinions are of
>> particular
>> >>> >> >> interest,
>> >>> >> >> >> >> please
>> >>> >> >> >> >> > >>> >> advise.
>> >>> >> >> >> >> > >>> >> > > > >>
>> >>> >> >> >> >> > >>> >> > > > >> Regards,
>> >>> >> >> >> >> > >>> >> > > > >> Alex
>> >>> >> >> >> >> > >>> >> > > >
>> >>> >> >> >> >> > >>> >> > >
>> >>> >> >> >> >> > >>> >> >
>> >>> >> >> >> >> > >>> >>
>> >>> >> >> >> >> > >>>
>> >>> >> >> >> >> > >>
>> >>> >> >> >> >> > >>
>> >>> >> >> >> >> >
>> >>> >> >> >> >>
>> >>> >> >> >>
>> >>> >> >>
>> >>> >>
>> >>>
>>

Reply via email to