Индекс eXist db не используется в xquery

Я сохранил в моем eXist db узлы следующего типа:

<Order ID="170473" LnkID="8288374995" OrignDt="2003-07-08" TrdDt="2003-07-09" Acct="104158163" AcctIDSrc="99" DayBkngInst="ingrated" BkngUnit="hobbyhorse" SettlDt="2003-07-28" ClrFeeInd="B" HandlInst="3" MinQty="2088.58" ProcCode="1" Side="2"
LocReqd="N" TxnTm="2003-07-06T08:44:24" QtyTyp="0" Typ="A" PxTyp="4" Px="4258.33" Ccy="USD" SolFlag="N" IOIID="8596226323" ExpireDt="2003-06-19" GTBkngInst="2" Cpcty="A" Rstctions="A" CustCpcty="1660" ForexReq="Y" SettlCcy="inclination" Txt="eats" EncTxt="pendulous" Qty2="4028.86" MaxShow="1636.80" CxllationRights="M" MnyLaunderingStat="N" Designation="tied" >
<Hdr SID="997453497" D2ID="5969180787" SSub="swiftest" D2Sub="flay" PosDup="N" Snt="2003-10-24T12:13:50" OrigSnt="2003-07-19T00:23:46" MsgEncd="lechery" ><Hop ID="9148044310" Ref="33787" Snt="2003-08-24T21:26:11"></Hop>
</Hdr><Pty ID="8059449011" Src="H" ><Sub ID="228" ></Sub></Pty>
<Instrmt Sym="VRTS" Sfx="CD" ID="8962619773" Src="5" CFI="entrances" MatDt="2003-12-09" CpnPmt="2004-06-12" Issued="2004-05-14" RepoTrm="2749" CrdRtg="dad" IssuCtry="purpose" Redeem="2003-10-17" Strk="2028.23" StrkCcy="posterns" Exch="religiously" EncSecDescLen="4238" Pool="separation" IntAcrl="2003-08-17" ></Instrmt>
<OrdQty Qty="3652" Cash="3036.44" Pct="3882.34" RndDir="2" RndMod="1819.70" ></OrdQty>
</Order>

Я хотел бы иметь индекс для атрибута ID. Мой файл конфигурации:

   <collection xmlns="http://exist-db.org/collection-config/1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<index>
    <create qname="@ID" type="xs:string"/>
</index>
<triggers>
    <trigger class="org.exist.extensions.exquery.restxq.impl.RestXqTrigger"/>
</triggers>

The index I have created is only used in pure xpath queries, such as

//Order[@ID ="170475"]

но не в запросах xquery, например:

for $ord in//Order/@ID
where $ord = "150985"
return $ord

Есть ли способ исправить это?


person user3765179    schedule 22.06.2014    source источник


Ответы (2)


Пожалуйста, попробуйте изменить свой запрос на

for $ord in//Order
where $ord/@ID = "150985"
return $ord

Механизм запросов пытается переписать ваше выражение, чтобы использовать индекс. Он не сможет проанализировать вашу предыдущую формулировку, но должен преуспеть в приведенной выше.

Общая рекомендация - по возможности использовать операторы XPath с фильтрами, поскольку их легче переписать автоматически.

person Wolfgang Meier    schedule 23.06.2014
comment
это имеет смысл, поскольку исходный запрос не вернет $ ord с пригодными для использования данными. - person DiZzZz; 23.06.2014

Это задокументировано что процессор xquery eXist-db испытывает трудности с оптимизацией запросов с предложением where.

Хотя ваш второй запрос синтаксически верен, рекомендуется использовать эквивалент XPATH.

person DiZzZz    schedule 23.06.2014