DeclaredType
A DeclaredType variable is a wrapper for a type and is used by the type service and creating objects.
Construction
You declare a type using a structure containing the type definition and takes the following form:
typename = (versioned)? type (extends typename)?
(comment)?
// Property
name as type(qualifier?) (not null)? (default expression)? (bucket bucketDefinition)?
// Smart Data
name as smart (timeseries|curve) (with)? expression
// Constraint
constraint name (check|unique) (mark)? (condition (, condition)* | profile for checkname(param (,param)*))
end
Adding property definitions
A property definition declares that this type has a specifically named property of a certain type. The type can be one of the following:
Type | Description |
---|---|
name | A special type declaring that this field is the default property to be used as the name of the object |
description | A special type declaring that this field is the default property to be used as the description of the object |
dimension | A special type declaring that this field is to be used as a filter property when navigating objects of this type |
string | A scalar string property |
number | A scalar numeric property |
date | A scalar date or timestamp property |
boolean | A scalar boolean (true |
list | A list of variables |
object | A dynamic object |
duration | A duration variable |
geometry | A geometry variable |
timeseries | A timeseries |
curve | A curve |
Not null
If you add the 'not null' modifier on the property definition, OpenDataDSL will not allow null values for this property.
Default
A way of counteracting the 'not null' modifier is to use a 'default' modifier that sets a default value for a property if it doesn't have a value. The default value can be a scalar value or can be an expression that looks up a value in other objects.
Examples
address = type
name as String() not null
type as Dimension()
typeName as String() default ${object:"abc_metadata"}[type].name
end
Bucket
You can define a bucketing scheme for a property using the 'bucket' modifier, this takes the form:
bucket (boundaries array|buckets integer (granularity (definition)?)
e.g.
...
year as Dimension(number) not null bucket boundaries [1980, 1990, 2000, 2010, 2020, 2030]
...
Adding smart data properties
Smart data properties allow you to create smart timeseries or curves which will be dynamically added to all objects that directly inherit this type.
For example, if you have an ASK and BID timeseries on the objects of a certain type, you can add a MID smart timeseries that dynamically calculates the mid point between the ASK and BID timeseries.
...
MID = smart timeseries with (ASK+BID)/2
...
Adding constraints
You can add constraints on the objects on a type that will help to improve the quality of your data.
constraint name (check|unique) (mark)? (condition (, condition)* | for checkname(param (,param)*))
name
The name of the constraint
check or unique
Check defines that this is a quality check type constraint and unique adds a unique index such that no 2 documents can be added with the same unique combination of fields
mark
Normally if a constraint catches a quality failure, the update will be rejected. If you add the 'mark' modifier, the object is marked with a status and message that the constraint check failed.
timeseries checks
You can perform tests for the following quality issues:
- Missing data using
for missing()
Examples
constraint type_valid check (type in ${object:"abc_metadata"}.types)
constraint zip_valid check mark (zip matches "^\d{5}(-\d{4})?$")
constraint hl_valid check mark (hl in ["high","low"])
constraint zip_index unique (zip,hl)