Я использую Mule 4.3 и Dataweave 2.x. Из базы данных я получаю следующий пример записей:
[
{
"gp": "G1",
"parent": "P1",
"child": "C1"
},
{
"gp": "G1",
"parent": "P1",
"child": "C2"
},
{
"gp": "G2",
"parent": "P1",
"child": "C3"
},
{
"gp": "G1",
"parent": "G1",
"child": "C4"
}
]
Каждый элемент в массиве представляет собой строку данных, и каждая строка имеет иерархические данные (данные прародителя, родителя и дочернего элемента).
Мне нужно сгенерировать вывод в XML, как показано ниже:
<list>
<genealogy>
<code>G1</code>
<hierarchy>
<!-- here parent is not included in hierarchy as it has same value of grandparent -->
<genealogy>
<code>C4</code>
<hierarchy/>
</genealogy>
<!-- here 2 instances of P1 have become One value -- >
<genealogy>
<code>P1</code>
<hierarchy>
<genealogy>
<code>C1</code>
<hierarchy/>
</genealogy>
<genealogy>
<code>C2</code>
<hierarchy/>
</genealogy>
</hierarchy>
</genealogy>
</hierarchy>
</genealogy>
<genealogy>
<code>G2</code>
<hierarchy>
<genealogy>
<code>P1</code>
<hierarchy>
<genealogy>
<code>C3</code>
<hierarchy/>
</genealogy>
</hierarchy>
</genealogy>
</hierarchy>
</genealogy>
</list>
Вот пара задач:
Я в тупике, как сделать все необходимое в Dataweave, и пробовал такие вещи, как groupBy , pluck и т. д., Но не могу получить желаемый результат.
Можете ли вы обновить вывод xml. Кажется совершенно недействительным. Кажется, теги genealogy
и hierarchy
закрыты неправильно
спасибо @harshank :), я проверил вставленный здесь XML o/p, он действителен XML, пожалуйста, игнорируйте комментарии, которые я добавил в XML, спасибо
О, теперь я вижу это, в части комментария есть лишний пробел. Я неправильно смотрел. Спасибо
Я построил решение. Почему-то сделать этот дженерик было проще, чем специально для 3-х уровней.
Это немного сложно, я объяснил логику в комментариях к скрипту.
%dw 2.0
output application/xml
// hierarchy's structure. If, lets say you add a "grand child" it should work. (haven't tested this though)
var hierarchy = {
gp: {
parent: {
child: null
}
}
}
fun getDirectGeanologies(records, hierarchyStructure) = do {
var topLevel = keysOf(hierarchyStructure)[0] as String
var secondLevel = keysOf(hierarchyStructure[topLevel])[0]
---
(records groupBy $[topLevel])
mapObject ((level1Childs, code) ->
genealogy: {
code: code,
hierarchy:
if (secondLevel != null) // If there are no more childs, do nothing.
(level1Childs groupBy ((item) -> item[secondLevel] ~= code) // This is to handle when parent = gp
mapObject ((value, hasSameParent) ->
// If parent = gp, we want to skip parent and link directly to child
if (hasSameParent as Boolean) getDirectGeanologies(value, hierarchyStructure[topLevel][secondLevel])
// recurrsively call the function with child records and going down the hierarchyStructure by one
else getDirectGeanologies(value, hierarchyStructure[topLevel])
))
else {}
}
)
}
---
list: getDirectGeanologies(payload,hierarchy)
Это поразительно.
вау это вообще гениально! за пару часов вы смогли придумать решение, просто потрясающее, большое спасибо! Проверим это и примем ваш ответ. Большое спасибо !
Спасибо @harshank, убедился, что это работает! У меня были дополнительные требования, которые не были указаны ранее, поэтому я открыл новый вопрос ссылка, если возможно, не могли бы вы взглянуть, пожалуйста?
Ты всегда приносишь что-нибудь интересное. :)