Resolver for Ticks and Token(s) methods (#177)

* Add query resolvers for Tick and Token entities.

* Implemented query for orderBy.

Co-authored-by: nabarun <nabarun@deepstacksoft.com>
This commit is contained in:
Ashwin Phatak 2021-08-02 15:46:21 +05:30 committed by GitHub
parent 9a3ac28a5d
commit f1a96e8ba9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 47 additions and 18 deletions

View File

@ -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();

View File

@ -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<Token | undefined> {
return this._db.getToken({ id, blockHash: block.hash, blockNumber: block.number });
}
async getEntities<Entity> (entity: new () => Entity, where: Partial<Entity>, queryOptions: QueryOptions, relations?: string[]): Promise<Entity[]> {
const res = await this._db.getEntities(entity, where, queryOptions, relations);
return res;

View File

@ -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<any> => {
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<Tick> }) => {
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<Token> }) => {
log('tokens', orderBy, orderDirection, where);
return indexer.getEntities(Token, where, { orderBy, orderDirection });
}
}
};