MarkLogicサーバーのXQueryの機能強化

MarkLogicサーバーは、XQuery 1.0-mlという独自のXQueryダイアレクトを実装しています。 これは、開発者の生活を改善するために設計されたMarkLogicのアドオンを備えた同じXQuery 1.0であると推測するのは難しくありません。 仕様では、これらの変更によりXQueryがアプリケーションプログラミングにより適したものになっていると記載されています。 MarkLogicサーバー6.0仕様(http://docs.marklogic.com/6.0/guide/xquery.pdf)で説明されているXQueryアドオンを見てみましょう
使用される方言は、次のディレクティブによって宣言されます

xquery version "1.0-ml"; 


デフォルトでは使用されますが、モジュールの先頭に次のディレクティブを配置することでXQuery 1.0を使用することもできます

 xquery version "1.0"; 


MarkLogicによるXQuery 1.0-mlの改善点のリスト
1.式を試す/キャッチする
2.関数マッピング
3.トランザクション分離記号としてのセミコロン
4.プライベート関数と変数
5.副作用のある機能「副作用」
6.短縮された述部の位置付け
7.バイナリオブジェクトのコンストラクタ
8.式は次のように検証します
9.シリアル化オプション
10. XQueryモデルにXSLTスタイルをインポートする
11.実装定義のセマンティクス

各項目をもう少し詳しく検討してみましょう。

1.式を試す/キャッチする
この式により、実行時XQueryで例外をキャッチし、適切に応答することができます

 try {    } catch ($exception) {    } 


MarkLogicサーバーのすべての例外と同様に、$例外変数は、XPathなどの設定可能な例外を記述するXMLであり、目的のデータを引き出したり、MarkLogicサーバー内でXMLで実行できるすべてを実行したりします。
そして、この方法で捕捉できない「特別な」例外は3つだけですXDMP-CANCELED, SVC-CENCELER XDMP-DISABLEDです。

2.関数マッピング
「関数マッピング」は、一連の要素を関数パラメーターとして渡すことができる式ですが、! シーケンスの各要素は個別に処理されます。 これは、シーケンスの各要素に対してハンドラー関数が呼び出され、1つの要素がパラメーターとして渡されることを意味します。
「関数マッピング」は、forループ内の要素の配列を繰り返し処理することの類似物です。 いくつかの例外を除いて当然

 xquery version "1.0-ml"; declare function local:print-word ($word as xs:string) { $word }; local:print-word( ("hello", "world") ) 


このコードは、テキスト「helloworld」を出力します。 local:print-word関数は、各要素に対して2回呼び出されます。
次の式では、興味深い結果が得られます

 xquery version "1.0-ml"; (1,2) * (3,4) 


結果(3、4、6、8)。 この場合、「関数マッピング」も機能し、結果は数値の順次乗算の結果です。
このような関数を呼び出した結果には特に注意を払う必要があります。これは、各要素に対して関数を呼び出した結果のシーケンスになります。 空のシーケンスで関数を呼び出すときは注意が必要です

 local:print-word( () ) 


関数の結果は-()になりますが、期待どおりですが、同時に関数自体は一度も呼び出されません。 これは覚えておく価値があります。
「機能マッピング」はデフォルトでMarkLogicサーバーで使用できますが、強制的に無効または有効にするオプションがあります。 これは次のように行われます
含まれるもの:

 declare namespace xdmp="http://marklogic.com/xdmp"; declare option xdmp:mapping "true"; 


シャットダウン:

 declare namespace xdmp="http://marklogic.com/xdmp"; declare option xdmp:mapping "false"; 


3.セミコロン-トランザクションセパレーターとして
Xquery 1.0-mlでは、「;」を追加できます 1つまたは複数のXQuery式の後。これは、このシンボルの前にあるコードが1つのトランザクションで実行され、このシンボルの後にあるすべての命令が別の(次の)トランザクションで実行されることを意味します。 デフォルトでは、MarkLogicサーバーへのリクエスト全体が1つのトランザクションで実行され、ロールバック時に、このリクエストで変更されたすべてのデータが復元されます。 トランザクションスプリッターを使用すると、MarkLogicサーバーへの要求を非常に複雑な場合に部分に分割できます。
また、ドキュメントの新しいバージョンは、それが変更されたトランザクションから利用できないことを覚えておく必要があります。

4.プライベート関数と変数の定義
ライブラリを実装するとき、モジュール内の一部の関数または変数をロックして、それらをプライベートにし、他のライブラリからアクセスできないようにすることができます。 これは次のように行われます

 declare private function .... declare private variable .... 


「メイン」モジュールの関数と変数は、定義によりプライベートであるため、「プライベート」はライブラリモジュールにのみ有効であることに注意してください。

5.副作用のある機能「副作用」
XQuery仕様では、関数は呼び出しではなく値のみを返すことができ、データの関数本体からの副次的な変更は許可されていません。 MarkLogicサーバーには、XQuery仕様と矛盾する多くの機能強化があり、関数の結果を超えてデータを変更します。 そのような効果の例としては、データベース内のドキュメントの変更があります。これは、結果を返すだけでなく、データも変更します。
「サイド効果」は、アプリケーションを作成するときに非常によく使用されます。そのため、MarkLogicサーバーには「サイド効果」を作成する多くの機能があります。
そのような機能の例
•xdmp:設定
•更新機能(xdmp:document-load、xdmp:node-insertなど)
•管理機能(xdmp:マージ、管理ライブラリ、xdmp:シャットダウンなど)

6.短縮された述部の位置付け
MarkLogicサーバーには、シーケンス内の要素を識別するための短縮述語があります。 したがって、XQuery 1.0-mlでシーケンスの最初の3つの要素を取得するには、以下を行う必要があります

 xquery version "1.0-ml"; (1, 2, 3, 4, 5, 5)[1 to 3] 


およびXQuery 1.0

 xquery version "1.0"; (1, 2, 3, 4, 5, 5)[fn:position() = (1 to 3)] 


7.バイナリオブジェクトのコンストラクタ
XQuery 1.0-ml expandsは、バイナリドキュメントの保存に使用されるバイナリデータのタイプを導入することにより、XQuery 1.0を拡張します。 新しいタイプをサポートするために、バイナリデータコンストラクター「binary」と、タイプ「typeswitch」の構造で使用できるタイプbinary()をチェックする機能が導入されています。

8.式は次のように検証します
もう1つの革新的な表現は、「検証する」という表現です。これは、「検証する」という表現で型を示すために使用できます。

 xquery version "1.0-ml"; validate as xs:boolean { <foo>{fn:true()}</foo> } 


基本的に、これはXQuery 1.0-mlのそのような革新ではありません。 XQuery 1.0の同様のチェックは、次のように実行できます。

 xquery version "1.0"; declare namespace xdmp="http://marklogic.com/xdmp"; (# xdmp:validate-type xs:boolean #) { <foo>{fn:true()}</foo> } 


9.シリアル化オプション
シリアル化オプションは、declare optionディレクティブを使用してXQueryで指定できます。

10. XQueryモデルにXSLTスタイルをインポートする
XQuery 1.0-mlでは、XSLTスタイルをXQueryモジュールにインポートでき、XSLTモジュールで宣言されたすべての関数と変数にアクセスできます。
XSLTをインポートする

 xquery version "1.0-ml"; import stylesheet at "/path-to-stylesheet.xsl"; 


11.実装定義のセマンティクス
XQuery仕様には、異なるXQuery実装で異なる方法で実装できるアイテムのセットが含まれています。

1.定義済みの名前空間。
各XQuery実装には、明示的にインポートせずに使用できる独自の名前空間のセットが含まれています。 たとえば、「fn:」はそのようなスペースの1つです。

2.外部変数
外部変数は、外部モジュールから使用できる変数です。 そのような変数を宣言する例

 xquery version "1.0-ml"; declare namespace my="myNamespace"; declare variable $my:variable as xs:string* external; fn:concat("The value of $my:variable is: ", $my:variable) 


関数xdmp:invoke、xdmp:eval、xdmp:spawnまたはXCCを介して、このような変数の値を設定できます。

 >xquery version "1.0-ml"; declare namespace my="myNamespace"; xdmp:invoke("/extvar.xqy", (xs:QName("my:variable"), "my value")) 


そのような変数を使用する

 The value of $my:variable is: my value 


3.並べ替えオプション
各XQuery実装の名前、ソートオプション、およびデフォルトパラメータは個別です。 詳細については、検索開発者ガイドを参照してください。

4. XQuery実装定義型
MarkLogicサーバーは、XQueryを拡張して、それらと対話するための追加のタイプと関数を提供します。 これらのタイプはXQuery仕様では必要ありませんが、それらの寿命は向上しているため、MarkLogicサーバーに存在します。
いくつかの新しいタイプ
•cts:クエリ(cts:word-query、cts:element-queryなどの多くのサブタイプを使用)
•マップ:マップ
•cts:リージョン(サブタイプcts:ボックス、cts:円、cts:ポリゴン、cts:ポイント)
•json:オブジェクト
•json:配列
•json:unquotedString

5. 10進数の精度
MarkLogicサーバーには、小数の精度を制限する設定がありません。 10進数の精度は18桁の10進数です。

6.モジュールの名前空間は、その機能のデフォルトのスペースです。
モジュールのデフォルト名前空間は、このモジュール内にあるすべての関数のデフォルト名前空間でもあります。 これは、接頭辞(名前空間)を明示的に指定しなくても、モジュール内で関数を宣言できることを意味します。

Source: https://habr.com/ru/post/J183004/


All Articles