Ivan Bessonov created IGNITE-15564:
--------------------------------------

             Summary: [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


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.3.4#803005)

Reply via email to