Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languagejava
titleStringToMapConverter
collapsetrue
@Converter(autoApply = true)
public final class StringToMapConverter implements AttributeConverter<Map<String, ? extends Object>, String> {

    private static final Coder coder = new StandardCoder();

    @Override
    public String convertToDatabaseColumn(Map<String, ? extends Object> map) {
        try {
            return map == null ? null : coder.encode(map);
        } catch (CoderException e) {
            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, e.getMessage(), e);
        }
    }

    @Override
    public Map<String, ? extends Object> convertToEntityAttribute(String dbData) {
        if (dbData == null) {
            return Map.of();
        }
        try {
            return coder.decode(dbData, Map.class);
        } catch (CoderException e) {
            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, e.getMessage(), e);
        }
    }
}

Table of comparison

TypeDataStoreValidationSupport QueryIndexPreserve Order
longtextMariaDBSELECTYesNoYes
longtextPostgreSQLNoNoNoYes
jsonPostgreSQLINSERT / UPDATEYesNoYes
jsonbPostgreSQLINSERT / UPDATEYesYesNo


Conclusion

My propose options are shown below:

  1. replace all ElementCollections with Converters (Minimum change with Minimum improvement):
    • A lot of small Jsons
    • Using longtext, we are be able to maintain compatibility with MariaDB
    • Minimum Java code impact
    • 50% of tables (with postfix as _ATTRIBUTES, _PROPERTIES, _METADATA, _OCCURRENCES, _CONSTRAINTS, _TARGETS, _TRIGGERS and _INPUTS) will be removed
    • Unit tests not need to change
  2. Unique Json String:
    • One big Json for each model (e.g. saving the whole ToscaServiceTemplace as Json)
    • Using jsonb, only PostgreSQL will be supported
    • Medium Java code impact: all persistence classes could be removed or have to be as Json Document
    • 90% of tables will be removed
    • Unit tests need PostgreSQLContainer
  3. Cassandra
    • Document oriented approach full supported by SpringBoot (not needs Converters)
    • Huge Java code impact: All repositories and all persistence classes have to change to a Json Document
    • No support for MariaDB and PostgreSQL anymore
    • Unit tests need an Embedded Cassandra Server (EmbeddedCassandraServerHelper or CassandraContainer)

Benchmark Performance

Using Jmeter to make calls and Prometheus to trace 

Current version

Eclipse-Link/Mariadb. Tosca Service template is saved as a schema entity relation.

Image Added

Unique Json

Hibernate/Mariadb. Tosca Service Template is saved into a longtext as Json.