메인 콘텐츠로 건너뛰기
ChainStream GraphQL에서 데이터를 필터링하는 두 가지 방법이 있습니다:
  1. 셀렉터 단축키 — 일반적인 필터를 위한 편리한 약칭을 제공하는 tokenAddress 같은 최상위 인자
  2. 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 } }
  }
}
셀렉터는 모든 필터 연산자를 지원합니다 — 정확한 일치만이 아닙니다. 예를 들어 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기본 필터효과
DEXTradesIsSuspect = 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 트레이드를 시간 내림차순으로 가져옵니다.

다음 단계

정렬 & 페이지네이션

orderBylimit으로 결과를 정렬하고 데이터를 페이지네이션하세요.

메트릭 & 집계

필터링된 데이터를 count, sum, avg, min, max, uniq로 집계하세요.