Attach Applied Discount Database Table

This example outlines how to attach a database table that’s in the same Amazon RDS instance as the example solution. Suppose you want to attach your MyAppliedDiscount table to apply a discount for one or more order items.

Update the Schema

Add the type and input declarations for the MyAppliedDiscount table to the GraphQL schema.

input AWSDateOperator {
	eq: AWSDate
	gt: AWSDate
	ge: AWSDate
	in: [AWSDate]
	like: AWSDate
	lt: AWSDate
	le: AWSDate
	ne: AWSDate
	nin: [AWSDate]
}

input AWSDateTimeOperator {
	eq: AWSDateTime
	gt: AWSDateTime
	ge: AWSDateTime
	in: [AWSDateTime]
	like: AWSDateTime
	lt: AWSDateTime
	le: AWSDateTime
	ne: AWSDateTime
	nin: [AWSDateTime]
}

input AWSJSONOperator {
	eq: AWSJSON
	gt: AWSJSON
	ge: AWSJSON
	in: [AWSJSON]
	like: AWSJSON
	lt: AWSJSON
	le: AWSJSON
	ne: AWSJSON
	nin: [AWSJSON]
}

input AWSTimeOperator {
	eq: AWSTime
	gt: AWSTime
	ge: AWSTime
	in: [AWSTime]
	like: AWSTime
	lt: AWSTime
	le: AWSTime
	ne: AWSTime
	nin: [AWSTime]
}

input BooleanOperator {
	eq: Boolean
	gt: Boolean
	ge: Boolean
	in: [Boolean]
	like: Boolean
	lt: Boolean
	le: Boolean
	ne: Boolean
	nin: [Boolean]
}

enum Direction {
	ASC
	DESC
}

enum Enumeration {
	VALUE1
	VALUE2
	VALUE3
	VALUE4
	VALUE5
	VALUE6
	VALUE7
	VALUE8
	VALUE9
}

input FloatOperator {
	eq: Float
	gt: Float
	ge: Float
	in: [Float]
	like: Float
	lt: Float
	le: Float
	ne: Float
	nin: [Float]
}

input IDOperator {
	eq: ID
	gt: ID
	ge: ID
	in: [ID]
	like: ID
	lt: ID
	le: ID
	ne: ID
	nin: [ID]
}

input IntOperator {
	eq: Int
	gt: Int
	ge: Int
	in: [Int]
	like: Int
	lt: Int
	le: Int
	ne: Int
	nin: [Int]
}

type Mutation {
	create_MyOrder(input: MyOrder_CreateInput!): MyOrder
	create_MyOrderItem(input: MyOrderItem_CreateInput!): MyOrderItem
	create_MyProduct(input: MyProduct_CreateInput!): MyProduct
	create_MyAppliedDiscount(input: MyAppliedDiscount_CreateInput!): MyAppliedDiscount
	delete_MyOrder(id: ID!): MyOrder
	delete_MyOrderItem(id: ID!): MyOrderItem
	delete_MyProduct(id: ID!): MyProduct
	delete_MyAppliedDiscount(id: ID!): MyAppliedDiscount
	update_MyOrder(input: MyOrder_UpdateInput!): MyOrder
	update_MyOrderItem(input: MyOrderItem_UpdateInput!): MyOrderItem
	update_MyProduct(input: MyProduct_UpdateInput!): MyProduct
	update_MyAppliedDiscount(input: MyAppliedDiscount_UpdateInput!): MyAppliedDiscount
}

type MyAppliedDiscount implements Node {
	id: ID!
	DiscountId: ID!
	OrderItemOrderId: String
	OrderItemProductId: String
	Multiplier: Float
}

type MyAppliedDiscount_Connection {
	edges: [MyAppliedDiscount_Edge]
	pageInfo: PageInfo!
}

input MyAppliedDiscount_CreateInput {
	DiscountId: ID!
	OrderItemOrderId: String
	OrderItemProductId: String
	Multiplier: Float
}

type MyAppliedDiscount_Edge {
	cursor: String!
	node: MyAppliedDiscount
}

input MyAppliedDiscount_FilterInput {
	and: [MyAppliedDiscount_FilterInput]
	not: MyAppliedDiscount_FilterInput
	or: [MyAppliedDiscount_FilterInput]
	id: IDOperator
	DiscountId: StringOperator
	OrderItemOrderId: StringOperator
	OrderItemProductId: StringOperator
	Multiplier: FloatOperator
}

input MyAppliedDiscount_OrderByInput {
	id: OrderByClause
	DiscountId: OrderByClause
	OrderItemOrderId: OrderByClause
	OrderItemProductId: OrderByClause
	Multiplier: OrderByClause
}

input MyAppliedDiscount_UpdateInput {
	id: ID!
	DiscountId: ID!
	OrderItemOrderId: String
	OrderItemProductId: String
	Multiplier: Float
}

type MyOrder implements Node {
	id: ID!
	OrderId: ID!
	OrderDate: AWSDateTime
	Status: String
	TotalCost: Float
}

type MyOrderItem implements Node {
	id: ID!
	ParentOrderId: ID!
	ParentProductId: ID!
	Quantity: Int
}

type MyOrderItem_Connection {
	edges: [MyOrderItem_Edge]
	pageInfo: PageInfo!
}

input MyOrderItem_CreateInput {
	ParentOrderId: ID
	ParentProductId: ID
	Quantity: Int
}

type MyOrderItem_Edge {
	cursor: String!
	node: MyOrderItem
}

input MyOrderItem_FilterInput {
	and: [MyOrderItem_FilterInput]
	not: MyOrderItem_FilterInput
	or: [MyOrderItem_FilterInput]
	id: IDOperator
	ParentOrderId: StringOperator
	ParentProductId: StringOperator
	Quantity: IntOperator
}

input MyOrderItem_OrderByInput {
	id: OrderByClause
	ParentOrderId: OrderByClause
	ParentProductId: OrderByClause
	Quantity: OrderByClause
}

input MyOrderItem_UpdateInput {
	id: ID!
	ParentOrderId: ID
	ParentProductId: ID
	Quantity: Int
}

type MyOrder_Connection {
	edges: [MyOrder_Edge]
	pageInfo: PageInfo!
}

input MyOrder_CreateInput {
	OrderDate: AWSDateTime
	OrderId: ID!
	Status: String
	TotalCost: Float
}

type MyOrder_Edge {
	cursor: String!
	node: MyOrder
}

input MyOrder_FilterInput {
	and: [MyOrder_FilterInput]
	not: MyOrder_FilterInput
	or: [MyOrder_FilterInput]
	id: IDOperator
	OrderDate: AWSDateTimeOperator
	OrderId: StringOperator
	Status: StringOperator
	TotalCost: FloatOperator
}

input MyOrder_OrderByInput {
	id: OrderByClause
	OrderId: OrderByClause
	OrderDate: OrderByClause
	Status: OrderByClause
	TotalCost: OrderByClause
}

input MyOrder_UpdateInput {
	id: ID!
	OrderDate: AWSDateTime
	OrderId: String
	Status: String
	TotalCost: Float
}

type MyProduct implements Node {
	id: ID!
	ProductId: ID!
	Name: String
	Price: Float
	Discontinued: Boolean
}

type MyProduct_Connection {
	edges: [MyProduct_Edge]
	pageInfo: PageInfo!
}

input MyProduct_CreateInput {
	ProductId: ID!
	Name: String
	Price: Float
	Discontinued: Boolean
}

type MyProduct_Edge {
	cursor: String!
	node: MyProduct
}

input MyProduct_FilterInput {
	and: [MyProduct_FilterInput]
	not: MyProduct_FilterInput
	or: [MyProduct_FilterInput]
	id: IDOperator
	ProductId: StringOperator
	Name: StringOperator
	Price: FloatOperator
	Discontinued: BooleanOperator
}

input MyProduct_OrderByInput {
	id: OrderByClause
	ProductId: OrderByClause
	Name: OrderByClause
	Price: OrderByClause
	Discontinued: OrderByClause
}

input MyProduct_UpdateInput {
	id: ID!
	ProductId: String
	Name: String
	Price: Float
	Discontinued: Boolean
}

interface Node {
	id: ID!
}

enum NullsOrder {
	NULLS_FIRST
	NULLS_LAST
}

input OrderByClause {
	direction: Direction
	nulls: NullsOrder
}

type PageInfo {
	endCursor: String
	hasNextPage: Boolean!
}

type Query {
	myOrder(
		limit: Int,
		offset: Int,
		orderBy: [MyOrder_OrderByInput],
		where: MyOrder_FilterInput,
		first: Int,
		after: String
	): MyOrder_Connection
	myOrderItem(
		limit: Int,
		offset: Int,
		orderBy: [MyOrderItem_OrderByInput],
		where: MyOrderItem_FilterInput,
		first: Int,
		after: String
	): MyOrderItem_Connection
	myProduct(
		limit: Int,
		offset: Int,
		orderBy: [MyProduct_OrderByInput],
		where: MyProduct_FilterInput,
		first: Int,
		after: String
	): MyProduct_Connection
	myAppliedDiscount(
		limit: Int,
		offset: Int,
		orderBy: [MyAppliedDiscount_OrderByInput],
		where: MyAppliedDiscount_FilterInput,
		first: Int,
		after: String
	): MyAppliedDiscount_Connection
	node(id: ID!): Node
}

input StringOperator {
	eq: String
	gt: String
	ge: String
	in: [String]
	like: String
	lt: String
	le: String
	ne: String
	nin: [String]
}

Update the Table Metadata

Add metadata entries in the Parameter Store for the MyAppliedDiscount table.

**/appsync/typemetadata/MyOrder**

{
  "secretName": "graphqlsample",
  "secretRegion": "us-west-2",
  "keyFields": [
    "OrderId"
  ],
  "databaseTableName": "graphqlsample.my_order",
  "graphQLFields": {
    "OrderId": {
      "fieldType": "String",
      "columnName": "order_id"
    },
    "OrderDate": {
      "fieldType": "AWSDateTime",
      "columnName": "order_date"
    },
    "Status": {
      "fieldType": "String",
      "columnName": "status"
    },
    "TotalCost": {
      "fieldType": "Float",
      "columnName": "total_cost"
    }
  }
}


**/appsync/typemetadata/MyOrderItem**


{
  "secretName": "graphqlsample",
  "secretRegion": "us-west-2",
  "keyFields": [
    "ParentOrderId",
    "ParentProductId"
  ],
  "databaseTableName": "graphqlsample.my_order_item",
  "graphQLFields": {
    "ParentOrderId": {
      "fieldType": "String",
      "columnName": "parent_order_id"
    },
    "ParentProductId": {
      "fieldType": "String",
      "columnName": "parent_product_id"
    },
    "Quantity": {
      "fieldType": "Int",
      "columnName": "quantity"
    }
  }
}

**/appsync/typemetadata/MyProduct**

{
  "secretName": "graphqlsample",
  "secretRegion": "us-west-2",
    "keyFields": ["ProductId"],
  "databaseTableName": "graphqlsample.my_product",
  "graphQLFields": {
    "ProductId": {
      "fieldType": "String",
      "columnName": "product_id"
    },
    "Name": {
      "fieldType": "String",
      "columnName": "name"
    },
    "Price": {
      "fieldType": "Float",
      "columnName": "price"
    },
    "Discontinued": {
      "fieldType": "Boolean",
      "columnName": "discontinued"
    }
  }
}

**/appsync/typemetadata/MyAppliedDiscount**

{
  "secretName": "graphqlsample",
  "secretRegion": "us-west-2",
  "keyFields": [
    "DiscountId",
    "OrderItemOrderId",
    "OrderItemProductId"
  ],
  "databaseTableName": "postgres.my_applied_discount",
  "graphQLFields": {
    "DiscountId": {
      "fieldType": "String",
      "columnName": "discount_id"
    },
    "OrderItemOrderId": {
      "fieldType": "String",
      "columnName": "order_item_order_id"
    },
    "OrderItemProductId": {
      "fieldType": "String",
      "columnName": "order_item_product_id"
    },
    "Multiplier": {
      "fieldType": "Float",
      "columnName": "multiplier"
    }
  }
}

Generate Table Qualifiers

MyOrder

This is a sample table qualifier generated for an external ID based on the id field of the MyOrder table.

{
  "columns": {
    "id": {
      "values": [
        {
          "definition": "\"MyOrder-\"&SUBSTITUTE(ExternalId, \"-\", \"\\\\-\")"
        }
      ]
    },
    "ExternalId": {
      "virtual": true,
      "values": [
        {
          "definition": "SUBSTITUTE(RIGHT(id, LEN(id)-8), \"\\\\-\", \"-\")"
        }
      ]
    }
  }
}

MyOrderItem

This is a sample table qualifier generated for an external ID based on the id field of the MyOrderItem table.

{
  "columns": {
    "id": {
      "values": [
        {
          "definition": "\"MyOrderItem-\"&SUBSTITUTE(SUBSTITUTE(ExternalId, \"-\", \"\\\\-\"), \"\\\\-PRD\", \"-PRD\")"
        }
      ]
    },
    "ExternalId": {
      "virtual": true,
      "values": [
        {
          "definition": "SUBSTITUTE(RIGHT(id, LEN(id)-12), \"\\\\-\", \"-\")"
        }
      ]
    }
  }
}

MyProduct

This is a sample table qualifier generated for an external ID based on the id field of the MyProduct table.

{
  "columns": {
    "id": {
      "values": [
        {
          "definition": "\"MyProduct-\"&SUBSTITUTE(ExternalId, \"-\", \"\\\\-\")"
        }
      ]
    },
    "ExternalId": {
      "virtual": true,
      "values": [
        {
          "definition": "SUBSTITUTE(RIGHT(id, LEN(id)-10), \"\\\\-\", \"-\")"
        }
      ]
    }
  }
}

MyAppliedDiscount

This is a sample table qualifier for a virtual external ID defined using the values formula.

{
  "columns": {
    "id": {
      "values": [
        {
          "definition": "\"MyAppliedDiscount-\"&SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(ExternalId, \"-\", \"\\\\-\"), \"\\\\-ORD\", \"-ORD\"), \"\\\\-PRD\", \"-PRD\")"
        }
      ]
    },
    "ExternalId": {
      "virtual": true,
      "values": [
        {
          "definition": "SUBSTITUTE(RIGHT(id, LEN(id)-18), \"\\\\-\", \"-\")"
        }
      ]
    },
    "OrderItemId": {
      "virtual": true,
      "values": [
        {
          "definition": "OrderItemOrderId&\"-\"&OrderItemProductId"
        }
      ]
    },
    "OrderItemOrderId": {
      "values": [
        {
          "definition": "LEFT(OrderItemId, FIND(\"-PRD\", OrderItemId)-1)"
        }
      ]
    },
    "OrderItemProductId": {
      "values": [
        {
          "definition": "RIGHT(OrderItemId, LEN(OrderItemId)-FIND(\"-PRD\",OrderItemId))"
        }
      ]
    }
  }
}