[ 
https://issues.apache.org/jira/browse/IGNITE-14645?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Ivan Bessonov updated IGNITE-14645:
-----------------------------------
    Description: 
NOTE: description might not be finished.
h3. Problem

Currently configuration schema structure is very restricted and doesn't allow 
any variations in it. This approach comes with a set of problems.
 # How do you properly configure {{IpFinder}}? For each type of finder you only 
need a few properties.
 # How do you configure SQL indexes? Pretty much the same problem.

h3. Interface

For the solution we need to expand abilities of configuration schemas. I 
propose the following option:
{code:java}
// Configuration schema that contains polymorphic field.
@Config
class TableConfigurationSchema {
    @NamedConfigValue
    public IndexConfigurationSchema indexes;
}

// Base class for polymorphic value. Explicitly has all subclasses
// in its description to simplify incremental code generation.
@PolymorphicConfig(impl = {
    HashIndexConfigurationSchema.class,
    TreeIndexConfigurationSchema.class,
})
class IndexConfigurationSchema {
    // This annotation shows that current field defines implementation.
    // Specific values are present in implementations declarations.
    @Id
    @Immutable
    @Value
    public String type;
}

// One of implementations for index. Id value is defined in annotation.
@PolymorphicInstance(id = "hash")
public static class HashIndexConfigurationSchema extends 
IndexConfigurationSchema {
    @Immutable
    @Value
    public String column;
}

// Other implementation for index.
@PolymorphicInstance(id = "tree")
public static class TreeIndexConfigurationSchema extends 
IndexConfigurationSchema {
    @Immutable
    @Value
    public String[] columns;
}
{code}
h3. Generated API

We need to tweak API a little bit. I'd love to see as few changes as possible, 
so my vision is something like this:
{code:java}
TableConfiguration tableCfg = ...;

tableCfg.indexes().create("hashIndexName", index ->
    // Id sets up automatically by the call.
    index.asHashIndex().changeColumn("columnName")
).get();

tableCfg.indexes().update("hashIndexName", index ->
    // Any cast is allowed to do in change request.
    // But this update will fail during processing.
    index.asTreeIndex().changeColumns("a", "b")
);

IndexConfiguration indexCfg = tableCfg.indexes().get("hashIndexName");

// This must be an instance of "HashIndexConfiguration".
HashIndexConfiguration hashCfg = (HashIndexConfiguration)indexCfg;

// This must be instance of HashIndexView,
IndexView indexView = indexCfg.value();

// Maybe this is redundant, I don't know.
assert indexView.isHashIndex();

// Returns the same object with a safe cast.
// Maybe this is redundant as well and regular cast would be enough.
HashIndexView hashView = indexView.asHashIndex();{code}
h3. Implementation Notes

TODO

  was:
NOTE: description might not be finished.
h3. Problem

Currently configuration schema structure is very restricted and doesn't allow 
any variations in it. This approach comes with a set of problems.
 # How do you properly configure {{IpFinder}}? For each type of finder you only 
need a few properties.
 # How do you configure SQL indexes? Pretty much the same problem.

h3. Interface

For the solution we need to expand abilities of configuration schemas. I 
propose the following option:
{code:java}
// Configuration schema that contains polymorphic field.
@Config
class TableConfigurationSchema {
    @NamedConfigValue
    public IndexConfigurationSchema indexes;
}

// Base class for polymorphic value. Explicitly has all subclasses
// in its description to simplify incremental code generation.
@PolymorphicConfig(impl = {
    HashIndexConfigurationSchema.class,
    TreeIndexConfigurationSchema.class,
})
class IndexConfigurationSchema {
    // This annotation shows that current field defines implementation.
    // Specific values are present in implementations declarations.
    @Id
    @Immutable
    @Value
    public String type;
}

// One of implementations for index. Id value is defined in annotation.
@PolymorphicInstance(id = "hash")
public static class HashIndexConfigurationSchema extends 
IndexConfigurationSchema {
    @Immutable
    @Value
    public String column;
}

// Other implementation for index.
@PolymorphicInstance(id = "tree")
public static class TreeIndexConfigurationSchema extends 
IndexConfigurationSchema {
    @Immutable
    @Value
    public String[] columns;
}
{code}
h3. Generated API

We need to tweak API a little bit. I'd love to see as few changes as possible, 
so my vision is something like this:
{code:java}
TableConfiguration tableCfg = ...;

tableCfg.indexes().create("hashIndexName", index ->
    // Id sets up automatically by the call.
    index.asHashIndex().changeColumn("columnName")
).get();

tableCfg.indexes().update("hashIndexName", index ->
    // Any cast is allowed to do in change request.
    // But this update will fail during processing.
    index.asTreeIndex().changeColumns(new String[] {"a", "b"})
);

IndexConfiguration indexCfg = tableCfg.indexes().get("hashIndexName");

// This must be an instance of "HashIndexConfiguration".
HashIndexConfiguration hashCfg = (HashIndexConfiguration)indexCfg;

// This must be instance of HashIndexView,
IndexView indexView = indexCfg.value();

// Maybe this is redundant, I don't know.
assert indexView.isHashIndex();

// Returns the same object with a safe cast.
// Maybe this is redundant as well and regular cast would be enough.
HashIndexView hashView = indexView.asHashIndex();{code}
h3. Implementation Notes

TODO


> Support polymorphic configuration nodes.
> ----------------------------------------
>
>                 Key: IGNITE-14645
>                 URL: https://issues.apache.org/jira/browse/IGNITE-14645
>             Project: Ignite
>          Issue Type: Sub-task
>            Reporter: Ivan Bessonov
>            Assignee: Ivan Bessonov
>            Priority: Major
>
> NOTE: description might not be finished.
> h3. Problem
> Currently configuration schema structure is very restricted and doesn't allow 
> any variations in it. This approach comes with a set of problems.
>  # How do you properly configure {{IpFinder}}? For each type of finder you 
> only need a few properties.
>  # How do you configure SQL indexes? Pretty much the same problem.
> h3. Interface
> For the solution we need to expand abilities of configuration schemas. I 
> propose the following option:
> {code:java}
> // Configuration schema that contains polymorphic field.
> @Config
> class TableConfigurationSchema {
>     @NamedConfigValue
>     public IndexConfigurationSchema indexes;
> }
> // Base class for polymorphic value. Explicitly has all subclasses
> // in its description to simplify incremental code generation.
> @PolymorphicConfig(impl = {
>     HashIndexConfigurationSchema.class,
>     TreeIndexConfigurationSchema.class,
> })
> class IndexConfigurationSchema {
>     // This annotation shows that current field defines implementation.
>     // Specific values are present in implementations declarations.
>     @Id
>     @Immutable
>     @Value
>     public String type;
> }
> // One of implementations for index. Id value is defined in annotation.
> @PolymorphicInstance(id = "hash")
> public static class HashIndexConfigurationSchema extends 
> IndexConfigurationSchema {
>     @Immutable
>     @Value
>     public String column;
> }
> // Other implementation for index.
> @PolymorphicInstance(id = "tree")
> public static class TreeIndexConfigurationSchema extends 
> IndexConfigurationSchema {
>     @Immutable
>     @Value
>     public String[] columns;
> }
> {code}
> h3. Generated API
> We need to tweak API a little bit. I'd love to see as few changes as 
> possible, so my vision is something like this:
> {code:java}
> TableConfiguration tableCfg = ...;
> tableCfg.indexes().create("hashIndexName", index ->
>     // Id sets up automatically by the call.
>     index.asHashIndex().changeColumn("columnName")
> ).get();
> tableCfg.indexes().update("hashIndexName", index ->
>     // Any cast is allowed to do in change request.
>     // But this update will fail during processing.
>     index.asTreeIndex().changeColumns("a", "b")
> );
> IndexConfiguration indexCfg = tableCfg.indexes().get("hashIndexName");
> // This must be an instance of "HashIndexConfiguration".
> HashIndexConfiguration hashCfg = (HashIndexConfiguration)indexCfg;
> // This must be instance of HashIndexView,
> IndexView indexView = indexCfg.value();
> // Maybe this is redundant, I don't know.
> assert indexView.isHashIndex();
> // Returns the same object with a safe cast.
> // Maybe this is redundant as well and regular cast would be enough.
> HashIndexView hashView = indexView.asHashIndex();{code}
> h3. Implementation Notes
> TODO



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to