-
Notifications
You must be signed in to change notification settings - Fork 2
Yukari Query
本稿は、Yukari 2.1.0.1853-dev 準拠です。
これ以降の更新によって、新規文法の追加や既存文法の引数や動作仕様の変更、非推奨化、削除などが行われている可能性にご注意下さい。
Yukari Query (以下 YQ) は、ツイートに対してのフィルタリング条件などを記述するための命令文法です。
この文法に従って条件式を記述することで、対応している機能に従来より高い自由度を持った制御を行わせることが出来ます。
文法の参考元としては、SQL、Krile Query、Lispが挙げられますが、実装にあたって紆余曲折を経たこともありエッセンスが混在しているので、特にどの文法さえ知っていれば……といったことは無さそうです。
Yukari Queryは主にSQLに由来した2つの部位を持ちます。
必要の無い場合、各句の一切を省略することが出来、その場合はそれぞれデフォルトの式が書かれているものとして処理されます。
ここではそれぞれの役割のみを説明し、具体的に部位内に記述できる内容は別の章とします。
from (source, ...|*) where (S-Expression)
ツイートの取得元に着目し、フィルタを行います。
また、これによってREST APIを用いた手動更新の際に使用するAPIを決定します。
ここで指定できる取得元のことを「ソース」と呼びます。
from 句のベースはKQです。そちらを知っている場合は、サブセットな文法ということですぐに理解できると思います。
from 句によって取得・フィルタされたツイートに対して、表示を許可する条件を記述します。
主にこちらを凝って設定することになることになるでしょう。
where 句のベースはLispです。S式を用いて論理式を作成します。ただ、Common LispやEmacs Lispのような高度な機能は持ちあわせていません。ツイートにフィルタリングを行う条件が書ける最低限のものです。
現時点では四則演算すらも実装されていません。
YQに一部あるいは全部の句が記述されていない場合、デフォルトの式が書かれているものとして処理を続行します。
from *
where (t)
ソースにおいては「受信アカウント」「対象アカウント」という用語を使用します。
「受信アカウント」とは、APIの実行 (TwitterやMastodonのサーバへの問い合わせ) に使用するアカウントのことです。Yukariでログインしているアカウントのみ、指定することができます。
「対象アカウント」とは、誰の情報を得たいか、その対象のアカウントのことです。たとえば、あるユーザーのツイート一覧を見たいとすれば、その相手のアカウントのことを指します。
Twitterにおける鍵アカウントを対象とする際、フォローが通っているアカウントを受信アカウントに指定して閲覧するといったように、フォロー/ブロック関係などの制約を手動で解決するために使用します。
なお、受信アカウントが省略可能なソースでは、省略時は「プライマリ設定されたアカウント」が使用されます。
from all
*
local
stream
全て
Yukariでストリーミング受信した、全てのツイートを対象とするソースです。ただしバグがあり、他のソースと併用した場合、このソースからは何も得られません。
from home:"screenName"
-
screenName
受信アカウントのScreenName。(@不要)
Twitter, Mastodon (2.1.0.440〜)
ホームタイムライン (statuses/home_timeline) を受信し、対象とするソースです。
from mention:"screenName"
-
screenName
受信アカウントのScreenName。(@不要)
mentions
reply
replies
Twitter, Mastodon (2.1.0.440〜)
メンション一覧 (statuses/mentions_timeline) を受信し、対象とするソースです。
from user:"target"
from user:"receiver/target"
-
receiver
受信アカウントのScreenName。省略可能。 -
target
対象アカウントのScreenName。
Twitter (1.2.3.265〜), Mastodon (2.1.0.1853〜)
ユーザータイムライン (statuses/user_timeline) を受信し、対象とするソースです。
つまり、特定のアカウントのツイート一覧です。
yqrs プロジェクトによって発見されたYukari Queryエンジンの性質に触れます。
類似の言語/言語処理系と比較して直感に反する部分と、明らかな不具合があります。不具合は現在のコードを修正する時間を割けるかが分からない、またYukari Query関連機能のユーザも少なく今まで誰にも指摘されてこなかったことを鑑みて、これを書いた後も放置されている可能性が高いです……。修正のPRは受け付けています。
- 1引数の
equals
は、その引数がtrue
である場合に真を返します。一般的な言語では常に真となるか、引数不足としてエラーになるでしょう。 -
and
,or
,not
の真偽判定は、引数を評価した結果がブール値のtrue
と等価である場合に真としています。一般的には、非nilであれば真となるでしょう。 -
or
に1つも引数を渡さなかった場合、真を返します。一般的には、この場合偽となるようです。 - 四則演算に数値以外の値を渡した場合、暗黙的に型変換を試みます。これは明らかに利便性のためですが、Lisp処理系などではエラーとなるでしょう。
- from句の一部、例えばソースの引数に "where" という文字列を含めることができません。from句のどこかにこの文字列がある場合、パースエラーとなります。
- 32bit符号付き整数の範囲に収まる整数リテラルは、同様の整数リテラルか
int
またはjava.lang.Integer
を返す変数/プロパティとしかequals
で比較できません。- 四則演算の結果と比較する際や、64bit符号付き整数を返す変数/プロパティと比較する際の回避策として、0と足し算をすることで64bit符号付き整数にキャストできます。
- https://social.mikutter.hachune.net/@shibafu528/108103082130612899
- 乗算、除算、剰余演算はどのような引数を与えても常に0を返します。(つまり、ただのスタブです)