2013-01-04 5 views
0

Eh bien, nous avons ce qui devrait être un scénario assez simple.Bibliothèque MarkLogic dls - mises à jour contradictoires

Nous utilisons la bibliothèque de MarkLogic pour gérer les documents, donc ci-dessous est le code

La variable passée dans les regards comme celui ci-dessous:

$doc: =<root> 
      <node1> 
       <subnode/></node1> 
      <node2> 
      <status/> 
      </node2> 
    <root> 

La fonction remplace/mises à jour deux différents noeuds dans le doc . Vérifie et retourne une carte des paires de versions d'id.

declare function process-and-version($doc) { 

    for $sb in $doc/node1/subnode 
    return if ($sb/node3) then 
     xdmp:node-replace($sb/node3, <node3>foo</node>) 
    else 
     xdmp:node-insert-after($sb, <node3>foo</node>), 

    xdmp:node-replace($doc/status, <status>{$status}</status>), 
    dls:document-checkout-update-checkin("fn:base-uri($doc), $doc, "", fn:true()), 

    let $updated-version:= 
    <entry>{ 
    let $version := c:get-latest-version($uri) 
    (:another function in our lib that uses cts:search:) 
    return ($doc/node1, <version>{$version}</version>) 
    } 
    </entry> 
return $updated-version 
}; 

Nous utilisons XRAY pour tester conduire ceci et obtenir l'erreur suivante:

<error:error xsi:schemaLocation="http://marklogic.com/xdmp/error error.xsd" xmlns:error="http://marklogic.com/xdmp/error" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <error:code>XDMP-CONFLICTINGUPDATES</error:code> 
     <error:name></error:name> 
     <error:xquery-version>1.0-ml</error:xquery-version> 
     <error:message>Conflicting updates</error:message> 

Un grand merci à l'avance de l'aide,

im

Répondre

3

Le problème réside dans le fait que les fonctions xdmp: node- * fonctionnent sur le document stocké dans la base de données. Vous n'avez pas besoin d'appeler une mise à jour pour enregistrer ces modifications. Il est très probable que la fonction de mise à jour dls remplace le document entier, ce qui crée un conflit avec ces mises à jour de nœud.

Vous recherchez des mises à jour en mémoire. La bibliothèque dls elle-même contient des fonctions qui font cela, mais celles-ci sont privées. Je suggère de regarder dans la bibliothèque d'aide mentionnée ci-dessous pour cela, ou si les changements sont relativement simples, vous pouvez simplement reconstruire le document. Cela se fait très souvent, et il n'y a pas de baisse de performance.

mem-mise à jour: https://github.com/marklogic/commons/tree/master/memupdate

HTH!