我们正在重构一个非常大的系统,并查看我们编写的许多 xQuery,并想知道使用和包含一个声明许多全局变量的 xQuery 是否无济于事。

但问题是建筑师......这些是引用加载还是仅在使用时加载?

意思是说我有一些 xQuery ... _global.xq 像这样:

module namespace g="global/variables";
declare variable $g:col.build := '/db/foo/data/Build';
declare variable $g:doc.langmap := doc(concat($g:col.build,'/','langmap.xml'));
declare variable $g:doc.easymap := doc(concat($g:col.build,'/','easymap.xml'));
declare variable $g:doc.foomap := doc(concat($g:col.build,'/','foomap.xml'));

然后我在我的 xQuery 中引用它:
import module namespace g='global/variables' at '_global.xq';

然后我在我的 xQuery 中只使用 $g:doc.langmap。其他两个( $g:doc.easymap$g:doc.foomap )是否也被评估并加载到内存中,即使我不使用它们?
$g:doc.langmap 是填充在 import 上还是仅在我在查询中实际使用它时填充?就像我编写一个从未引用 $g:doc.langmap 但导入该模块的 xQuery 一样,它是否仍然在内存中创建并填充?

我想知道是因为我在 _global.xq 中是否有许多其他声明变量可用于许多其他 xQueries。当然,我不使用但只使用每个引用文献中的几个。那么问题就很简单了…… import module 命令是否会导致它们在导入时都被评估,或者它们是否只有在使用时才具有值?

我怀疑这将是一个非常简短的答案。

最佳答案

好的,我相信我已经通过一些简单的测试知道了这个问题的答案。

我在运行大约需要 87 秒时创建了一个 Xquery。

xquery version "3.0";
declare variable $test := collection('/db/foo/data')//*[@docnum='GS01'];
let $foo := 'bar'
return
$test

如果我将其更改为:
xquery version "3.0";
declare variable $test := collection('/db/foo/data')//*[@docnum='GS01'];
let $foo := 'bar'
return
$foo

它运行是几分之一秒。这让我相信 $test 实际上并没有填充数据,除非使用它来回答我的问题。如果我错了,请进来。

关于xquery - 在什么时候加载变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54472658/

10-12 22:56