109.5. 演算子サポート
パーサーは、単一の演算子のみをサポートするように制限されています。
有効にするには、左の値を $\\{ } で囲む必要があります。構文は以下のようになります。
${leftValue} OP rightValue
${leftValue} OP rightValue
rightValue は、' ' で囲まれた文字列リテラル、null、定数値、または $\{ } で囲まれた別の式に指定できます。
演算子の前後にはスペースが 必要 です。
Camel は rightValue 型を leftValue 型に自動的に型変換します。文字列を数値に変換して、数値に対して > 比較を使用できるようにします。
次の演算子がサポートされています。
| Operator | 説明 |
|---|---|
| == | 等しい |
| =~ | equals は大文字と小文字を区別しません (文字列値を比較するときは大文字と小文字を区別しません) |
| > | は次の値よりも大きい: |
| >= | より大きいか等しい |
| < | は次の値よりも小さい: |
| ⇐ | より小さいか等しい |
| != | 等しくない |
| !=~ | 等しくない場合は大文字と小文字を区別しません (文字列値を比較するときに大文字と小文字を区別しません) |
| contains | 文字列ベースの値に含まれているかどうかをテストします |
| !contains | 文字列ベースの値に含まれていないかどうかをテストします |
| ~~ | 文字列ベースの値で大文字と小文字の区別を無視して含まれているかどうかをテストします |
| !~~ | 文字列ベースの値で大文字と小文字の区別を無視して含まれていないかどうかをテストします |
| regex | 文字列値として定義された特定の正規表現パターンと照合するため |
| !regex | 文字列値として定義された特定の正規表現パターンと一致しない場合 |
| in | 一連の値があり、各要素をコンマで区切る必要がある場合に照合するため空の値を含める場合は 2 つのコンマを使用して定義する必要があります。たとえば、',,bronze,silver,gold' のように、空の値と 3 つのメダルを含めた 4 つの値のセットです。 |
| !in | 値がセットでなく、各要素をコンマで区切る必要がある場合に照合するため。空の値を含める場合は 2 つのコンマを使用して定義する必要があります。たとえば、',,bronze,silver,gold' のように、空の値と 3 つのメダルを含めた 4 つの値のセットです。 |
| is | 左側の型が値のインスタンスである場合に照合するため。 |
| !is | 左側の型が値のインスタンスでない場合に照合するため。 |
| range |
左辺が数値として定義された値の範囲内にある場合に照合するため ( |
| !range |
左辺が数値として定義された値の範囲内にない場合に照合するため ( |
| startsWith | 左辺の文字列が右辺の文字列で開始するかどうかをテストします |
| starts with | startsWith 演算子と同じです。 |
| endsWith | 左辺の文字列が右辺の文字列で終了するかどうかをテストします |
| ends with | endWith 演算子と同じです。 |
また、次の単項演算子を使用できます。
| 演算子 | 説明 |
|---|---|
| ++ | 数値を 1 ずつ増やします。左辺は関数でなければならず、それ以外の場合はリテラルとして解析されます。 |
| — | 数値を 1 つ減らします。左辺は関数でなければならず、それ以外の場合はリテラルとして解析されます。 |
| \n | 改行文字を使用します。 |
| \t | タブ文字を使用します。 |
| \r | キャリッジリターン文字を使用します。 |
| \} | } 文字をテキストとして使用します。これは、Simple 言語で JSON 構造を構築するときに必要になる場合があります。 |
また、次の論理演算子を使用して式をグループ化できます。
| 演算子 | 説明 |
|---|---|
| && | and 論理演算子は、2 つの式のグループ化に使用されます。 |
| or 論理演算子は、2 つの式のグループ化に使用されます。 |
AND の構文は次のとおりです。
${leftValue} OP rightValue && ${leftValue} OP rightValue
${leftValue} OP rightValue && ${leftValue} OP rightValue
OR の構文は次のとおりです。
${leftValue} OP rightValue || ${leftValue} OP rightValue
${leftValue} OP rightValue || ${leftValue} OP rightValue
例:
109.5.1. さまざまなタイプとの比較 リンクのコピーリンクがクリップボードにコピーされました!
String や int などの異なる型と比較する場合は、少し注意が必要です。Camel は左辺のタイプを最優先して使用します。右辺の型に基づいて両方の値を比較できなかった場合は、右辺の型にフォールバックします。
これは、値を反転して特定のタイプを適用できることを意味します。上記のバーの値が文字列であるとします。次に、方程式を反転できます。
simple("100 < ${header.bar}")
simple("100 < ${header.bar}")
これにより、int 型が最優先で使用されます。
これは、Camel チームがバイナリー比較演算を改善して、文字列ベースよりも数値型を優先する場合に、今後変更される可能性があります。数値と比較するときに問題を引き起こすのは、ほとんどの場合 String 型です。
// testing for null
simple("${header.baz} == null")
// testing for not null
simple("${header.baz} != null")
// testing for null
simple("${header.baz} == null")
// testing for not null
simple("${header.baz} != null")
また、正しい値が別の式である場合の、もう少し高度な例
simple("${header.date} == ${date:now:yyyyMMdd}")
simple("${header.type} == ${bean:orderService?method=getOrderType}")
simple("${header.date} == ${date:now:yyyyMMdd}")
simple("${header.type} == ${bean:orderService?method=getOrderType}")
contains が含まれる例。タイトルに Camel という用語が含まれるかをテストします。
simple("${header.title} contains 'Camel'")
simple("${header.title} contains 'Camel'")
正規表現が含まれる例。数のヘッダーが 4 桁の値かどうかをテストします。
simple("${header.number} regex '\\d{4}'")
simple("${header.number} regex '\\d{4}'")
最後に、ヘッダーがリスト内のいずれかの値と等しい場合の例を示します。各要素はコンマで区切る必要があり、前後にスペースを入れないでください。
Camel は各要素を左辺の型に変換するため、これは数値などにも機能します。
simple("${header.type} in 'gold,silver'")
simple("${header.type} in 'gold,silver'")
また、最後の 3 つについては、not を使用した否定テストもサポートしています。
simple("${header.type} !in 'gold,silver'")
simple("${header.type} !in 'gold,silver'")
そして、文字列など、タイプが特定のインスタンスであるかどうかをテストできます。
simple("${header.type} is 'java.lang.String'")
simple("${header.type} is 'java.lang.String'")
次のように記述できるように、すべての java.lang タイプの短縮形を追加しました。
simple("${header.type} is 'String'")
simple("${header.type} is 'String'")
範囲もサポートされています。範囲間隔には数字が必要で、最初と最後の両方の値が含まれます。たとえば、値が 100 から 199 の間であるかどうかをテストするには、次のようにします。
simple("${header.number} range 100..199")
simple("${header.number} range 100..199")
スペースなしの範囲で .. を使用していることに注意してください。Groovy と同じ構文に基づいています。
simple("${header.number} range '100..199'")
simple("${header.number} range '100..199'")
XML DSL は、さまざまなビルダーメソッドをすべて備えた Java DSL ほど強力ではないため、単純な演算子でテストするには、他の言語を使用する必要があります。これで、Simple 言語でこれを行うことができます。以下のサンプルでは、ヘッダーがウィジェットの注文かどうかをテストします。
109.5.2. And/Or の使用 リンクのコピーリンクがクリップボードにコピーされました!
式が 2 つある場合は、&& または || 演算子で結合できます。
たとえば、以下のようになります。
simple("${header.title} contains 'Camel' && ${header.type'} == 'gold'")
simple("${header.title} contains 'Camel' && ${header.type'} == 'gold'")
そしてもちろん || もサポートされています。サンプルは次のようになります。
simple("${header.title} contains 'Camel' || ${header.type'} == 'gold'")
simple("${header.title} contains 'Camel' || ${header.type'} == 'gold'")