From f1a96e8ba900b3a4fd62ab6328553b6f2b9b8af2 Mon Sep 17 00:00:00 2001 From: Ashwin Phatak Date: Mon, 2 Aug 2021 15:46:21 +0530 Subject: [PATCH] Resolver for Ticks and Token(s) methods (#177) * Add query resolvers for Tick and Token entities. * Implemented query for orderBy. Co-authored-by: nabarun --- packages/uni-info-watcher/src/database.ts | 39 ++++++++++++---------- packages/uni-info-watcher/src/indexer.ts | 4 +++ packages/uni-info-watcher/src/resolvers.ts | 22 ++++++++++++ 3 files changed, 47 insertions(+), 18 deletions(-) diff --git a/packages/uni-info-watcher/src/database.ts b/packages/uni-info-watcher/src/database.ts index ada57ad5..2f45271e 100644 --- a/packages/uni-info-watcher/src/database.ts +++ b/packages/uni-info-watcher/src/database.ts @@ -367,10 +367,27 @@ export class Database { const repo = this._conn.getRepository(entity); const { tableName } = repo.metadata; + let subQuery = await repo.createQueryBuilder('subTable') + .select('MAX(subTable.block_number)') + .where(`subTable.id = ${tableName}.id`); + + if (blockHash) { + const { canonicalBlockNumber, blockHashes } = await this._getBranchInfo(blockHash); + + subQuery = subQuery + .andWhere(new Brackets(qb => { + qb.where('subTable.block_hash IN (:...blockHashes)', { blockHashes }) + .orWhere('subTable.block_number <= :canonicalBlockNumber', { canonicalBlockNumber }); + })); + } + + if (blockNumber) { + subQuery = subQuery.andWhere('subTable.block_number <= :blockNumber', { blockNumber }); + } + let selectQueryBuilder = repo.createQueryBuilder(tableName) - .distinctOn([`${tableName}.id`]) - .orderBy(`${tableName}.id`) - .addOrderBy(`${tableName}.block_number`, 'DESC'); + .where(`${tableName}.block_number IN (${subQuery.getQuery()})`) + .setParameters(subQuery.getParameters()); relations.forEach(relation => { selectQueryBuilder = selectQueryBuilder.leftJoinAndSelect(`${repo.metadata.tableName}.${relation}`, relation); @@ -380,20 +397,6 @@ export class Database { selectQueryBuilder = selectQueryBuilder.andWhere(`${tableName}.${field} = :value`, { value }); }); - if (blockHash) { - const { canonicalBlockNumber, blockHashes } = await this._getBranchInfo(blockHash); - - selectQueryBuilder = selectQueryBuilder - .andWhere(new Brackets(qb => { - qb.where(`${tableName}.block_hash IN (:...blockHashes)`, { blockHashes }) - .orWhere(`${tableName}.block_number <= :canonicalBlockNumber`, { canonicalBlockNumber }); - })); - } - - if (blockNumber) { - selectQueryBuilder = selectQueryBuilder.andWhere(`${tableName}.block_number <= :blockNumber`, { blockNumber }); - } - const { limit = DEFAULT_LIMIT, orderBy, orderDirection, skip = DEFAULT_SKIP } = queryOptions; // TODO: Use skip and take methods. Currently throws error when using with join. @@ -401,7 +404,7 @@ export class Database { .limit(limit); if (orderBy) { - selectQueryBuilder = selectQueryBuilder.addOrderBy(`${tableName}.${orderBy}`, orderDirection === 'desc' ? 'DESC' : 'ASC'); + selectQueryBuilder = selectQueryBuilder.orderBy(`${tableName}.${orderBy}`, orderDirection === 'desc' ? 'DESC' : 'ASC'); } return selectQueryBuilder.getMany(); diff --git a/packages/uni-info-watcher/src/indexer.ts b/packages/uni-info-watcher/src/indexer.ts index 33cd9237..d102200c 100644 --- a/packages/uni-info-watcher/src/indexer.ts +++ b/packages/uni-info-watcher/src/indexer.ts @@ -199,6 +199,10 @@ export class Indexer { return this._db.getPool({ id, blockHash: block.hash, blockNumber: block.number }); } + async getToken (id: string, block: BlockHeight): Promise { + return this._db.getToken({ id, blockHash: block.hash, blockNumber: block.number }); + } + async getEntities (entity: new () => Entity, where: Partial, queryOptions: QueryOptions, relations?: string[]): Promise { const res = await this._db.getEntities(entity, where, queryOptions, relations); return res; diff --git a/packages/uni-info-watcher/src/resolvers.ts b/packages/uni-info-watcher/src/resolvers.ts index d2a0266d..7660f4d3 100644 --- a/packages/uni-info-watcher/src/resolvers.ts +++ b/packages/uni-info-watcher/src/resolvers.ts @@ -10,6 +10,8 @@ import { Mint } from './entity/Mint'; import { PoolDayData } from './entity/PoolDayData'; import { Pool } from './entity/Pool'; import { Swap } from './entity/Swap'; +import { Tick } from './entity/Tick'; +import { Token } from './entity/Token'; const log = debug('vulcanize:resolver'); @@ -79,6 +81,26 @@ export const createResolvers = async (indexer: Indexer): Promise => { log('swaps', first, orderBy, orderDirection, where); return indexer.getEntities(Swap, where, { limit: first, orderBy, orderDirection }, ['pool', 'transaction']); + }, + + ticks: async (_: any, { block = {}, first, skip, where = {} }: { block: BlockHeight, first: number, skip: number, where: Partial }) => { + log('ticks', block, first, skip, where); + where.blockHash = block.hash; + where.blockNumber = block.number; + + return indexer.getEntities(Tick, where, { limit: first, skip }); + }, + + token: async (_: any, { id, block = {} }: { id: string, block: BlockHeight }) => { + log('token', id, block); + + return indexer.getToken(id, block); + }, + + tokens: async (_: any, { orderBy, orderDirection, where }: { orderBy: string, orderDirection: OrderDirection, where: Partial }) => { + log('tokens', orderBy, orderDirection, where); + + return indexer.getEntities(Token, where, { orderBy, orderDirection }); } } };