Хвостовая рекурсия в Dataweave - PullRequest
0 голосов
/ 24 октября 2019

Есть ли способ взять рекурсивную функцию (например, следующую) и сделать ее рекурсивной? У меня есть такой ввод:

{
    "message": "Test   ",
    "read": [
        {
            "test": "   t   "
        }
    ]
}

и эта функция Dataweave

fun trimWS(item) = item match {
    case is Array -> $ map trimWS($)
    case is Object -> $ mapObject {
        ($$): $ match {
            case is String -> trim($)
            case is Object -> trimWS($)
            case is Array -> $ map trimWS($)
            else -> $
        }
    }
    case is String -> trim($)
    else -> $
}

1 Ответ

1 голос
/ 25 октября 2019

Я немного переработал вашу существующую функцию, чтобы упростить ее, и я также провел несколько тестов в соответствии с Mule 4.2.1.

Создав структуру данных с более чем 840 уровнями, я смог перемещаться иобрезать поля. Я предполагаю, что из-за структуры данных и ленивых вычислений я могу преодолеть 256 глубин, что является значением по умолчанию, когда DW 2.0 выбрасывает StackOverflow.

Вы также можете увеличить значение по умолчанию, передав время выполненияпараметр, его имя com.mulesoft.dw.stacksize (например, com.mulesoft.dw.stacksize=500) или любое другое число при условии, что ваша система может обработать его.

Как я уже сказал, создание хвостовой рекурсивной версии не просто, это усложнит код,он будет менее удобен в обслуживании по сравнению с существующей версией и т. д.

Надеюсь, это поможет, даже если я не отвечаю на ваш вопрос напрямую.

%dw 2.0
output application/json
var ds =  {
    "message": "Test   ",
    "read": [
        {
            "test": "   t   "
        }
    ]
}
var deepData = (0 to 840) as Array reduce (e, acc=ds) -> {value: " TO_TRIM ",next: acc}

fun trimWS(item) = item match {
    case is Array -> $ map trimWS($)
    case is Object -> $ mapObject {($$): trimWS($)}
    case is String -> trim($)
    else -> $
}

---

trimWS(deepData)
...