Skip to main content

Features Details

Some important GraphQL feature details.

Queries

ViewAll | ViewAllPaged | SelectWhere | <table>Query | DataMesh

Following Query variants are provided in generated code.

  • ViewAll
  • ViewAllPaged
  • SelectWhere
  • <table>Query
  • DataMesh
  • FindOne
  • GetOne
extend type Query { 
ProductViewAll: [Product]!
ProductViewAllPaged(page: Int, size: Int) : [Product]!
ProductSelectWhere(searchBy: String, sortBy: String, page: Int = 0, size: Int = 10) : [Product]!
# ProductDataMesh: [Product]!
}
extend type Query {
ProductQuery(productId: Int): [Product]!
}

ViewAll, ViewAllPaged, <table>Query are self-explanatory.

Query SelectWhere: Flexible SQL-Like Querying

Query type SelectWhere empowers developers in extending data filtering on-the-fly to any columns needed, and also empowers end-users with flexible filter selections via UI Filter Screen.

Please refer to GraphQL_Readme.txt file for full details on using it, syntax, operators supported and examples.

Some excerpts here:

* Example: searchBy string: " invQty > 100 and invLocation = 'USA' and invDate = '2022-10-20 14:20' and invCost isNotNull 0  " 
* Example: sortBy string: " invQty desc , invMinQty desc "

Data Federation | Data Mesh

A default DataMesh Query is provided in generated code. That can be easily customized further. Refer to GraphQL APIs Extending section here.

Nested Objects

Implementing Nested Objects is easy. Configure Table-to-Table Joins and Multi-Table Relations. Generate code. Complete use case via Via Low-Code Customize.

Please refer to One-to-many relationship section on this page for example of Nested Model.

GraphQL Data Modeling

Please refer to common reference on Data Modeling

In this feature details page, we give examples of GraphQL Data Modeling with 1x1, 1xM and MxM relationships.

One-to-one relationship

1x1 relationship between two tables.

1x1 Table Join example

Table Join:

Srl Left Table   Lt Tbl Id  Relationship    Right Table Rt Tbl Id   Defn Id
1 erp_inventory 5004391 1x1 erp_product 5004393 5000113

GraphQL API Generated: Query:

{
ErpInventoryErpProductFindOne(invId: 1) {
invId
productId
invDate
invQty
invMinQty
invCost
invLocation
ErpProduct {
productId
productName
productCategory
primarySupplier
}
}
}

Payload:

{
"data": {
"ErpInventoryErpProductFindOne": {
"invId": 1,
"productId": 1,
"invDate": "19/02/23",
"invQty": 10,
"invMinQty": 2,
"invCost": 50,
"invLocation": "USA",
"ErpProduct": {
"productId": 1,
"productName": "Amoxicillin",
"productCategory": "Antibiotics",
"primarySupplier": "Lupin",
}
}
}
}

One-to-many relationship

1xM relationship between two tables.

1xM Table Relation example with multiple tables

Tables Relation:

Srl Left Table  Lt Tbl Id   Relationship    Right Table Rt Tbl Id   Defn Id
1 erp_product 5004393 1xM erp_inventory 5004391 5000112
2 erp_inventory 5004391 1x1 erp_inventory_vw 5004399 5000114

GraphQL API Generated: Query:

{
ErpProductErpInventory1MultiFindOne(productId: 1) {
productId
productName
productCategory
primarySupplier
ErpInventoryErpInventoryVw {
invId
productId
invDate
invQty
ErpInventoryVw {
invId
invCost
invMinQty
invLocation
}
}
}
}

Payload:

{
"data": {
"ErpProductErpInventory1MultiFindOne": {
"productId": 1,
"productName": "Amoxicillin",
"productCategory": "Antibiotics",
"primarySupplier": "Lupin",
"ErpInventoryErpInventoryVw": [
{
"invId": 1,
"productId": 1,
"invDate": "19/02/23",
"invQty": 10,
"ErpInventoryVw": {
"invId": 1,
"invCost": 50,
"invMinQty": 2,
"invLocation": "USA"
}
},
{
"invId": 2,
"productId": 2,
"invDate": "19/02/23",
"invQty": 20,
"ErpInventoryVw": {
"invId": 1,
"invCost": 50,
"invMinQty": 2,
"invLocation": "USA"
}
}
]
}
}
}

Many-to-many relationship

MxM relationship between two tables.

MxM Table Relation example

Table Join:

Srl Left Table  Lt Tbl Id   Relationship    Right Table Rt Tbl Id   Defn Id
1 erp_product 5004393 1xM erp_inventory 5004391 5000112

GraphQL API Generated: Query:

{
ErpProductErpInventoryViewAllPaged(page: 0, size: 2) {
productId
productName
productCategory
primarySupplier
ErpInventory {
invId
productId
invDate
invQty
}
}
}

Payload:

{
"data": {
"ErpProductErpInventoryViewAllPaged": [
{
"productId": 1,
"productName": "Amoxicillin",
"productCategory": "Antibiotics",
"primarySupplier": "Lupin",
"ErpInventory": [
{
"invId": 1,
"productId": 1,
"invDate": "19/02/23",
"invQty": 10
},
{
"invId": 2,
"productId": 1,
"invDate": "19/02/23",
"invQty": 20
}
]
},
{
"productId": 2,
"productName": "Azithromycin",
"productCategory": "Antibiotics",
"primarySupplier": "Abbot",
"ErpInventory": [
{
"invId": 1,
"productId": 2,
"invDate": "19/02/23",
"invQty": 10
},
{
"invId": 2,
"productId": 2,
"invDate": "19/02/23",
"invQty": 20
}
]
}
]
}
}

Mutations

Following Mutation variants are provided in generated code, for database insert, update, delete actions.

extend type Mutation { 
CustomerCreate(CustomerTblRec1: CustomerInput ): Customer
CustomerUpdate(customerId: String, CustomerTblRec1: CustomerInput ): Customer
CustomerDelete(customerId: String): Int
}

Misc

Solving Underfetching and the n+1 problem

What is the problem ?

Underfetching and the n+1-requests problem means that a specific endpoint doesn’t provide enough of the required information. The client will have to make additional requests to fetch everything it needs. e.g. A client needs to first download a list of elements, but then needs to make one additional request per element to fetch the required data.

Using Table Relationship Queries solves this problem. Also Low-Code Customize to implement Nested Objects can help further.

Table Relationship Queries

Table Relationship Queries using Query methods like <table>Query and SelctWhere solve this problem. Master-Detail relationship records have master record (relationship) keys in all detail level tables, which can be used to avoid n+1.

Example : Fetch Table Relation Data For Master:Detail 1:N (Many) Relations

See Example

Query:

query MyProductInventories {
ProductQuery(productId: 1) {
productId
productName
productCategory
primarySupplier
productDesc
}
InventorySelectWhere(searchBy: " productId = 1 ") {
invId
productId
invDate
invQty
invCost
invLocation
}
}

Response Data:

{
"data": {
"ProductQuery": [
{
"productId": 1,
"productName": "Amoxicillin",
"productCategory": "Antibiotics",
"primarySupplier": "Lupin",
"productDesc": ""
}
],
"InventorySelectWhere": [
{
"invId": 1,
"productId": 1,
"invDate": "2022-11-28",
"invQty": 10,
"invCost": 50,
"invLocation": "USA"
},
{
"invId": 42,
"productId": 1,
"invDate": "2023-02-19",
"invQty": 20,
"invCost": 100,
"invLocation": "USA"
},
{
"invId": 43,
"productId": 1,
"invDate": "2023-02-18",
"invQty": 40,
"invCost": 200,
"invLocation": "USA"
}
]
}
}

Use similar approach for Master:Detail:Detail 1:N:N Relations

Example : Fetch Table Relation Data For Foreign Key or 1:1 Relations

This solution is applicable when the relation key value is known and used.

See Example

Query:

query MyInventory {
InventoryQuery(invId: 1) {
invId
productId
invDate
invQty
invCost
invLocation
}
ProductSelectWhere(searchBy: " productId = 1 ") {
productId
productName
productCategory
primarySupplier
productDesc
}
}

Response Data:

{
"data": {
"InventoryQuery": [
{
"invId": 1,
"productId": 1,
"invDate": "2022-11-28",
"invQty": 10,
"invCost": 50,
"invLocation": "USA"
}
],
"ProductSelectWhere": [
{
"productId": 1,
"productName": "Amoxicillin",
"productCategory": "Antibiotics",
"primarySupplier": "Lupin",
"productDesc": ""
}
]
}
}

Setup

Setup Security & Authentication

Customize - Authorize Access

  • Security - Role/User based Auth.

API Customization

Handle inserting data to 2 tables via API Created on View

Troubleshooting FAQs