0

使用 MarkLogic Xquery,我有一个函数(admin:add-collection-to-publication)调用另一个维护函数( admin:check-collections-exists),该函数检查元素是否存在,如果不存在,则创建该特定元素。

我调用维护功能的方式是使用let。这似乎是一种奇怪的方式,要做到这一点,它需要创建一个未使用的变量。我是否应该返回一个序列,调用是序列admin:check-collections-exists中的第一项,然后后续处理是第二个元素?只是寻找标准的优雅方式来做到这一点。我的职能是:

declare function admin:add-collection-to-publication($pub-name, $collection-name)
{
(:does this publication have a COLLECTIONS element?:)
let $unnecessary-variable := admin:check-collections-exists($pub-name)
    (:now go and do what this function does:)
return "do some other stuff then return"

 };

 declare function admin:check-collections-exists($pub-name)
 {
if(fn:exists($pubs-node/pub:PUBLICATION[pub:NAME/text()=$pub-name]/pub:COLLECTIONS))
then
    "exists"
else
    xdmp:node-insert-child($pubs-node/pub:PUBLICATION[pub:NAME/text()=$pub-name],<pub:COLLECTIONS/>)
};
4

1 回答 1

1

使用序列是不可靠的。MarkLogic 很可能会尝试并行评估序列项,这可能导致创建在“同时”时间甚至在其他工作之后发生。最好的方法确实是使用let. let总是在 之前评估return。请注意,虽然let's 也可以并行评估,但优化器足够聪明,可以检测依赖关系。

就个人而言,我经常使用未使用的变量。例如插入日志语句,在这种情况下,我有一个未使用的变量名,我每次都会重用:

let $log := xdmp:log($before)
let $result := do:something($before)
let $log := xdmp:log($result)

您还可以使用非常短的变量名,例如$_. 或者您可以重新考虑实际给变量一个合理的名称,然后使用它,即使您知道它永远不会到达 else

let $exists := 
    if (collection-exists()) then
        create()
    else true()
return
    if ($exists) then
        "do stuff"
    else () (: never reached!! :)

于 2013-01-03T16:28:25.380 回答