fig:s2dm_pre_defined_elements

Units

Units are represented as enum values. For example:

enum VelocityUnitEnum {
  KILOMETER_PER_HOUR
  METERS_PER_SECOND
}

The name of the enum itself refers to the quantity kind (e.g., Velocity). A set of commonly used units is provided in the file unit_enums.graphql.

[!NOTE] It is planned to adopt and reuse an existing standard data model for units. At the moment, the units file is inspired by COVESA VSS Units file. The tentative model that will be used in the future is the QUDT units.

Custom scalars

Scalars in GraphQL are basically the datatypes to which a field resolves. GraphQL supports a few built-in scalars such as Int, Float, String, Boolean, and ID. It is possible to define custom ones. The file /spec/custom_scalars.graphql contains custom scalars that could be referenced in the model.

Custom directives

@instanceTag

directive @instanceTag on OBJECT

TODO: Add description and example

@cardinality

directive @cardinality(min: Int, max: Int) on FIELD_DEFINITION

TODO: Add description and example

@range

directive @range(min: Float, max: Float) on FIELD_DEFINITION

TODO: Add description and example

@noDuplicates

directive @noDuplicates on FIELD_DEFINITION

Considering the following generic object:

type MyObject {
    field: <outputType>
}

By default, the GraphQL SDL let us express the following six combinations for output types in fields:

CaseDescriptionoutputType
Nullable Singular FieldA singular element that can also be null.NamedType
Non-Nullable Singular FieldA singular element that cannot be null.NamedType!
Nullable List FieldAn array of elements. The array itself can be null.[NamedType]
Non-Nullable List FieldAn array of elements. The array itself cannot be null.[NamedType]!
Nullable List of Non-Nullable ElementsAn array of elements. The array itself can be null but the elements cannot.[NamedType!]
Non-Nullable List of Non-Nullable ElementsList and elements in the list cannot be null.[NamedType!]!

Implicitly, lists here refer to an array of values that could be duplicated. In order to explicitly say that the intended content of the array should function as a set of unique values instead, the custom directive @noDuplicates is introduced.

type Person {
    nicknamesList: [String]  # Array with possible duplicate values
    nicknamesSet: [String] @noDuplicates  # Set of unique values
}

Common types

Common enumeration sets

In some cases, it is practical to refer to a particular set of values that might fit to multiple use cases. For example, the zone inside the cabin of a car could be re used by the Door and the Window It could be modeled as:

type InCabinZone {
    row: InCabinRowEnum!
    side: InCabinSide!
}

enum InCabinRowEnum {
    FRONT
    REAR
}

enum InCabinSide {
    DRIVER_SIDE
    PASSENGER_SIDE
}

Then, it can be referenced from:

Window {
    instance: InCabinZone
    ...
}

Door {
    instance: InCabinZone
    ...
}

Such common enumeration sets are available in the file /spec/common_enums.graphql.

Common objects of interest

Under construction…