PEXA Serviceについて

チュートリアル

テストツール

定義ファイル

基本プロセス

拡張プロセス

Condition

セッション

モデル

リファレンス

環境設定

目次
  1. モデル評価式について
  2. 基本比較式書式
  3. 比較式の結合
  4. パスの利用


モデル評価式について

モデル評価式は、ServiceSession上もしくはDB上に格納されているデータモデルの内容を評価するために使用される。
この条件式は、以下のような箇所で使用される。


基本比較式書式

基本書式 : 

  評価対象モデルの現象型名 比較演算子 比較値
左辺に評価対象モデルの現象型名を指定して、右辺にそれに対する比較値を指定する。

対象モデルの現象型の値と比較値を比較演算子に基づき比較する。
比較演算子としては下記の演算子を使用することができる。
演算子				概要
-------------------------------------------------------------------------------------------------------
>                 評価対象が比較値よりも大きい
<                 評価対象が比較値よりも小さい
>=                評価対象が比較値よりも大きいか等しい
<=                評価対象が比較値よりも小さいか等しい
=                 評価対象と比較値が等しい
!=                評価対象が比較値と等しくない
like              評価対象が比較値の文字列を含む
in                評価対象が比較値の集合のいずれかに該当する(比較値が専用の記述形式となる)
not in            評価対象が比較値の集合のいずれにも該当しない(比較値が専用の記述形式となる)
is null           評価対象が存在しない
is not null       評価対象が存在する
is space          評価対象の値がホワイトスペースである
is not space      評価対象の値がホワイトスペースでない
exists            評価対象(明細)に副問い合わせ条件に合致する物がある(比較値が専用の記述形式となる)
not exists        評価対象(明細)に副問い合わせ条件に合致する物がない(比較値が専用の記述形式となる)
条件式は、論理演算子"and"または、"or"接続することができる。
また、()で論理演算子の接続対象をグループ化することができる。詳細はこちらを参照。

例:
    filter    "現象型A = @X and (現象型B = @Y or 現象型B = @Z)"

右辺の比較値は以下の指定方法がある。
演算子毎のグループ毎についての解説はこちら。

右辺に固定値を指定する

文字列による直接指定の場合、値を現象型の値に変換できる文字列表現で指定する。

元の値が文字列や数値であればそのまま記述する。
記述例 :  数値の場合

filter	"支払額 >= 100"

Phenomenonであればそれぞれの区分値の文字列表現で指定する。
記述例 :  Phenomenonの場合
filter	"RemovedFlag = NOT_REMOVED"

比較値に空白を含む場合はシングルクオートでクオートする。
記述例 : 空白を含む文字列の場合
filter	" @ワークフロー申請コメント = 'コメント1 コメント2' "

日付を文字列で指定する場合は、
    yyyy/MM/dd:HH:mm:ss
    yyyy/MM/dd:HH:mm
    yyyy/MM/dd:HH
    yyyy/MM/dd
のいずれかで指定する。

記述例:比較値が固定値の日付
    作成日 >= '2004/01/01'
    最終更新日時 >= '2004/01/01:00:00:00'


右辺にSession値を指定する

ServiceSessionキー名を指定する場合は比較値の先頭の"@"に続けてServiceSessoinキー名を記述する。
また、ServiceSessionキーの値がモデルの場合、"/"に続けてパスを記述することができる。
ただし、比較値の型は現象型に対応する型に変換可能な物である必要がある。

また、値が複数値(Collectionや配列)になっている場合は、使用できる演算子はin演算子のみとなります。

記述例:比較値がSession値(単数値)

filter    "支払額 >= @支払額"
記述例:比較値がSession値(複数値)
filter    "病棟No in (@病棟Noリスト)"
なお、比較値に指定されたServiceSessionKeyの値がnullの場合、いかなる評価対象との比較でも"偽"として扱われる。
また、
	is null
	is not null
	is changed
	is not changed
	is space
	is not space
については比較値は存在しない。


右辺にDirectiveを指定する

評価値には数値、文字列などの他にDirectiveを指定することもできる。
Directiveとは'&'で始まる文字列で、評価時に一定のルールに基づいて値に変換される。

値を返すようなDirectiveを右辺で指定することができます。
詳しくはDirectiveの一覧を参照してください。

記述例1 : 当月作成されたものかどうかを判断する

filter    " 作成日 >= &StartOfMonth and 作成日 < &StartOfNextMonth "
記述例2 : 記述例1を別のDirectiveで表現してみる
filter    " 作成日 >= '&FirstDateOfOfMonth:{&Today}' and 作成日 < '&FirstDateOfNextMonth:{&Today}' "
!!!注意!!!
この場合に注意する点として、パラメータをとるDirectiveは上記の記述例のようにDirective全体をシングルクオートで囲む必要があります。 Directiveのリファレンスにも書式についての説明があるので、以下を参照してください。


右辺にパスを指定する

比較対象ServiceSessionKeyの値がモデル(Observableのサブクラス)の場合、 @Key名に続けてモデルが保持する項目にアクセスするパスを続けて記述することができる。

書式 : 

"現象型名  比較演算子  @比較対象ServiceSessionKey名/モデルの保持する現象型名/..."

記述例 : 
filter    " 予定開始日  > @Order/有効期間開始日  and  予定開始日 < @Order/有効期間終了日 "
パスの書式については、こちらを参照してください。


大小比較

下記の比較演算子を利用する場合

	<
	>
	<=
	>=
比較値は、下記の条件を満たす必要がある
  • 現象型の値の型がStringからのコンストラクタを持つ
  • 比較値(文字列)をパラメータに上記のコンストラクタでコンストラクトが可能
  • 現象型の値の型がjava.lang.Comparableのインタフェースを実装している
現象型の値の型がjava.lang.Numberのサブクラスの場合上記の条件を満たす。
なお、java.lang.Booleanの場合、JDK1.4まではjava.lang.Comparableを実装していないため3番目の条件に抵触するが、JDK1.5以降からはjava.lang.Comparableを実装しているため、利用可能。
現象型の値の型がjava.lang.Integerの場合、文字列に小数点などを含んでいると2番目の条件に抵触する

ただし、現象型の値の型がjava.util.Dateの場合は、下記のフォーマットの文字列で比較値を記述することができる。
	yyyy/MM/dd:HH:mm:ss
	yyyy/MM/dd:HH:mm
	yyyy/MM/dd:HH
	yyyy/MM/dd

なお、"HH","MM","SS"について省略された場合はそれぞれ、"00"が設定された物と見なされる。


同一比較

下記の比較演算子を利用する場合、

	=
	!=
比較値は、下記の条件を満たす必要がある
  • 現象型の値の型がStringからのコンストラクタを持つ
  • 比較値(文字列)をパラメータに上記のコンストラクタでコンストラクトが可能


like演算子

下記の演算子の場合

	like
下記の条件を満たす必要がある
  • 現象型の値の型が文字列
  • 比較値が文字列である
データベースに対する検索でlikeを使用する場合、前方一致、後方一致、前後方一致の三通りが指定できます。
それぞれの場合に、比較値に"%"を付与することでこの指定が出来ます。
なお、メモリ上での検索(searchプロセスのextra_filterやiteratorプロセス)の場合は"%"の付与は不要です。

DBに対する前方一致検索の場合
比較値の後ろに"%"を付与します。
    患者氏名 like 青木%
DBに対する後方一致の場合
比較値の後ろに"%"を付与します。
    患者氏名 like %太郎
DBに対する前後方一致の場合
比較値の前後に"%"を付与します。
    患者氏名 like %郎%

この"%"の付与は、あらかじめsessionプロセスで付与しておくか、もしくは評価式中で&Catディレクティブを使用して付与して下さい。 なお、評価式中でディレクティブを使用する場合は、別項での説明通りシングルクオートで囲んで下さい。

例:あらかじめsessionプロセスで付与
;;------------------------------------------------------
;; like検索用に比較値に%を付与
;;------------------------------------------------------
(like条件の比較値作成
    format_type  session
    (session
        (session_keys
            前後方一致比較値    &Cat:{%}{@氏名}{%}
        )
    )
)
;;------------------------------------------------------
;; like検索を実行
;;------------------------------------------------------
(検索
    format_type  search
    (search
        source         患者情報
        session_value  患者検索結果一覧
        filter         "患者氏名 like @前後方一致比較値"
    )
)

例:searchプロセスで直接付与
;;------------------------------------------------------
;; like検索を実行
;;------------------------------------------------------
(検索
    format_type  search
    (search
        source         患者情報
        session_value  患者検索結果一覧
        filter         "患者氏名 like '&Cat:{%}{@氏名}{%}'"
    )
)


in演算子

比較対象に対して、複数の比較値の集合を一度にぶつけて判定するための演算子です。
in演算子を使用する場合、比較値の集合を以下の形式で表します。

記述:

	現象型 in (比較値1 比較値2 比較値3 .....)
これは、以下と等価になります。
	(現象型A = 比較値1) or (現象型 = 比較値2) or (現象型 = 比較値3) or .....

右辺の比較値集合全体を括弧でくくります。内部は"半角スペース区切り"で複数個の比較値を指定できます。
また、この比較値一つ一つは固定値、セッション値(単数値)、セッション値(複数値)、Directiveが指定できます。複数値が指定された場合は自動的に内部で括弧内に展開されるイメージとなります。

例1:
セッション値"病棟Noリスト"に病棟Noの値が複数個入っている場合

filter    病棟No in (@病棟Noリスト)

例2:
区分値を固定で複数個指定する場合

ModelOperationCategory in (CREATE UPDATE REMOVE)

なお、inの逆に「比較値集合のどれにも該当しない」という判定をしたい場合は"not in"で比較して下さい。


is space演算子

比較対象がnullの代わりにホワイトスペースになっているようなケースで使用できる比較演算子です。
下記の演算子の場合

	is space
	is not space
下記の条件を満たす必要があります。
  • 評価対象の現象型の型が文字列


exists演算子

明細を評価対象にして検索条件を指定する場合に使用する比較演算子です。
比較と言うよりは、副問い合わせのイメージに近くなります。

書式:

評価対象の明細現象型  exists {明細に対する検索条件式}
上記の書式のように、副問い合わせ部分の検索条件式については、前後を"{}"で囲って下さい。

記述例:
"在庫アカウント"というデータモデルが検索対象で、"在庫商品List"という明細現象型を持つケース
(在庫を検索
    format_type    search
    (search
        source    在庫アカウント
        session_value  検索結果
        [filter
            condition    "@保管場所 is not null"
            filter       "保管場所 = @保管場所"
        ]
        [extra_filter
            condition    "@在庫状態区分 is not null"
            filter       "在庫商品List exists {在庫状態区分 = @在庫状態区分}"
        ]
    )
)
上記のように指定すると、以下のような検索が行われます。
  1. "在庫アカウント"というデータモデルを、"保管場所"という現象型に対する検索条件付きで検索。
  2. 検索結果の"在庫アカウント"が持つ明細"在庫商品List"に対して、"在庫状態区分"という明細側の項目で検索し、 該当する明細が1件でもある(=exists)場合は検索条件に合致したとみなす。
なお、existsによる副問い合わせは現状ではDBに対するSQLには展開されません。
そのため、existsを利用できるのはメモリ上のモデルリストに対する検索条件指定(searchプロセスのextra_filterセクションなど)の箇所になります。



比較式の結合

比較式同士は、論理演算子による結合が可能である。
論理演算子には"and"と"or"を利用することができる
また"()"でグループ化した比較式同士を比較演算子で結合することも可能である。

記述例:

	支払額 > 0 and 支払額 <= 100
	(支払額 > 0 and 支払額 <= 100) or 支払額合計 <= 10000


更新情報

  • 最終更新者 : $Author: morishita $
  • 最終更新日時 : $Date:: 2009-06-10 13:52:48 #$
  • バージョン : $Revision: 3740 $



Copyright © 2006, Atrris Corporation