Вставка документа и чтение его в той же транзакции в MarkLogic - PullRequest
0 голосов
/ 07 января 2019

Ниже приведен фрагмент кода, который я использую для одной из функций

declare function local:matchCounts($Id as xs:string, $status as xs:string) as xs:int {
  xdmp:estimate(cts:search(/count, cts:and-query((
    cts:element-attribute-value-query(xs:QName("count"), xs:QName("Id"), $Id, "exact"),
    cts:element-attribute-value-query(xs:QName("child"), xs:QName("MatchStatus"), $status, "exact")
  )), "unfiltered"))
};

declare function local:saveCountsMatchC($Id as xs:string) {
  let $evenCount := local:matchCounts($Id, "even")
  let $oddCount := local:matchCounts($Id, "odd")
  return ($evenCount, $oddCount)
};

declare function local:matchingProcess($Id as xs:string) {
let $total-records := 1000
let $batch-size := 50
let $pagination := 0
let $bs := 
   for $records in 1 to fn:ceiling($total-records  div $batch-size )
   let $start := fn:sum($pagination + 1)
   let $end := fn:sum($batch-size + $pagination)
   let $_ := xdmp:set($pagination, $end)
   return
    xdmp:spawn-function
    (
    function() {
     for $each at $pos in ($start to $end)
     let $id := sem:uuid-string()
     let $xml := if(($pos mod 2) eq 0) then <count Id='{$Id}'><child MatchStatus='even'></child></count> 
                 else <count Id='{$Id}'><child MatchStatus='odd'></child></count>
     return xdmp:document-insert(concat("/", $id, ".xml"), $xml)
    },
    <options xmlns="xdmp:eval"><result>{fn:true()}</result><commit>auto</commit><update>true</update></options>
    )
let $_ := $bs
return local:saveCountsMatchC($Id)
};

local:matchingProcess("1")

Здесь необходимо выполнить итерацию 1000 документов, используя размер пакета 50, поэтому в основном я использую функцию spawn для создания 20 пакетов размером 50, который вставляет 1000 документов в мою базу данных. Как только эти документы вставлены, мне нужно прочитать эти документы в той же транзакции. Здесь 500 документов имеют MatchStatus = 'odd', а 500 документов имеют MatchStatus = 'even' Запрос должен вернуть (500 500) в качестве вывода; Вместо этого он возвращает (0,0)

Я использую опцию <result>{fn:true()}</results>, чтобы мой следующий оператор ожидал завершения всей задачи вызова, но это не принесло пользы.

Кто-нибудь может мне помочь с требованием?

Примечание. Необходимо вставить 1000 документов, а затем прочитать их только в том же вызове функции

1 Ответ

0 голосов
/ 07 января 2019

Ваш код, который выполняет порождения, сам не выполняет обновления, поэтому будет работать в так называемом режиме запроса. В режиме запроса видны только обновления до начала кода.

Вы можете попробовать запустить в режиме обновления (declare option xdmp:transaction-mode "update";), но обычно проще просто создать или оценить подсчет / чтение ваших обновлений. Например. оберните xdmp:estimate в xdmp:spawn-function с результатом true.

НТН!

...