[英]Using global map variable with BaseX collection
我正在使用 BaseX (v9.3.2) XQuery v3.1。 我有一個 XQuery 腳本,它評估 BaseX 集合中的所有 XML 文件。 該集合有大約 100 個文件,每個文件的大小在 30MB 到 1.5GB 之間,並且具有相同的 XSD 架構。 獲得更好性能的腳本使用 BaseX Map 模塊將鍵映射到值並通過鍵快速獲取值。 我已經聲明了幾個map(*)
類型的模塊全局變量。 關鍵是鍵值僅在一個XML 文件中是唯一的。 為了使鍵在整個集合中唯一,我只是添加了base-uri($value),'_'
作為鍵的附加部分:)。 它工作正常。 我看到的主要缺點是需要通過所有連續的 function 調用FooN($baseuri, $arg2) FooN-1($baseuri, $arg2)... Foo1($baseuri, $arg2)
來隧道化base-uri
如果$baseuri
值是在第一次調用FooN($baseuri, $arg2)
設置的,但僅在執行鏈的最后一個 function 中使用。 為了更清楚,請參閱下面的 XQuery 代碼。 這里$basuri
最后只在helper:Foo1
helper:Foo2
作為參數傳遞。
我的問題是對於 arguments 隧道是否有更好的方法並且沒有其他缺點(性能、內存)。
xquery version "3.1" encoding "utf-8";
declare namespace helper="helperns";
declare variable $helper:root := db:open("BMW");
declare variable $helper:mapAS_ApplicationRecordElementByTypeRef as map(*) := map:merge(for $value in $helper:root//*:APPLICATION-RECORD-ELEMENT[*:TYPE-TREF/@DEST='APPLICATION-PRIMITIVE-DATA-TYPE'] return map:entry(concat(base-uri($value),'_',$value/*:TYPE-TREF/tokenize(text(),'/')[last()]), $value));
declare variable $helper:mapAS_ImplementationDataTypeRefByApplicationDatatypeRef as map(*) := ...
...
declare function helper:Foo1($applPrimitiveDataType as element(),$basuri as xs:string)
as element() {
let $applRecordElement := map:get($helper:mapAS_ApplicationRecordElementByTypeRef, concat($basuri,'_',$applPrimitiveDataType/*:SHORT-NAME/text()))
...
let $resolved := if($implDataTypeElement) then (
...
)
else (
<RESOLVED_DATATYPE>
<SHORT-NAME resolveinfo='not resolved (DB ERROR)'>unknown</SHORT-NAME>
</RESOLVED_DATATYPE>
)
return ($resolved)
};
...
declare function helper:Foo2($basuri as xs:string)
as element()* {
let $applicationPrimitiveDataTypes := ...
let $res :=
for $applicationPrimitiveDataType in $applicationPrimitiveDataTypes
...
order by $shortname
return (
if (not($implDataTypeRef)) then (
let $dataTypeResolved := helper:Foo1($applicationPrimitiveDataType,$basuri)
return(
<MAPPING appldtname="{$shortname}" size="{$dataTypeResolved/*:SHORT-NAME/@size}" basedatatype="{$dataTypeResolved/*:SHORT-NAME}" resolveinfo="{$dataTypeResolved/SHORT-NAME/@resolveinfo}"/>
)
)
)
return($res)
};
let $mappingsForAllDocs :=
for $doc in helper:getAllDocs()/doc
...
let $missingmappings := helper:Foo2($doc/@baseuri)
return (
<FILE name="{$doc/@filename}" missing="{count($missingmappings)}">
<MISSING-MAPPING>{$missingmappings}</MISSING-MAPPING>
...
</FILE>
)
let $allDocs :=
for $doc in helper:getAllDocs()/doc
order by $doc/@filename
return (
<FILE name="{$doc/@filename}"/>
)
return($mappingsForAllDocs)
您是否考慮過使用唯一 ID 更新 XML 文件(或生成新集)? 一旦有了唯一的 ID,XML 數據庫(如 BaseX)就能夠使用fn:id()
function 進行快速查找。 如需更新 XML 文件,請參閱https://docs.basex.org/wiki/XQuery_Update 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.