Skip to content
This repository has been archived by the owner on May 18, 2021. It is now read-only.

KQ_Expressions_Operators

Karno edited this page Mar 17, 2014 · 11 revisions

フィルタクエリの演算子について

フィルタクエリの演算子はその多くがBooleanを返します。この場合、フィルタの直下に置くことができます。
しかし、それ以外を返す演算子を利用する場合、他の演算子と組み合わせてBooleanを返すようにしなければなりません。
フィルタクエリの型についてはフィルタクエリについてをご覧ください。

また、フィルタ演算には括弧 ()が利用可能です。括弧で囲った部分は先に評価されます。

みかた

演算子の型テーブルは以下のように表記されます。(例: contains の場合)

左項 右項 演算結果
String String Boolean
Set Numeric
Set

この場合、左項としてSetを指定した場合、右項にはSetかNumericを指定でき、結果はBooleanとなることがわかります。
左項にStringを指定した場合、右項はStringのみを指定でき、結果はBooleanです。

また、**この表は上から優先されます。**左項にSetを、右項にNumericかSetを指定した場合、右項はNumericが優先されます。

この挙動は、いくつかのフィルタにおいて非常に重要です。 たとえば、 to contains us とした場合と us contains to とした場合では、toがNumericとして扱われるかSetとして扱われるかが異なります。toはSetのときはすべての返信先のユーザーIDを返しますが、Numericとして扱われるとメインの返信先のIDしか返しません。

さらに、rts などはさらに大きく異なり、 rts contains us と書こうとして us contains rts と記述してしまった場合、正しい結果が一切得られないことになるでしょう。なぜなら、rts は Numeric として扱われた際には「被リツイート数」を返すからです!

このような挙動は、通常はクエリを簡潔に保つために重宝しますが、一方で非常に気付きにくいクエリの誤りを誘発します。 もしクエリが思った通りに動かない場合は、contains と in を入れ替えたり、containsやinの両辺を入れ替えたりしてみてください。
基本的な考え方としては、[SET] contains [ITEM]、[ITEM] in [SET] です。多相性のある項(to など)をourなどのSet型を返すものと組み合わせる場合、多相性のある項を[SET]側に指定するのがコツです。

演算子一覧

これら演算子は、この項目に記述されている順番に優先して処理されます。
ですから、rts * 3 + 5 > favs ((rts * 3) + 5) > favs の順番で評価されます。

!

単項演算子です。Booleanを取り、その否定を返します。

演算結果
Boolean Boolean

括弧と組み合わせた形である!()は多くの場面で利用可能です。
たとえば、!(rts contains @karno)とすると、@karnoがRTしていないツイートを抽出できます。

caseful

特殊な単項演算子です。この指定が用いられている文字列を含む比較について、大文字小文字を考慮します。

演算結果
String String

たとえば、text contains "twitter" では「twitter」の他に「Twitter」や「TWITTER」もヒットしますが、
caseful text contains "twitter" では「twitter」のみヒットします。

+

両項の数値について、加算を行います。
集合型が指定された場合は、両項の和集合を取得します。
文字列を指定した場合、結合した文字列を取得します。

左項 右項 演算結果
Numeric Numeric Numeric
String String String
Set Set Set

-

両項の数値について、減算を行います。
集合型が指定されたときは、左項から右項を引いた差集合を取得します。

左項 右項 演算結果
Numeric Numeric Numeric
Set Set Set

*

両項の数値について、乗算を行います。
集合型が指定されたときは、両項の積集合、共通部分を取り出します。

左項 右項 演算結果
Numeric Numeric Numeric
Set Set Set

なお、項としての * も存在します
our.following などと同等の表現として *.following が利用可能ですが、混乱するのでやめたほうが無難です。

/

両項の数値について、除算を行います。

左項 右項 演算結果
Numeric Numeric Numeric

フィルタについては、右項が 0 となる場合、この演算子は 0 を返します。
ただし、SQL化される際はその限りではないため、この挙動を前提とするフィルタは構成しないようにしてください。

in, <-

左項に与えた数値が右項の集合に含まれるかを調べます。

左項が集合の場合、共通部分が存在するかを調べます。

左項 右項 演算結果
Numeric Set Boolean
Set

contains, ->

左項に与えた集合に右項の数値が含まれるかを調べます。

右項が集合の場合、共通部分が存在するかを調べます。

左項が文字列の場合、右項の文字列を含むかを調べます。

左項 右項 演算結果
String String Boolean
Set Numeric
Set

startswith, startwith

左項に与えた文字列の先頭が右項に与えた文字列と合致するかを調べます。

左項 右項 演算結果
String String Boolean

endswith, endwith

左項に与えた文字列の末尾が右項に与えた文字列と合致するかを調べます。

左項 右項 演算結果
String String Boolean

match, regex

左項に与えた文字列が右項で与えたパターンに合致するかを調べます。
注意: 動作が非常に遅いです。出来る限り contains などのフィルタに置き換えるか、他のフィルタで数を絞ってから実行させたほうが動作が速くなります。

左項 右項 演算結果
String String Boolean

<

左項に与えた数値が右項よりも小さいかを調べます。

左項 右項 演算結果
Numeric Numeric Boolean

<=

左項に与えた数値が右項よりも小さいか、または等しいかを調べます。

左項 右項 演算結果
Numeric Numeric Boolean

>

左項に与えた数値が右項よりも大きいかを調べます。

左項 右項 演算結果
Numeric Numeric Boolean

>=

左項に与えた数値が右項よりも大きいか、または等しいかを調べます。

左項 右項 演算結果
Numeric Numeric Boolean

=, ==

左項と右項が等しいかを調べます。

左項 右項 演算結果
Boolean Boolean Boolean
Numeric Numeric
String String

!=

左項と右項が等しくないかを調べます。

左項 右項 演算結果
Boolean Boolean Boolean
Numeric Numeric
String String

&, &&

左項と右項の論理積、ANDを取得します。

左項 右項 演算結果
Boolean Boolean Boolean

|, ||

左項と右項の論理和、ORを取得します。

左項 右項 演算結果
Boolean Boolean Boolean