Как создать множественное условное IF в Mule 4 и DW 2.0?

Мне нужно создать функцию с такими условиями, как этот псевдокод:

var consent = []

function buildConsent() {
   if (condition1) {
       consent += values1
   }

   if (condition2) {
       consent += values2
   }

   if (condition3) {
       consent += values3
   }
}

Вот как я это делаю на Mule4 и DW 2.0:

%dw 2.0
var consent = []
var factIntake = vars.facts

fun buildConsent() =
    if (factIntake.miscFactItems[?($.value1 == true)] != null) {
        consent + {
            "Consent_Type": "some1",
            "Consent_Given_By": "some2"
        }
    }

    if (factIntake.miscFactItems[?($.value2 == true)] != null) {
        consent + {
            "Consent_Type": "some3",
            "Consent_Given_By": "some4"
        }
    }

output application/json
--
{
    "Consent_Data": buildConsent()
}

Но я получаю следующую ошибку из среды IDE (AnypointStudio 7):

Неверный ввод '+', ожидаемое пространство имен или атрибут ‹'@ (' (Имя: Значение) + ')'> (строка 11, столбец 11):

Где строка 11, столбец 11 - первое появление consent +. Если я попытаюсь отладить проект, все, что у меня появится в консоли:

Сообщение: Ошибка при разборе скрипта:% dw 2.0

Вот пример ввода / вывода, чтобы вы могли лучше понять, чего я пытаюсь достичь:

// Input
{
    "miscFactItems": [{
            "factId": "designeeFirstName",
            "factValue": "test test",
            "factValueType": "System.String"
        }, {
            "factId": "designeeLastName",
            "factValue": "test test",
            "factValueType": "System.String"
        },{
            "factId": "value1",
            "factValue": true,
            "factValueType": "System.Boolean"
        }, {
            "factId": "value2",
            "factValue": true,
            "factValueType": "System.Boolean"
        }, {
            "factId": "value3",
            "factValue": true,
            "factValueType": "System.Boolean"
        }
    ]
}

// Output
consent = [{
             "Consent_Type": "type1",
             "Consent_Given_By": miscFactItems.designeeFirstName
         }, {
             "Consent_Type": "type2",
             "Consent_Given_By": miscFactItems.designeeFirstName
         }, {
             "Consent_Type": "type3",
             "Consent_Given_By": miscFactItems.designeeFirstName
         }
]

Что мне здесь не хватает? Как мне добавить три условия к моей функции и добавить значения в consent var?


person ReynierPM    schedule 30.05.2019    source источник
comment
Являются ли условия взаимоисключающими?   -  person Shoki    schedule 30.05.2019
comment
@Shoki нет, их нет в полезной нагрузке, у меня могут быть оба условия, поэтому их нужно добавить в массив consent   -  person ReynierPM    schedule 30.05.2019
comment
Будет проще дать точный ответ с ожидаемым вводом / выводом.   -  person Shoki    schedule 03.06.2019
comment
@Shoki, помогает ли моя правка? Я добавил набор INPUT / OUTPUT :)   -  person ReynierPM    schedule 03.06.2019


Ответы (2)


В DataWeave переменные неизменяемы, поэтому вы не можете накапливать вещи в одной и той же переменной, вам нужно создавать новые переменные.

Это будет выглядеть примерно так:

%dw 2.0
output application/json  

var consent1 = if (condition1) [{"Consent_Type": "some1", "Consent_Given_By": "some2"}] else []
var consent2 = if (condition2) [{"Consent_Type": "some3", "Consent_Given_By": "some4"}] else []
---
consent1 ++ consent2
person Shoki    schedule 04.06.2019

Ваше требование похоже на хорошее использование функции reduce. На основе предоставленного вами псевдокода вы можете сделать что-то вроде ниже

output application/json
var payload = [  
    {"name":"Ram", "email":"[email protected]", "state": "CA","age":21},  
    {"name":"Bob", "email":"[email protected]","state": "CA","age":30},
    {"name":"john", "email":"[email protected]","state": "NY","age":43} 

] 
---
payload reduce ((item, consent = []) -> consent +
{
    (state: item.state) if(item.state=='CA'),
    (age: item.age) if(item.age >25)
}
)
person Imtiyaz Qureshi    schedule 30.05.2019
comment
Что ж, я не уменьшаю полезную нагрузку, потому что она выглядит иначе, чем вывод, поэтому мне нужно создать новый JSON на основе условных выражений из функции, не уверен, что я не понимаю, что ваше решение, возможно, поможет вывод. - person ReynierPM; 30.05.2019