Hi Pavel, Good point! What if we make it the following way?
class QueryEntity { ... /** All constraints to be enforced on this QueryEntity. */ Set<QueryConstraint> constraint; } /** Describes constraints that affect one or more fields. */ class QueryConstraint { /** Names of fields to be checked. */ Set<String> fields; /** Indicates whether check for null is required. */ boolean notNull; ... here we would add more flags corresponding to other constraints ... } -- Best Regards, Sergey 2017-07-21 10:54 GMT+03:00 Pavel Tupitsyn <ptupit...@apache.org>: > Hi Sergey, > > This one looks not very good to me: > >> class QueryEntity { >> ... >> Set<String> notNullFields; >> } > > What if there are more constraints in future? UNIQUE, CHECK, etc etc? > > Instead we could do something like > > Set<QueryConstraint> constraints; > > Which is easily extendable in future. > > Thoughts? > > Pavel > > On Thu, Jul 20, 2017 at 11:17 PM, Denis Magda <dma...@apache.org> wrote: > >> Hi Sergey, >> >> That will be an excellent addition to DDL features set. >> >> The proposed changes look good to from the public API standpoint. >> >> Alexander P., Sergi, Vovan, please share your thoughts. >> >> — >> Denis >> >> > On Jul 20, 2017, at 12:27 PM, Sergey Kalashnikov <zkilling...@gmail.com> >> wrote: >> > >> > Hi Igniters, >> > >> > I am working on the ticket >> > https://issues.apache.org/jira/browse/IGNITE-5648, which purpose is to >> > add support for NOT NULL constraint for any fields of key or value >> > stored in Ignite cache. >> > >> > I would appreciate your comments on the design approach I have described >> below. >> > >> > In my opinion, such checks should be enforced both by SQL DML and >> > cache API to be consistent. >> > >> > Here is my analysis of what needs to be done. >> > >> > 1. First, the SQL CREATE table will not throw exception anymore >> > whenever it encounters a column with "not null" modifier. >> > Instead, the resulting QueryEntity will now indicate which fields have >> > such modifier. >> > >> > The proposed way of doing this is the following: >> > class QueryEntity { >> > ... >> > Set<String> notNullFields; >> > } >> > >> > Since QueryEntity is a part of public api, it becomes possible to >> > configure this constraint not only via DDL CREATE TABLE. >> > >> > 2. Then we need a special method on GridQueryProcessor that for the >> > given cacheName, key and value would perform the following things: >> > - Get a GridQueryTypeDescriptor that corresponds to given value type; >> > - Delegate that GridQueryTypeDescriptor a task to validate given key and >> value; >> > - Type descriptor would itself delegate the validation to its >> > GridQueryProperties that have "not null" constraint. >> > >> > 3. To enforce the constraints, the validation method should be called >> > - In GridNearAtomicSingleUpdateFuture.mapSingleUpdate() and >> > GridNearAtomicUpdateFuture.mapUpdate() when operation is CREATE or >> > UPDATE. >> > That would cover putIfAbsent(), getAndPut(), getAndPutIfAbsent(), >> > replace(), getAndReplace(), putAll() operations on atomic cache. >> > And in GridNearTxLocal.enlistWriteEntry() when operation is CREATE or >> > UPDATE for the case of transactional cache. >> > >> > - Right after EntryProcessor.process() in >> > GridCacheMapEntry.AtomicCacheUpdateClosure.runEntryProcessor() as part >> > of invoke(), invokeAll() operations on atomic cache. >> > And in GridDhtTxPrepareFuture.onEntriesLocked() for the case of >> > transactional cache. >> > >> > 4. DML processor changes >> > The DMLStatementProcessor methods doInsert(), doUpdate(), doMerge() >> > must also incorporate such checks to avoid attempts >> > to insert values that are known to be rejected by cache. >> > >> > Thoughts? >> > >> > -- >> > Best regards, >> > Sergey >> >>