第 3 章 アプリケーション依存の先読 みが可能な O/R マッピングみが可能なO/Rマッピング
3.4 仕様
例えば、「Proceeding[@year = 2005]/Paper/@name」という記述はyear という属性の値が2005 であるProcedingというノードの子ノードPaper の属性である name を指定たことになる。
AspectJのポイントカットでは、先読みのコードを実行する位置しか指 定出来ない。そのため、本フレームワークでは、this ポイントカットを拡 張して、 DB アクセスの履歴を考慮した先読みのタイミングの指定を可 能にした。本フレームワークでの this ポイントカットの仕様は以下のよ うになる。
• 記述方式
this(<クラスまたはインターフェースのタイプ>)[XPath文字列] または、
this(<タイプ識別子>)[XPath文字列]
• 選択されるジョインポイント
処理の主体側インスタンスのタイプが< ... >で指定されるクラス またはインターフェースであり、かつ、XPathでの記述とマッチし ている全てのジョインポイント。
thisポイントカットの特定に用いるXPathの文法について述べる。こ こで用いる文法はW3Cによって勧告されているXPathの文法のサブ セットである。
まず、ロケーションパスは永続クラス間の Relationship を区切ってい くものとする。また、ノードは永続クラスまたは、永続クラスのプロパ ティであることにする。
元来XPathでは[ ]を用いて
//P roceeding[@year]/P aper/@name
のような記述が可能である。この記述は「属性 year をもつ Proceeding ノードの子ノードである Paper ノードの属性name」という意味になる が、これを本研究での永続クラス間の Relationship にという観点から翻 訳すると「 year というプロパティをもつProceeding オブジェクトに関 連付けられているPaper オブジェクトの nameプロパティ」という無意 味な記述になってしまう。text()やlast() 、position() のような関数も同 様に意味を成さない。
このことは、ノードを永続クラスまたは永続クラスのプロパティに限定 したためにおきる矛盾だと考えられる。このため、thisポイントカットを 指定するする際にXPathの述語を用いる場合には、比較演算子または述 語演算子を用いた限定のみ有効であることにした。
//Biblography/P roceeding[@year <2005]/P aper/@name のような記述は有効なものである。
以下、永続クラス間の関係を指定するXPathの仕様を示す。
表3.7: XPathの仕様 記述 用途
// 間に任意個の永続クラスを含む永続クラス間のRelationship . 現在指している永続オブジェクトを表す
.. 現在指している永続オブジェクトの親オブジェクトを表す
@ 永続クラスのプロパティを表す
∗ 任意の永続クラスまたは永続クラスのプロパティを表す [] 永続クラスに関する条件の指定に用いる
このXPathの文法を用いると以下のように this ポイントカットの指 定が出来る。this ポイントカットの記述例は以下のようになる。
• this[//Proceeding/@*]
Proceedingオブジェクトの任意のフィールドがアクセスされた時点。
AspectJのthisポイントカットと等しい。
• this[//Biblography/Proceeding/@year]
Biblographyオブジェクトによって取得されたProceedingオブジェ クトのyearフィールドがアクセスされた時点
• this[//Biblography/Proceeding[year = 2005]/@conference-name]
Biblographyオブジェクトによって取得されたyearフィールドの値 が1であるProceedingオブジェクトのconferece-nameフィールド がアクセスされた時点
Prefetch アスペクトクラスに定義されている。 prefetch() メソッド、
prefetchAsync() メソッドも同様にこのXPathの文法を用いて先読みの 指定を行う。prefetch() メソッド、pefetchAsync() メソッドはXPath形 式の文字列で指定されたデータをRDBから取得し、その後取得したデー タを適当な永続オブジェクトにマップする。
このXPathを用いた先読みデータの指定を行うことで、オブジェクト レベルでの先読みの指定が可能となる。そのため、SQLやHQLを用い る場合に比べて直感的かつ容易に先読みの記述が出来る。例えば、
pref etch(”./P roceeding/P aper/@pdf f ile) をSQL を用いて記述しようとすると
SELECT pdffile FROM paper t0, proceeding t1, biblography t2 WHERE t0.cid = t1.conferenceid AND t1.bib-id = t2.id AND (t2.bib-id like ?)
のようなデータベースのテーブル名、カラム名を意識した煩雑は記述を しなければならなくなる。
以下、簡単なprefetch()メソッドの記述例を示す。
• prefetch(”./@*”);
thisJointPointが表す永続オブジェクトの全てのプロパティを先読 みする。
• prefetch(”../Paper/@*[self::pdffile and self::psfile]”);
thisJoinPointが表す永続オブジェクトを取得したオブジェクトに関 連付けられているPaperオブジェクトのpdffileとpsfileプロパティ を取得する。