用于创建索引的XQuery脚本

用于创建索引的XQuery脚本,xquery,marklogic,Xquery,Marklogic,我正在尝试创建一个脚本,为MarkLogic数据库创建索引。请注意,显示的索引只是要创建的脚本的一小部分 xquery version "1.0-ml"; import module namespace admin = "http://marklogic.com/xdmp/admin" at "/MarkLogic/admin.xqy"; declare namespace xdmpdb = "http://marklogic.com/xdmp/database"; declare varia

我正在尝试创建一个脚本,为MarkLogic数据库创建索引。请注意,显示的索引只是要创建的脚本的一小部分

xquery version "1.0-ml";
import module namespace admin = "http://marklogic.com/xdmp/admin" at "/MarkLogic/admin.xqy";
declare namespace xdmpdb = "http://marklogic.com/xdmp/database";

declare variable $databaseName as xs:string := "army-itam";
declare variable $os as xs:string := "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_OperatingSystem";
declare variable $pe as xs:string := "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_PhysicalElement";

declare variable $os_xml as node() :=
<range-element-index>
  <index>  
    <type>string</type>
    <name>Name</name>
  </index>
  <index>  
    <type>string</type>
    <name>Version</name>
  </index>  
</range-element-index>;

declare variable $pe_xml as node() :=
<range-element-index>
  <index>  
    <type>string</type>
    <name>Model</name>
  </index>
  <index>  
    <type>string</type>
    <name>Manufacturer</name>
  </index>
  <index>  
    <type>dateTime</type>
    <name>ModelTest</name>
  </index>
</range-element-index>;

declare function local:add-range-element-index($config as element(configuration), $dbname as xs:string, $namespace-uri as xs:string, $type as xs:string, $localname as xs:string)
{
try {
     let $dbid := admin:database-get-id($config, $dbname)
     let $range-index := admin:database-range-element-index($type, $namespace-uri, $localname, "http://marklogic.com/collation/", fn:false() )
     let $ExistingREindexes := fn:data(admin:database-get-range-element-indexes($config, $dbid)/xdmpdb:localname)
     let $config :=
        if ($localname = $ExistingREindexes) 
        then $config
        else admin:database-add-range-element-index($config, $dbid, $range-index)
     let $log := xdmp:log(fn:concat("ERI (", $localname, ") added"), "info")
     return $config
} catch($e) {
     (fn:concat("Error adding ERI: ", fn:string-join($localname,",")),xdmp:log(xdmp:quote($e)))
   }
};

declare function local:create-index($config as element(configuration), $namespace-uri as xs:string, $server as node())
{
try {
    let $log := xdmp:log(fn:concat("Creating indexs for (", $namespace-uri, ")"), "info")
    let $config :=
      for $results in $server//index
        let $type := xs:string($results//type/text())
        let $name := xs:string($results//name/text())
        return local:add-range-element-index($config, $databaseName, $namespace-uri, $type, $name) 
    return $config
} catch($e) {
     xdmp:log(xdmp:quote($e))
   }
};

declare function local:index-create($config as element(configuration))
{
try {
     let $config := local:create-index($config, $os, $os_xml)
     let $config := local:create-index($config, $pe, $pe_xml)
     return $config
} catch($e) {
     xdmp:log(xdmp:quote($e))
   }
};

let $config := admin:get-configuration()
let $config := local:index-create($config)
return admin:save-configuration($config)

问题在于
local:create-index()
中的for循环正在创建一个配置序列,每个
$server//index
一个配置序列。每一个都是原始配置加上您在循环的特定迭代中添加的内容

xdmp:set($config, local:add-range-element-index($config, ...))
执行
admin:save-configuration()
时,实际上是在向其传递一系列配置,函数映射导致对每个配置调用一次
save-configuration()

我将声明
local:create-index()
以显式返回
元素(配置)
,确保它只返回一个元素

我还将使用
xdmp:set()
在循环的每个迭代中覆盖
$config

xdmp:set($config, local:add-range-element-index($config, ...))
或者,如果您不想使用
xdmp:set()
,则可以使用递归函数获得相同的效果。

将为您处理此问题,以及更多问题

我在local:create-index()函数的for循环返回行中添加了
xdmp:set()
命令。我还输入了将$config导出到日志中的代码。