IConditionGenerator
COM公式ドキュメント
名前付きエンティティを処理し、特別な条件を生成するためのメソッドを提供します。
解説(Remarks)
IConditionGenerator をサポートするオブジェクトがセマンティック型 T としてクエリパーサーに登録されていて(IQueryParser::SetMultiOption メソッドと SQMO_GENERATOR_FOR_TYPE 定数を使用)、そのクエリパーサーがセマンティック型 T のリーフ条件ノードを生成しようとする場合、クエリパーサーはまず条件ジェネレーターの IConditionGenerator::GenerateForLeaf メソッドを呼び出します。このメソッドが S_OK を返した場合は、返された条件ツリー(リーフノードである必要はありません)が使用されます。S_FALSE を返した場合は通常の処理が再開され、リーフノードが生成されます。
クエリパーサーには、数値、ブール値、日付/時刻、ファイルパスを表す既知のセマンティック型に対する条件ジェネレーターがあらかじめ登録されています。
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
インターフェイスのすべての状態を既定値にリセットし、スキーマから必要な情報を取得します。
| pSchemaProvider | ISchemaProvider* | in | 使用するスキーマへのポインター。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
入力文字列内の名前付きエンティティを識別し、それらを格納するコレクションを作成します。
| pszInputString | LPWSTR | in | 解析対象の入力文字列。 |
| lcidUserLocale | DWORD | in | 名前付きエンティティの認識に使用する LCID。 |
| pTokenCollection | ITokenCollection* | in | 入力文字列がどのようにトークン化されたかを示す ITokenCollection オブジェクトへのポインター。 |
| pNamedEntities | INamedEntityCollector* | in | 入力時には INamedEntityCollector または NULL を格納します。戻り時には、名前付きエンティティの INamedEntityCollector コレクションを格納します。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
入力文字列、ユーザーロケール(通常はユーザーの既定のロケール)、および入力文字列のトークン化が与えられたとき、IConditionGenerator::RecognizeNamedEntities メソッドは、その入力文字列内の名前付きエンティティを識別し、各エンティティを名前付きエンティティのコレクションに追加できる必要があります。
本来であればリーフクエリ式となるものに対して、特別なクエリ式を生成します。
| pConditionFactory | IConditionFactory* | in | 必要なノードの作成に使用できる IConditionFactory オブジェクト。 |
| pszPropertyName | LPWSTR | in | プロパティ名。プロパティ名がない場合は NULL。 |
| cop | CONDITION_OPERATION | in | 操作を識別する CONDITION_OPERATION 列挙型。 |
| pszValueType | LPWSTR | in | pszValue および pszValue2 に含まれる値を記述するセマンティック型。 |
| pszValue | LPWSTR | in | 値を表す、IConditionGenerator::RecognizeNamedEntities によって生成された文字列。pszValue2 が NULL でない場合、これは値の範囲の開始を表します。 |
| pszValue2 | LPWSTR | in | NULL でない場合は、値の範囲の終了を表す、IConditionGenerator::RecognizeNamedEntities によって生成された文字列。NULL の場合、pszValue は単一の値を表します。 |
| pPropertyNameTerm | IRichChunk* | in | 入力文字列のどの部分からプロパティ名が生成されたかに関する情報を格納する IRichChunk オブジェクトへのポインター。 |
| pOperationTerm | IRichChunk* | in | 入力文字列のどの部分から操作が生成されたかに関する情報を格納する IRichChunk オブジェクトへのポインター。 |
| pValueTerm | IRichChunk* | in | 入力文字列のどの部分から値が生成されたかに関する情報を格納する IRichChunk オブジェクトへのポインター。 |
| automaticWildcard | BOOL | in | 意味がある場合に、生成される条件が指定した値で始まる結果を返す必要があるときは TRUE。生成される条件が指定した値に完全に一致する結果を返す必要があるときは FALSE 。 |
| pNoStringQuery | BOOL* | out | ppQueryExpression 内の条件ツリーをクエリ全体とする場合は VARIANT_TRUE。クエリ全体を、ppQueryExpression 内の条件ツリーと、このメソッドが S_FALSE を返した場合に使用されたであろう条件ツリーとの論理和(OR)とする場合は VARIANT_FALSE。 |
| ppQueryExpression | ICondition** | out | ICondition 条件ツリーへのポインターを受け取ります。 |
戻り値
型: HRESULT
次のいずれかを返します。それ以外の場合はエラー値を返します。
| 戻り値 | 説明 |
|---|---|
| 条件を正常に生成しました。 | |
| 条件は生成されませんでした。クエリパーサーは別の方法で条件を生成する必要があります。 |
解説(Remarks)
このメソッドが S_FALSE を返した場合、呼び出し元のクエリパーサーは、このプロパティ名、操作、値を持つリーフノード N を生成する必要があります。このメソッドが S_FALSE を返し、かつ pNoStringQuery に VARIANT_FALSE が格納されている場合、生成されるクエリ全体は、リーフノード N と ppQueryExpression 内の条件ツリーをサブ条件とする論理和(OR)になります。
このメソッドが S_OK を返し、かつ pNoStringQuery に VARIANT_TRUE が格納されている場合、ppQueryExpression 内の条件ツリーがクエリ全体になります。
pszValue2 の値が NULL 以外になるのは、date:1/2/2003..1/30/2006 のような範囲クエリの場合だけです。この例では、pszValue に 1/2/2003 の値が、pszValue2 に 1/30/2006 の値が格納されます。条件ジェネレーターは、pszValue2 が NULL でない場合に常に S_OK を返すことで、範囲を受け付けないようにすることもできます。
条件ジェネレーターは、引数 pPropertyNameTerm、pOperationTerm、pValueTerm を無視しても問題ありません。ただし、これらを MakeLeaf に渡すことで、プロパティ名、演算子、値がクエリ文字列のどこに由来するかについて正しい情報を持つリーフノードを生成できます。
多くの場合、条件ジェネレーターは該当しないため引数 automaticWildcard を無視できます。ただし、生成される条件ツリーが何らかの文字列検索を行い、前方一致検索(CONDITION_OPERATION の COP_VALUE_STARTSWITH)と完全一致検索(CONDITION_OPERATION の COP_EQUAL)の両方が意味を持つ場合は、automaticWildcard が VARIANT_TRUE のときは前者を、VARIANT_FALSE のときは後者を生成する必要があります。
このメソッドは、この IConditionGenerator インスタンスによって認識されたときに、エンティティ、リレーションシップ、または名前付きエンティティの型と値のペアを表すフレーズの生成を試みます。
| pszValueType | LPWSTR | in | ppropvar に格納された値のセマンティック型。 |
| ppropvar | PROPVARIANT* | in | 処理対象の値。 |
| fUseEnglish | BOOL | in | パラメーター fUseEnglish は予約済みです。実装側では無視する必要があり、呼び出し側は FALSE を渡してください。 |
| ppszPhrase | LPWSTR* | outoptional | 値を表すフレーズへのポインターを受け取ります。フレーズを生成できない場合、このパラメーターには NULL が設定され、メソッドは S_FALSE を返します。 |
戻り値
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IConditionGenerator "{92D2CC58-4386-45A3-B98C-7E0CE64A4117}" #usecom global IConditionGenerator IID_IConditionGenerator "{}" #comfunc global IConditionGenerator_Initialize 3 sptr #comfunc global IConditionGenerator_RecognizeNamedEntities 4 wstr,int,sptr,sptr #comfunc global IConditionGenerator_GenerateForLeaf 5 sptr,wstr,int,wstr,wstr,wstr,sptr,sptr,sptr,int,var,sptr #comfunc global IConditionGenerator_DefaultPhrase 6 wstr,var,int,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IConditionGenerator "{92D2CC58-4386-45A3-B98C-7E0CE64A4117}" #usecom global IConditionGenerator IID_IConditionGenerator "{}" #comfunc global IConditionGenerator_Initialize 3 sptr #comfunc global IConditionGenerator_RecognizeNamedEntities 4 wstr,int,sptr,sptr #comfunc global IConditionGenerator_GenerateForLeaf 5 sptr,wstr,int,wstr,wstr,wstr,sptr,sptr,sptr,int,sptr,sptr #comfunc global IConditionGenerator_DefaultPhrase 6 wstr,sptr,int,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。