Docs

# Alternative implementation choices

# One-time generation

Instead of a maven archetype, initial project creation could be done with:

  • Yeoman.
  • A webapp that produces a zip for download, like Spring Initializr for Spring Boot.
  • A custom CLI, possibly in python.

# Metamodel

Instead of a new metamodel, Klass could use an existing metamodel like Eclipse Modeling Framework's ECore.

ECore is a fairly complete implementation of UML, with all its warts. ECore also has enhancements to allow it to represent anything expressible in Java, including Generics.

Klass's metamodel is a fairly narrow subset of UML. It addresses some weaknesses in UML, such as the lack of a type hierarchy between the various types of properties.

Klass's metamodel also includes projections and services.

# Metamodel language

Instead of a new DSL, the model could be expressed using:

  • OpenAPI vendor extensions (maybe, unproven)
  • A data format that's not a DSL, like JSON, YML, or XML, conforming to a JSON schema or XSD.
  • Annotations inside a Java or Python program.
  • A graphical language like UML.

# Data Store

Rather than a relational database, the data could be stored in:

  • A specific non-relational store, like a documentation database or a graph database.
  • An abstract DataStore interface, with multiple implementations.

# Audit Data

Rather than storing phased-out data in the same tables as active data, they could be stored in separate audit tables.

This would improve the performance of queries for active data. It would complicate querying for previous versions, especially when those versions have relationships to data that is still active.

# Relationship criteria

The docs show a syntax for relationship criteria that is similar to a sql join.

klass
relationship this.id == Answer.questionId

It's possible to use a syntax where a property is annotated as a foreign key instead.

It's possible to use a syntax where a foreign key tuple is listed instead.

However, parameterized properties would need a more powerful syntax.

# Service syntax

The service syntax is url-centric. If we want to support both http and rpc, we may want a more flexible syntax.