Browse Source

Task/refactor historical market data query (#8116)

Refactor historical market data query
pull/8117/head
Thomas Kaul 4 days ago
committed by GitHub
parent
commit
c88ff79d0b
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 10
      apps/api/src/app/portfolio/portfolio.service.ts
  2. 40
      apps/api/src/services/data-provider/data-provider.service.ts
  3. 10
      apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts

10
apps/api/src/app/portfolio/portfolio.service.ts

@ -1056,11 +1056,11 @@ export class PortfolioService {
); );
}); });
const historicalData = await this.dataProviderService.getHistorical( const historicalData = await this.dataProviderService.getHistorical({
[{ dataSource, symbol }], assetProfileIdentifiers: [{ dataSource, symbol }],
parseISO(dateOfFirstActivity, { in: utc }), from: parseISO(dateOfFirstActivity, { in: utc }),
new Date() to: new Date()
); });
const [firstActivity] = activitiesOfHolding; const [firstActivity] = activitiesOfHolding;
const referenceUnitPrice = const referenceUnitPrice =

40
apps/api/src/services/data-provider/data-provider.service.ts

@ -369,11 +369,15 @@ export class DataProviderService implements OnModuleInit {
}); });
} }
public async getHistorical( public async getHistorical({
aItems: AssetProfileIdentifier[], assetProfileIdentifiers,
from: Date, from,
to: Date to
): Promise<{ }: {
assetProfileIdentifiers: AssetProfileIdentifier[];
from: Date;
to: Date;
}): Promise<{
[assetProfileIdentifier: string]: { [assetProfileIdentifier: string]: {
[date: string]: DataProviderHistoricalResponse; [date: string]: DataProviderHistoricalResponse;
}; };
@ -384,35 +388,29 @@ export class DataProviderService implements OnModuleInit {
}; };
} = {}; } = {};
if (isEmpty(aItems) || !isValid(from) || !isValid(to)) { if (isEmpty(assetProfileIdentifiers) || !isValid(from) || !isValid(to)) {
return response; return response;
} }
const rangeQuery = const assetProfileIdentifierTuples = assetProfileIdentifiers.map(
from && to ({ dataSource, symbol }) => {
? Prisma.sql`AND date >= ${format(from, DATE_FORMAT, {
in: utc
})}::timestamp AND date <= ${format(to, DATE_FORMAT, {
in: utc
})}::timestamp`
: Prisma.empty;
const assetProfileIdentifiers = aItems.map(({ dataSource, symbol }) => {
return Prisma.sql`(${dataSource}::"DataSource", ${symbol})`; return Prisma.sql`(${dataSource}::"DataSource", ${symbol})`;
}); }
);
try { try {
const marketDataByGranularity: Pick< const marketDataItems: Pick<
MarketData, MarketData,
'dataSource' | 'date' | 'marketPrice' | 'symbol' 'dataSource' | 'date' | 'marketPrice' | 'symbol'
>[] = await this.prismaService.$queryRaw` >[] = await this.prismaService.$queryRaw`
SELECT "dataSource", "date", "marketPrice", "symbol" SELECT "dataSource", "date", "marketPrice", "symbol"
FROM "MarketData" FROM "MarketData"
WHERE ("dataSource", "symbol") IN (${Prisma.join(assetProfileIdentifiers)}) WHERE ("dataSource", "symbol") IN (${Prisma.join(assetProfileIdentifierTuples)})
${rangeQuery} AND date >= ${format(from, DATE_FORMAT, { in: utc })}::timestamp
AND date <= ${format(to, DATE_FORMAT, { in: utc })}::timestamp
ORDER BY date;`; ORDER BY date;`;
response = marketDataByGranularity.reduce((r, marketData) => { response = marketDataItems.reduce((r, marketData) => {
const { dataSource, date, marketPrice, symbol } = marketData; const { dataSource, date, marketPrice, symbol } = marketData;
const assetProfileIdentifier = getAssetProfileIdentifier({ const assetProfileIdentifier = getAssetProfileIdentifier({

10
apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts

@ -173,11 +173,11 @@ export class ExchangeRateDataService {
{ in: utc } { in: utc }
); );
const historicalData = await this.dataProviderService.getHistorical( const historicalData = await this.dataProviderService.getHistorical({
this.currencyPairs, assetProfileIdentifiers: this.currencyPairs,
startOfUtcDateOfYesterday, from: startOfUtcDateOfYesterday,
startOfUtcDateOfYesterday to: startOfUtcDateOfYesterday
); });
const quotes = await this.dataProviderService.getQuotes({ const quotes = await this.dataProviderService.getQuotes({
items: this.currencyPairs.map(({ dataSource, symbol }) => { items: this.currencyPairs.map(({ dataSource, symbol }) => {

Loading…
Cancel
Save