|
WebObjects 5.2.3 | ||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object com.webobjects.eocontrol.EOQualifier
EOQualifierは、条件に合うオブジェクトやデータベース行を選択するための情報を持つ抽象クラスです。 ただしEOSQLQualifier (EOAccess) は例外であり、EOModel (EOAccess) の生成するSQLに依存しません。 これにより、同じEOQualifierオブジェクトでメモリとデータベースの両方を検索することができます。
EOQualifierのインスタンスを生成することはありません。 独自のEOQualifierのサブクラスや次のクラスなどのサブクラスを使うことになります。
サブクラス | 目的 |
EOKeyValueQualifier |
オブジェクトの属性値と指定されたオブジェクトを比較します。
例: "weight > 150"
|
EOKeyComparisonQualifier | オブジェクトの属性値同士を比較します。
例: "name = wife.name" |
EOAndQualifier |
複数のフェッチ条件をまとめます。
条件は結合されます。
例: "name = 'Fred' AND age < 20" |
EOOrQualifier |
複数のフェッチ条件をまとめます。
条件は別々に扱われます。
例: "name = 'Fred' OR name = 'Ethel'" |
EONotQualifier |
単体のフェッチ条件を否定します。
例: "NOT (name = 'Fred')" |
EOSQLQualifier | EOSQLExpressionに変換される、構造化されていないテキストを扱います。 EOSQLQualifierは任意のSQL文からEOSQLExpressionオブジェクトを生成する手段を提供します。 EOSQLQualifierはメモリ中のオブジェクトではなくデータベースをSQLで検索するクラスで、必要のない限り常にEOQualifierを使うべきです。 |
EOQualifierEvaluationインターフェースはEOQualifierオブジェクトがメモリ中のオブジェクトをどう評価するかを定義しています。 データベースを評価するには、EOSQLExpression (EOAccess) とEOEntity (EOAccess) のメソッドを使ってSQLを生成します。 SQLを生成する機能はすべてアクセスレイヤーに含まれています。
上記で示したEOQualifierの様々なサブクラスはいずれも異なる目的に使います。
ただしEOQualifierオブジェクトはEOQualifierのクラスメソッド qualifierWithQualifierFormat
で簡単に生成できます。
EOQualifier qual = EOQualifier.qualifierWithQualifierFormat ("lastName = 'Smith'", null);
このような式から生成されるQualifier群は、フォーマット文字列の内容を元にしたものになります。
例えば "lastName = 'Smith'"
という文字列を qualifierWithQualifierFormat
の引数にして実行すると、EOKeyValueQualifierオブジェクトを返します。
ただ、通常はここまでの詳細を気にする必要はありません。
Qualifierを生成するのに使うフォーマット文字列は、 "firstName = 'Fred' AND age < 20"
のように論理式を組み合わせることができます。
Qualifierを生成するとき、論理式の組み合わせはEOQualifierの構文木に変換されます。
論理演算子 AND
と OR
は、それぞれEOAndQualifierとEOOrQualifierを生成します。
これらのQualifierは、Qualifier群を結合 (AND
) したり個別に (OR
) まとめます。
上記で述べたように、通所は qualifierWithQualifierFormat
を使ってフォーマット文字列からQualifierを生成します。
このメソッドは標準C言語ライブラリの printf() 関数に似たフォーマット文字列を引数に取ります。
フォーマット文字列は、文字列・数値・ %@
で変換されるオブジェクトを含みます。
qualifierWithQualifierFormat
の二番目の引数は、 %@
を変換する値や結果の配列です。
これによってQualifierを動的に組み立てることができます。
次の表はフォーマット文字列で使える変換記号と変換されるデータ型を示します。
変換記号 | 変換される値や結果 |
%s | 文字列、または toString メソッドの結果。 |
%d | 整数や整数に変換された値。 |
%f | 実数や実数に変換された値。 |
%@ | 任意のオブジェクト。変換処理は行われません。 |
%K | toString で文字列に変換され、 key として扱われる点を除けば %@ に似ています。
EOKeyValueQualifierとEOKeyComparisonQualiferのどちらかが生成されます。
|
%% | % 文字に変換されます。 |
変換記号に定義されていない文字を使うと(%x
など)例外を発生します。
例えば empID, firstName, lastName, salary, department (部署エンティティと1対1のリレーションシップ)の属性を持つ従業員エンティティと deptID, name の属性を持つ部署エンティティがあるとします。 単純なQualifierなら次のようにして生成することができます。
lastName = 'Smith' salary > 2500 department.name = 'Personnel'
次の例は上記に似たQualifierを生成しますが、指定する値にフェッチ済みのエンタープライズオブジェクトを使用します。
Employee anEmployee; // あるものと仮定 Department aDept; // あるものと仮定 EOQualifier myQualifier; NSMutableArray args = new MutableVector(); args.addObject("lastName"); args.addObject(anEmployee.lastName()); myQualifier = EOQualifier.qualifierWithQualifierFormat("%@ = %@", args); args.removeAllObjects(); args.addObject("salary"); args.addObject(anEmployee.salary()); myQualifier = EOQualifier.qualifierWithQualifierFormat("%@ > %f", args); args.removeAllElements(); args.addElement("department.name"); args.addElement(aDept.name()); myQualifier = EOQualifier.qualifierWithQualifierFormat("%@ = %@", args);
エンタープライズオブジェクトは属性値にアクセスできるメソッドを実装しています。
従業員オブジェクトの lastName と salary 、部署オブジェクトの name などに直接アクセスすることができます。
文字列と異なり、 %@
をシングルクォートで囲う必要はありません。
// 文字列リテラルではシングルクォートを使います。 EOQualifier.qualifierWithQualifierFormat("lastName = 'Smith'", null); // %@ にはクォートを使う必要はありません。 args.removeAllElements(); args.addElement("Jones"); EOQualifier.qualifierWithQualifierFormat("lastName = %@", args);
よくあるフォーマット文字列は、文字列と数値の2つのデータ型のみを使うものです。 シングルクォート、ダブルクォートで囲んだ文字列は文字列オブジェクトとして、クォートで囲まない数値は数値オブジェクトとして、クォートで囲まない文字列はキーとして扱われます。 明示的にキャストすることでこの制限を回避できます。
Qualifierに使用できる演算子に =, ==, !=, <, >, <=, >=, "like", "caseInsensitiveLike" があります。 演算子 like と caseInsensitiveLike では、パターンマッチを行うのにワイルドカードを使うことができます。
NULLにマッチするデータベース行をフェッチするQualifierを生成するには、次のどちらかの方法で行います。
NSMutableArray args = new NSMutableArray(); // 方法 1 EOQualifier.qualifierWithQualifierFormat("bonus = nil", null); // 方法 2 args.addElement(NullValue.nullValue()); EOQualifier.qualifierWithQualifierFormat("bonus = %@", args);
Qualifierの式でlike や caseInsensitiveLike 演算子を使う場合、パターンマッチにワイルドカードと ? を使うことができます。
"lastName like 'Jo*'"
Jones, Johnson, Jolsen, Josephs などにマッチします。
? は1文字にマッチします。
"lastName like 'Jone?'"
Jones にマッチします。
アスタリスクは演算子 like か caseInsensitiveLike でのみワイルドカードとして使用できます。 例えば次の式では、 * はワイルドカードではなくリテラル値として処理されます。
quot;lastName = 'Jo*'"
Qualifierを初期化するフォーマット文字列にはメソッドも含めることができます。 パーザはコロンのつく文字列(myMethod: など)をメソッドとして扱います。 次はその例です。
point1 isInside: area firstName isAnagramOfString: "Computer"
例えば、セレクタ isAnagramOfString
の実際のメソッドは次のように定義しなければなりません。
public Boolean isAnagramOfString (String aString){}
引数にはStringではなくObjectを渡すこともできます。
Objectを渡すと例外処理を考慮して実行され、Boolean値を返さない限り false
を返します。
Qualifierで指定したメソッドはメモリ内でのみ実行され、データベースからのフェッチには使えません。
EOAndQualifier, EOOrQualifier, EONotQualifierのインスタンスを明示的に生成する必要はほとんどありません。 しかし、EOKeyValueQualifierとEOKeyComparisionQualifierのインスタンスを生成したいこともあるかもしれません。 主なメリットはQualifierをどう構築するかをより細かく制御できることです。
Qualifierのサブクラスのインスタンスを明示的に生成したければ、次のようなコードで実現できます。
EOKeyValueQualifierを使って "isOut" キー値が 1 (true
を意味します)であるすべてのオブジェクトを選択します。
Qualifierはメモリ中の配列のフィルタとして使われます。
// qualifierを生成する EOQualifier qual = new EOKeyValueQualifier("isOut", EOQualifier.QualifierOperatorEqual, new Integer(1)); // 配列をフィルタリングして返す return Qualifier.filteredVectorWithQualifier(allRentals(), qual);
filteredArrayWithQualifier
は、引数の配列からQualifierにマッチするオブジェクトを選択し、新しい配列で返すメソッドです。
EOQualifierのサブクラスは、メモリ中のオブジェクトを評価するのではあればEOQualifierEvaluationインターフェースを実装しなければなりません。
Nested Class Summary | |
static interface |
EOQualifier.Comparison
EOQualifierComparisonは比較用のメソッドを定義したインターフェースです。 |
static class |
EOQualifier.ComparisonSupport
JavaクライアントのEOQualifier.ComparisonSupportクラスは、EOQualifierComparisonインターフェースのデフォルト実装です。 |
class |
EOQualifier.QualifierVariableSubstitutionException
|
Field Summary | |
static NSSelector |
QualifierOperatorCaseInsensitiveLike
セレクタの1つです。 |
static NSSelector |
QualifierOperatorContains
セレクタの1つです。 |
static NSSelector |
QualifierOperatorEqual
セレクタの1つです。 |
static NSSelector |
QualifierOperatorGreaterThan
セレクタの1つです。 |
static NSSelector |
QualifierOperatorGreaterThanOrEqualTo
セレクタの1つです。 |
static NSSelector |
QualifierOperatorLessThan
セレクタの1つです。 |
static NSSelector |
QualifierOperatorLessThanOrEqualTo
セレクタの1つです。 |
static NSSelector |
QualifierOperatorLike
セレクタの1つです。 |
static NSSelector |
QualifierOperatorNotEqual
セレクタの1つです。 |
Constructor Summary | |
EOQualifier()
|
Method Summary | |
abstract void |
addQualifierKeysToSet(NSMutableSet qualifierKeys)
qualifierKeys をqualifierのキーに追加します。 |
NSSet |
allQualifierKeys()
すべての式の左辺の文字列から構成されるNSSetを返します。 |
static NSArray |
allQualifierOperators()
EOQualifierがサポートする演算子の配列を返します。 |
NSArray |
bindingKeys()
式で使われる変数名の文字列の配列を返します。 |
Object |
clone()
オブジェクトの複製を返します。 |
boolean |
evaluateWithObject(Object object)
サブクラスによって実装されます。 object が条件に一致すれば true を、そうでなければ false を返します。
|
static void |
filterArrayWithQualifier(NSMutableArray array,
EOQualifier qualifier)
qualifier に一致する array 中のオブジェクトを選別します。 |
static NSArray |
filteredArrayWithQualifier(NSArray array,
EOQualifier qualifier)
qualifier に一致する array 中のオブジェクトを選別し、そのオブジェクトを含む新しい配列を生成して返します。 |
String |
keyPathForBindingKey(String key)
変数を含む式の左辺の文字列を返します。 |
protected static NSSelector |
operatorSelectorForSelectorNamed(String string)
指定した名前の演算子のセレクタを返します。 |
static NSSelector |
operatorSelectorForString(String string)
string に対応する演算子のセレクタを返します。 |
static EOQualifier |
qualifierToMatchAllValues(NSDictionary values)
検索条件を含む辞書を受け取り、キーと値の組み合わせ1つごとにEOKeyValueQualifiersを生成します。 |
static EOQualifier |
qualifierToMatchAnyValue(NSDictionary values)
検索条件を含む辞書を受け取り、キーと値の組み合わせ1つごとにEOKeyValueQualifiersを生成します。 |
abstract EOQualifier |
qualifierWithBindings(NSDictionary bindings,
boolean requiresAll)
bindings に含まれるすべての変数を置き換えた新しいqualifierを返します。 |
static EOQualifier |
qualifierWithQualifierFormat(String format,
NSArray arguments)
フォーマット文字列 format と arguments を解析し、EOQualifierを生成して返します。 |
static NSArray |
relationalQualifierOperators()
EOQualifierがサポートする関係演算子の配列を返します。 |
static String |
stringForOperatorSelector(NSSelector selector)
セレクタ selector を表す文字列を返します。 |
abstract void |
validateKeysWithRootClassDescription(EOClassDescription classDescription)
指定されたキーやキーパスが classDescription において有効であることを保証します。 |
Methods inherited from class java.lang.Object |
equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
public static final NSSelector QualifierOperatorCaseInsensitiveLike
public static final NSSelector QualifierOperatorContains
public static final NSSelector QualifierOperatorEqual
public static final NSSelector QualifierOperatorGreaterThan
public static final NSSelector QualifierOperatorGreaterThanOrEqualTo
public static final NSSelector QualifierOperatorLessThan
public static final NSSelector QualifierOperatorLessThanOrEqualTo
public static final NSSelector QualifierOperatorLike
public static final NSSelector QualifierOperatorNotEqual
Constructor Detail |
public EOQualifier()
Method Detail |
public abstract void addQualifierKeysToSet(NSMutableSet qualifierKeys)
qualifierKeys をqualifierのキーに追加します。 EOControlフレームワークの(EOQualifierの)サブクラスはqualifierの構文木に関わらずキーを追加します。 EOAndQualifierなどのqualifierは、末節のqualifier(EOKeyValueQualifierなど)にたどりつくまで再帰的にこのメソッドを実行し、キーをセットに追加します。
EOQualifierのサブクラスはこのメソッドを必ず実装しなければいけません。
qualifierKeys
- qualifierのキーの変更可能なセット*1public NSSet allQualifierKeys()
salary > 10000 AND manager.lastName = 'smith'
addQualifierKeysToSet(NSMutableSet qualKeys)
public static NSArray allQualifierOperators()
relationalQualifierOperators()
public NSArray bindingKeys()
public Object clone()
public boolean evaluateWithObject(Object object)
true
を、そうでなければ false
を返します。
引数は、エンタープライズオブジェクトやスナップショットの辞書など key-value coding が実装されているオブジェクトであるべきです。
evaluateWithObject
in interface EOQualifierEvaluation
object
- 入力するオブジェクト
true
を、そうでなければ false
を返します。public static void filterArrayWithQualifier(NSMutableArray array, EOQualifier qualifier)
array
- 入力する配列
qualifier
- データベース選択条件public static NSArray filteredArrayWithQualifier(NSArray array, EOQualifier qualifier)
array
- 入力する配列
qualifier
- データベース選択条件
public String keyPathForBindingKey(String key)
"salary > $amount and manager.lastName = $manager"
というqualifierがあるとき、 bindingKeys
を実行すると (amount, manager) の配列を返します。
keyPathForBindingKey
を実行すると、引数が amount なら salary を、manager なら manager.lastName を返します。
key
- 入力する文字列
protected static NSSelector operatorSelectorForSelectorNamed(String string)
string
- セレクタ名
public static NSSelector operatorSelectorForString(String string)
Selector selector = Qualifier.operatorSelectorForString(!=);対応している文字列は =, ==, !=, <, >, <=, >=, "like", "caseInsensitiveLike" です。 おそらくこのメソッドは独自にqualifierのパーザを書くときにしか使われないでしょう。
string
- 入力する文字列
stringForOperatorSelector(NSSelector selector)
public static EOQualifier qualifierToMatchAllValues(NSDictionary values)
values
- 検索条件を含む辞書
public static EOQualifier qualifierToMatchAnyValue(NSDictionary values)
values
- 検索条件を含む辞書
public abstract EOQualifier qualifierWithBindings(NSDictionary bindings, boolean requiresAll)
true
なら、 bindings に変数が含まれなければ例外を発生します。
requiresAll が false
なら、見つからない変数の分だけ構文木が切り詰められます。
bindings
- バインディングの辞書
requiresAll
- すべての条件(変数が存在するかどうか)を必須にするかどうか
public static EOQualifier qualifierWithQualifierFormat(String format, NSArray arguments)
フォーマット文字列 format と arguments を解析し、EOQualifierを生成して返します。 変換記号 (%@) が含まれていれば arguments の値で置き換えます。
このメソッドは format を元に、基本的なqualifierを木構造になるように生成します。
例えば "firstName = 'Joe' AND department = 'Facilities'"
のフォーマット文字列からは、2つのEOKeyValueQualifierを含むEOAndQualifierが生成されます。
次のコードは qualifierWithQualifierFormat
メソッドの一般的な使い方です。
エンティティ名とqualifierを含むEOFetchSpecificationを生成しています。
続いてEOFetchSpecificationをEODisplayGroupのデータソースに設定し、EODisplayGroupにフェッチするよう要求します。
EODisplayGroup displayGroup; // あるものと仮定 EOQualifier qualifier; EOFetchSpecification fetchSpec; EODatabaseDataSource dataSource; dataSource = (EODatabaseDataSource)displayGroup.dataSource(); qualifier = EOQualifier.qualifierWithQualifierFormat(cardType = 'Visa', null); fetchSpec = new EOFetchSpecification(Member, qualifier, null), null); dataSource.setFetchSpecification(fetchSpec); displayGroup.fetch();
qualifierWithQualifierFormat
は、フォーマット文字列 format に含まれるキーが存在するかどうかを検証しません。
もし format に文法エラーがあれば例外を発生します。
format
- フォーマット文字列
arguments
- 引数の配列
public static NSArray relationalQualifierOperators()
allQualifierOperators()
public static String stringForOperatorSelector(NSSelector selector)
セレクタ selector を表す文字列を返します。 例えば次のコードでは != を返します。
String operator = EOQualifier.stringForOperatorSelector(EOQualifier.QualifierOperatorNotEqual);
次のリストは対応している selector です。
おそらくこのメソッドは独自にqualifierのパーザを書くときにしか使われないでしょう。
selector
- 入力するセレクタ
operatorSelectorForString(String string)
,
QualifierOperatorEqual
,
QualifierOperatorNotEqual
,
QualifierOperatorLessThan
,
QualifierOperatorGreaterThan
,
QualifierOperatorLessThanOrEqualTo
,
QualifierOperatorGreaterThanOrEqualTo
,
QualifierOperatorContains
,
QualifierOperatorLike
,
QualifierOperatorCaseInsensitiveLike
public abstract void validateKeysWithRootClassDescription(EOClassDescription classDescription)
classDescription
- 検証するために使うEOClassDescriptionオブジェクト
|
Last updated Thu Oct 21 15:04:16 PDT 2004. | ||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
*1 原文は "The mutable array of qualifier keys" だが、配列ではないので修正した。
*2
原文ではキーが有効なときは null
を返すことになっているが、戻り値は void なので何も返さない。