ChainStream GraphQL에서 데이터를 필터링하는 두 가지 방법이 있습니다:
셀렉터 단축키 — 일반적인 필터를 위한 편리한 약칭을 제공하는 tokenAddress 같은 최상위 인자
where 인자 — 전체 범위의 연산자와 임의 디멘션 필터링을 지원하는 중첩 필터 객체
동일한 쿼리에서 둘 다 결합할 수 있습니다.
셀렉터 단축키
셀렉터는 일반적인 where 필터 패턴에 매핑되는 Cube 필드의 편의 인자 입니다. 일반 문자열이 아닌 where 필드와 동일한 필터 입력 타입(예: is, in, like 등이 있는 StringFilter)을 받습니다.
셀렉터 매핑 대상 사용 가능 Cube tokenAddress각 Cube의 기본 토큰 주소 컬럼 DEXTrades, Transfers, BalanceUpdates, DEXPools, TokenSupplyUpdates, Pairs, Tokens, DEXPoolEvents, TokenHolders walletAddress월렛/계정 소유자 주소 DEXTrades, WalletTokenPnL poolAddress풀 컨트랙트 주소 DEXTrades, DEXPools senderAddress전송 발신자 주소 Transfers receiverAddress전송 수신자 주소 Transfers ownerAddress토큰 계정 소유자 주소 BalanceUpdates dexProgramDEX 프로그램/컨트랙트 주소 DEXTrades date블록 타임스탬프 (DateTime 필터) DEXTrades, Transfers, BalanceUpdates, DEXPools
다음 두 쿼리는 동일합니다:
query {
DEXTrades (
network : sol
tokenAddress : { is : "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" }
limit : { count : 10 }
) {
Block { Time }
Trade { Buy { Amount PriceInUSD } }
}
}
query {
DEXTrades (
network : sol
where : {
Trade : {
Buy : {
Currency : {
MintAddress : {
is : "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
}
}
}
}
}
limit : { count : 10 }
) {
Block { Time }
Trade { Buy { Amount PriceInUSD } }
}
}
셀렉터는 모든 필터 연산자를 지원합니다 — 정확한 일치만이 아닙니다. 예를 들어 tokenAddress: {in: ["ADDR_1", "ADDR_2"]}는 여러 토큰과 일치하고, date: {after: "2025-01-01T00:00:00Z"}는 시간으로 필터링합니다.
where 인자
where 인자는 Cube의 디멘션 계층을 반영하는 중첩 입력 객체를 받습니다. 각 리프 필드는 타입이 있는 연산자가 포함된 필터 프리미티브 에 매핑됩니다.
where : {
DimensionGroup : {
DimensionField : {
operator : value
}
}
}
예제 — 블록 시간이 특정 날짜 이후이고 매수 금액이 1000보다 큰 DEXTrades 필터링:
query {
DEXTrades (
network : sol
where : {
Block : { Time : { after : "2025-01-01T00:00:00Z" } }
Trade : { Buy : { Amount : { gt : 1000 } } }
}
limit : { count : 20 }
) {
Block { Time }
Trade { Buy { Amount PriceInUSD } }
}
}
where에서 동일 레벨에 여러 필드가 지정되면 AND 로직으로 결합됩니다.
필터 프리미티브 타입
모든 리프 디멘션은 다음 필터 입력 타입 중 하나에 매핑됩니다:
StringFilter
주소, 해시, 프로토콜 이름 같은 텍스트 필드용.
연산자 타입 설명 isString정확한 일치 notString같지 않음 in[String!]목록의 값 중 하나와 일치 notIn[String!]목록의 모든 값 제외 likeStringSQL LIKE 패턴 매칭 (% 와일드카드)
where : {
Trade : {
Dex : {
ProtocolName : { in : [ "Raydium" , "Orca" ] }
}
}
}
IntFilter / FloatFilter
금액, 가격, 카운트 같은 숫자 필드용.
연산자 타입 설명 eqNumber같음 neNumber같지 않음 gtNumber보다 큼 gteNumber크거나 같음 ltNumber보다 작음 lteNumber작거나 같음 in[Number!]목록의 값 중 하나와 일치 notIn[Number!]목록의 모든 값 제외
where : {
Trade : {
Buy : {
PriceInUSD : { gte : 0.001, lte : 1.0 }
}
}
}
DateTimeFilter
타임스탬프 필드용. 값은 ISO 8601 문자열입니다.
연산자 타입 설명 afterDateTime이 타임스탬프 이후 (배타적) beforeDateTime이 타임스탬프 이전 (배타적) sinceDateTime이 타임스탬프 이후 (포함) tillDateTime이 타임스탬프까지 (포함) between[DateTime!, DateTime!]두 타임스탬프 사이 (양쪽 포함)
where : {
Block : {
Time : { since : "2025-03-01T00:00:00Z" , till : "2025-03-31T23:59:59Z" }
}
}
after/before는 배타적 (엄격한 부등식)입니다. since/till은 포함적 입니다. between은 두 요소 배열을 받으며 양쪽 모두 포함됩니다.
BoolFilter
불리언 필드용.
연산자 타입 설명 eqBooleantrue 또는 false와 같음
where : {
IsSuspect : { eq : true }
}
any를 사용한 OR 로직
기본적으로 where의 모든 조건은 AND로 결합됩니다. OR 로직을 표현하려면 any 배열 필드를 사용합니다 — 각 요소는 완전한 필터 객체이며, 어느 하나라도 일치하는 레코드가 반환됩니다.
query {
DEXTrades (
network : sol
where : {
any : [
{ Trade : { Buy : { Currency : { MintAddress : { is : "TOKEN_A" } } } } }
{ Trade : { Buy : { Currency : { MintAddress : { is : "TOKEN_B" } } } } }
]
}
limit : { count : 20 }
) {
Trade {
Buy { Currency { MintAddress } Amount }
}
}
}
any는 다른 최상위 where 필드와 결합할 수 있습니다. any 조건들은 OR로 결합된 후, 형제 조건들과 AND로 결합됩니다.
기본 필터
일부 Cube는 기본 필터를 자동으로 적용합니다. where 절에서 명시적으로 필터를 설정하여 재정의할 수 있습니다.
Cube 기본 필터 효과 DEXTrades IsSuspect = false기본적으로 봇/MEV 트레이드 제외
의심 트레이드를 포함 하려면 명시적으로 필터를 설정하세요:
query {
DEXTrades (
network : sol
where : { IsSuspect : { eq : true } }
limit : { count : 10 }
) {
Block { Time }
Trade { Buy { Amount } }
IsSuspect
}
}
또는 where에서 IsSuspect를 지정하지 않으면 기본값 false가 적용됩니다. 의심 상태에 관계없이 모든 트레이드를 쿼리하려면 OR을 사용하세요:
where : {
any : [
{ IsSuspect : { eq : true } }
{ IsSuspect : { eq : false } }
]
}
셀렉터와 where 결합
셀렉터와 where 필터는 AND로 결합됩니다. 셀렉터를 주요 엔티티에 사용하고 where로 추가 세분화를 할 수 있습니다:
query {
DEXTrades (
network : sol
tokenAddress : { is : "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" }
where : {
Block : { Time : { after : "2025-03-01T00:00:00Z" } }
Trade : { Buy : { Amount : { gt : 100 } } }
}
orderBy : Block_Time_DESC
limit : { count : 50 }
) {
Block { Time }
Transaction { Hash }
Trade {
Buy { Amount PriceInUSD }
Sell { Currency { MintAddress } Amount }
Dex { ProtocolName }
}
}
}
이 쿼리는 Solana에서 매수 금액이 100을 초과하는 최근 50건의 USDC 트레이드를 시간 내림차순으로 가져옵니다.
다음 단계
정렬 & 페이지네이션 orderBy와 limit으로 결과를 정렬하고 데이터를 페이지네이션하세요.
메트릭 & 집계 필터링된 데이터를 count, sum, avg, min, max, uniq로 집계하세요.