Есть 4 поля, основанные на комбинации его значений, мы должны отфильтровать данные в Mulesoft

#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