Skip to content

Yukari Query

shibafu edited this page Apr 17, 2022 · 8 revisions

Yukari Query Reference

本稿は、Yukari 2.1.0.1853-dev 準拠です。
これ以降の更新によって、新規文法の追加や既存文法の引数や動作仕様の変更、非推奨化、削除などが行われている可能性にご注意下さい。

Yukari Queryとは

Yukari Query (以下 YQ) は、ツイートに対してのフィルタリング条件などを記述するための命令文法です。
この文法に従って条件式を記述することで、対応している機能に従来より高い自由度を持った制御を行わせることが出来ます。

文法の参考元としては、SQL、Krile Query、Lispが挙げられますが、実装にあたって紆余曲折を経たこともありエッセンスが混在しているので、特にどの文法さえ知っていれば……といったことは無さそうです。

全体の構成

Yukari Queryは主にSQLに由来した2つの部位を持ちます。
必要の無い場合、各句の一切を省略することが出来、その場合はそれぞれデフォルトの式が書かれているものとして処理されます。
ここではそれぞれの役割のみを説明し、具体的に部位内に記述できる内容は別の章とします。

from (source, ...|*) where (S-Expression)

from 句

ツイートの取得元に着目し、フィルタを行います。
また、これによってREST APIを用いた手動更新の際に使用するAPIを決定します。

ここで指定できる取得元のことを「ソース」と呼びます。

from 句のベースはKQです。そちらを知っている場合は、サブセットな文法ということですぐに理解できると思います。

where 句

from 句によって取得・フィルタされたツイートに対して、表示を許可する条件を記述します。
主にこちらを凝って設定することになることになるでしょう。

where 句のベースはLispです。S式を用いて論理式を作成します。ただ、Common LispやEmacs Lispのような高度な機能は持ちあわせていません。ツイートにフィルタリングを行う条件が書ける最低限のものです。
現時点では四則演算すらも実装されていません。

各句のデフォルト

YQに一部あるいは全部の句が記述されていない場合、デフォルトの式が書かれているものとして処理を続行します。

from 句

from *

where 句

where (t)

from ソースリファレンス

ソースにおいては「受信アカウント」「対象アカウント」という用語を使用します。

「受信アカウント」とは、APIの実行 (TwitterやMastodonのサーバへの問い合わせ) に使用するアカウントのことです。Yukariでログインしているアカウントのみ、指定することができます。

「対象アカウント」とは、誰の情報を得たいか、その対象のアカウントのことです。たとえば、あるユーザーのツイート一覧を見たいとすれば、その相手のアカウントのことを指します。

Twitterにおける鍵アカウントを対象とする際、フォローが通っているアカウントを受信アカウントに指定して閲覧するといったように、フォロー/ブロック関係などの制約を手動で解決するために使用します。

なお、受信アカウントが省略可能なソースでは、省略時は「プライマリ設定されたアカウント」が使用されます。

all

from all
エイリアス

* local stream

対応サービス

全て

説明

Yukariでストリーミング受信した、全てのツイートを対象とするソースです。ただしバグがあり、他のソースと併用した場合、このソースからは何も得られません。


home

from home:"screenName"
引数
  • screenName 受信アカウントのScreenName。(@不要)
対応サービス

Twitter, Mastodon (2.1.0.440〜)

説明

ホームタイムライン (statuses/home_timeline) を受信し、対象とするソースです。


mention

from mention:"screenName"
引数
  • screenName 受信アカウントのScreenName。(@不要)
エイリアス

mentions reply replies

対応サービス

Twitter, Mastodon (2.1.0.440〜)

説明

メンション一覧 (statuses/mentions_timeline) を受信し、対象とするソースです。


user

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 で比較できません。
  • 乗算、除算、剰余演算はどのような引数を与えても常に0を返します。(つまり、ただのスタブです)