#transform #anypoint-studio #mulesoft #payload
Вопрос:
У меня есть результаты из родительской таблицы, дочерней таблицы и таблицы отношений. Мне нужно объединить три таблицы вместе на основе значений в таблице отношений, используя «ParentID» и «childID». Я пытался использовать сбор разброса в AnyPoint Studio и могу получать результаты для каждого запроса, но у меня возникли проблемы с объединением их обратно в одну полезную нагрузку, чтобы родитель, значения отношений и потомок находились в одной строке. У родителей может быть более одного ребенка.
Полезные нагрузки основаны на запросах из таблиц Salesforce —
Объект полезной нагрузки 0:
Array<object>:
[
{"ParentId": "0cE3S0000000HVGUA2",
"Name": "job's Pharmacy"
"Address": "123 4th Ave",
"ParentLicense": "PHARM.PF.12345678"}
]
Объект полезной нагрузки 1:
Array<Object>:
[
{ "ChildId": "0cE3S0000000GscUAE",
"ParentId": 0cE3S0000000HVGUA2,
"RelationStatus":"Site Branch"}
]
Объект полезной нагрузки 2:
Array<Object>:
[
{ "ChildId": "0cE3S0000000GscUAE",
"ChildLicense": PHRM.PF.98765432-MHOUT,
"ExpirationDate": "2019-02-28",
"PublicStatusDescription": "Closed"}
]
ожидаемый результат
[
{
"ParentId": "0cE3S0000000HVGUA2",
"Name": "job's Pharmacy"
"Address": "123 4th Ave",
"ParentLicense": "PHARM.PF.12345678",
"ChildId": "0cE3S0000000GscUAE",
"ChildLicense": PHRM.PF.98765432-MHOUT,
"ExpirationDate": "2019-02-28",
"PublicStatusDescription": "Closed",
"RelationStatus":"Site Branch"
}
]
Комментарии:
1. Поступают ли таблицы из запросов к базе данных внутри вашего приложения?
2. Пожалуйста, отредактируйте вопрос, чтобы добавить детали.
3. Куда вы помещаете эти объекты в приложении? что-то в полезной нагрузке, а два других-в переменных?
4. Не совсем уверен, о чем вы спрашиваете. полезные нагрузки получаются из запросов разброса и подпотока с помощью сообщений преобразования с помощью проекта anypoint.
5. Хорошо, пример простой полезной нагрузки был бы полезен, если вы хотите получить буквальный ответ.
Ответ №1:
Если данные поступают из SQL-запросов из одной и той же базы данных и внутри одного и того же приложения, лучше использовать SQL для получения уже объединенных данных. SQL будет более эффективным, и он в основном предназначен для этого.
Если данные поступают из другого источника, например из разных API REST, вы можете использовать DataWeave для объединения данных.
Обратите внимание, что для простоты я использую JSON в качестве выходного формата, но вам следует использовать application/java, если вы собираетесь выполнять дальнейшие преобразования.
Это один из примеров. Вероятно, это не самый эффективный способ сделать это:
%dw 2.0
output application/json
import * from dw::core::Arrays
var parents=payload."0"
var childs=payload."2"
var relation=payload."1"
var parentWithChildId=leftJoin(parents, relation, (p) -> p.ParentId, (r) -> r.ParentId)
map((item, index) -> item.l {ChildId: item.r.ChildId})
var parentWithChildValues=leftJoin(parentWithChildId, childs, (p) -> p.ChildId, (c) -> c.ChildId)
map((item, index) -> item.l (item.r - "ChildId"))
---
parentWithChildValues
Ввод: Я должен был угадать, как должен выглядеть ввод, предполагая, что это результат сбора разброса.
{
"0":
[
{
"ParentId": "0cE3S0000000HVGUA2",
"Name": "job's Pharmacy",
"Address": "123 4th Ave",
"ParentLicense": "PHARM.PF.12345678"
}
],
"1":
[
{
"ChildId": "0cE3S0000000GscUAE",
"ParentId": "0cE3S0000000HVGUA2",
"RelationStatus":"Site Branch"
}
],
"2":
[
{
"ChildId": "0cE3S0000000GscUAE",
"ChildLicense": "PHRM.PF.98765432-MHOUT",
"ExpirationDate": "2019-02-28",
"PublicStatusDescription": "Closed"
}
]
}
Выход:
[
{
"ParentId": "0cE3S0000000HVGUA2",
"Name": "job's Pharmacy",
"Address": "123 4th Ave",
"ParentLicense": "PHARM.PF.12345678",
"ChildId": "0cE3S0000000GscUAE",
"ChildLicense": "PHRM.PF.98765432-MHOUT",
"ExpirationDate": "2019-02-28",
"PublicStatusDescription": "Closed"
}
]
Комментарии:
1. Данные находятся в системе salesforce, поэтому объединить таблицы, как в SQL, невозможно
2. В зависимости от того, используете ли вы SOQL или нет, вы можете сделать что-то подобное, или вы можете просто использовать метод, аналогичный тому, о котором я упоминал.
3. Я добавил пример имен данных выше в вопросе, можете ли вы привести мне пример, используя эти значения, я очень буквален. Спасибо