我们正在重构一个非常大的系统,并查看我们编写的许多 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/