Должен ли конвейер MarkLogic Content Processing Framework (CPF) быть линейным или ациклическим? - PullRequest
0 голосов
/ 09 марта 2019

Насколько я понимаю, поскольку каждый переход состояния имеет одно текущее состояние и одно будущее состояние (в случае успеха), результирующий конвейер (ы) CPF будет линейным, как показано в документации:

enter image description here

https://docs.marklogic.com/guide/cpf/pipelines#id_42403

Возможно ли, что государство может условно перейти в одно государство или другое государство (филиал)?Используя приведенный выше пример, можно ли перейти из состояния B в состояние C или состояние F на основании какого-либо условия?Этот ответ (автор @rjrudin) предложил маршрут путем манипулирования доменом.

Если ветвь может быть достигнута, возможно ли перейти в предыдущее состояние (циклическое)?Например, для условного перехода из состояния K в состояние B или состояние L. Это позволило бы выполнить некоторую итеративную обработку.

Ответы [ 2 ]

2 голосов
/ 11 марта 2019

Можно иметь пары условие / действие в определении конкретного перехода состояния.CPF действительно не волнует, является ли ваш конвейер линейным или циклическим: он просто смотрит на текущее состояние документа и выполняет условия на нем, чтобы решить, что делать дальше.

Если вы хотите увидетьПример петлевой линии, конвейерные петли «Преобразование PDF (пакетная обработка изображений)» (источник в Installer / Conversion / alternatives / batched-pdf-pipeline.xml).Хитрость заключается в том, чтобы зацикливаться между двумя различными состояниями: некоторые оптимизации могут победить попытки вернуться в одно и то же состояние.

1 голос
/ 09 марта 2019

Взгляните на этот простой пример модуля действий CPF:

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 ()

(Скопировано из руководства CPF: https://docs.marklogic.com/guide/cpf/quickStart#id_76015)

Это вызов cpf:successи cpf:failure, которые определяют, какое состояние будет применено следующим. Однако функция cpf:success имеет 3-й параметр (здесь - пустая последовательность), который позволяет предоставить переопределение для целевого состояния. Используя этот параметр, вы можетепереведите документ в любое состояние, которое вам нравится.

Будьте осторожны, вы можете легко создавать бесконечные циклы (указывая назад на состояние, которое вы уже передали ранее), или тупики на полпути (из-за опечаток имен состояний, вызывающихэто не обрабатывается дальше), если вы не будете осторожны ..

HTH!

...