#dataweave #mulesoft #mule4 #mule-esb
Вопрос:
Есть 4 поля, основанные на комбинации его значений, которые мы должны отфильтровать в Mulesoft. Пример:
Входная полезная нагрузка 1:
{
"Msg": {
"Code": "abc",
"Chcode": "123",
"Dcode": "55",
"Type": "pqr"
}
}
Входная полезная нагрузка 2:
{
"Msg": {
"Code": "klm",
"Chcode": "789",
"Dcode": "32",
"Type": "xyz"
}
}
Входная полезная нагрузка 3:
{
"Msg": {
"Code": "klm",
"Chcode": "456",
"Dcode": "22",
"Type": "shi"
}
}
Условие фильтра: Входная полезная нагрузка должна совпадать с кодом, Chcode, Dcode и типом.
Пример: Ввод полезной нагрузки должен содержать Код=abc, Chcode=123, Dcode=55, Тип=pqr
Код | Chcode | Dcode | Тип |
---|---|---|---|
азбука | 123 | 55 | pqr |
ghl | 456 | 22 | ши |
ghi | 276 | 3u | фо |
Входная полезная нагрузка 1 соответствует первой строке в условии фильтра,например,код, Chcode,Dcode и тип совпадают. Таким образом, эта запись должна быть отфильтрована для обработки. Ввод полезной нагрузки 3 совпадает с кодом Chcode,кодом Dcode и типом, но не с кодом, поэтому эту запись следует игнорировать.
Как и в приведенных выше комбинациях, существует 45 комбинаций, как фильтровать записи этого типа в Mulesoft.
Комментарии:
1. Каковы критерии? если какое — либо из условий соответствует, запись должна быть отфильтрована? Если все поля совпадут? Пожалуйста, приведите несколько примеров. Обратите внимание, что кавычки в вашем вводе недопустимы.
2. Что сказал @aled-пожалуйста, сформулируйте свои вопросы четко и кратко, желательно с использованием правил форматирования текста SO.
3. Обратите внимание, что ваш ввод JSON также недействителен. Я предполагаю, что вы хотите, чтобы Msg был массивом.
4. Я обновил вопрос с помощью правил форматирования текста SO, а также исправил json. не могли бы вы, пожалуйста, помочь.
5. Вам все равно нужно будет передать их из какого-то хранилища. Але опубликовал ответ с таким подходом (сохранение условий фильтра в массиве объектов), и это должно быть идеальным способом сделать это.
Ответ №1:
Этот сценарий является примером того, как реализовать проверку условий:
%dw 2.0
output application/json
import * from dw::core::Arrays
import * from dw::core::Objects
var conditionsTable=[
{Code: "abc", Chcode: "123", Dcode:"55", Type: "pqr"},
{Code: "ghl", Chcode: "456", Dcode:"22", Type: "shi"},
{Code: "ghl", Chcode: "276", Dcode:"3u", Type: "foh"}
]
fun matchRecord(record, cond)=record everyEntry (value, key) -> cond[key] == value
fun matchConditions(record, conditions)=conditions some ((item) -> matchRecord(record, item))
---
matchConditions(payload.Msg, conditionsTable)
Комментарии:
1. Спасибо, Алед, он отлично работает в соответствии с требованиями. Если во входных данных есть дополнительные поля, эта логика работать не будет.
2. Это не было упомянуто в вопросе, но вы можете легко изменить функцию matchRecord (), чтобы добавить это требование, только учитывая поля, которые находятся в записи условий:
fun matchRecord(record, cond)=record everyEntry (value, key) -> if(cond[key]?) (cond[key] == value) else true