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