、XSetsを取り出し、作成の売り手独立した方法の提供と同様、変更し、そして削除し、SNIA XAM v1.0の 指定はまたSQLの言語、なぜなら内容定義された規準に基づいてXSetsのXUIDsを選ぶこと そして 取り出すことのサブセットに基づいて照会言語(XAM QL)を、定義する。
この照会言語のための予約語のセットはかなり小さい: 、の後で、含んでいる、および中選べば前に、または、ない、のように、存在しているところで、不良部分、typeof読み取り専用、長さ、日付、本当、偽。 意図的に、XAMの問い合わせはSQLの選り抜き声明のように見える。 照会言語は無感覚な場合、ASCII文字セットを使用する。
簡単なXAMの問い合わせの例はここにある:
select ".xset.xuid" where "com.example.name" = ’Tuckers Plantation'
XAMの指定の版1.0は照会言語サポートの2つのレベルを定義する、すなわちレベル1およびレベル2.のレベル1は特性の問い合わせおよびXSetsの分野属性を定義し、必須である。 XAMの図書館によって応用プログラムにとって入手しやすいどのXSetの属性値でもただすことができる。 レベル2はXStreamsのサポート問い合わせにレベル1を拡張し、任意である。 問い合わせのレベルは両方ともすべての支えなければXAMの提供者がならない単一の、定義された仕事のタイプを通してアクセスされる。 私はわかっているをこと売り手に実際に実行されたレベル2の問い合わせがないので、レベル1の問い合わせのこのポストの焦点の残り。
XAMのクエリーステートメントは任意に先行している必須の選り抜き節からところで節成っている。 XAM v1.0のために唯一の有効な選り抜き節は選り抜き`.xset.xuid'.である。 これは適用がXUIDの価値のリストを要求していることを指定する。 例えば
select ".xset.xuid "
問い合わせの時に読解可能であるあらゆるXSetのリストを戻す。
一致するべきXSetsのサブセットを指定するのに節が使用されているところ。 レベル1の問い合わせのためにそれはXSetの特性および文字の価値間の比較にや分野属性および文字の価値制限される。
select ".xset.xuid" where ".xam.time.xuid" > date(’2009-02-01T00:00:00.0’)
すべてのXsetsのリストを戻すまたは2009年2月1日後に作成された。
守備につくおよび文字のタイプは有効に比較することができる次のテーブルショー。
| xam_int | xam_double | xam_string | xam_datetime | xam_xuid | |
|---|---|---|---|---|---|
| int | * | * | |||
| 倍 | * | * | |||
| ひも | * | ||||
| 日付時刻 | * | ||||
| XUID | * |
XAMの図書館はひもおよびひもの自由主義者が合わせるUTF-8ひもであること認可する。 不適格なUTF-8リテラル文字列はXAMの重大でない問い合わせの文法エラーを発生させる。 多数のグリフの特性および非印刷できる特性対単一のような問題は明記していなく、実施および適用扶養家族である。 ひもの比較は大文字/小文字の区別があり、比較演算子はバイトによバイトの基礎を作動させる。 関係演算子のために関係はバイトの価値によって定義される。 すべてのデータ標準化は適用の責任である。
支えられたエスケープ・シーケンスは次である。 他のどのエスケープ・シーケンスも非重大エラーを発生させる。
| \ \ | バックスラッシュ(\) |
| \ 「 | 二重引用符(「) |
| \ 「 | 単一引用符(「) |
| \ uxxxx | 16進法のフォーマットのUnicodeの特性(xxxx) |
リテラル文字列は単一引用符と引用されなければならない。 1つ以上の単一引用符の特性を含んでいるリテラル文字列はバックスラッシュを使用して各々の単一引用符の特性を脱出しなければならない。 例えば、「これのリテラル文字列は問い合わせでひものliteral表されるようにである
select ".xset.xuid" where "com.example.string-property" = ’This is a string literal’
へひもで単一引用符を使用するためには、バックスラッシュとのそれを守りなさい
select ".xset.xuid" where "com.example.claimed.ownership" = ’Tucker\’s’
XAMの問い合わせのひものフィールド名のすべての例は二重引用符と引用されなければならない。 フィールド名が二重引用符の特性を含んでいれば、各々の二重引用符の特性はバックスラッシュを使用して脱出しなければならない。 例えば、xam_boolean特性com.exampleのフィールド名。」qstringは」問い合わせでように表されるべきである
select ".xam.xuid" where "com.example.\"qstring\"" = TRUE
フィールド名がバックスラッシュの特性を含んでいれば、バックスラッシュ自体は別のバックスラッシュと脱出しなければならない。 例えば、xam_double特性com.example.file \比率のフィールド名は問い合わせでように表されるべきである
select ".xam.xuid" where "com.example.file\\ratio" = 100.1
照会言語は日付時刻を受け入れ、セレクター機能を使用してXUID評価された誤字は()およびxuid ()それぞれ日付を記入する。 日付()機能はので指定されるきちんと形作られた日付時刻の価値をXAMの日付時刻の指定に一貫している文字のひも取る。
select ".xset.xuid" where ".xam.time.xuid" = date(’2009-06-01T00:00:00.0’)
xuid ()機能はbase64によって符号化されるリテラル文字列の形にあるXUIDを期待する。 不適当に形作られたリテラル文字列は問い合わせの分析の間に非重大エラーを発生させる。
分野属性はを使用して存在している、typeof、読み取り専用、結合および長さ分野属性のアクセス機構機能アクセスされる。 テストは() XSetのネームフィールドの属性(特性)の存在のための機能ある。 それは他では偽を評価するXSetがネームフィールドを含んでいれば調整するために評価する。
select ".xset.xuid" where exists("com.example.name")
typeof ()機能はMIMEのタイプのひも評価された特性であるXSetのネームフィールドを戻す。
select ".xset.xuid" where typeof("com.example.data") = ’text/plain’
select ".xset.xuid" where typeof("com.example.data") like ’text%’
この機能は適用がひも評価された特性への分野の参照を使用できる時はいつでも使用することができる。 あらゆる非ひもの文字の価値の比較が問い合わせの分析の間に非重大エラーを発生させることに注目しなさい。
読み取り専用()機能はXSetの分野が読み取り専用ようにいつ印が付いているか調整するために評価する。
select ".xset.xuid" where readonly("com.example.flag")
select ".xset.xuid" where not readonly("com.example.name")
結合の()機能はXSetの分野がいつ印が付いているか調整するために評価し結合するように。
select ".xset.xuid" where binding("com.example.case_id")
select ".xset.xuid" where not binding("com.example.subject")
長さ()機能は長さを、ネームフィールドのバイトで、戻す。
select ".xset.xuid" where length("com.example.data") > 1024
特性長さで使用されたときstypesのために定義されるようにこの機能リターンの守備につく。 この比較が使用される特性の符号化によって決まると同時にひもの特性の数を比較するのにこの機能が使用されるべきではないことに注目しなさい。
論理演算子への今回転。 節が論理演算子の使用によっておよびか結合され、修飾することができるところの内のSubclauses、またはおよびない。 これらのオペレータは彼らのSQLの同等に類似している。
そしてオペレータ両方のsubclausesが結果のXSetを含んで前に調整するために評価するように要求する。 例えば
select ".xset.xuid" where typeof("com.example.stream") = ’image/gif’ and length("com.example.stream") > 4096
それらのサイズが4096バイトより大きいGIFのイメージを含んでいるXSetsだけを選ぶ。 どちらかのsubclauseが調整するために評価すればまたはオペレータ調整するために評価する。 例えば
select ".xset.xuid" where typeof("com.example.stream") = ’image/jpeg’ or typeof("com.example.stream") = ’image/gif’
それらのイメージのタイプJPEGかGIFの示された流れを含んでいるXSetsだけを選ぶ。 ないオペレータはブール式を否定する。 例えば
select ".xset.xuid" where not binding("com.example.property")
拘束力がない特性com.example.propertyとのすべてのXSetsを選ぶ。
SQLのある特定のオペレータでように問い合わせの他のオペレータに優先しなさい。 XAM QLの演算子の優先順位は次の通りある:
| 優位 | オペレータ |
|---|---|
| 1 | 、のtypeof、長さ、結合、+読み取り専用存在している、- |
| 2 | = <>、>、>=、 <> |
| 3 | ない |
| 4 | そして |
| 5 | または |
同じ優位のオペレータは問い合わせの内の評価された左から右である。 但し演算子の優先順位は次の例によって示されているように括弧を使用して打ち消されるかもしれない。
select ".xset.xuid" where not "com.example.bool-prop" and "com.example.int-prop" = 64
select ".xset.xuid" where not ("com.example.bool-prop" and "com.example.int-prop" = 64)
最初の例では、ないオペレータはcom.example.bool支柱の特性にだけ適用する。 第2例では、ないオペレータはcom.example.bool支柱およびcom.example.int支柱両方に= 42適用する。
私達がXAM QLの構文法を幾分よく知られているので、答えられるべき次の質問は私達がXAMの貯蔵システムを問い合わせを実行し、私達に結果を戻すようにいかに言うかである。 よくそれはXAMの仕事の特定の種類が問い合わせの仕事を呼んだように問い合わせが実行されることなる。 問い合わせの仕事への入力はあなたが作成しなければならないXSetである。 このXSetは2つの項目- `xam.job.queryおよびUTF-8テキスト流れ(MIMEのタイプ`のテキストか平野であるXStream xam.job.query.comのmandに常に置かれる分野のorg.snia.xam.job.comのmand --を含まなければならない; charset=utf-8')実際の問い合わせの表現のひもを含んでいること。
問い合わせの仕事の実行の前または最中で任意に託されるこれは要求されない託す。 連続した仕事を託す機能は任意および実施の扶養家族である。 適用は仕事がXSystemのブール特性.xsystem.job.com mit.supportedのことを点検によって支えられる託すかどうか定めることができる。 XSetを閉めることが意味する前に問い合わせの仕事を託す失敗は問い合わせの仕事の結果あくまで貯えられない。
問い合わせの仕事はsubmitJobの実施によって実行される。 問い合わせの仕事XSetの2つの要求された項目のどちらかが正しく記入されなければ、標準的な仕事の間違い分野.xam.job.errorは問い合わせの仕事XSetに加えられ、それはどちらかのorg.snia.xamに価値置かれるである:: not_a_jobかorg.snia.xam:: unspecified_commandおよび問い合わせの仕事は中断される。 次サンプル・アプリケーションに示すように、問い合わせの仕事の状態は.xam.job.statusの価値の検査によって定めることができる。
問い合わせの仕事が巧妙なとき、結果はxam.job.query.resultsと示される新しいXStreamの形で問い合わせの仕事XSetで貯えられる。 このXStreamにMIMEのタイプの適用またはvnd.snia.xam.query.xuid_listがあり、XSetsのセットのためのXUIDsを含んでいて問い合わせの評価に起因する。 各XUIDは80-byte記録の一部としてバイナリ形式で貯えられる。 XUIDが80バイトより短ければ、記録は80バイトにパッドを入れられるゼロである。
結果XStreamに関する他のいくつかの特性はまたセットアップされる。 xam_intの特性xam.job.query.results.countは結果XStreamでXUIDの記録の現在の計算を含んでいる。 この特性は結果が問い合わせの処理の間に結果XStreamに入れられると同時に更新される。 適用は問い合わせの仕事が実行すると同時にユーザーにステータス情報を提供するのにこれを使用できる。 xam_string特性xam.job.query.levelは結果に一致させる問い合わせのレベルを示す。 その価値はorg.snia.xam.job.query.level.1またはorg.snia.xam.job.query.level.2である。
問い合わせの仕事が関係に許可される役割および許可の内で作動することを覚えていることは重要である。 それは問い合わせの仕事が実行される役割に従って読まれた見通しからの適用にとって目に見え、入手しやすい、少なくとも、結果XStreamがそれらのXSetsだけを含んでいることを意味する。
問い合わせの仕事は.xam.job.errorの次のエラー・コードを置くかもしれない:
| xam.job.query:: level_not_supported | XAMの貯蔵システムは問い合わせの仕事で指定される問い合わせのレベルを支えてない。 非重大エラー。 |
| xam.job.query:: invalid_command_syntax | 重大でない文法エラーは問い合わせのひもを分析している間生じた |
| xam.job.query:: insufficient_permission | 現在認証済みユーザに十分がない 問い合わせの仕事を実行する許可 |
| xam.job.query:: insufficient_resources | XAMの貯蔵システムに問い合わせの仕事を完了する十分なリソースがない |
問い合わせの仕事がどういうわけか停止するとき価値を割り当てるために、標準的な仕事の健康は状態分野、すなわち.xam.job.errorhealth .xam.job.status、置かれ、XAMの貯蔵システムは結果XStreamのゼロかもしれないまたは置くより付加的なXUIDs。 従って適用は結果XStreamの完全なXUIDの価値を常に見るべきである。 停止させた問い合わせの仕事を再開することは支えられない。
、従来のRDBMSとは違って、問い合わせの仕事の実行中にXAMの貯蔵システムの錠がないことに注目しなさい。 従って問い合わせの結果はXAMの貯蔵システムの即時のスナップショットではない。 XAMの貯蔵システムの内容は問い合わせの仕事が実行される間、変わらないかもしれないしまたはそうではないかもしれない。 一般ルールは問い合わせの規準を満たせば問い合わせの仕事の開始前に貯えられたどのXSetでも結果XStream、および問い合わせの仕事が完了した後貯えられたXSetに結果XStreamに含まれているべきではない含まれていることである。 XSetsは含まれない問い合わせの仕事実行中に貯えられるかもしれないしまたはそうではないかもしれない。 同じ規準は結果XStreamに適用する。 それはXSetsのXUIDsを含むかもしれない点XSetがただされた後もはやXSetの変更による検索基準を満たさないXSetsのXAMの貯蔵システムそしてXUIDsにもはやない。
それを定めるためにXAMの貯蔵システムをのXAMの問い合わせのためのサポートのレベルただす簡単なJavaアプリケーションはここにある。
import org.snia.xam.XAMException;
import org.snia.xam.XAMLibrary;
import org.snia.xam.XSystem;
import org.snia.xam.toolkit.XAMXUID;
import org.snia.xam.util.XAMLibraryFactory;
public class CheckQuerySupport
{
private static XAMLibrary xamLib;
private static XSystem xSystem;
public static void main(String[] args)
{
String xri = "snia-xam://centera_vim!XXX.XXXX.XXX.XXX?/home/fpm/xam/xamconnect.pea";
long exitCode = 0;
boolean isSupported = false;
try
{
xamLib = XAMLibraryFactory.newXAMLibrary();
System.out.println("Connecting to XSystem: " + xri + "\n");
xSystem = xamLib.connect(xri);
// support job commit?
isSupported = xSystem.getBoolean(XSystem.XAM_XSYSTEM_JOB_COMMIT_SUPPORTED);
System.out.println("Support job commit? " + (isSupported ? "Yes" : "No"));
// support continuance of job?
isSupported = xSystem.getBoolean(XSystem.XAM_XSYSTEM_JOB_QUERY_CONTINUANCE_SUPPORTED);
System.out.println("Support job continuance? " + (isSupported ? "Yes" : "No"));
// support level 1 query?
isSupported = xSystem.getBoolean(XSystem.XAM_XSYSTEM_JOB_QUERY_LEVEL1_SUPPORTED);
System.out.println("Support level 1 query? " + (isSupported ? "Yes" : "No"));
// support level 2 query?
isSupported = xSystem.getBoolean(XSystem.XAM_XSYSTEM_JOB_QUERY_LEVEL2_SUPPORTED);
System.out.println("Support level 2 query? " + (isSupported ? "Yes" : "No"));
xSystem.close();
System.out.println("\nClosed connection to XSystem");
} catch (XAMException xe) {
exitCode = xe.getStatusCode();
System.err.println("XAM Error occured: " + xe.getMessage());
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
e.printStackTrace();
exitCode = 1;
}
System.exit((int) exitCode);
}
}
EMC Centera XAMの貯蔵システムに接続されたときこの適用からの出力はここにある
Connecting to XSystem: snia-xam://centera_vim!XXX.XXX.XXX.XXX?/home/fpm/xam/xamconnect.pea Support job commit? No Support job continuance? No Support level 1 query? Yes Support level 2 query? No Closed connection to XSystem
XAMの建築V1.0文書のセクション10.8で論議される3サンプルXSetsおよびサンプル問い合わせを実行するより長いJavaアプリケーションはここにある。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.snia.xam.XAMException;
import org.snia.xam.XAMLibrary;
import org.snia.xam.XSet;
import org.snia.xam.XStream;
import org.snia.xam.XSystem;
import org.snia.xam.XUID;
import org.snia.xam.toolkit.XAMXUID;
import org.snia.xam.util.XAMLibraryFactory;
public class QueryExample
{
private static XAMLibrary xamLib;
private static XSystem xSystem;
private static void CreateXset(int parm1, String parm2, double parm3)
throws XAMException
{
System.out.print("Create XSet 1 .... ");
XSet xSet = xSystem.createXSet(XSet.MODE_UNRESTRICTED);
xSet.createProperty("com.example.rhc", false, true);
xSet.createProperty("com,example.foo", false, parm1);
xSet.createProperty("com.example.bar", false, parm2);
xSet.createProperty("com.example.num", false, parm3);
XUID xuID = xSet.commit();
System.out.println("XUID: " + xuID.toString());
xSet.close();
}
private static void CreateXset(int parm1, int parm2, int parm3)
throws XAMException
{
System.out.print("Create XSet 2 .... ");
XSet xSet = xSystem.createXSet(XSet.MODE_UNRESTRICTED);
xSet.createProperty("com.example.rhc", false, true);
xSet.createProperty("com,example.foo", false, parm1);
xSet.createProperty("com.example.bar", false, parm2);
xSet.createProperty("com.example.num", false, parm3);
XUID xuID = xSet.commit();
System.out.println("XUID: " + xuID.toString());
xSet.close();
}
private static void CreateXset(int parm1, int parm2)
throws XAMException
{
System.out.print("Create XSet 3 .... ");
XSet xSet = xSystem.createXSet(XSet.MODE_UNRESTRICTED);
xSet.createProperty("com.example.rhc", false, true);
xSet.createProperty("com,example.foo", false, parm1);
xSet.createProperty("com.example.num", false, parm2);
XUID xuID = xSet.commit();
System.out.println("XUID: " + xuID.toString());
xSet.close();
}
private static void QueryXsystem(String queryString)
throws XAMException
{
boolean finished = false;
final int XAM_MAX_XUID = 80;
int resultCount = 0;
String status;
System.out.println("Create query XSet. Query string: " + queryString);
XSet query = xSystem.createXSet(XSet.MODE_UNRESTRICTED);
query.createProperty(XSet.XAM_JOB_COMMAND, true, XSet.XAM_JOB_QUERY);
byte[] buffer = queryString.getBytes();
XStream queryStream = query.createXStream(XSet.XAM_JOB_QUERY_COMMAND, true, XAMLibrary.TEXT_PLAIN_MIME_TYPE);
queryStream.write(buffer);
queryStream.close();
System.out.println("Submit query job ....");
query.submitJob();
System.out.println("Wait for query job to finish ....");
while (!finished)
{
// check status of query job
status = query.getString(XSet.XAM_JOB_ERRORHEALTH);
if (status.equals(XSet.XAM_JOB_ERRORHEALTH_ERROR))
{
System.out.println("ERROR: Errorhealth - " + query.getString(XSet.XAM_JOB_ERROR));
query.haltJob();
System.out.println("ERROR: Job halted");
break;
}
status = query.getString(XSet.XAM_JOB_STATUS);
resultCount = (int) query.getLong(XSet.XAM_JOB_QUERY_RESULTS_COUNT);
// uncomment if you want continuous job status
// System.out.println("Job Status: " + status + " Result count: " + resultCount);
// exit loop if job complete
if (status.equals(XSet.XAM_JOB_STATUS_COMPLETE))
{
finished = true;
}
}
System.out.println("Query job completed ....");
System.out.println("Result set final count is: " + resultCount);
if (resultCount > 0)
{
// open query job result stream
XStream results = query.openXStream(XSet.XAM_JOB_QUERY_RESULTS, XStream.MODE_READ_ONLY);
byte rawXUID[] = new byte[XAM_MAX_XUID];
long bytesRead = 0;
// output XUIDs in result set
while( (bytesRead = results.read(rawXUID, XAM_MAX_XUID)) >= 0 )
{
XAMXUID resultXUID = new XAMXUID(rawXUID);
System.out.println("XUID: " + resultXUID.toString());
}
results.close();
}
query.close();
}
public static void main(String[] args)
{
String xri = "snia-xam://centera_vim!XXX.XXX.XXX.XXX?/home/fpm/xam/xamconnect.pea";
long exitCode = 0;
try
{
xamLib = XAMLibraryFactory.newXAMLibrary();
// uncomment next 2 lines if you want extensive XAM Library logging
// xamLib.setProperty(XAMLibrary.XAM_LOG_VERBOSITY, 1);
// xamLib.setProperty(XAMLibrary.XAM_LOG_LEVEL, 5);
System.out.println("Connecting to XSystem " + xri + "\n");
xSystem = xamLib.connect(xri);
xSystem.setProperty(".xsystem.log.verbosity", 1);
xSystem.setProperty(".xsystem.log.level", 5);
CreateXset(1, "string", 123.55);
CreateXset(77, 42, 100);
CreateXset(6, 200);
xSystem.close();
System.out.println("\nClose/reopen XSystem\n");
xSystem = xamLib.connect(xri);
// uncomment one or more of the following queries
// QueryXsystem("select \".xset.xuid\"");
QueryXsystem("select \".xset.xuid\" where (\"com.example.foo\" > 0) and (\"com.example.foo\" < 50)");
// QueryXsystem("select \".xset.xuid\" where (\"com.example.bar\" > 0) and (\"com.example.bar\" < 100)");
// QueryXsystem("select \".xset.xuid\" where exists (\"com.example.bar\")");
// QueryXsystem("select \".xset.xuid\" where \"com.example.bar\" like '%ing%'");
// QueryXsystem("select \".xset.xuid\" where \"com.example.num\" >= 124");
// QueryXsystem("select \".xset.xuid\" where \"com.example.num\" >= 124.6 ");
// QueryXsystem("select \".xset.xuid\" where (\"com.example.num\" >= 123) and typeof(\"com.example.num\") = 'application/vnd.snia.xam.int'");
xSystem.close();
System.out.println("\nClosed connection to XSystem");
} catch (XAMException xe) {
exitCode = xe.getStatusCode();
System.err.println("XAM Error occured: " + xe.getMessage() + "("
+ exitCode + ")");
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
e.printStackTrace();
exitCode = -1;
}
System.exit((int) exitCode);
}
}
XStream.asyncReadがXStream.readの代りに使用されたらXAMの貯蔵システムが結果XStreamでXUIDsすべてを貯えることを終わった前に問い合わせの仕事によって作り出される結果XStreamが適用によって消費されるかもしれないことに注目しなさい。
よく私はXAMの照会言語の独りで行くことを可能にするように私は十分な情報および例を演劇提供したことを考える。 それはGoogleのグループのXAMの開発者のグループが 助けること 幸せよりもっとあることをことを助けを私確かめる必要とする。
分割で私はXAMを使用して実際の十分に内容基づかせていた調査のためのサポートはしばらくの間起こらないかもしれないことをXAMの貯蔵システム提供者が現在満足なメタデータ上の問い合わせのためのサポートを実行するためにだけ要求されるので私は疑うことを指摘する。






















