このセクションでは、メッセージ レスポンダー ツールおよび SQL レスポンダー ツールで値の照合に使用される条件式について説明します。

このセクションの内容:

条件式の概要

条件式は、以下の照合を行うための簡潔な構文です。

  • SQL レスポンダー のパラメーター判定条件
  • メッセージ レスポンダー のデータソース応答条件

条件式の構文は、文字列や数字の比較、およびワイルドカードや正規表現を使用した照合をサポートします。この構文は次の目的で使用されます。

  • 応答条件に使用されるデータソース列の各エントリ
  • SQL レスポンダーのパラメーター判定条件

Virtualize はレスポンダーが提供した入力値に対して条件式を評価します。 条件式が true を返す場合に値は一致したと考えられます。

SQL レスポンダーでの条件式の使用

構文とその有用性を理解するために、簡単な SQL レスポンダーで考えてみましょう。 Virtualize がデータベーストラフィックの記録中に次の 2 つの SQL クエリーをキャプチャしたと仮定します。

select id, name from widget where yearCreated = 2008 and category = 'tool-metal'
select id, name from widget where yearCreated = 2011 and category = 'construction-molding'

これらの SQL 文は両方とも次の SQLレスポンダーの SQL クエリーテンプレートに対応します。

select id, name from widget where yearCreated = ${yearCreated} and category = ${category}

記録されたデータを使用して、Virtualize は 1 つのクエリー テンプレートと次のパラメーター判定条件のテーブルを生成しました。興味深いのは、 SQL 文の WHERE 節の値に対応する "yearCreated" と "category"列です。

yearCreatedcategoryResultSet FileResponse Time (ms)
2008tool-metaldatabase_widgets\file1.csv0
2011construction-moldingdatabase_widgets\file2.csv0

構成されたように、SQL レスポンダーは Virtualize が記録中にキャプチャした 2 つの SQL 文のみに結果セットを返すことができます。Virtualize は、記録中に見つけた値に正確に一致するようにパラメーター判定条件を構成します。レスポンダーは、 2005 年に作成された widget の "tool-metal" の結果セットを持っていません。また、 2011 年に作成された widgetの "construction-molding" に分類されたもの以外の結果セットも持っていません。

すべての "tool-metal" widget をレスポンダーで処理したい場合は、作成された年で widget をグループ化することで実施可能です。 2008 年より前に作成されたすべての "tool-metal" widget に結果セットを 1 つ返し、2008 年以降に作成されたすべての "tool-metal" widget に別の結果セット (Virtualize が記録中にキャプチャしたもの ) を返すには、"yearCreated" パラメーターに数値比較を使用します。2008 年より前に作成された widget のために、レスポンダーに別の結果セットを手動で追加する必要があります。最終的に、パラメーター判定条件テーブルは次のようになります。

yearCreatedcategoryResultSet FileResponse Response 
[< 2008]tool-metaldatabase_widgets\file3.csv0
[>= 2008]tool-metaldatabase_widgets\file1.csv0
2011construction-moldingdatabase_widgets\file2.csv0

"category"が "tool-metal" である行の "yearCreated" 列のエントリに注意してください。両方のエントリが大括弧で囲まれています。大括弧は、エントリをリテラル文字列として照合するのではなく、より高性能な応答条件として扱われるべきである、ということを示します。大括弧内の式は true または false に評価されます。[< 2008] という式は入力値が 2008 より小さい数の場合に true を返します。入力値は着信 SQL 文から取得されます。 SQL レスポンダーは SQL をパースし、クエリーテンプレートの "${yearCreated}" に対応する値を見つけて、その値を [< 2008] 式に入力値として提供します。

ほとんどのプログラミング言語の小なりの比較は、variable1 < variable2 のように、小なり演算子の両側に値があります。条件式では、演算子の左に値がありません。演算子の左の値は暗黙的に入力値です。 [< 2008] 式は入力値が 2008 より小さいかをチェックし、[>= 2008] は入力値が 2008 以上かをチェックします。

< や >= に加えて、条件式は <=、 >、 == (等しい)、および != (等しくない) をサポートしています。数値の比較にも文字列の比較にも同じ比較演算子を使用できます。

パラメーター判定条件テーブルの最初の 2 行では、 "category"の値は tool-metal です。tool-metal という式は [== "tool-metal"] という式と同等です。簡単にするために、 Virtualize は式が "[" 文字で始まらない限り、式をリテラル文字列の照合に使用します。副作用として、 "[" で始まるリテラル文字列を照合するには、明示的に == 演算子を使用する必要があります。"[xyz"というリテラル文字列を照合するには、[== "[xyz"] という式を使用する必要があります。

数値と文字列に使用できる比較演算子に加えて、Virtualize は文字列を分析するために更なる演算子をサポートします。2011 年に作成され、categoryが "construction-" で始まるすべての widget に別の結果セットを使用したいと仮定します。これを行うには、レスポンダーに別の結果セットを追加し、 "category" パラメーターに [like "construction-*"] という式を使用します。この式は、construction-support や construction-something-misc といった入力に一致します。like 演算子はワイルドカードとして * および ? を使用します。* ワイルドカードは 0 以上の文字に一致します。? ワイルドカードは正確に 1 文字に一致します。

category が "circuit" または "circuit-" の後に任意の文字列が続くもので、かつ 2011 年に作成されたすべての widget に別の結果セットを使用したいと仮定します。"circuitbreaker" のような category は対象外です。これを行うには、レスポンダーに別の結果セットを追加して、正規表現で "category" パラメーターを照合するようにします。条件式 [=~ /^circuit(-.+)?$/] を使用できます。正規表現は circuit、または circuit-electric のように circuit の後に - と 1 つ以上の文字が続くことを照合します。

パラメーター判定条件テーブルは次のようになります。

yearCreatedcategoryResultSet FileResponse Time (ms)
[< 2008]tool-metaldatabase_widgets\file3.csv0
[>= 2008]tool-metaldatabase_widgets\file1.csv0
2011construction-moldingdatabase_widgets\file2.csv0
2011[like "construction-*"]database_widgets\file4.csv0
2011[=~ /^circuit(-.+)?$/]database_widgets\file5.csv0

ユーザーが使用しているクエリーテンプレートに一致するどんな SQL 文にも、SQL レスポンダーが結果セットを返すように設定したいと仮定します。 他のパラメーター条件には一致せず、 2000 年から 2007 年の間に作成された widget 用に結果セットを 1 つ用意します。他の一致しない widget には、最終的な結果セットを用意します。

2000 から 2007 の間の "yearCreated" に一致させるには、 2 つの数値比較演算子と and 演算子を組み合わせて使用します。 この式は、次の範囲に一致します: [>= 2000 および <= 2007]。and 演算子は 2 つの条件式を結合し、両方の式が true を返すときに限り true を返します。or 演算子も同じような動きをしますが、どちらか 1 つまたは両方の式が true を返すときに限り true を返します。

"category" パラメーターのどんな値にも一致させるには、条件式 [*] を使用できます。条件式 [*] はどんな入力にも一致します。あるいは、[] 式を使用できます。[] は条件がないことを意味するので、true と評価されます。より意味が明確なので Virtualize は [*] をサポートします。空の式 (パラメーター判定条件のテーブルで空のテーブルセルとして表現される) はどんな入力にも一致しません。むしろ、文字列の長さが 0 の入力に一致します。

最後に、 widget に一致しなかったものに一致させるには、最終的な結果セットを判定テーブルの最終行として追加します。 "yearCreated" と "category" パラメーターそれぞれに [*] 式を使用します。

パラメーター判定条件テーブルは次のようになります。

yearCreatedcategoryResultSet FileResponse Time (ms)
[< 2008]tool-metaldatabase_widgets\file3.csv0
[>= 2008]tool-metaldatabase_widgets\file1.csv0
2011construction-moldingdatabase_widgets\file2.csv0
2011[like "construction-*"]database_widgets\file4.csv0
2011[=~ /^circuit(-.+)?$/]database_widgets\file5.csv0
[>= 2000 and <= 2007][*]database_widgets\file6.csv0
[*][*]database_widgets\file7.csv0

データソース応答条件の設定は SQL レスポンダーの構成とは異なりますが、 Virtualize のデータソース応答条件は同じ条件式の構文をサポートします。

条件式の構文

条件式はリテラル文字列に一致させるか、より高度な式かのいずれかに解釈されます。 

式が [ で始まらない場合、Virtualize は式をリテラル文字列に一致させるものと解釈します。[ で始まり、] で終わらない式は不正な式なのでパースされません。大括弧で囲まれた式は、入力値に対して評価をするいくつかの演算子 (比較演算子、like 演算子および正規表現を使用した文字列のパターンマッチング) および条件式を結合するための boolean 演算子をサポートしています。 

Virtualize は入力値に対して式を評価します。入力値は数値または文字列のいずれかを使用できます。各条件は true または false に評価されます。true は照合に成功したことを示します。

比較演算子

Virtualize は数値の比較にも文字列の比較にも使用できる、いくつかの比較演算子をサポートします。サポートしている演算子は次のとおりです。

演算子意味
<=小なりまたは等しい
<小なり
==等しい
>=大なりまたは等しい
>大なり
!=等しくない

たとえば、数値と推定される入力が 57 より小さいことをチェックするには、[< 57] を使用します。入力値は暗黙的に左オペランドです。右オペランドは入力値と比較する値です。

文字列は二重引用符で囲みます。例:

[< "xyz"] 

abc という式は、次の式と同等です。 

[== "abc"]

Virtualize は文字列を辞書順に比較します。たとえば、 A < AA < Z < Zoo < a < aa < z < zoo です。比較では大文字と小文字が区別されることに注意してください。Virtualize は各文字の Unicode 値を比較します。2 つの文字列があり、1 つの文字列の方がもう 1 つの文字列より長いこと以外 2 つの文字列が同じであるとしたら、短い文字列は長い文字列より小さいです。

二重引用符内の文字列は、次のエスケープシーケンスを含むことができます。

エスケープシーケンス意味ASCII 文字コード (16進法)
\bバックスペース0x08
\t水平タブ0x09
\n改行0x0A
\fフォームフィード0x0C
\rキャリッジリターン0x0D
\"二重引用符0x22
\'一重引用符0x27
\\バックスラッシュ文字0x5C

Java は同じエスケープ シーケンスをサポートします。一重引用符のエスケープシーケンス \' は厳密には必要ありません。しかし、Java 文字列の構文との互換性のために提供されています。

数値と文字列の扱いは異なります。式 [== "30"] は 30 という入力文字列には一致しますが、30.0 という入力文字列には一致しません。しかし、[== 30] は両方の入力文字列に一致します。右オペランドと入力値の両方とも、数値か文字列のいずれかのタイプがあります。両方とも数値の場合、Virtualize は数値比較を実行します。どちらか一方だけが数値の場合、Virtualize はもう一方のオペランドを数値に変換しようと試みます。成功した場合、Virtualize は数値比較を実行します。失敗した場合は、数値のオペランドを文字列に変換し、文字列比較を実行します。

二重引用符の有無によって、右オペランドが数値かどうか判断されます。二重引用符の有無によって、右オペランドが数値かどうか判断されます。 SQL レスポンダーは SQL 文をパースすることで入力値のタイプを判断します。 SQL 文内の一重引用符内の値は文字列です。一重引用符内にない数字は数値です。メッセージレスポンダーのデータソース応答条件では、すべての入力値が文字列となります。数値比較を行うためには、右オペランドが数字である必要があります。

次のテーブルは、比較演算子の使用方法と一致する入力値を表します。

一致不一致
[== 55]

数値または文字列: 55, 55.0

数値または文字列: 60
[> 55]数値または文字列: 56, 56.0, 3.1e24数値または文字列: 55, 10
[== "55"]

数値: 55, 55.0

文字列: 55

数値: 60

文字列: 55.0, 60

[> "55"]

数値: 56, 56.0, 3.1e24
文字列: 56, 55.0

数値: 55, 55.0, 10

文字列: 55, 050, 3.1e24, abc

[== "greetings"]greetingsxyz
greetingsgreetingsxyz
[>= "abc"]abc, abca, greetingsABC, ab, 11
[== "this is \"quoted\""]this is "quoted"this is \"quoted\"
this is "quoted"this is "quoted"this is \"quoted\"

構文をさらに詳しく説明するために、次のテーブルではいくつかのパース不可能な式を表します。

パース不可能な式パースエラー
[xyz括弧で始まるリテラル文字列です。== 演算子を使用してください。
[55]演算子がありません。== 演算子を使用してください。
["something"]演算子がありません。== 演算子を使用してください。
[== 55右大括弧がありません。

文字列照合

比較演算子に加えて、より高度な文字列照合を行うために like 演算子と正規表現を使用できます。

like 演算子は、[like "alpha?beta*"] 形式の式を使用した簡単なパターン マッチングをサポートします。ワイルドカード文字 ? は任意の 1 文字に一致します。ワイルドカード文字 * は 1 つ以上の文字に一致します。入力文字が数値の場合、 Virtualize は入力を文字列に変換します。

正規表現は、 [=~ /pat-tern/] の形式の式を使用して、より強力なパターン マッチングをサポートします。入力文字が数値の場合、 Virtualize は入力を文字列に変換します。Perl と同様に、 =~ は正規表現による比較を表し、パターン自身はスラッシュで囲まれます。Virtualize は Java の正規表現で使用されるものと同じパターン構文を使用します。Java のパターン構文に関する詳細なドキュメントについては、Javadoc で java.util.regex.Pattern クラスを参照してください。Java のパターン構文と異なる点は、 / 文字に一致することです。そのため、バックスラッシュでエスケープする必要があります。

入力文字列のいくつかの部分文字列がパターンに一致する場合、正規表現による比較は true を返します。abc123123abc でははく abc に一致させたい場合、[=~ /abc/ ] ではなく [=~ /^abc$/] を使用する必要があります。^ および $ はそれぞれ文字列の最初と最後を照合します。

次のテーブルは、比較演算子の使用方法と一致する入力値を表します。

一致不一致
[like "a*b"]ab, axb, axxb,axyzbabx
[like "a?b"]axb, aab, abbab, axxb, axyzb
[=~ /^a.*b$/]ab, axb, axxb,axyzbabx
[=~ /^a.b$/]axb, aab, abbab, axxb, axyzb
[=~ /^id-\d+$/]id-1, id-456id-, id-xyz, id-2b
[=~ /beta/]beta, alpha-beta, alpha-beta-gammaalpha, BETA
[=~ /^beta$/]betaalpha, BETA, alpha-beta, alpha-beta-gamma
[=~ /(?i)^beta$/]beta, BETAalpha, alpha-beta, alpha-beta-gamma
[=~ /^.*\/.*$/]alpha/beta, /alpha, alpha\beta
[=~ /^.*\\.*$/]alpha\beta, \alpha, alpha/beta
[=~ /^a\Q.*\Eb$/]a.*bab, axb, axxb, axyzb, abx

複合式

Virtualize は and および or 演算子による条件式の結合をサポートします。たとえば、入力値が 0 から 9 の間の場合、[>= 0 and <= 9] は true を返します。

and 演算子は or 演算子よりも優先順位が高くなります。式を囲むのに括弧を使用できます。 [like "*b*" or like "*a*" and like "*z*"] という式は [like "*b*" or (like "*a*" and like "*z*")] と同等です。

演算子名は大文字と小文字を区別します。次の式は AND が有効な演算子ではないため、パースエラーとなります: [> 0 AND < 10]

次のテーブルは、比較演算子の使用方法と一致する入力値を表します。

一致不一致
[>= 0 and <= 9]文字列または数値: 0, 3.14159, 5, 9.0文字列または数値: -1, 10.12, 5.7e+12
[like "*b*" or like "*a*" and like "*z*"]b, mnb, ba, bz, zaa, z
[like "*b*" or (like "*a*" and like "*z*")]b, mnb, ba, bz, zaa, z
[(like "*b*" or like "*a*") and like "*z*"]bz, za, zaabxyza, b, z, mnb, ba
[(((== "abc")))]abcxyz

メッセージ レスポンダーでの条件式の使用

メッセージ レスポンダーでデータソース応答条件を設定する一般的なプロセス (リクエスト内の値をデータソース列の値に対して比較するように構成) については、「[データソース応答条件] タブ」 に記述しています。

このセクションで説明した構文は Virtualize 9.2 で導入され、仮想アセット (.pva ファイル) に特有のものです。Virtualize 9.1 の構文はサポートされていません。  さらに、 Virtualize 環境にスタブとともに Parasoft .tst ファイルをインポートした場合、Virtualize はこれらのアイテムのデータソース応答条件にレガシー構文を使用します。

  • No labels