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
- ores.ore.core — the
facet whose
series_key_registryreads this table. - ORE market data catalogue — the quote-key formats these rows make machine-readable.