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