В какой момент загружаются переменные? - PullRequest
0 голосов
/ 01 февраля 2019

Мы проводим рефакторинг очень большой системы и смотрим на многие из написанных нами 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';

Тогда я использую только $g:doc.langmap в своем xQuery.Оцениваются ли и загружаются ли другие два ($g:doc.easymap и $g:doc.foomap) в память, даже если я ими не пользуюсь?

Заполняется ли $g:doc.langmap на import или только когда я на самом деле его используюв запросе?Например, если я напишу xQuery, который никогда не ссылается на $g:doc.langmap, но импортирует этот модуль, он все еще создается в памяти и заполняется или нет?

Мне интересно, потому что, если у меня есть десятки других переменных, объявленных в _global.xq для использования во многих, многих других xQueries.И конечно я не использую, но только несколько ссылок в каждой.Тогда возникает простой вопрос ... вызывает ли команда import module их оценку во время импорта или они имеют значения только при использовании?

Я подозреваю, что это будет оченькраткий ответ.

1 Ответ

0 голосов
/ 01 февраля 2019

ОК, я думаю, что знаю ответ на этот вопрос уже с помощью некоторого простого теста.

Я создал Xquery, когда запуск занимает около 87 секунд.

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 на самом деле не заполняется данными, если они не используются, что ответило бы на мой вопрос.Если я не прав, пожалуйста, звоните.

...