Skip to main content
ChainStream GraphQL でデータを絞り込む方法は 2 つあります。
  1. セレクター省略形tokenAddress のようなトップレベル引数で、よく使うフィルターを簡潔に書く
  2. where 引数 — ネストしたフィルターオブジェクトで、すべての演算子と任意のディメンションによる絞り込みが可能
ベストプラクティス: 必ず時間フィルターを付ける。 DWD(明細)Cube(DEXTrades、Transfers、BalanceUpdates など)では、Block.Time フィルターなしのクエリは非常に大きなテーブルパーティションをスキャンする可能性があります。where: {Block: {Time: {after: "..."}}} でスキャン範囲を限定し、OLAP エンジン上のメモリ制限を避けてください。
同じクエリで両方を組み合わせられます。

セレクター省略形

セレクターは Cube フィールド上の利便性のための引数で、よく使う where パターンにマップされます。プレーン文字列ではなく、where のフィールドと同じフィルター入力型(例: isinlike などを持つ StringFilter)を受け取ります。 次の 2 つのクエリは等価です。
セレクターは完全一致だけでなく、すべてのフィルター演算子をサポートします。例: tokenAddress: {in: ["ADDR_1", "ADDR_2"]} で複数トークンにマッチし、date: {after: "2025-01-01T00:00:00Z"} で時間で絞れます。

where 引数

where 引数は、Cube のディメンション階層を反映したネストした入力オブジェクトを受け取ります。各リーフフィールドは、型付き演算子を持つフィルタープリミティブにマップされます。

構造

— ブロック時刻が指定日より後で、かつ買い数量が 1000 超の DEXTrades に絞る:
where の同一レベルに複数フィールドがある場合、AND で結合されます。

フィルタープリミティブの型

各リーフディメンションは、次のいずれかのフィルター入力型にマップされます。

StringFilter

アドレス、ハッシュ、プロトコル名などのテキストフィールド向け。

IntFilter / FloatFilter

数量、価格、件数などの数値フィールド向け。

DateTimeFilter

タイムスタンプフィールド向け。値は ISO 8601 文字列です。
after / before排他的(狭義の不等号)。since / till包含です。between は 2 要素の配列で、両端とも包含です。

BoolFilter

真偽フィールド向け。

any による OR ロジック

既定では where 内の条件はすべて AND で結合されます。OR を表すには any 配列フィールドを使います — 各要素は完全なフィルターオブジェクトで、いずれかに一致する行が返されます。
any は他のトップレベル where フィールドと併用できます。any 内の条件同士は OR で結合され、その結果が兄弟条件と AND で結合されます。

既定フィルター

一部の Cube では既定フィルターが自動適用されます。where で明示的に設定すると上書きできます。 疑わしい取引を含めるには、フィルターを明示します:
whereIsSuspect を書かないと、既定の false のままです。疑わしさに関係なくすべての取引を取得するには OR を使います:

セレクターと where の併用

セレクターと where は AND で結合されます。主エンティティはセレクター、追加の絞り込みは where に書けます:
このクエリは、Solana 上の USDC で買い数量が 100 を超える直近 50 件の取引を、時刻の降順で取得します。

次のステップ

並び順とページネーション

orderBylimit で結果を並べ替え、ページングします。

メトリクスと集計

count、sum、avg、min、max、uniq でフィルター済みデータを集計します。