0

MarkLogic Xquery を使用して、要素の存在をチェックする(admin:add-collection-to-publication)別のメンテナンス関数を呼び出す関数( admin:check-collections-exists)があり、存在しない場合はその特定の要素を作成します。

私がメンテナンス機能を呼び出す方法は、letを使用することです。これは奇妙な方法のように思えます。これを行うには、未使用の変数を作成する必要があります。代わりに、シーケンスadmin:check-collections-existsの最初の項目を呼び出してシーケンスを返し、その後の処理を 2 番目の要素にする必要がありますか? これを行うための標準的なエレガントな方法を探しています。私の機能は次のとおりです。

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は並行して評価することもできますが、オプティマイザーは依存関係を検出するのに十分なほどスマートです。

個人的には、未使用の変数をよく使用します。たとえば、ログ ステートメントを挿入する場合、毎回再利用する未使用の変数名が 1 つあります。

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 に答える