MarkLogic - XQuery 语句的顺序处理

MarkLogic - Sequential processing of XQuery statements

我在代码下面 运行 并期望 insert-after 函数在 insert-before 函数之后执行(至少有 2000 毫秒的间隔),因为我的理解是 XQuery 将执行语句序列。但是,在 运行 代码之后,我看到两个文档 (/content/testbefore.xml/content/testafter。 xml) 这两个函数创建的时间戳值精确到毫秒。

如何让语句按顺序执行?

xquery version "1.0-ml";

declare function local:insert-before()
  {
  let $contents :=
    <book>
      <bookTitle>All About George</bookTitle>
      <tstmp>{fn:current-dateTime()}</tstmp>
      <chapter1>
        <chapterTitle>Curious George</chapterTitle>
      </chapter1>
   </book>
  return xdmp:document-insert("/content/testbefore.xml", $contents)
};

declare function local:insert-after()
{
let $contents :=
  <after>
    <bookTitle>All About George</bookTitle>
    <tstmp>{fn:current-dateTime()}</tstmp>
    <chapter1>
      <chapterTitle>Curious George</chapterTitle>
    </chapter1>
 </after>
 return xdmp:document-insert("/content/testafter.xml", $contents)
};

local:insert-before(),
xdmp:commit(),
xdmp:sleep(2000),
local:insert-after();

语句按该顺序执行,但所有内容都在同一个快照中提交给数据库。

fn:current-dateTime() is deterministic,并且将始终 return 同一事务中的一致答案。

[Definition] A function that is guaranteed to produce ·identical· results from repeated calls within a single ·execution scope· if the explicit and implicit arguments are identical is referred to as deterministic.

您可以使用 xdmp:elapsed-time(),它将 return 一个 xs:dayTimeDuration 自查询处理开始以来经过的时间,并将其添加到 fn:currentDateTime()值:

<tstmp>{fn:current-dateTime() + xdmp:elapsed-time()}</tstmp>