packages feed

hydra-0.8.0: src/main/haskell/Hydra/Sources/Tier4/Ext/Pg/Mapping.hs

{-# LANGUAGE OverloadedStrings #-}

module Hydra.Sources.Tier4.Ext.Pg.Mapping where

import Hydra.Sources.Tier3.All
import Hydra.Dsl.Annotations
import Hydra.Dsl.Bootstrap
import Hydra.Pg.Mapping
import qualified Hydra.Dsl.Terms as Terms
import Hydra.Dsl.Types as Types
import Hydra.Sources.Tier4.Ext.Pg.Model


pgMappingModule :: Module
pgMappingModule = Module ns elements
    [pgModelModule, hydraCoreModule, hydraComputeModule] tier0Modules $
    Just "A model for property graph mapping specifications. See https://github.com/CategoricalData/hydra/wiki/Property-graphs"
  where
    ns = Namespace "hydra/pg/mapping"
    mappings = typeref ns
    compute = typeref $ moduleNamespace hydraComputeModule
    core = typeref $ moduleNamespace hydraCoreModule
    v3 = typeref $ moduleNamespace pgModelModule
    def = datatype ns
    toField (k, v) = Field k $ Terms.string v

    elements = [

      def "AnnotationSchema" $
        doc "Configurable annotation keys for property graph mapping specifications" $
        record [
          "vertexLabel">: string,
          "edgeLabel">: string,
          "vertexId">: string,
          "edgeId">: string,
          "propertyKey">: string,
          "propertyValue">: string,
          "outVertex">: string,
          "outVertexLabel">: string,
          "inVertex">: string,
          "inVertexLabel">: string,
          "outEdge">: string,
          "outEdgeLabel">: string,
          "inEdge">: string,
          "inEdgeLabel">: string,
          "ignore">: string],

      def "EdgeSpec" $
        doc "A mapping specification producing edges of a specified label." $
        record [
          "label">:
            doc "The label of the target edges, which must conform to the edge type associated with that label." $
            v3 "EdgeLabel",
          "id">:
            doc "A specification of the id of each target edge" $
            mappings "ValueSpec",
          "out">:
            doc "A specification of the out-vertex reference of each target edge" $
            mappings "ValueSpec",
          "in">:
            doc "A specification of the in-vertex reference of each target edge" $
            mappings "ValueSpec",
          "properties">:
            doc "Zero or more property specifications for each target edge" $
            list $ mappings "PropertySpec"],

      def "ElementSpec" $
        doc "Either a vertex specification or an edge specification" $
        union [
          "vertex">: mappings "VertexSpec",
          "edge">: mappings "EdgeSpec"],

      def "PropertySpec" $
        doc "A mapping specification producing properties of a specified key, and values of the appropriate type." $
        record [
          "key">:
            doc "The key of the target properties" $
            v3 "PropertyKey",
          "value">:
            doc "A specification of the value of each target property, which must conform to the type associated with the property key" $
            mappings "ValueSpec"],

      def "Schema" $
        doc "A set of mappings which translates between Hydra terms and annotations, and application-specific property graph types" $
        lambdas ["s", "t", "v"] $
          record [
            "vertexIdTypes">: compute "Coder" @@ "s" @@ "s" @@ core "Type" @@ "t",
            "vertexIds">: compute "Coder" @@ "s" @@ "s" @@ core "Term" @@ "v",
            "edgeIdTypes">: compute "Coder" @@ "s" @@ "s" @@ core "Type" @@ "t",
            "edgeIds">: compute "Coder" @@ "s" @@ "s" @@ core "Term" @@ "v",
            "propertyTypes">: compute "Coder" @@ "s" @@ "s" @@ core "Type" @@ "t",
            "propertyValues">: compute "Coder" @@ "s" @@ "s" @@ core "Term" @@ "v",
            "annotations">: mappings "AnnotationSchema",
            "defaultVertexId">: "v",
            "defaultEdgeId">: "v"],

      def "ValueSpec" $
        doc "A mapping specification producing values (usually literal values) whose type is understood in context" $
        union [
          "value">:
            doc "A trivial no-op specification which passes the entire value"
            unit,
          "pattern">:
            doc "A compact path representing the function, e.g. engine-${engineInfo/model/name}"
            string],

      def "VertexSpec" $
        doc "A mapping specification producing vertices of a specified label" $
        record [
          "label">:
            doc "The label of the target vertices, which must conform to the vertex type associated with that label." $
            v3 "VertexLabel",
          "id">:
            doc "A specification of the id of each target vertex" $
            mappings "ValueSpec",
          "properties">:
            doc "Zero or more property specifications for each target vertex" $
            list $ mappings "PropertySpec"]]