[ 
https://issues.apache.org/jira/browse/IGNITE-15564?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17457157#comment-17457157
 ] 

Semyon Danilov commented on IGNITE-15564:
-----------------------------------------

LGTM! Thanks for the contribution, merged to main

> [Ignite 3] Properly inject names into named list elements
> ---------------------------------------------------------
>
>                 Key: IGNITE-15564
>                 URL: https://issues.apache.org/jira/browse/IGNITE-15564
>             Project: Ignite
>          Issue Type: Improvement
>    Affects Versions: 3.0.0-alpha2
>            Reporter: Ivan Bessonov
>            Assignee: Kirill Tkalenko
>            Priority: Major
>              Labels: iep-55, ignite-3
>             Fix For: 3.0.0-alpha4
>
>          Time Spent: 6h 20m
>  Remaining Estimate: 0h
>
> h3. Problem
> Current design of named lists has a flaw that is best shown in classes like 
> "TableConfigurationSchema". It's the field called "name". Simple table 
> configuration would look like this (prefix "table.tables" looks bad BTW):
> {code:java}
> table.tables : {
>     foo : {
>         name = foo,
>         etc...
>     }
> }{code}
> Table name must be duplicated and I actually doubt that we validate names 
> equality. Same applies to columns and indexes. There's probably more, I 
> didn't check.
> Obviously, developers want to access named list element name inside of the 
> element itself. And there's no API for that.
> h3. Approach
> Proper solution would be annotating name fields:
> {code:java}
> @Config
> public class TableConfigurationSchema {
>     @InjectedName // temporary title, maybe there are better options
>     public String name = "default";
>     ...
> }{code}
> Injected name must be a string. It's treated like "@Value" field BUT has no 
> "update" method associated with it. Basically, name is considered immutable 
> and "explicitly uninitializable" in this context. So how do you initialize it 
> then?
>  * if schema is used as a named list - name is passed into "create*"/"rename" 
> methods. Field is automatically updated after that.
>  * if schema if used as a regular config value, we have two options:
>  ** generate special extended interfaces that will in fact have setters for 
> names. These will only be used for "non-named-list" values;
>  ** always use default value provided in either schema itself (as in example) 
> or in "@Value(name = "default") if it makes any sense. This option looks 
> better for me and it's easier to implement.
> h3. Implementation notes
> Compile-time code generation is easy, just reuse already existing methods and 
> add few "if" clauses.
> I don't think that methods like "traverse*" or "construct*" should process 
> name fields. So there's a filtering to be done in ConfigurationAsmGenerator.
> "NamedConfigValue#syntheticKeyName" should probably be removed. Instead we 
> should use injected field name or just "name" if there's none. Otherwise 
> there will be a confusion.
> All classes that use constant "NamedListNode#NAME" are a subject to 
> modification. There's a high chance that they will inject values for 
> annotated fields. Maybe we need a new method in "InnerNode" for this, it's 
> not clear yet.
> Classes that implement ConfigurationSource should be carefully examined as 
> well, especially HOCON* ones.
>  



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to