ores.ore.series_key_shape

Table of Contents

The key grammar of ORE market data, one row per series type. Every ORE key follows the skeleton TYPE/METRIC/[QUALIFIER...]/[POINT_ID], and this table says where the split falls: qualifier_depth counts the segments after the metric that identify the series and stay stable across market dates, and every remaining segment is the point (a tenor, a strike, a surface coordinate).

The table belongs to ores.ore because the grammar it records is ORE's, not ours: ORE defines the file format and we only read it. It replaces a compiled C++ table, so a type ORE adds later, or one a user brings, is an inserted row rather than a rebuild. A type with no row is not an error – its key folds whole into the qualifier and still reconstructs verbatim – so an uncatalogued type never aborts an import.

Two invariants hold. The reader rejects an empty table, because an empty table silently degrades every key into a series of its own. A row that claims a point dimension and also carries a default point is contradictory and is rejected, both by the reader and by the check constraint below.

The table carries an entity, a repository and its SQL, and nothing else. It is a reference table that reads like configuration: one seeded row per series type ORE defines. Nothing sends its subjects, serves its handlers or drives its commands, so every facet that would build a surface for them is disabled, and the repository the component keeps is the whole of its use of this entity. ores.marketdata, the one real consumer, reads it through that repository, in process.

1. Physical space

The entity's surface is deliberately not generated. It is a reference table an operator does not edit: the rows are ORE's key grammar, seeded by a populate script, and the whole of the component's use of it is the key registry's read. A NATS protocol, a handler, a sub-registrar, a history provider registrar, an event registrar, a service, a sample generator, a shell command unit and its recipe, a table renderer and the TypeScript twins would all be generated for nobody: the nine subjects answer nothing, the registrars are called from nowhere, and the shell unit has never been in the build.

The profile simple-lookup enables the shell command and the eventing integration test, so both are stated here rather than in the drawer: a physical-space table beats a profile default, and a drawer entry does not.

The data layer — domain, entity, mapper, repository — and the SQL schema are generated.

Address Enabled
ores.cpp.protocol false
ores.cpp.nats-handler false
ores.cpp.nats-sub-registrar false
ores.cpp.nats-eventing false
ores.cpp.nats-event-registrar false
ores.cpp.history-provider-registrar false
ores.cpp.presentation false
ores.cpp.service false
ores.cpp.generator false
ores.cpp.eventing-integration-test false
ores.cpp.shell-command false
ores.cpp.domain.table_header false
ores.cpp.domain.table_impl false
ores.cpp.domain.table_io_header false
ores.cpp.domain.table_io_impl false
ores.ts.domain false
ores.ts.protocol false
ores.doc.shell-recipe false

2. Flags

3. Columns

3.1. series_type

The ORE key type: the first segment of a market data key, verbatim.

Examples: 'DISCOUNT', 'SWAPTION', 'OI_FUTURE', 'GENERIC-MD'.

3.2. qualifier_depth

Number of slash-separated segments after the metric that identify the series. Every remaining segment forms the point.

For 'DISCOUNT', a depth of 2 splits DISCOUNT/RATE/EUR/CURVE/2Y into the series EUR/CURVE and the point 2Y.

3.3. has_point_dimension

True when keys of this type carry a point of their own – a tenor or a surface coordinate. False for a type with no such dimension, whose whole remainder folds into the qualifier.

3.4. default_point

The point recorded for an observation whose key carries none. Every observation stores a point, so a type with a single point needs one name for it.

FX spot is the case that matters: its single point is a real tenor, SPOT. A type whose single point is not a tenor at all carries an empty string, which is the honest "no coordinate" value rather than an invented tenor. A row with a point dimension always carries the empty string here, because its points come from the keys.

3.5. description

The key grammar of the type and the reason for its shape, written as a worked example where one helps.

Example: 'FXFWD/RATE/ccy1/ccy2/tenor'.

4. SQL

4.1. Flags

4.2. Checks

expression
not ("has_point_dimension" and "default_point" <> '')

5. Insert trigger

5.1. Validations

column validation_function
change_reason_code ores_dq_validate_change_reason_fn

6. C++

6.1. Flags

6.2. Repository

6.3. Domain includes

#include <chrono>
#include <string>

6.4. Entity includes

#include <string>
#include "sqlgen/Timestamp.hpp"

6.5. Conventions

6.6. Table display

column header
series_type Series Type
qualifier_depth Qualifier Depth
has_point_dimension Has Point Dimension
default_point Default Point
description Description
modified_by Modified By
version Version

6.7. Custom repository methods

7. See also

Emacs 29.3 (Org mode 9.6.15)