Sergey, looks good to me! I thought of something a bit different, where there is a base class and each constraint type inherits it, but your design is actually better.
Pavel On Fri, Jul 21, 2017 at 6:38 PM, Sergey Kalashnikov <zkilling...@gmail.com> wrote: > 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 > >> > >> >