Mulesoft объединяет 3 результата запроса в одну полезную нагрузку

#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. Я добавил пример имен данных выше в вопросе, можете ли вы привести мне пример, используя эти значения, я очень буквален. Спасибо