> QueryEntity is already too complex > let's make it even more complex
We already see that String-based approach is bad: * LinkedHashMap<String, String> fields * Set<String> keyFields * Map<String, String> aliases Which should have been just QueryField { name, isKey, alias }. Let's learn from our mistakes and do constraints right. > we will deprecate it soon This is not a valid argument. What is "soon"? 3.0 is not soon, and I think we don't deprecate APIs in minor releases. Temporary things tend to become permanent very often. Thanks, Pavel On Fri, Jul 21, 2017 at 9:57 PM, Vladimir Ozerov <voze...@gridgain.com> wrote: > Guys, > > QueryEntity is already too complex. We will deprecate it soon in favor of > brand new SQL API. No need to design FieldConstraint or something similar > at the moment, let's just stick to "Set<String> notNullFields". > > On Fri, Jul 21, 2017 at 7:08 PM, Sergey Chugunov < > sergey.chugu...@gmail.com> > wrote: > > > Sergey, > > > > It may be a good idea to distinguish between field constraints (like "not > > null" one) which can be applied to only one field; and more complex > > constraints that involves more than one field. > > > > In case of field constraints it is better to simplify our model and allow > > only one field to appear inside constraint entity class. > > > > Something like this: > > class QueryEntity { > > ... > > > > /** All constraints to be enforced on this QueryEntity. */ > > Set<FieldConstraint> fieldConstraints; > > } > > > > /** Describes all constraints that affect the field. */ > > class FieldConstraint { > > /** Field name to be examined against all its constraints. */ > > String fieldName; > > > > /** Indicates whether check for null is required. */ > > boolean notNull; > > > > ... here we would add more flags corresponding to other constraints > ... > > } > > > > This model has a flaw that if we want to enforce the same constraint on > > many fields we must define FieldConstraint entity for each of these > fields. > > But it has its advantages too: first of all, its simplicity and therefore > > obvious usage patterns; and easy to implement validation. > > > > Thanks, > > Sergey Ch. > > > > > > On Fri, Jul 21, 2017 at 6:43 PM, Pavel Tupitsyn <ptupit...@apache.org> > > wrote: > > > > > 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 > > > > >> > > > > >> > > > > > > > > > >