Replacing immutable core API calls

Any typical Atoti Server implementation will define stores using two core API objects, the StoreDescriptionBuilder and ReferenceDescriptionBuilder. These objects are followed by a chain of fluent API calls that can be considered immutable - the chain is a complete definition of the store or reference configuration, and any partial (or iterative) definition is difficult due to the nested interfaces composing the fluent API.

The Datastore Helper API makes these fluent API chains mutable, by providing implementations that allow external customisations to be defined using the datastore configurator.

The MutableStoreDescriptionBuilder and MutableReferenceDescriptionBuilder objects can be instantiated manually using their public constructors, but using the factory methods provided in the configurator allows for non-breaking future changes in the implementation details of the Datastore Helper API.

A typical migration of an existing project would entail the following modifications.

MutableStoreDescriptionBuilder

The standard store definition

StoreDescription.builder()
    .withStoreName(TRADE_PNL_STORE_NAME)
    .withField(AS_OF_DATE, LOCAL_DATE).asKeyField()
    .withField(TRADE_PNL__TRADE_ID).asKeyField()
    .withField(TRADE_PNL__SCENARIO_SET).asKeyField()
    .withField(TRADE_PNL__CALCULATION_ID).asKeyField()
    .withField(TRADE_PNL__RISK_FACTOR).asKeyField()
    .withField(TRADE_PNL__RISK_CLASS)
    .withField(TRADE_PNL__RISK_FACTOR_TYPE)
    .withField(TRADE_PNL__LIQUIDITY_HORIZON, INT)
    .withField(TRADE_PNL__CCY)
    .withVectorField(TRADE_PNL__PNL_VECTOR, DOUBLE)
    .withModuloPartitioning(TRADE_PNL__TRADE_ID, NUM_HASH_PARTITIONS)
    .onDuplicateKeyWithinTransaction().logException()
    .build();

becomes

configurator.storeBuilder(PNL_SCHEMA)
    .withStoreName(TRADE_PNL_STORE_NAME)
    .withField(AS_OF_DATE, LOCAL_DATE).asKeyField()
    .withField(TRADE_PNL__TRADE_ID).asKeyField()
    .withField(TRADE_PNL__SCENARIO_SET).asKeyField()
    .withField(TRADE_PNL__CALCULATION_ID).asKeyField()
    .withField(TRADE_PNL__RISK_FACTOR).asKeyField()
    .withField(TRADE_PNL__RISK_CLASS)
    .withField(TRADE_PNL__RISK_FACTOR_TYPE)
    .withField(TRADE_PNL__LIQUIDITY_HORIZON, INT)
    .withField(TRADE_PNL__CCY)
    .withVectorField(TRADE_PNL__PNL_VECTOR, DOUBLE)
    .withModuloPartitioning(TRADE_PNL__TRADE_ID, NUM_HASH_PARTITIONS)
    .onDuplicateKeyWithinTransaction().logException()
    .build();

MutableReferenceDescriptionBuilder

The standard reference definition

ReferenceDescription.builder()
    .fromStore(COUNTERPARTY_STORE_NAME)
    .toStore(COUNTRY_STORE_NAME)
    .withName(COUNTERPARTY_TO_COUNTRY_RISK)
    .withMapping(COUNTERPARTY__COUNTRY_OF_RISK, COUNTRY__COUNTRY_CODE)
    .withMapping(AS_OF_DATE, AS_OF_DATE)
    .build();

becomes

configurator.referenceBuilder(PNL_SCHEMA)
    .fromStore(COUNTERPARTY_STORE_NAME)
    .toStore(COUNTRY_STORE_NAME)
    .withName(COUNTERPARTY_TO_COUNTRY_RISK)
    .withMapping(COUNTERPARTY__COUNTRY_OF_RISK, COUNTRY__COUNTRY_CODE)
    .withMapping(AS_OF_DATE, AS_OF_DATE)
    .build();