XQuery および XQSE 開発者ガイド

     前  次    新しいウィンドウで目次を開く     
ここから内容

BEA の XQuery 実装

World Wide Web Consortium (W3C) は、XQuery については、言語に関する機能のセットを定義します。BEA AquaLogic Data Services Platform XQuery エンジンは、1 つの例外 (モジュール) を除き、これらの言語機能を完全にサポートし、関数の強力なサブセットもサポートします。さらに、実装ごとに固有の多くの関数および言語キーワードを追加します。

この章では、XQuery エンジンにおける、関数と言語の実装および拡張について説明します。

この章の内容は以下のとおりです。

 


BEA XQuery 関数の実装

AquaLogic Data Services Platform は、2004 年 7 月 23 日の W3C Working Draft 「XQuery 1.0 and XPath 2.0 関数および演算子」 (http://www.w3.org/TR/2004/WD-xpath-functions20040723/) をサポートします。
さらに、AquaLogic Data Services Platform は、XQuery 仕様のエンハンスメントであるまた、次の拡張関数プレフィックスにより識別される複数の関数をサポートします。プレフィックスは
fn-bea: です。たとえば、拡張関数の完全な XQuery 表記は、fn-bea:function_name です。

この節では、BEA XQuery の拡張関数について説明します。以下のトピックがあります。

関数の概要

表 2-1 は BEA XQuery の拡張関数の概要を示します。

表 2-1 BEA XQuery の拡張関数
カテゴリ
関数
説明
アクセス制御関数
fn-bea:is-access-allowed
現在の要求コンテキストに関連するユーザが、指定したリソースにアクセスできるか、チェックする。
fn-bea:is-user-in-group
現在のユーザが指定したグループに存在するか、チェックする。
fn-bea:is-user-in-role
現在のユーザが指定したロールに存在するか、チェックする。
fn-bea:userid
保護されたリソースを要求するユーザの識別子を返す。
期間、日付および時間の関数
fn-bea:date-from-dateTime
dateTime 値の日付部分を返す。
fn-bea:date-from-string-
with-format
指定したパターンに従い、文字列ソース値から新しい date 値を返す。
fn-bea:date-to-string-with-
format
指定したパターンの日付文字列を返す。
fn-bea:dateTime-from-string-with-format
指定したパターンに従い、文字列ソース値から新しい dateTime 値を返す。
fn-bea:dateTime-to-string-
with-format
指定したパターンの日時文字列を返す。
fn-bea:time-from-dateTime
dateTime 値の時刻部分を返す。
fn-bea:time-from-string-
with-format
指定したパターンに従い、文字列ソース値から新しい時間値を返す。
fn-bea:time-to-string-with-
format
指定したパターンの時刻文字列を返す。
実行制御関数
fn-bea:async
XQuery 式を非同期的に評価し、評価結果をバッファーに格納する。
fn-bea:fence
最適化するアイランドにクエリを分割し、最適化の境界の定義を可能にする。
fn-bea:timeout
一次 XQuery 式がタイムアウトされた場合、一次式全体の結果か、代替式全体の結果を返す。
fn-bea:timeout-with-label
fn-bea:timeout と同様だが、監査をサポートするラベルが付いている。
fn-bea:fail-over
fn-bea:fail-over-with-label
一次 XQuery 式が失敗した場合、一次式全体の結果か代替式全体の結果を返す。
fn-bea:fail-over-with-label について、監査レコードには引数として指定したラベルも含まれています。
fn-bea:fail-over-retry
fn-bea:fail-over-retry-
with-label
一次 XQuery 式が失敗した場合、一次式全体の結果か代替式全体の結果を返す。
式の評価にエラーが発生しても、関数は以降の各評価の一次式を再評価します。
fn-bea:fail-over-retry-with-label について、監査レコードには引数として指定したラベルも含まれています。
数値関数
fn-bea:format-number
関数は、指定したフォーマット パターンを使用して Double 型を文字列に変換します。
fn-bea:decimal-round
指定した精度、または整数に四捨五入した 10 進値を返す。
fn-bea:decimal-truncate
指定した精度、または整数に切り捨てた 10 進値を返す。
その他の関数
fn-bea:get-property
外部からの影響に基づき行動を変更できるデータ サービスの書き込みを可能にする。
fn-bea:inlinedXML
テキスト形式の XML を解析し、XQuery 1.0 データ モデルのインスタンスを返す。
fn-bea:rename
要素のシーケンス名を変更する。
QName 関数
fn-bea:QName-from-string
xs:QName を作成し、指定した引数の値をネームスペースなしのローカル名として使用する。
シーケンス関数
fn-bea:interleave
引数に指定した項目をインターリーブする。
文字列関数
fn-bea:match
入力された文字列のどの文字が入力した正規表現に一致するかを指定する整数のリスト(整数が 0 の空のリストあるいは整数が 2 つ入ったリスト)を返す。
fn-bea:sql-like
SQL LIKE 句構文で指定したパターンを使って文字列を検索する。この関数を使うと、パターンにおいてワイルドカードをエスケープするオプションが可能になる。
fn-bea:trim
先頭と末尾の空白文字を削除する。
fn-bea:trim-left
先頭の空白文字を削除する。
fn-bea:trim-right
末尾の空白文字を削除する。
fn-bea:pad-left
指定した文字列の左側に指定した数の文字を追加する。必要に応じて、パディングに使用する文字列を指定することもできる。
fn-bea:pad-right
指定した文字列の右側に指定した数の文字を追加する。必要に応じて、パディングに使用する文字列を指定することもできる。
拡張された XQuery データ モデル (XXDM) 関数
fn-bea:current-value
指定した引数の現在の値を表す XQuery データ モデル (XDM) インスタンスを返します。
fn-bea:old-value
変更する前に指定した引数の現在の値を表す XDM インスタンスを返します。

アクセス制御関数

AquaLogic Data Services Platform (ALDSP) は、基底の WebLogic Platform のロール ベース セキュリティ ポリシーを使用し、データ リソースへのアクセスを管理します。セキュリティ ポリシーは、保護されたリソースにアクセスするために満たさなければならない条件です。ポリシー、要求されたリソースおよびユーザ コンテキストに従って条件の評価結果が FALSE である場合、当該リソースへのアクセスがブロックされ、関連データは返されません。

AquaLogic Data Services Platform Console を使用していったんセキュリティ ポリシーが構成されると、この節で説明したセキュリティの拡張関数で以下の情報を確認することができます。

この節では、BEA の XQuery 実装における以下の AquaLogic Data Services Platform のアクセス管理拡張関数について説明します。

fn-bea:is-access-allowed

fn-bea:is-access-allowed 関数は、現在の要求コンテキストに関連するユーザが、リソース名とデータ サービス識別子で示される指定リソースにアクセスできるかチェックします。

この関数には以下の署名があります。

fn-bea:is-access-allowed($resource as xs:string, $data\service as xs:string) as xs:boolean

$resource はリソース名で、また $dataservice はリソースの識別子です。

この関数は、WebLogic セキュリティ フレームワークにコールし、指定したリソースについてアクセスをチェックします。以下にその例を示します。

if (fn-bea:is-access-allowed("ssn", "ld:DataServices/CustomerProfile.ds"))
	then fn:true() 

fn-bea:is-user-in-group

fn-bea:is-user-in-group 関数は、現在のユーザが、指定したグループに存在するかチェックします。この関数は、適切なグループ メンバシップについて、WebLogic で認証された対象を分析します。

この関数には以下の署名があります。

fn-bea:is-user-in-group($group as xs:string) as xs:boolean

$group は現在のユーザに対してテストするグループです。

注意 : この処理は自動的に認証されません。

fn-bea:is-user-in-role

fn-bea:is-user-in-role 関数は、現在のユーザが指定したグローバル ロールに存在するかチェックします。この関数は WebLogic セキュリティ フレームワークから役割の一覧を取得します。

この関数には以下の署名があります。

fn-bea:is-user-in-group($group as xs:string) as xs:boolean

$role は現在のユーザに対してテストするロールです。

注意 : この処理は自動的に認証されません。

fn-bea:userid

fn-bea:userid() 関数は、保護されたリソースを要求するユーザの識別子を返します。

この関数には以下の署名があります。

fn-bea:userid() as xs:string

期間、日付および時間の関数

この節では、BEA の XQuery 実装における以下の期間、日付および時刻の拡張関数について説明します。

fn-bea:date-from-dateTime

fn-bea:date-from-dateTime() 関数は、dateTimedate に変換し、dateTime 値の日付部分を返します。

この関数には以下の署名があります。

fn-bea:date-from-dateTime($dateTime as xs:dateTime?) as xs:date?

$dateTime は日時です。

例 :

fn-bea:date-from-string-with-format

fn-bea:date-from-string-with-format 関数は、指定したパターンに従い、文字列ソース値から新しい date 値を返します。

この関数には以下の署名があります。

fn-bea:date-from-string-with-format($format as xs:string?, $dateString as xs:string?) as xs:date?

$format はパターン、$dateString は日付です。パターンの指定の詳細については、「日付および時間のパターン」を参照してください。

例 :

fn-bea:date-to-string-with-format

fn-bea:date-to-string-with-format 関数は、指定したパターンの日付文字列を返します。

この関数には以下の署名があります。

fn-bea:date-from-string-with-format($format as xs:string?, $dateString as xs:string?) as xs:date?

$format はパターン、$date は日付です。パターンの指定の詳細については、「日付および時間のパターン」を参照してください。

例 :

fn-bea:dateTime-from-string-with-format

fn-bea:dateTime-from-string-with-format 関数は、指定したパターンに従い、文字列ソース値から新しい dateTime 値を返します。

この関数には以下の署名があります。

fn-bea:date-from-string-with-format($format as xs:string?, $dateString as xs:string?) as xs:date?

$format はパターン、$dateTimeString は日時です。パターンの指定の詳細については、「日付および時間のパターン」を参照してください。

例 :

fn-bea:dateTime-to-string-with-format

fn-bea:dateTime-to-string-with-format 関数は、指定したパターンの日時文字列を返します。

この関数には以下の署名があります。

fn-bea:date-from-string-with-format($format as xs:string?, $dateString as xs:string?) as xs:date?

$format はパターン、$dateTime は日時です。パターンの指定の詳細については、「日付および時間のパターン」を参照してください。

例 :

fn-bea:time-from-dateTime

fn-bea:time-from-dateTime 関数は、dateTime 値から時刻を返します。

この関数には以下の署名があります。

fn-bea:date-from-dateTime($dateTime as xs:dateTime?) as xs:date?

$dateTime は日時です。

例 :

fn-bea:time-from-string-with-format

fn-bea:time-from-string-with-format 関数は指定したパターンに従い、文字列ソース値から新しい時刻値を返します。

この関数には以下の署名があります。

fn-bea:time-from-string-with-format($format as xs:string?, $timeString as xs:string?) as xs:time?

$format はパターン、$timeString は時刻です。パターンの指定の詳細については、「日付および時間のパターン」を参照してください。

例 :

fn-bea:time-to-string-with-format

fn-bea:time-to-string-with-format 関数は指定したパターンの時刻文字列を返します。

この関数には以下の署名があります。

fn-bea:time-to-string-with-format($format as xs:string?, $time as xs:time?) as xs:string?

$format はパターンで、$time は時刻です。パターンの指定の詳細については、「日付および時間のパターン」を参照してください。

例 :

日付および時間のパターン

Java クラスの標準記号を使用することにより、日付と時刻のパターンを作成することができます。表 2-2 は使用可能なパターン記号を示しています。

表 2-2 日付および時間のパターン  
記号    
対応データ  
出力結果
G
年代
AD
y
1996
M
7月、07
d
19
h
時 (1-12)
10
H
時 (0-23)
22
m
30
s
55
S
ミリ秒
978
E
曜日
火曜日
D
27
w
週 (年間)
27
W
週 (月間)
2
a
am/pm
AM, PM
k
時間 (1-24)
24
K
時間 (0-11)
0
z
時間帯
PST
PDT

実際の値を表すのに必要な最大文字数に一致するまで各記号を繰り返します。例えば、4 July 2002 を表すパターンは、d MMMM yyyy です。12:43 PM を表すパターンは、hh:mm a です。

実行制御関数

この節では、BEA の XQuery 実装における以下の AquaLogic Data Services Platform の実行制御拡張関数について説明します。

fn-bea:async

fn-bea:async 関数は、バッファを使用して実行スレッド間にデータ フローを制御し、XQuery 式を非同期的に評価します。

この関数には以下の署名があります。

fn-bea:async($expression as item()*) as item()*

$expression は、非同期的に評価する XQuery 式です。

fn-bea:async 関数は、Web サービスの非同期的実行を可能にし、サービスの待ち時間により発生する問題を削減します。

注意 : 非同期 Web サービスは、トランザクション設定に関係なく、他のスレッドにトランザクション コンテキストを伝播しません。非同期のオペレーションは、同様に新しいトランザクションを開始することはできません。

例 :

以下の例では、CUSTOMER はデータベース テーブルで、getCreditScore 関数は 2 つの格付け機関が提供する Web サービスです。

for $cust in db:CUSTOMER()
where $cust/ID eq $param
return
let $score1:= fn-bea:async(exper:getCreditScore($cust/SSN), 2),
    $score2:= fn-bea:async(equi:getCreditScore($cust/SSN), 2)
return
if (fn:abs($score1 - $score2) < $threshold)
then fn:avg(($score1, $score2))
else fn:max(($score1, $score2))

fn-bea:fence

fn-bea:fence 関数を使用すると、クエリを複数のアイランドに分割し、その中で境界を越えることのないよう最適化を行い、最適化の境界の定義ができます。クエリを積み重ねる場合にも fn-bea:fence 関数を利用できます。

この関数には以下の署名があります。

fn-bea:async($expression as item()*, $cap as xs:integer) as item()*

$expression は入力式です。

fn-bea:fence 関数は入力ストリームを変更しない pass-through 関数ですが、グローバルな書き換えがその中で起こらないようオプティマイザに指示を出します。特に、fn-bea:fence 関数は、表示展開 (view unfolding)、ループ展開 (loop unrolling)、定数畳み込み (constant folding) およびブール最適化 (Boolean optimizations) の書き換えを防ぎます。

fn-bea:timeout および fn-bea:timeout-with-label

timeout 関数は以下のいずれかを返します。

Timeout 関数は設定が自由に変更できるよう設計されています。エラー条件が発生した場合、関数は単一の $alt 式を返すか、$timeout および $failure としてより詳細な情報を返すことができます。

fn-bea-timeout( )fn-bea-timeout-with-label( ) の 2 つの関数の相違は、後者はエラー条件発生時に監査情報に加えて $label を返すことです。

fn-bea-timeout 署名

fn-bea:timeout( ) 関数には以下の署名があります。

fn-bea:timeout($seq as item()*,
$millisec as xs:integer,
$timeout as item()*,
$failure as item()*) as item()*

$seq は評価する XQuery の一次式、$millisec はミリ秒単位でのタイムアウト値、また $timeout$seq の評価が $millis ミリ秒より長くかかる場合に返されます。$failure$seq の評価にエラーが発生した場合に返されます。

代わりに、$timeout および $failure パラメータを単一の $alt パラメータに置換することができます。$alt の結果はタイムアウトまたはその他のエラーが発生した場合に返されます。

fn-bea-timeout-with-label 署名

fn-bea:timeout-with-label( ) 関数には以下の署名があります。

fn-bea:timeout-with-label($seq as item()*,
$millisec as xs:integer,
$timeout as item()*
$failure as item(),
$label as xs:string) as item()*

$label は監査レコードに提供する情報を示します。

操作の詳細

どちらの関数も $seq の評価が以下のような場合、$seq の評価結果を返します。

  1. エラーが発生しない、また
  2. $millis (ミリ秒単位) の値より長い時間がかからない。

それでもエラーが発生した場合、あるいはミリ秒の制限を越えた場合には、監査記録と共に代替式が返されます。

監査レコードには以下が含まれています。

$millis または $alt の評価にエラーが発生した場合は、通常の方法でエラーが報告されます。つまり、どちらの関数も返されたエラーに対する処理を行いません。

クエリにおいて、これらの関数の中の 1 つの関数の特定インスタンスで $seq の評価にエラーが発生した場合、または「タイムアウト」が発生した場合、同じクエリの評価中、このインスタンスの後続の評価はすべて $timeout および $failure (または $alt) を返します。この場合は、$seq を再評価することはありません。

タイムアウト関数は以下のように使用することができます。

データ ソースにアクセスするときにエラーが発生した場合、タイムアウト関数はただちに代替式を返すことに注意してください。

ここで、$param が外部パラメータである場合の例を示します。

for $cust in db:CUSTOMER()
where $cust/ID eq $param
return
fn-bea:timeout(exper:getCreditScore($cust/SSN), 200,
fn-bea:timeout(equi:getCreditScore($cust/SSN), 200,
fn:error()
)
)

fn-bea:fail-over、fn-bea:fail-over-with-label、fn-bea:fail-over-retry、および fn-bea:fail-over-retry-with-label

fn:bea:fail-over および fn:bea:fail-over-with-label 関数は、$seq の評価に例外が発生しない場合、$seq の評価結果を返します。例外が発生する場合は、$alt を返します。どちらも多様関数で、その静的リターン タイプは $seq および $alt の静的タイプの組み合わせです。

この関数には以下の署名があります。

fn-bea:fail-over($seq as item()*,
           $alt as item()*) as item()*
fn-bea:fail-over-with-label($seq as item()*, 
$alt as item()*,
$label as xs:string) as item()*

$alt が返される場合、監査レコードには以下が含まれています。

$seq の評価によって例外が発生した場合、同じクエリの評価中、このインスタンスに続くすべての評価が $alt を返します。$seq の再評価は行いません。$alt の評価によって例外が発生した場合、報告をするだけです。エラー処理を行うことはありません。

fn:bea:fail-over-retry および fn:bea:fail-over-retry-with-label 関数は、$seq の評価に例外が発生しない場合、$seq の評価結果を返します。例外が発生しない場合は、$alt を返します。

fn:bea:fail-over および fn:bea:fail-over-with-label 関数とは異なり、fn:bea:fail-over-retry および fn:bea:fail-over-retry-with-label 関数は、$seq の評価においてエラーが発生しても、以降の各評価の $seq を再評価します。

fn:bea:fail-over-retry および fn:bea:fail-over-retry-with-label 関数には以下の署名があります。

fn-bea:fail-over-retry($seq as item()*, 
$alt as item()*) as item()*
fn-bea:fail-over-retry-with-label($seq as item()*, 
$alt as item()*,
$label as xs:string) as item()*
使用方法における提案事項

fn-bea:fail-over( ) 関数は次の 2 通りの方法で使用できます。

数値関数

この節では、BEA の XQuery 実装における以下の数字拡張関数について説明します。

fn-bea:format-number

fn-bea:format-number 関数は、指定したフォーマット パターンを使用して Double 型を文字列に変換します。

この関数には以下の署名があります。

fn-bea:format-number($number as xs:double, $pattern as xs:string) as xs:string

$number は文字列に変換する Double 型数値、$pattern はパターン文字列を示します。このパターンのフォーマットは JDK 1.5.0 DecimalFormat クラスにより指定されます。(DecimalFormat およびその他の JDK 1.5.0 Java クラスに関する情報については、「http://java.sun.com/j2se/1.5.0/」を参照してください。)

fn-bea:decimal-round

fn-bea:decimal-round 関数は、指定した精度 (スケール)、または最も近い整数に四捨五入した 10 進値を返します。

この関数には以下の署名があります。

fn-bea:decimal-round($value as xs:decimal?, $scale as xs:integer?) as xs:decimal?

fn-bea:decimal-round($value as xs:decimal?, $scale as xs:integer?) as xs:decimal?

$value は四捨五入する 10 進値で、$scale は入力した 10 進値を四捨五入する精度です。1 のスケール値は入力した値を小数点以下第 1 位に、2 のスケール値は小数点以下第 2 位に四捨五入します。

例 :

fn-bea:decimal-truncate

fn-bea:decimal-truncate 関数は、指定した精度 (スケール)、または最も近い整数に切り捨てた 10 進値を返します。

この関数には以下の署名があります。

fn-bea:decimal-round($value as xs:decimal?, $scale as xs:integer?) as xs:decimal?

fn-bea:decimal-round($value as xs:decimal?, $scale as xs:integer?) as xs:decimal?

$value は切り捨てる 10 進値、$scale は入力した 10 進値を切り捨てる精度です。1 のスケール値は入力した値を小数点以下第 1 位に、2 のスケール値は小数点以下第 2 位に切り捨てます。

例 :

その他の関数

この節では、BEA の XQuery 実装における以下の拡張関数について説明します。

fn-bea:get-property

fn-bea:get-property 関数は、外部影響に基づいて振る舞いを変更できるデータ サービスの書き込みを可能にします。これは関数をパラメータ化するための暗黙の方法です。

この関数は、最初にプロパティの定義に AquaLogic Data Services Console が使用されているかチェックします。これにあてはまる場合、この値を文字列として返します。プロパティが定義されていない場合は、関数がデフォルト値を返します。

この関数には以下の署名があります。

fn-bea:get-property($propertyName as xs:string, $defaultValue as xs:string) as xs:string

$propertyName はプロパティ名、$defaultValue は関数が返すデフォルト値です。

fn-bea:inlinedXML

fn-bea:inlinedXML 関数はテキスト形式の XML を解析し、XQuery 1.0 Data Model のインスタンスを返します。

この関数には以下の署名があります。

fn-bea:inlinedXML($text as xs:string) as node()*

$text は解析するテキスト形式の XML です。

例 :

fn-bea:rename

fn-bea:rename 関数は要素名、または要素のシーケンス名を変更します。

この関数には以下の署名があります。

fn-bea:rename($oldelements as element()*, $newname as element()) as element()*)

$oldelements は名前を変更する要素のシーケンス、$newname は新しい名前とタイプを抽出する要素です。

元のシーケンスの各要素について、fn-bea:rename 関数は以下を含む新規要素を返します。

例 :

for $c in CUSTOMER()
return
<CUSTOMER>
{fn-bea:rename($c/FIRST_NAME, <FNAME/>)}
{fn-bea:rename($c/LAST_NAME, <LNAME/>)}
</CUSTOMER>

上記の例で、CUSTOMER() が以下の値を返すと、

<CUST><FIRST_NAME>John</FIRST_NAME><LAST_NAME>Jones</LAST_NAME></CUST>

出力値は以下のようになります。

<CUST><FIRST_NAME>John</FIRST_NAME><LAST_NAME>Jones</LAST_NAME></CUST>

QName 関数

この節では、BEA の XQuery 実装における以下の QName 拡張関数について説明します。

fn-bea:QName-from-string

fn-bea:QName-from-string 関数は、xs:QName を作成し、$param の値をネームスペースなしのローカル名として使用します。

この関数には以下の署名があります。

fn-bea:QName-from-string($name as xs:string) as xs:QName

$name はローカル名です。

シーケンス関数

この節では、BEA の XQuery 実装における以下のシーケンス拡張関数について説明します。

fn-bea:interleave

fn-bea:interleave 関数は、指定した引数のインターリーブを行います。この関数には以下の署名があります。

fn-bea:async($expression as item()*, $cap as xs:integer) as item()*

$item1 および $item2 はインターリーブする項目です。

例えば、fn-bea:interleave((<a/>, <b/>, </c>), " ") は以下のシーケンスを返します。

(<a/>, " ", <b/>, " ", </c>

文字列関数

この節では、BEA の XQuery 実装における以下の文字列拡張関数について説明します。

fn-bea:match

fn-bea:match 関数は、入力された正規表現に一致する文字列に含まれる文字を指定する 2 つの整数のリストを返します (一致する文字が見つからない場合は、空のリスト)。関数が一致する文字を返すと、第 1 整数は一致するサブ文字列の最初の文字のインデックス (位置) を、第 2 整数は一致する文字数を示します。この関数には以下の署名があります。

fn-bea:match($source as xs:string?, $regularExp as xs:string?) as xs:int*

$source は入力された文字列で、$regularExp は正規表現の式を使用します。

正規表現の式は標準 java.util.regex.Pattern クラス パターンを使用します。現在有効な正規表現式コンストラクトへのリンクを以下に示します。


http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Pattern.html

fn-bea:sql-like

fn-bea:sql-like 関数は、文字列に指定したパターンが含まれているかテストします。通常は、この関数を SQL クエリの述語に使用される SQL LIKE 演算子と同様にクエリの条件として使用することができます。ソース式にパターンが一致した場合、関数は TRUE を返し、そうでない場合は、FALSE を返します。

この関数には以下の署名があります。

fn-bea:match($source as xs:string?, $regularExp as xs:string?) as xs:int*

fn-bea:match($source as xs:string?, $regularExp as xs:string?) as xs:int*

$source は検索する文字列、$pattern は SQL LIKE 条件の構文を使用して指定されたパターン、$escape はパターン内のワイルドカード文字をエスケープするために使用する文字です。

パターンを指定するために以下のワイルドカード文字を使用することができます。

エスケープ文字を指定してそれをパターン内の「%」または「_」文字の前に置くことにより、「%」または「_」文字をパターンに含めることができます。関数は、文字をパターン・マッチング用の特殊文字として解釈するのではなく、文字どおりに読み込みます。

$escape 文字は正確に 1 文字の長さで、パーセント文字 (「%」) とアンダースコア文字 (「_」) を用いることはできません。

例 :

fn-bea:trim

fn-bea:trim 関数は、先頭と末尾の空白文字を削除します。

この関数には以下の署名があります。

fn-bea:match($source as xs:string?, $regularExp as xs:string?) as xs:int*

$source はトリムする文字列です。$source が空のシーケンスの場合、関数は空のシーケンスを返します。パラメータが文字列でない場合、AquaLogic Data Services Platform はエラーを生成します。

例 :

fn-bea:trim-left

fn-bea:trim-left 関数は、先頭の空白文字を削除します。

この関数には以下の署名があります。

fn-bea:match($source as xs:string?, $regularExp as xs:string?) as xs:int*

$input はトリムする文字列です。

例 :

fn-bea:trim-right

fn-bea:trim-right 関数は、末尾の空白文字を削除します。

この関数には以下の署名があります。

fn-bea:match($source as xs:string?, $regularExp as xs:string?) as xs:int*

$input はトリムする文字列です。

例 :

fn-bea:pad-left

fn-bea:pad-left 関数は、固定長文字列を作成するためパディング文字を文字列の左側に追加します。関数には次の 2 つの種類があります。

入力文字列が要求された長さを超える場合は、そこに収まる長さの従属文字列のみが返されます。

デフォルト文字を使用した Pad Left 関数 (ASCII 32)

この関数には以下の署名があります。

fn-bea:pad-left($str as xs:string?, $size as xs:integer?) as xs:string?

ここでは、文字列 $str の左側に文字 (ASCII 32) が先頭に付加された、指定数($size)の文字列が返されます。その結果、$size の長さを持つ文字列となります。この文字列には、$size から fn:長さ ($str) の文字数を差し引いた空白文字を付加した $str が含まれます。

例 :

補注 :

特定のパッド文字列を使用した Pad Left 関数

この関数には以下の署名があります。

fn-bea:pad-left($str as xs:string?, $size as xs:integer?, $pad as xs:string?) as xs:string?

必要に応じて反復されたパッド文字列 ($pad) を先頭に付加した任意の数 ($size) の文字列 ($str) を返します。

例 :

補注 :

fn-bea:pad-right

fn-bea:pad-right 関数は、固定長文字列を作成するためパディング文字を文字列の右側に追加します。関数には次の 2 つの種類があります。

入力文字列が要求された長さを超える場合は、そこに収まる長さの従属文字列のみが返されます。

デフォルト文字使用した Pad Right 関数 (ASCII 32)

この関数には以下の署名があります。

fn-bea:pad-right($str as xs:string?, $size as xs:integer?) as xs:string?

ここでは、文字列 ($str) に文字 (ASCII 32) を付加した指定数 ($size) の文字列が返されます。その結果、$size の長さを持つ文字列となります。この文字列は、$size - fn:length($str) の空白文字が付加された $str から構成されます。

例 :

補注 :

特定の Pad 文字列を使用した Pad Right 関数

この関数には以下の署名があります。

fn-bea:pad-right($str as xs:string?, $size as xs:integer?, $pad as xs:string?) as xs:string?

必要に応じて反復されたパッド文字列 ($pad) を先頭に付加した任意の数 ($size) の文字列 ($str) を返します。

例 :

補注 :

拡張された XQuery データ モデル (XXDM) 関数

AquaLogic Data Services Platform には、拡張された XQuery データ モデル (XXDM) をサポートする関数が含まれます。XXDM は、XQuery データ モデル (XDM) のインスタンスおよびインスタンスの変更に関する情報を表します。

この節では、XXDM インスタンスを XDM インスタンスに変換する関数について説明します。

fn-bea:current-value

fn-bea:current-value 関数は、指定した引数 (適用された変更に関する情報を除く)の現在の値を表す XDM インスタンスを返します。

この関数には以下の署名があります。

fn-bea:current-value($changed as changed-element()) as element()?

$expression は XXDM インスタンスです。

fn-bea:old-value

fn-bea:old-value 関数は、変更前の指定した引数の値を表す XDM インスタンスを返します。

この関数には以下の署名があります。

fn-bea:old-value($changed as changed-element()) as element()?

$changed は XXDM インスタンスです。

fn-bea:current-value 関数と fn-bea:old-value 関数は共に多相関数です。

例 :

次の関数は、顧客の給与の変更前後の差を返します。

declare function salaryDifference($cus as changed-element
(cus:customer)) as xs:decimal {
   fn:data(fn-bea:get-current-value($cus)/salary - fn:data(fn-
   bea:get-old-value($cus)/salary)
}

関数は、現在のバージョンの顧客要素と旧バージョンの顧客要素にアクセスし給与を抽出します。さらに抽出した給与を減算してその差を取得します。

サポートされない XQuery 関数

XQuery 1.0 仕様書の以下の関数は、現在の BEA XQuery エンジンの実装においてサポートされていません。

実装固有の関数および演算子

この節では、関数および演算子に関する BEA 固有の実装の詳細について説明します。

表 2-3 実装定義値
説明
AquaLogic Data Services Platform XQuery エンジン
6.2—数値に関する演算子 [算術演算におけるオーバーフローとアンダーフロー]
数値演算のオーバーフローまたはアンダーフローにおけるエラーの発生とその他のオプションの選択肢。
算術におけるオーバーフローとアンダーフローは、基底のアプリケーション サーバ JVM (Java Virtual Machine) の動作に従う。
6.2—数値に関する演算子 [xs:decimal value digit precision]
xs:decimal results の精度の桁数
18 桁。
7.4.6—fn:normalize-unicodee
必要な正規化フォーム「NFC」のサポートの他に、準拠する実装が実装定義のセマンティクスをサポートする場合もある。
未対応。
7.5—サブ文字列の一致に基づく関数
文字列を照会単位に分解することができる。
この関数をサポートする照会はない。
10.1.1—制限と精度
XML Schema Part 2: Data Types で指定した価を超える期間、日付および時刻の制限と精度
秒数の端数は 3 桁を超える精度でサポートされるが、シリアライズされたデータ (binXML パッケージ) では 7 桁、計算中は 18 桁となる。
15.5.4—シーケンスに関する関数および演算子 [fn:doc]
処理またはドキュメントの URI、検証用 DTD またはスキーマの使用、非 XML メディア タイプの処理、非 XML リソースからのデータ モデル インスタンス作成およびドキュメント処理用のエラー処理。
fn:doc() 関数は検証を行わない。AquaLogic Data Services Platform は、外部 XML と非 XML データ ソースにアクセスするために事前定義外部関数を使用します。

 


BEA XQuery 言語の実装

この節では、BEA XQuery 言語の実装を説明します。以下のトピックがあります。

XQuery 言語サポート (およびサポートしない機能)

AquaLogic Data Services Platform は、2004 年 7 月 23 日の W3C Working Draft「XQuery 1.0: An XML Query Language」(http://www.w3.org/TR/2004/WD-xquery-20040723/)、に適合しますが、以下の例外があります。

AquaLogic Data Services Platform XQuery エンジンの XQuery 言語に対する拡張機能

BEA AquaLogic Data Services Platform での XQuery 言語の実装 (AquaLogic Data Services Platform XQuery エンジン) は、仕様書に適合するだけでなく、以下を通して XQuery 言語を拡張することができます。

汎用 FLWGOR (group by)

BEA は標準 FLWOR 式に group by 句の拡張子を提供します。以下の EBNF は一般的な FLWGDOR 構文を示します。

flwgdorExpression := (forClause | letClause) (forClause 
| letClause
| whereClause
| groupbyClause
| orderbyClause)* returnClause
groupbyClause := "group" [variable "as" variable] "by" (expression 
["as" variable]) ("," (expression ["as" variable]))*

EBNF フラグメントに参照される残りの句は、XQuery 仕様書に記載された標準定義に従います。

例として、年属性を持たないブックを除外することなく、年単位でブックをグループ化する問題について考えてみます。標準の XQuery を使用すると、fn:distinct-values() 関数の結果を用いて self-join を行い、self-join の結果を年属性のないブックの結果に結びつける必要があります。

以下にこれを実現するために使用する XQuery 式を示します。

let $books := document("bib.xml")/bib/book return (
for $year in fn:distinct-values($books/@year)
return
<g>
<year>{ $year }</year>
<titles>{ $books[@year eq $year]/title }</titles>
</g>,
<g>
<year/>
<titles>{ $books[fn:empty(@year)]/title }
</g>
)

BEA の group by 拡張関数を使用することにより、同じクエリを以下のように表すことができます。

for $book in document("bib.xml")/bib/book
group $book as $partition by $book/@year as $year
return
<g>
<year>{ $year }</year>
<titles>{ $partition/title }</titles>
</g>

以下の表 (表 2-4 および 表 2-5) は、group by 句の適用前後のブックのバインディングを示します。

表 2-4 Group By 句を適用する前のバインディング
$book
<book year="1994" ISBN="147...">...</book>
<book year="1994" ISBN="198...">...</book>
<book year="2000" ISBN="123...">...</book>

表 2-5 Group By 句を適用した後のバインディング
$year
$partition
1994
(<book year="1994" ISBN="147...">...</book>,
<book year="1994" ISBN="198...">...</book>
2000
<book year="2000" ISBN="123...">...</book>

FLWGOR 式は、概念的にバインディング タプルのシーケンスを構築します。タプルのサイズは FLWGOR にあるその時点での範囲内変数の数です。この例では、group by 句でのタプルは単一の変数バインディング $book で構成され、bib.xml ドキュメントにある各ブックに 一度に 1 冊ずつバインドされます (表 2-4 を参照してください)。

group by はバインディング タプルの新規シーケンスを作成し、各出力タプルには group by 句で定義される変数が含まれます。group by 句の後、それまで範囲内にあった変数はすべて範囲外に移動します。

この例では、group by 句からの出力タプルのサイズは 2 で、その変数バインディングは $year および $partition です (表 2-5 を参照してください)。

出力タプル数は、ユニークな group by 値のバインディング数と等しくなります。上記の例では、これはユニークな book/@year 値の数である 2 になります。group 句で指定した変数(上記の例では、$partition) は、すべての一致する入力値のシーケンスにバインドされます。

直接要素および属性コンストラクタの省略可能インジケータ

この拡張子を使うと、XQuery に生成された XML の外部コンシューマが特定の空の要素と属性を省略できるようになります。これは計算コンストラクタ、条件文およびカスタム関数の代わりに、オプション インジケータを使用することで指定できます。

例として、以下のクエリを考えてみましょう。

<a><b>{()}</b><c foo="{()}"/></a>,

拡張子を使って以下の結果を、

<a><c/></a>

以下の代わりに返すことができます。

<a><b/><c foo=""/></a>

拡張子は直接の要素および属性コンストラクタと共にオプション インジケータ '?' を使用します。これにより、以下においてプロダクション DirElemConstructor を次のように変更することができます。

[94]    DirElemConstructor    ::=    "<" QName "?"?DirAttributeList
("/>" | (">" DirElemContent* "</" QName S?">")) /* ws: explicit */

同様に、DirAttributeList を以下のように変更することができます。

[95]    DirAttributeList    ::=    (S (QName "?"?S?"=" S?
DirAttributeValue)?)*

? が存在する場合、子のない要素、および "" の値を持つ属性が省略されます。この例ではクエリが以下のように書き込まれ、

<a><b>{()}</b><c foo="{()}"/></a>,

以下の結果を生成します。

<a><c/></a>

もう一つの例として、さまざまなタグを使って新規カスタマ要素を作成するケースを考えてみましょう。要件の一つは、元のカスタマに電話番号が存在しない場合、結果のカスタマには電話要素が必要ないということです。標準の XQuery を使用して、以下のように書き込みます。

for $cust in CUSTOMER()
return
<customer>
<id>{ fn:data($cust/C_ID) }</id>
{
if (fn:exists($cust/PHONE))
then <phone>{ fn:data($cust/PHONE) }</phone>
else ()
}
...
</customer>

任意選択の要素コンストラクタを使用すると、以下のように書き込むこともできます。

for $cust in CUSTOMER()
return
<customer>
<id>{ fn:data($cust/C_ID) }</id>
<phone?>{ fn:data($cust/PHONE) }</phone>
...
</customer>

同様に、結果カスタマ要素に要素の代わりに属性を使用する場合、以下に示すように、標準の XQuery を使用して計算属性コンストラクタを使用する必要があります。

for $cust in CUSTOMER()
return
<customer>
<id>{ fn:data($cust/C_ID) }</id>
{
if (fn:exists($cust/PHONE))
then <phone>{ fn:data($cust/PHONE) }</phone>
else ()
}
...
</customer>

任意選択の属性コンストラクタを使用すると、クエリは以下のようになります。

for $cust in CUSTOMER()
return
<customer>
<id>{ fn:data($cust/C_ID) }</id>
<phone?>{ fn:data($cust/PHONE) }</phone>
...
</customer>

XQuery 言語処理の実装定義値

この節では、XQuery 言語処理に関する BEA 固有の実装の詳細について説明します。

表 2-6 実装定義値
説明
AquaLogic Data Services Platform XQuery エンジン
2.1.2 動的コンテキスト
比較 (またはその他の処理) においてタイムゾーンのない日付、時刻、または日時値を使用した場合の暗黙のタイムゾーン (xdt:dayTimeDuration 型の値)。
基底のアプリケーション サーバの JVM のタイムゾーン。
2.5.1 エラーの種類 — 静的エラー
静的エラーの報告の仕組み (構文エラーなど、分析段階で検出すべきエラー)。
パーサおよびコンパイラ API は Java 例外を生成
2.5.1 エラーの種類 - 警告
静的、動的およびタイプ エラーの他に、XQuery の実装は特定の条件に対応して分析段階または評価段階において(オプションとして)警告を生成できる。
WarningListener API を提供するが、XQuery 言語の主要実装に対する特殊な警告が定義されていない。
2.6.3 Full Axis 機能
Full Axis 機能がサポートされない場合の任意選択の軸セット
なし
2.6.6.1 Must-Understand 拡張、XQuery flagger
XQuery flagger (`must understand' 拡張子を含むクエリをフラグするもの) を有効にする仕組み (必要がある場合)。デフォルトでは flagger は無効になっている。
XQuery flagger はサポートされない。
2.6.7.1 静的タイピングの拡張、XQuery static flagger
XQuery static flagger を提供する仕組み (必要がある場合)。
XQuery static flagger はサポートされない。
3.1.1 リテラル
文字参照に使用する XML 1.0 または XML 1.1 の選択 (em-dash に — を使うなど、Unicode 文字に対する XML スタイルの参照)。
XML 1.0
3.7.1.2 ネームスペース宣言属性
XML Names 1.1 に対するサポート
なし
3.8.3 Order By および Return 句
順序仕様 (orderspec) は、empty least または、empty greatest として実装できる (XQuery の order by 句内の 2 つの orderspec 値にある greater-than 関係を評価するため)。
最も少ないものを空にする。
4.10 モジュールのインポート
at キーワードに続く文字列リテラルは、モジュールのインポート文にある任意選択のロケーションのヒントで、実装者はそれを解釈 (または無視) することができる。
不適用。AquaLogic Data Services Platform XQuery エンジンはモジュールをサポートしないため、実装が行われない。
4.13 関数の宣言
パラメータを外部関数に引き渡して、呼び出しクエリに関数の結果を返すプロトコル。
Java API のセットが含まれている。
A.2 字句の構造
字句に関するルールは XML 1.0 と XML Names、あるいは XML 1.1 と XML Names 1.1 に従う。
XML 1.0 と XML Names


  ページの先頭       前  次