У меня есть требование, при котором я перебираю 10 000 000 документов, и для каждого документа я выполняю некоторую операцию и сохраняю некоторые значения в /count.xml.Когда я перехожу ко второму документу, я обновляю /count.xml обновленным значением
В настоящее время это то, что я делаю, здесь $ total-records составляет 10 000 000
let $total-records := xdmp:estimate(cts:search( //some code))
let $batch-size := 5000
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 in cts:search( //some code)[$start to $end]
return //some operation and update '/count.xml' with some updated values
},
<options xmlns="xdmp:eval"><commit>auto</commit><update>true</update</options>
)
let $doc := doc("/count.xml")
return ()
Так что здесьпроблема в том, что мне нужно прочитать файл '/count.xml' после того, как все документы будут повторяться, но с помощью приведенного выше кода с помощью задачи spawn
let $ doc: = doc ("/ count.xml")
не будет последней, так как вышеуказанная задача spawn будет выполняться в разных потоках.
Мне нужно решение, в котором
let $ doc: = doc("/count.xml")
ожидает завершения всех задач вызова.
Я также сталкивался с опцией
<result>{fn:true()}</result>
, но яне знаю, будет ли это работать или нет, потому что переменная
$ bs
нигде не используется, и документация говорит: «Когда вызывающий запрос использует значение future в любой операции, он будет автоматически ждать завершения вызываемой задачи и будет использовать результат. '
Есть ли другиеternative, где строка
let $ doc: = doc ("/ count.xml")
будет выполнена только после того, как все задачи вызова будут завершены