Adding some new test cases based on finishing off testing.
This commit is contained in:
parent
5f76f143bf
commit
45d2e67905
|
@ -5,6 +5,7 @@ import { SqlClient } from "../utils"
|
||||||
|
|
||||||
describe("Captures of real examples", () => {
|
describe("Captures of real examples", () => {
|
||||||
const limit = 5000
|
const limit = 5000
|
||||||
|
const relationshipLimit = 100
|
||||||
|
|
||||||
function getJson(name: string): QueryJson {
|
function getJson(name: string): QueryJson {
|
||||||
return require(join(__dirname, "sqlQueryJson", name)) as QueryJson
|
return require(join(__dirname, "sqlQueryJson", name)) as QueryJson
|
||||||
|
@ -26,7 +27,7 @@ describe("Captures of real examples", () => {
|
||||||
const queryJson = getJson("basicFetchWithRelationships.json")
|
const queryJson = getJson("basicFetchWithRelationships.json")
|
||||||
let query = new Sql(SqlClient.POSTGRES, limit)._query(queryJson)
|
let query = new Sql(SqlClient.POSTGRES, limit)._query(queryJson)
|
||||||
expect(query).toEqual({
|
expect(query).toEqual({
|
||||||
bindings: [100, limit],
|
bindings: [relationshipLimit, limit],
|
||||||
sql: `select "a"."year" as "a.year", "a"."firstname" as "a.firstname", "a"."personid" as "a.personid", "a"."address" as "a.address", "a"."age" as "a.age", "a"."type" as "a.type", "a"."city" as "a.city", "a"."lastname" as "a.lastname", "b"."executorid" as "b.executorid", "b"."taskname" as "b.taskname", "b"."taskid" as "b.taskid", "b"."completed" as "b.completed", "b"."qaid" as "b.qaid", "b"."executorid" as "b.executorid", "b"."taskname" as "b.taskname", "b"."taskid" as "b.taskid", "b"."completed" as "b.completed", "b"."qaid" as "b.qaid" from (select * from "persons" as "a" order by "a"."firstname" asc limit $1) as "a" left join "tasks" as "b" on "a"."personid" = "b"."qaid" or "a"."personid" = "b"."executorid" order by "a"."firstname" asc limit $2`,
|
sql: `select "a"."year" as "a.year", "a"."firstname" as "a.firstname", "a"."personid" as "a.personid", "a"."address" as "a.address", "a"."age" as "a.age", "a"."type" as "a.type", "a"."city" as "a.city", "a"."lastname" as "a.lastname", "b"."executorid" as "b.executorid", "b"."taskname" as "b.taskname", "b"."taskid" as "b.taskid", "b"."completed" as "b.completed", "b"."qaid" as "b.qaid", "b"."executorid" as "b.executorid", "b"."taskname" as "b.taskname", "b"."taskid" as "b.taskid", "b"."completed" as "b.completed", "b"."qaid" as "b.qaid" from (select * from "persons" as "a" order by "a"."firstname" asc limit $1) as "a" left join "tasks" as "b" on "a"."personid" = "b"."qaid" or "a"."personid" = "b"."executorid" order by "a"."firstname" asc limit $2`,
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -35,10 +36,50 @@ describe("Captures of real examples", () => {
|
||||||
const queryJson = getJson("filterByRelationship.json")
|
const queryJson = getJson("filterByRelationship.json")
|
||||||
let query = new Sql(SqlClient.POSTGRES, limit)._query(queryJson)
|
let query = new Sql(SqlClient.POSTGRES, limit)._query(queryJson)
|
||||||
expect(query).toEqual({
|
expect(query).toEqual({
|
||||||
bindings: [100, "assembling", limit],
|
bindings: [relationshipLimit, "assembling", limit],
|
||||||
sql: `select "a"."productname" as "a.productname", "a"."productid" as "a.productid", "b"."executorid" as "b.executorid", "b"."taskname" as "b.taskname", "b"."taskid" as "b.taskid", "b"."completed" as "b.completed", "b"."qaid" as "b.qaid" from (select * from "products" as "a" order by "a"."productname" asc limit $1) as "a" left join "products_tasks" as "c" on "a"."productid" = "c"."productid" left join "tasks" as "b" on "b"."taskid" = "c"."taskid" where "b"."taskname" = $2 order by "a"."productname" asc limit $3`,
|
sql: `select "a"."productname" as "a.productname", "a"."productid" as "a.productid", "b"."executorid" as "b.executorid", "b"."taskname" as "b.taskname", "b"."taskid" as "b.taskid", "b"."completed" as "b.completed", "b"."qaid" as "b.qaid" from (select * from "products" as "a" order by "a"."productname" asc limit $1) as "a" left join "products_tasks" as "c" on "a"."productid" = "c"."productid" left join "tasks" as "b" on "b"."taskid" = "c"."taskid" where "b"."taskname" = $2 order by "a"."productname" asc limit $3`,
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it("should handle fetching many to many relationships", () => {
|
||||||
|
const queryJson = getJson("fetchManyToMany.json")
|
||||||
|
let query = new Sql(SqlClient.POSTGRES, limit)._query(queryJson)
|
||||||
|
expect(query).toEqual({
|
||||||
|
bindings: [relationshipLimit, limit],
|
||||||
|
sql: `select "a"."productname" as "a.productname", "a"."productid" as "a.productid", "b"."executorid" as "b.executorid", "b"."taskname" as "b.taskname", "b"."taskid" as "b.taskid", "b"."completed" as "b.completed", "b"."qaid" as "b.qaid" from (select * from "products" as "a" order by "a"."productname" asc limit $1) as "a" left join "products_tasks" as "c" on "a"."productid" = "c"."productid" left join "tasks" as "b" on "b"."taskid" = "c"."taskid" order by "a"."productname" asc limit $2`,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should handle enrichment of rows", () => {
|
||||||
|
const queryJson = getJson("enrichRelationship.json")
|
||||||
|
const filters = queryJson.filters?.oneOf?.taskid as number[]
|
||||||
|
let query = new Sql(SqlClient.POSTGRES, limit)._query(queryJson)
|
||||||
|
expect(query).toEqual({
|
||||||
|
bindings: [...filters, limit, limit],
|
||||||
|
sql: `select "a"."executorid" as "a.executorid", "a"."taskname" as "a.taskname", "a"."taskid" as "a.taskid", "a"."completed" as "a.completed", "a"."qaid" as "a.qaid", "b"."productname" as "b.productname", "b"."productid" as "b.productid" from (select * from "tasks" as "a" where "a"."taskid" in ($1, $2) limit $3) as "a" left join "products_tasks" as "c" on "a"."taskid" = "c"."taskid" left join "products" as "b" on "b"."productid" = "c"."productid" limit $4`,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should manage query with many relationship filters", () => {
|
||||||
|
const queryJson = getJson("manyRelationshipFilters.json")
|
||||||
|
let query = new Sql(SqlClient.POSTGRES, limit)._query(queryJson)
|
||||||
|
const filters = queryJson.filters
|
||||||
|
const notEqualsValue = Object.values(filters?.notEqual!)[0]
|
||||||
|
const rangeValue = Object.values(filters?.range!)[0]
|
||||||
|
const equalValue = Object.values(filters?.equal!)[0]
|
||||||
|
|
||||||
|
expect(query).toEqual({
|
||||||
|
bindings: [
|
||||||
|
notEqualsValue,
|
||||||
|
relationshipLimit,
|
||||||
|
rangeValue.low,
|
||||||
|
rangeValue.high,
|
||||||
|
equalValue,
|
||||||
|
limit,
|
||||||
|
],
|
||||||
|
sql: `select "a"."executorid" as "a.executorid", "a"."taskname" as "a.taskname", "a"."taskid" as "a.taskid", "a"."completed" as "a.completed", "a"."qaid" as "a.qaid", "b"."productname" as "b.productname", "b"."productid" as "b.productid", "c"."year" as "c.year", "c"."firstname" as "c.firstname", "c"."personid" as "c.personid", "c"."address" as "c.address", "c"."age" as "c.age", "c"."type" as "c.type", "c"."city" as "c.city", "c"."lastname" as "c.lastname", "c"."year" as "c.year", "c"."firstname" as "c.firstname", "c"."personid" as "c.personid", "c"."address" as "c.address", "c"."age" as "c.age", "c"."type" as "c.type", "c"."city" as "c.city", "c"."lastname" as "c.lastname" from (select * from "tasks" as "a" where not "a"."completed" = $1 order by "a"."taskname" asc limit $2) as "a" left join "products_tasks" as "d" on "a"."taskid" = "d"."taskid" left join "products" as "b" on "b"."productid" = "d"."productid" left join "persons" as "c" on "a"."executorid" = "c"."personid" or "a"."qaid" = "c"."personid" where "c"."year" between $3 and $4 and "b"."productname" = $5 order by "a"."taskname" asc limit $6`,
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe("update", () => {
|
describe("update", () => {
|
||||||
|
|
|
@ -0,0 +1,123 @@
|
||||||
|
{
|
||||||
|
"endpoint": {
|
||||||
|
"datasourceId": "datasource_plus_44a967caf37a435f84fe01cd6dfe8f81",
|
||||||
|
"entityId": "tasks",
|
||||||
|
"operation": "READ"
|
||||||
|
},
|
||||||
|
"resource": {
|
||||||
|
"fields": [
|
||||||
|
"a.executorid",
|
||||||
|
"a.taskname",
|
||||||
|
"a.taskid",
|
||||||
|
"a.completed",
|
||||||
|
"a.qaid",
|
||||||
|
"b.productname",
|
||||||
|
"b.productid"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"filters": {
|
||||||
|
"oneOf": {
|
||||||
|
"taskid": [
|
||||||
|
1,
|
||||||
|
2
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"relationships": [
|
||||||
|
{
|
||||||
|
"tableName": "products",
|
||||||
|
"column": "products",
|
||||||
|
"through": "products_tasks",
|
||||||
|
"from": "taskid",
|
||||||
|
"to": "productid",
|
||||||
|
"fromPrimary": "taskid",
|
||||||
|
"toPrimary": "productid",
|
||||||
|
"aliases": {
|
||||||
|
"products_tasks": "c",
|
||||||
|
"products": "b",
|
||||||
|
"tasks": "a"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"extra": {
|
||||||
|
"idFilter": {}
|
||||||
|
},
|
||||||
|
"meta": {
|
||||||
|
"table": {
|
||||||
|
"type": "table",
|
||||||
|
"_id": "datasource_plus_44a967caf37a435f84fe01cd6dfe8f81__tasks",
|
||||||
|
"primary": [
|
||||||
|
"taskid"
|
||||||
|
],
|
||||||
|
"name": "a",
|
||||||
|
"schema": {
|
||||||
|
"executorid": {
|
||||||
|
"type": "number",
|
||||||
|
"externalType": "integer",
|
||||||
|
"autocolumn": false,
|
||||||
|
"name": "executorid",
|
||||||
|
"constraints": {
|
||||||
|
"presence": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"taskname": {
|
||||||
|
"type": "string",
|
||||||
|
"externalType": "character varying",
|
||||||
|
"autocolumn": false,
|
||||||
|
"name": "taskname",
|
||||||
|
"constraints": {
|
||||||
|
"presence": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"taskid": {
|
||||||
|
"type": "number",
|
||||||
|
"externalType": "integer",
|
||||||
|
"autocolumn": true,
|
||||||
|
"name": "taskid",
|
||||||
|
"constraints": {
|
||||||
|
"presence": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"completed": {
|
||||||
|
"type": "boolean",
|
||||||
|
"externalType": "boolean",
|
||||||
|
"autocolumn": false,
|
||||||
|
"name": "completed",
|
||||||
|
"constraints": {
|
||||||
|
"presence": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"qaid": {
|
||||||
|
"type": "number",
|
||||||
|
"externalType": "integer",
|
||||||
|
"autocolumn": false,
|
||||||
|
"name": "qaid",
|
||||||
|
"constraints": {
|
||||||
|
"presence": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"products": {
|
||||||
|
"tableId": "datasource_plus_44a967caf37a435f84fe01cd6dfe8f81__products",
|
||||||
|
"name": "products",
|
||||||
|
"relationshipType": "many-to-many",
|
||||||
|
"through": "datasource_plus_44a967caf37a435f84fe01cd6dfe8f81__products_tasks",
|
||||||
|
"type": "link",
|
||||||
|
"_id": "c3b91d00cd36c4cc1a347794725b9adbd",
|
||||||
|
"fieldName": "productid",
|
||||||
|
"throughFrom": "productid",
|
||||||
|
"throughTo": "taskid"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"sourceId": "datasource_plus_44a967caf37a435f84fe01cd6dfe8f81",
|
||||||
|
"sourceType": "external",
|
||||||
|
"primaryDisplay": "taskname",
|
||||||
|
"sql": true,
|
||||||
|
"views": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tableAliases": {
|
||||||
|
"tasks": "a",
|
||||||
|
"products": "b",
|
||||||
|
"products_tasks": "c"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,109 @@
|
||||||
|
{
|
||||||
|
"endpoint": {
|
||||||
|
"datasourceId": "datasource_plus_44a967caf37a435f84fe01cd6dfe8f81",
|
||||||
|
"entityId": "products",
|
||||||
|
"operation": "READ"
|
||||||
|
},
|
||||||
|
"resource": {
|
||||||
|
"fields": [
|
||||||
|
"a.productname",
|
||||||
|
"a.productid",
|
||||||
|
"b.executorid",
|
||||||
|
"b.taskname",
|
||||||
|
"b.taskid",
|
||||||
|
"b.completed",
|
||||||
|
"b.qaid"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"filters": {
|
||||||
|
"string": {},
|
||||||
|
"fuzzy": {},
|
||||||
|
"range": {},
|
||||||
|
"equal": {},
|
||||||
|
"notEqual": {},
|
||||||
|
"empty": {},
|
||||||
|
"notEmpty": {},
|
||||||
|
"contains": {},
|
||||||
|
"notContains": {},
|
||||||
|
"oneOf": {},
|
||||||
|
"containsAny": {}
|
||||||
|
},
|
||||||
|
"sort": {
|
||||||
|
"productname": {
|
||||||
|
"direction": "ASCENDING"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"paginate": {
|
||||||
|
"limit": 100,
|
||||||
|
"page": 1
|
||||||
|
},
|
||||||
|
"relationships": [
|
||||||
|
{
|
||||||
|
"tableName": "tasks",
|
||||||
|
"column": "tasks",
|
||||||
|
"through": "products_tasks",
|
||||||
|
"from": "productid",
|
||||||
|
"to": "taskid",
|
||||||
|
"fromPrimary": "productid",
|
||||||
|
"toPrimary": "taskid",
|
||||||
|
"aliases": {
|
||||||
|
"products_tasks": "c",
|
||||||
|
"tasks": "b",
|
||||||
|
"products": "a"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"extra": {
|
||||||
|
"idFilter": {}
|
||||||
|
},
|
||||||
|
"meta": {
|
||||||
|
"table": {
|
||||||
|
"type": "table",
|
||||||
|
"_id": "datasource_plus_44a967caf37a435f84fe01cd6dfe8f81__products",
|
||||||
|
"primary": [
|
||||||
|
"productid"
|
||||||
|
],
|
||||||
|
"name": "a",
|
||||||
|
"schema": {
|
||||||
|
"productname": {
|
||||||
|
"type": "string",
|
||||||
|
"externalType": "character varying",
|
||||||
|
"autocolumn": false,
|
||||||
|
"name": "productname",
|
||||||
|
"constraints": {
|
||||||
|
"presence": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"productid": {
|
||||||
|
"type": "number",
|
||||||
|
"externalType": "integer",
|
||||||
|
"autocolumn": true,
|
||||||
|
"name": "productid",
|
||||||
|
"constraints": {
|
||||||
|
"presence": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tasks": {
|
||||||
|
"tableId": "datasource_plus_44a967caf37a435f84fe01cd6dfe8f81__tasks",
|
||||||
|
"name": "tasks",
|
||||||
|
"relationshipType": "many-to-many",
|
||||||
|
"fieldName": "taskid",
|
||||||
|
"through": "datasource_plus_44a967caf37a435f84fe01cd6dfe8f81__products_tasks",
|
||||||
|
"throughFrom": "taskid",
|
||||||
|
"throughTo": "productid",
|
||||||
|
"type": "link",
|
||||||
|
"main": true,
|
||||||
|
"_id": "c3b91d00cd36c4cc1a347794725b9adbd"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"sourceId": "datasource_plus_44a967caf37a435f84fe01cd6dfe8f81",
|
||||||
|
"sourceType": "external",
|
||||||
|
"primaryDisplay": "productname"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tableAliases": {
|
||||||
|
"products": "a",
|
||||||
|
"tasks": "b",
|
||||||
|
"products_tasks": "c"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,202 @@
|
||||||
|
{
|
||||||
|
"endpoint": {
|
||||||
|
"datasourceId": "datasource_plus_44a967caf37a435f84fe01cd6dfe8f81",
|
||||||
|
"entityId": "tasks",
|
||||||
|
"operation": "READ"
|
||||||
|
},
|
||||||
|
"resource": {
|
||||||
|
"fields": [
|
||||||
|
"a.executorid",
|
||||||
|
"a.taskname",
|
||||||
|
"a.taskid",
|
||||||
|
"a.completed",
|
||||||
|
"a.qaid",
|
||||||
|
"b.productname",
|
||||||
|
"b.productid",
|
||||||
|
"c.year",
|
||||||
|
"c.firstname",
|
||||||
|
"c.personid",
|
||||||
|
"c.address",
|
||||||
|
"c.age",
|
||||||
|
"c.type",
|
||||||
|
"c.city",
|
||||||
|
"c.lastname",
|
||||||
|
"c.year",
|
||||||
|
"c.firstname",
|
||||||
|
"c.personid",
|
||||||
|
"c.address",
|
||||||
|
"c.age",
|
||||||
|
"c.type",
|
||||||
|
"c.city",
|
||||||
|
"c.lastname"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"filters": {
|
||||||
|
"string": {},
|
||||||
|
"fuzzy": {},
|
||||||
|
"range": {
|
||||||
|
"1:persons.year": {
|
||||||
|
"low": 1990,
|
||||||
|
"high": 2147483647
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"equal": {
|
||||||
|
"2:products.productname": "Computers"
|
||||||
|
},
|
||||||
|
"notEqual": {
|
||||||
|
"3:completed": true
|
||||||
|
},
|
||||||
|
"empty": {},
|
||||||
|
"notEmpty": {},
|
||||||
|
"contains": {},
|
||||||
|
"notContains": {},
|
||||||
|
"oneOf": {},
|
||||||
|
"containsAny": {},
|
||||||
|
"onEmptyFilter": "all"
|
||||||
|
},
|
||||||
|
"sort": {
|
||||||
|
"taskname": {
|
||||||
|
"direction": "ASCENDING"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"paginate": {
|
||||||
|
"limit": 100,
|
||||||
|
"page": 1
|
||||||
|
},
|
||||||
|
"relationships": [
|
||||||
|
{
|
||||||
|
"tableName": "products",
|
||||||
|
"column": "products",
|
||||||
|
"through": "products_tasks",
|
||||||
|
"from": "taskid",
|
||||||
|
"to": "productid",
|
||||||
|
"fromPrimary": "taskid",
|
||||||
|
"toPrimary": "productid",
|
||||||
|
"aliases": {
|
||||||
|
"products_tasks": "d",
|
||||||
|
"products": "b",
|
||||||
|
"tasks": "a"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tableName": "persons",
|
||||||
|
"column": "tasksToExecute",
|
||||||
|
"from": "executorid",
|
||||||
|
"to": "personid",
|
||||||
|
"aliases": {
|
||||||
|
"persons": "c",
|
||||||
|
"tasks": "a"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tableName": "persons",
|
||||||
|
"column": "tasksToQA",
|
||||||
|
"from": "qaid",
|
||||||
|
"to": "personid",
|
||||||
|
"aliases": {
|
||||||
|
"persons": "c",
|
||||||
|
"tasks": "a"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"extra": {
|
||||||
|
"idFilter": {}
|
||||||
|
},
|
||||||
|
"meta": {
|
||||||
|
"table": {
|
||||||
|
"type": "table",
|
||||||
|
"_id": "datasource_plus_44a967caf37a435f84fe01cd6dfe8f81__tasks",
|
||||||
|
"primary": [
|
||||||
|
"taskid"
|
||||||
|
],
|
||||||
|
"name": "a",
|
||||||
|
"schema": {
|
||||||
|
"executorid": {
|
||||||
|
"type": "number",
|
||||||
|
"externalType": "integer",
|
||||||
|
"name": "executorid",
|
||||||
|
"constraints": {
|
||||||
|
"presence": false
|
||||||
|
},
|
||||||
|
"autocolumn": true,
|
||||||
|
"autoReason": "foreign_key"
|
||||||
|
},
|
||||||
|
"taskname": {
|
||||||
|
"type": "string",
|
||||||
|
"externalType": "character varying",
|
||||||
|
"autocolumn": false,
|
||||||
|
"name": "taskname",
|
||||||
|
"constraints": {
|
||||||
|
"presence": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"taskid": {
|
||||||
|
"type": "number",
|
||||||
|
"externalType": "integer",
|
||||||
|
"autocolumn": true,
|
||||||
|
"name": "taskid",
|
||||||
|
"constraints": {
|
||||||
|
"presence": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"completed": {
|
||||||
|
"type": "boolean",
|
||||||
|
"externalType": "boolean",
|
||||||
|
"autocolumn": false,
|
||||||
|
"name": "completed",
|
||||||
|
"constraints": {
|
||||||
|
"presence": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"qaid": {
|
||||||
|
"type": "number",
|
||||||
|
"externalType": "integer",
|
||||||
|
"name": "qaid",
|
||||||
|
"constraints": {
|
||||||
|
"presence": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"products": {
|
||||||
|
"tableId": "datasource_plus_44a967caf37a435f84fe01cd6dfe8f81__products",
|
||||||
|
"name": "products",
|
||||||
|
"relationshipType": "many-to-many",
|
||||||
|
"through": "datasource_plus_44a967caf37a435f84fe01cd6dfe8f81__products_tasks",
|
||||||
|
"type": "link",
|
||||||
|
"_id": "c3b91d00cd36c4cc1a347794725b9adbd",
|
||||||
|
"fieldName": "productid",
|
||||||
|
"throughFrom": "productid",
|
||||||
|
"throughTo": "taskid"
|
||||||
|
},
|
||||||
|
"tasksToExecute": {
|
||||||
|
"tableId": "datasource_plus_44a967caf37a435f84fe01cd6dfe8f81__persons",
|
||||||
|
"name": "tasksToExecute",
|
||||||
|
"relationshipType": "one-to-many",
|
||||||
|
"type": "link",
|
||||||
|
"_id": "c0f440590bda04f28846242156c1dd60b",
|
||||||
|
"foreignKey": "executorid",
|
||||||
|
"fieldName": "personid"
|
||||||
|
},
|
||||||
|
"tasksToQA": {
|
||||||
|
"tableId": "datasource_plus_44a967caf37a435f84fe01cd6dfe8f81__persons",
|
||||||
|
"name": "tasksToQA",
|
||||||
|
"relationshipType": "one-to-many",
|
||||||
|
"type": "link",
|
||||||
|
"_id": "c5fdf453a0ba743d58e29491d174c974b",
|
||||||
|
"foreignKey": "qaid",
|
||||||
|
"fieldName": "personid"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"sourceId": "datasource_plus_44a967caf37a435f84fe01cd6dfe8f81",
|
||||||
|
"sourceType": "external",
|
||||||
|
"primaryDisplay": "taskname",
|
||||||
|
"sql": true,
|
||||||
|
"views": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tableAliases": {
|
||||||
|
"tasks": "a",
|
||||||
|
"products": "b",
|
||||||
|
"persons": "c",
|
||||||
|
"products_tasks": "d"
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue