MarkLogic内容处理框架(CPF)管道必须是线性的还是非循环的?

时间:2019-03-09 05:59:17

标签: marklogic

我的理解是,由于每个状态转换都具有一个当前状态和一个将来状态(成功时),因此生成的CPF管道将是线性的,如文档所示:

enter image description here

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

一个状态是否可能有条件地转换为一个状态或另一状态(分支)?使用上面的示例,是否可以根据某些条件从状态B转换为状态C或状态F? answer (by @rjrudin)提出了通过操纵域的方法。

如果可以实现分支,是否有可能过渡到先前的状态(循环)?例如,有条件地从状态K过渡到状态B或状态L。这样可以进行一些迭代处理。

2 个答案:

答案 0 :(得分:2)

在特定状态转换的定义中可能有条件/动作对。 CPF确实不在乎您的管道是线性的还是循环的:它只是查看文档的当前状态并对其执行条件来决定下一步要做什么。

如果您想查看循环管道的示例,则“ PDF转换(图像批处理)”管道循环(Installer / conversion / alternatives / batched-pdf-pipeline.xml中的源)。诀窍是在两个不同的状态之间循环:某些优化可能会挫败尝试回到相同状态的尝试。

答案 1 :(得分:1)

看看这个简单的示例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:successcpf:failure的调用决定了接下来要应用的状态。 cpf:success函数具有第三个参数(此处为空序列),可让您提供目标状态的替代。使用该参数,可以将文档转换为所需的任何状态。

但是请小心,如果您不小心,很容易创建无限循环(通过指向之前已经通过的状态),或者中途出现死角(错误输入的状态名称导致其不再得到进一步处理) ..

HTH!