我正在使用公积金。
为集合范围创建域(如果在特定集合中创建或更新了任何文档,则触发触发器。)
我正在尝试使用xs:anyURI('http://marklogic.com/states/updated')
将文档状态显式设置为cpf:document-set-state
。
少数URIS触发器被触发,少数未触发(所有uris都属于域中使用的集合)
没有触发触发器的URIS,我先运行xdmp:node-replace
(用相同的文本替换了一个节点)。
运行xdmp:node-replace
后,cpf:document-set-state
开始按预期工作。我可以看到触发器被触发。
我无法理解为什么在我将文档状态设置为xs:anyURI('http://marklogic.com/states/updated')
时第一次没有触发触发器
答案 0 :(得分:2)
CPF运行两个互锁状态机:一个决定CPF是否有兴趣对文档做任何事情(通过cpf:processing-status属性记录),另一个用于记录文档所在位置的特定应用程序应用程序(通过cpf:state属性记录)。
由于CPF在运营过程中更新了这些属性,并且由于它需要响应属性的变化,因此许多CPF代码都关注自身避免创建级联触发器,以响应其自身的操作,而不应该这样做。吨。
因此,如果您要执行的操作是触发文档通过其应用程序状态机,就像它刚刚更新一样,最简单的方法是更新它,即节点替换而不是其他任何内容。如果你有状态改变管道,它将负责其余部分。更新属性片段以更新文档片段的成本不会更高或更低。
如果你想戳一个文件来开始处理,但是开始的状态不是通常从文档更新中获得的状态(即应用程序管道中的某个中间状态),你需要将处理状态设置为"有源"和国家到中间状态。但这是一个忍者行动,我真的建议你做更简单的事情,除非你有充分的理由不这样做。