Algebraic types

One can construct complex types by defining unions of special non-entity type definitions decorated with @variant. The resulting complex type is mapped into JSON at the database level and should be prefixed with _json in when queried through the API. Here is an example

type Miserable @variant {
  hates: String!
}

type HappyPoor @variant {
  isMale: Boolean
}

union Poor = HappyPoor | Miserable

type MiddleClass @variant {
  father: Poor
  mother: Poor
}

type Rich @variant {
  bank: String!
}

union Status = Rich | MiddleClass | HappyPoor | Miserable

type Account @entity {
  status: Status!
}

The resulting API will support inline fragments and type resolutions:

query {
    accounts(limit: 5, orderBy: about_ASC, where: { status_json: { father: { isMale_eq: true }} }) {
    about
    status {
      __typename 
      ... on MiddleClass {
        father {
          ... on HappyPoor {
            isMale
          }
          ... on Miserable {
            hates
          }
        }
      }
    }
  }
}

Last updated