Использование DHF для гармонизации в денормализованные объекты - PullRequest
0 голосов
/ 08 января 2019

Мы используем MarkLogic 9.0.5 и DHF 3.0, и мы пытаемся привести несколько исходных документов в денормализованную форму. Однако мы не можем получить правильную форму xml.

Допустим, у нас есть исходный документ для семьи и по одному на каждого члена семьи. Теперь мы хотим создать гармонизированную сущность примерно так:

<envelope>
<header></header>
<instance>
   <family>
     <name>Paulsen</name>
     <family-member>
         <name>John</name>
         <age>54</age>
     </family-member>
     <family-member>
         <name>Clarice</name>
         <age>38</age>
     </family-member>
   </family>
</instance>
</envelope>

Однако новая структура DHF вынуждает нас использовать карту объектов json для генерации кода, но, как бы мы ни помещали данные в объект, мы не получим их, как описано выше. Например:

declare function plugin:extract-instance-family
$source as node()?,
$options as map:map
) as map:map

let $name := get-family-name()
let $family-member := (<family-member>
                         <name>get-name()</name>
                         <age>get-age()</age>
                       </family-member>,
                       <family-member>
                         <name>get-name()</name>
                         <age>get-age()</age>
                       </family-member>)

let $model := 
  json:object()
    =>map:with('name', $name)
        =>map:with('family-member', '$family-member')

    return $model
};

приводит к некоторому XML, как:

<envelope>
<header></header>
<instance>
   <family>
     <name>Paulsen</name>
     <family-member>
         <family-member>
             <name>John</name>
             <age>54</age>
         </family-member>
     </family-member>
     <family-member>
        <family-member>
           <name>Clarice</name>
           <age>38</age>
         </family-member>
     </family-member>
</instance>
</envelope>

Содержит каждый семейный узел дважды. Любые предложения о том, как решить эту проблему?

PS Я также пытался передать вложенные json-объекты в качестве аргументов, но, по-видимому, это приводит к ошибкам в dhf-потоках:

let $family-member := json-object()
                      => map:with('family-member', 'stuff')

1 Ответ

0 голосов
/ 12 января 2019

Есть причины этого поведения. Это следует шаблону, который используется в службах MarkLogic Entity Services. Подробнее о преимуществах использования моделирования объектов вы можете прочитать здесь: http://docs.marklogic.com/guide/entity-services/intro#id_23284.

Это может помочь настроить ваш код так, чтобы имена элементов не конфликтовали, и прояснить, что второй уровень описывает тип объекта, в отличие от первого уровня, который описывает имя свойства для объекта верхнего уровня.

например.,

declare function plugin:extract-instance-family-type
  $source as node()?,
  $options as map:map
) as map:map

let $name := get-family-name()
let $family-member := (<family-member-type>
                         <name>get-name()</name>
                         <age>get-age()</age>
                       </family-member>,
                       <family-member>
                         <name>get-name()</name>
                         <age>get-age()</age>
                       </family-member-type>)

let $model := 
  json:object()
    =>map:with('name', $name)
        =>map:with('family-member', '$family-member')

    return $model
};

В этом случае вы можете рассмотреть ситуацию, когда вам может потребоваться извлечь данные в Java-программу. Сущность верхнего уровня семейного типа будет сопоставлена ​​с классом Family Java и полем family -ember элемента-элемента-члена семейства класса и, наконец, family-member-type будет сопоставлена ​​с классом FamilyMember и связанными с ним полями.

Кроме того, если вы планируете использовать данные в формате JSON, я бы пошел еще дальше и рекомендовал бы соглашение о создании типов сущностей TitleCase и свойств camelCase. (FamilyType, familyMember, FamilyMemberType).

...