packages feed

hydra-0.15.0: src/main/haskell/Hydra/Demos/Genpg/ExampleMapping.hs

module Hydra.Demos.GenPG.ExampleMapping where

import Hydra.Core (Term)
import Hydra.Pg.Model (Edge, Vertex, LazyGraph)
import Hydra.Formatting (decapitalize)
import Hydra.Phantoms (TTerm)
import Hydra.Dsl.Meta.Phantoms ((@@), constant, just, lambda, nothing, string, var)
import Hydra.Dsl.Pg.Mappings (column, edge, edgeNoId, graph, property, vertex)
import qualified Hydra.Dsl.Meta.Lib.Literals as Literals
import qualified Hydra.Dsl.Meta.Lib.Maybes as Maybes
import qualified Hydra.Dsl.Meta.Lib.Strings as Strings
import Hydra.Demos.GenPG.ExampleGraphSchema

-- Helpers -----------------------

labeledIntId :: String -> TTerm (r -> Maybe Int) -> TTerm (r -> String)
labeledIntId itype iid = lambda "r" $ Maybes.map
  (lambda "i" $ Strings.concat [
    string $ decapitalize itype,
    string "_",
    Literals.showInt32 $ var "i"])
  (iid @@ var "r")

interactionVertex :: String -> String -> Vertex Term
interactionVertex tableName itype = vertex tableName customerInteractionVertexLabel
  (labeledIntId itype (column "id"))
  [property "interactionType" $ constant $ just $ string itype,
   property "interactionDate" $ column "interaction_date",
   property "notes" $ column "notes",
   property "durationMinutes" $ column "duration_minutes",
   property "followUpRequired" $ column "follow_up_required",
   property "customerInitiated" $ column "customer_initiated"]

employeeEdge :: String -> String -> Edge Term
employeeEdge tableName itype = edgeNoId tableName employeeEdgeLabel
  (labeledIntId itype (column "id"))
  (labeledIntId employeeVertexLabel $ column "employee_id")
  []

customerEdge :: String -> String -> Edge Term
customerEdge tableName itype = edgeNoId tableName customerEdgeLabel
  (labeledIntId itype (column "id"))
  (labeledIntId customerVertexLabel $ column "customer_id")
  []

-- Mapping -----------------------------

salesGraph :: LazyGraph Term
salesGraph = graph
  -- Vertices
  [vertex "employees.csv" employeeVertexLabel (labeledIntId employeeVertexLabel $ column "employee_id") [
     property "firstName" $ column "first_name",
     property "lastName" $ column "last_name",
     property "email" $ column "email",
     property "hireDate" $ column "hire_date"],

   vertex "departments.csv" departmentVertexLabel (labeledIntId departmentVertexLabel $ column "department_id") [
     property "name" $ column "department_name"],

   vertex "customers.csv" customerVertexLabel (labeledIntId customerVertexLabel $ column "customer_id") [
     property "companyName" $ column "company_name",
     property "contactName" $ column "contact_name",
     property "email" $ column "email",
     property "phone" $ column "phone"],

   vertex "products.csv" productVertexLabel (labeledIntId productVertexLabel $ column "product_id") [
     property "name" $ column "product_name",
     property "price" $ column "price"],

   vertex "sales.csv" saleVertexLabel (labeledIntId saleVertexLabel $ column "sale_id") [
     property "saleDate" $ column "sale_date",
     property "totalAmount" $ column "total_amount"],

   vertex "sale_items.csv" saleItemVertexLabel (labeledIntId saleItemVertexLabel $ column "sale_item_id") [
     property "quantity" $ column "quantity",
     property "itemPrice" $ column "item_price"],

   interactionVertex "calls.csv" callInteractionType,
   interactionVertex "emails.csv" emailInteractionType,
   interactionVertex "meetings.csv" meetingInteractionType]

  -- Edges
  [edgeNoId "employees.csv" managesEdgeLabel
     (labeledIntId employeeVertexLabel $ column "manager_id")
     (labeledIntId employeeVertexLabel $ column "employee_id")
     [property "sinceDate" $ column "management_since_date"],

   edgeNoId "employees.csv" belongsToEdgeLabel
     (labeledIntId employeeVertexLabel $ column "employee_id")
     (labeledIntId departmentVertexLabel $ column "department_id")
     [property "joinDate" $ column "department_join_date",
      property "role" $ column "department_role"],

   edgeNoId "departments.csv" parentDepartmentEdgeLabel
     (labeledIntId departmentVertexLabel $ column "department_id")
     (labeledIntId departmentVertexLabel $ column "parent_department_id")
     [property "since" $ column "parent_department_since"],

   edgeNoId "sales.csv" soldEdgeLabel
     (labeledIntId employeeVertexLabel $ column "employee_id")
     (labeledIntId saleVertexLabel $ column "sale_id")
     [property "commissionRate" $ column "commission_rate",
      property "salesChannel" $ column "sales_channel"],

   edgeNoId "sales.csv" purchasedEdgeLabel
     (labeledIntId customerVertexLabel $ column "customer_id")
     (labeledIntId saleVertexLabel $ column "sale_id")
     [property "paymentMethod" $ column "payment_method",
      property "satisfactionRating" $ column "satisfaction_rating",
      property "isRepeatCustomer" $ column "is_repeat_customer"],

   edgeNoId "sale_items.csv" includesEdgeLabel
     (labeledIntId saleVertexLabel $ column "sale_id")
     (labeledIntId saleItemVertexLabel $ column "sale_item_id")
     [property "itemOrder" $ column "item_order",
      property "discountApplied" $ column "discount_applied"],

   edgeNoId "sale_items.csv" containsProductEdgeLabel
     (labeledIntId saleItemVertexLabel $ column "sale_item_id")
     (labeledIntId productVertexLabel $ column "product_id")
     [property "warrantyPeriodYears" $ column "warranty_period"],

   employeeEdge "calls.csv" callInteractionType,
   customerEdge "calls.csv" callInteractionType,
   employeeEdge "emails.csv" emailInteractionType,
   customerEdge "emails.csv" emailInteractionType,
   employeeEdge "meetings.csv" meetingInteractionType,
   customerEdge "meetings.csv" meetingInteractionType]