xdmp: ошибка журнала при использовании CPF (MarkLogic) - PullRequest
0 голосов
/ 22 февраля 2019

Я пытался следовать руководству по Marklogic для создания нашего собственного CPF.Я в значительной степени скопировал и вставил все коды, и большинство функциональных возможностей работали помимо xdmp: log.CPF завершит свою задачу по достижении этого.Документацию от marklogic можно найти здесь Начало работы с простым приложением CPF

Если я что-то сделал не так, я опубликую здесь свои коды и то, что я сделал.

======= Используемые документы =======

add-last-updated.xqy => добавлено в БД модулей

xquery version "1.0-ml";
import module namespace cpf="http://marklogic.com/cpf" 
  at "/MarkLogic/cpf/cpf.xqy";
declare variable $cpf:document-uri as xs:string external;
declare variable $cpf:transition as node() external;
if (cpf:check-transition($cpf:document-uri,$cpf:transition)) then try {
  let $doc := fn:doc($cpf:document-uri)
  return
      xdmp:node-insert-child(
        $doc/book,
        <last-updated>{fn:current-dateTime()}</last-updated>
      ),
  xdmp:log( "add last-updated ran OK" ),
  cpf:success($cpf:document-uri, $cpf:transition, ())
} catch ($e) {
  cpf:failure($cpf:document-uri, $cpf:transition, $e, ())
}
else ()

add-copyright.xqy => добавлено в базу данных модулей

xquery version "1.0-ml";
import module namespace cpf = "http://marklogic.com/cpf" 
  at "/MarkLogic/cpf/cpf.xqy";
declare variable $cpf:document-uri as xs:string external;
declare variable $cpf:transition as node() external;
if (cpf:check-transition($cpf:document-uri,$cpf:transition)) then try {
  let $doc := fn:doc( $cpf:document-uri )
  return
      xdmp:node-insert-child( 
        $doc/book,
        <copyright>
          <year>2010</year>
          <holder>The Publisher</holder>
        </copyright>),
      xdmp:log( "add copyright ran OK" ),
      cpf:success( $cpf:document-uri, $cpf:transition, () )
}
catch ($e) {
  cpf:failure( $cpf:document-uri, $cpf:transition, $e, () )
}
else ()

copyright.xml => добавлено в конвейер и присоединено к домену «документов по умолчанию»

<pipeline xmlns="http://marklogic.com/cpf/pipelines">
  <pipeline-name>Copyright Pipeline</pipeline-name>
  <pipeline-description>Pipeline to test CPF</pipeline-description>
  <success-action>
    <module>/MarkLogic/cpf/actions/success-action.xqy</module>
  </success-action>
  <failure-action>
    <module>/MarkLogic/cpf/actions/failure-action.xqy</module>
  </failure-action>
  <state-transition>
    <annotation>
      When a document containing ‘book' as a root element is created, 
      add a ‘copyright' statement.
    </annotation>
    <state>http://marklogic.com/states/initial</state>
    <on-success>http://marklogic.com/states/done</on-success>
    <on-failure>http://marklogic.com/states/error</on-failure>
    <execute>
      <condition>
        <module>/MarkLogic/cpf/actions/namespace-condition.xqy</module>
        <options xmlns="/MarkLogic/cpf/actions/namespace-condition.xqy">
          <root-element>book</root-element>
          <namespace/>
        </options>
      </condition>
      <action>
        <module>add-copyright.xqy</module>
      </action>
    </execute>
  </state-transition>
  <state-transition>
    <annotation>
      When a document containing ‘book' as a root element is updated, 
      add a ‘last-updated' element
    </annotation>
    <state>http://marklogic.com/states/updated</state>
    <on-success>http://marklogic.com/states/done</on-success>
    <on-failure>http://marklogic.com/states/error</on-failure>
    <execute>
      <condition>
        <module>/MarkLogic/cpf/actions/namespace-condition.xqy</module>
        <options xmlns="/MarkLogic/cpf/actions/namespace-condition.xqy">
          <root-element>book</root-element>
          <namespace/>
        </options>
      </condition>
      <action>
        <module>add-last-updated.xqy</module>
      </action>
    </execute>
  </state-transition>
</pipeline>

====== протестировано с использованием ======

xquery version "1.0-ml";
let $contents :=   
  <book>
    <bookTitle>All About George</bookTitle>
    <chapter1>
      <chapterTitle>Curious George</chapterTitle>
      <para>
        George Washington crossed the Delaware to see what was on the other side.
      </para>
    </chapter1>
  </book>
return
  xdmp:document-insert("/content.xml", $contents)

В целом код работает, и документ редактируется при первой вставке, как показано ниже, но журналы, найденные в MarkLogic / Data / Logs / 8000_ErrorLog, не были обновлены.Кроме того, когда я попытался вывести xdmp: log выше xdmp: node-insert-child, CPF останавливается преждевременно, и узел не редактируется.Буду очень признателен за любые советы, чтобы помочь с этой проблемой.

<book>
  <bookTitle>All About George</bookTitle>
  <chapter1>
    <chapterTitle>Curious George</chapterTitle>
    <para>
      George Washington crossed the Delaware to see what was on the other side.
    </para>
  </chapter1>
  <copyright>
    <year>2010</year>
    <holder>The Publisher</holder>
  </copyright>
</book>

======== Обновление ========

Я выполнил рекомендацию mholstege и удалилмои операторы return и let, а также трейлинг логов, как предложил grtjn.Оттуда я понял, что журналы помещаются в журналы «TaskServer_Error».Глупый вопрос с моей стороны и спасибо за помощь.

1 Ответ

0 голосов
/ 22 февраля 2019

То, как вы отформатировали код, подсказывает мне, что вы думаете, что строки xdmp:log и cpf:success попадают под return, но это не так: только первое выражение после return.Таким образом, вы, вероятно, получаете неопределенную переменную статическую ошибку в этом модуле при переупорядочении строк.Вам не нужны let и return: вы можете просто использовать doc($document-uri)/book непосредственно в вызове xdmp:node-replace.Тогда вы можете изменить порядок последовательности по желанию.Если вы хотите, чтобы значения xdmp:node-replace и xdmp:log находились в области действия переменной $doc, заключите скобки в эту последовательность выражений.

...