Droonga Engineはメッセージのパターンを指定するための小規模な言語を実装しています。これをマッチングパターンと呼びます。 マッチングパターンは、プラグインなどの様々な場所で処理対象のメッセージを指定するために使われます。
pattern = ["type", :equal, "search"]
これは以下のようなメッセージにマッチします:
{
"type": "search",
...
}
pattern = ["body.success", :equal, true]
これは以下のようなメッセージにマッチします:
{
"type": "add.result",
"body": {
"success": true
}
}
以下にはマッチしません:
{
"type": "add.result",
"body": {
"success": false
}
}
pattern = [
["type", :equal, "table_create"],
:or,
["body.success", :equal, true]
]
これは以下の両方にマッチします:
{
"type": "table_create",
...
}
および:
{
"type": "column_create",
...
"body": {
"success": true
}
}
マッチングパターンには「基本パターン」と「ネストしたパターン」の2種類があります。
基本パターンは以下のように、2つ以上の要素を含む配列として表現されます:
["type", :equal, "search"]
ターゲットパスは以下の文字列のような形で示します:
"body.success"
Droonga Engineのマッチング機構は、これをドットで区切られた パスコンポーネント のリストとして解釈します。 1つのパスコンポーネントはメッセージ中の同名のプロパティを表します。 よって、上記の例は以下の位置を示します:
{
"body": {
"success": <target>
}
}
演算子はシンボルとして指定します。
:equal
true
を返します。それ以外の場合は false
を返します。
例えば、
["type", :equal, "search"]
上記のパターンは以下のようなメッセージにマッチします:
{
"type": "search",
...
}
:in
true
を返します。それ以外の場合は false
を返します。
例えば、
["type", :in, ["search", "select"]]
上記のパターンは以下のようなメッセージにマッチします:
{
"type": "select",
...
}
以下にはマッチしません:
{
"type": "find",
...
}
:include
true
を返します。それ以外の場合は false
を返します。
言い換えると、これは :in
演算子の反対の働きをします。
例えば、
["body.tags", :include, "News"]
上記のパターンは以下のようなメッセージにマッチします:
{
"type": "my.notification",
"body": {
"tags": ["News", "Groonga", "Droonga", "Fluentd"]
}
}
:exist
true
を返します。それ以外の場合は false
を返します。
例えば、
["body.comments", :exist, "News"]
上記のパターンは以下のようなメッセージにマッチします:
{
"type": "my.notification",
"body": {
"title": "Hello!",
"comments": []
}
}
以下にはマッチしません:
{
"type": "my.notification",
"body": {
"title": "Hello!"
}
}
:start_with
true
を返します。それ以外の場合は false
を返します。
例えば、
["body.path", :start_with, "/archive/"]
上記のパターンは以下のようなメッセージにマッチします:
{
"type": "my.notification",
"body": {
"path": "/archive/2014/02/28.html"
}
}
ネストしたパターンは、以下のような3つの要素を持つ配列として表現されます:
[
["type", :equal, "table_create"],
:or,
["type", :equal, "column_create"]
]
:and
true
を返す場合に、true
を返します。それ以外の場合は false
を返します。:or
true
を返す場合に true
を返します。それ以外の場合は false
を返します。