From 1ce122e7689cb56f9f2c6295aa8e65f9bdfc39aa Mon Sep 17 00:00:00 2001 From: Ben Smith Date: Thu, 15 Feb 2024 18:23:56 +0100 Subject: [PATCH 1/4] add large performance query --- src/api/execution.ts | 3 +++ src/api/extensions.ts | 8 +++++++- src/api/query.ts | 6 +----- src/api/router.ts | 5 +---- src/types/requestPayload.ts | 6 ++++++ tests/e2e/client.spec.ts | 11 +++++++++++ 6 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/api/execution.ts b/src/api/execution.ts index d6f522e..67500a3 100644 --- a/src/api/execution.ts +++ b/src/api/execution.ts @@ -7,15 +7,18 @@ import { import log from "loglevel"; import { logPrefix } from "../utils"; import { Router } from "./router"; +import { ExecutionPerformance } from "../types/requestPayload"; // This class implements all the routes defined in the Dune API Docs: https://dune.com/docs/api/ export class ExecutionClient extends Router { async executeQuery( queryID: number, parameters?: QueryParameter[], + performance?: ExecutionPerformance, ): Promise { const response = await this._post(`query/${queryID}/execute`, { query_parameters: parameters ? parameters : [], + performance: performance ? performance : ExecutionPerformance.Medium, }); log.debug(logPrefix, `execute response ${JSON.stringify(response)}`); return response as ExecutionResponse; diff --git a/src/api/extensions.ts b/src/api/extensions.ts index 51afb9e..990acde 100644 --- a/src/api/extensions.ts +++ b/src/api/extensions.ts @@ -4,6 +4,7 @@ import log from "loglevel"; import { logPrefix } from "../utils"; import { ExecutionClient } from "./execution"; import { POLL_FREQUENCY_SECONDS, THREE_MONTHS_IN_HOURS } from "../constants"; +import { ExecutionPerformance } from "../types/requestPayload"; const TERMINAL_STATES = [ ExecutionState.CANCELLED, @@ -16,6 +17,7 @@ export class ExtendedClient extends ExecutionClient { queryID: number, parameters?: QueryParameter[], pingFrequency: number = POLL_FREQUENCY_SECONDS, + performance?: ExecutionPerformance, ): Promise { log.info( logPrefix, @@ -23,7 +25,11 @@ export class ExtendedClient extends ExecutionClient { parameters, )}`, ); - const { execution_id: jobID } = await this.execute(queryID, parameters); + const { execution_id: jobID } = await this.executeQuery( + queryID, + parameters, + performance, + ); let { state } = await this.getExecutionStatus(jobID); while (!TERMINAL_STATES.includes(state)) { log.info( diff --git a/src/api/query.ts b/src/api/query.ts index 8ad1008..d06e729 100644 --- a/src/api/query.ts +++ b/src/api/query.ts @@ -1,10 +1,6 @@ // Assuming the existence of these imports based on your Python code import { Router } from "./router"; -import { - DuneQuery, - QueryParameter, - CreateQueryResponse, -} from "../types"; +import { DuneQuery, QueryParameter, CreateQueryResponse } from "../types"; import { CreateQueryPayload, UpdateQueryPayload } from "../types/requestPayload"; export class QueryAPI extends Router { diff --git a/src/api/router.ts b/src/api/router.ts index 6985e84..29242d2 100644 --- a/src/api/router.ts +++ b/src/api/router.ts @@ -2,10 +2,7 @@ import { DuneError } from "../types"; import fetch from "cross-fetch"; import log from "loglevel"; import { logPrefix } from "../utils"; -import { - RequestPayload, - payloadJSON, -} from "../types/requestPayload"; +import { RequestPayload, payloadJSON } from "../types/requestPayload"; const BASE_URL = "https://api.dune.com/api/v1"; diff --git a/src/types/requestPayload.ts b/src/types/requestPayload.ts index 0114ac3..6b78eaa 100644 --- a/src/types/requestPayload.ts +++ b/src/types/requestPayload.ts @@ -1,5 +1,10 @@ import { QueryParameter } from "./queryParameter"; +export enum ExecutionPerformance { + Medium = "medium", + Large = "large", +} + export type RequestPayload = | ExecuteQueryPayload | UpdateQueryPayload @@ -24,6 +29,7 @@ export function payloadJSON(payload?: RequestPayload): string { export interface ExecuteQueryPayload { query_parameters?: QueryParameter[]; + performance: string; } export interface UpdateQueryPayload { diff --git a/tests/e2e/client.spec.ts b/tests/e2e/client.spec.ts index 69b902b..aa6f533 100644 --- a/tests/e2e/client.spec.ts +++ b/tests/e2e/client.spec.ts @@ -7,6 +7,7 @@ import { QueryAPI, } from "../../src/"; import log from "loglevel"; +import { ExecutionPerformance } from "../../src/types/requestPayload"; const { DUNE_API_KEY } = process.env; const apiKey: string = DUNE_API_KEY ? DUNE_API_KEY : "No API Key"; @@ -75,6 +76,16 @@ describe("DuneClient: native routes", () => { expect(execution.execution_id).is.not.null; }); + it("execute with Large tier performance", async () => { + const client = new DuneClient(apiKey); + const execution = await client.executeQuery( + 1215383, + undefined, + ExecutionPerformance.Large, + ); + expect(execution.execution_id).is.not.null; + }); + it("returns expected results on cancelled query exection", async () => { const client = new DuneClient(apiKey); // Execute and check state From acee6f95358a352340701d1310e6dda6889d8057 Mon Sep 17 00:00:00 2001 From: Ben Smith Date: Thu, 15 Feb 2024 21:37:09 +0100 Subject: [PATCH 2/4] use ExecutionParams interface --- src/api/execution.ts | 17 ++++++++++++----- src/api/extensions.ts | 13 ++++--------- src/types/requestPayload.ts | 5 +++++ tests/e2e/client.spec.ts | 17 +++++++++-------- 4 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/api/execution.ts b/src/api/execution.ts index 67500a3..02eb68b 100644 --- a/src/api/execution.ts +++ b/src/api/execution.ts @@ -7,18 +7,25 @@ import { import log from "loglevel"; import { logPrefix } from "../utils"; import { Router } from "./router"; -import { ExecutionPerformance } from "../types/requestPayload"; +import { ExecutionParams, ExecutionPerformance } from "../types/requestPayload"; // This class implements all the routes defined in the Dune API Docs: https://dune.com/docs/api/ export class ExecutionClient extends Router { async executeQuery( queryID: number, - parameters?: QueryParameter[], - performance?: ExecutionPerformance, + params?: ExecutionParams, ): Promise { + // Extract possible ExecutionParams + let query_parameters: QueryParameter[] = []; + let performance = ExecutionPerformance.Medium; + if (params !== undefined) { + query_parameters = params.query_parameters ? params.query_parameters : []; + performance = performance ? performance : ExecutionPerformance.Medium; + } + const response = await this._post(`query/${queryID}/execute`, { - query_parameters: parameters ? parameters : [], - performance: performance ? performance : ExecutionPerformance.Medium, + query_parameters, + performance, }); log.debug(logPrefix, `execute response ${JSON.stringify(response)}`); return response as ExecutionResponse; diff --git a/src/api/extensions.ts b/src/api/extensions.ts index 990acde..88604ba 100644 --- a/src/api/extensions.ts +++ b/src/api/extensions.ts @@ -4,7 +4,7 @@ import log from "loglevel"; import { logPrefix } from "../utils"; import { ExecutionClient } from "./execution"; import { POLL_FREQUENCY_SECONDS, THREE_MONTHS_IN_HOURS } from "../constants"; -import { ExecutionPerformance } from "../types/requestPayload"; +import { ExecutionParams, ExecutionPerformance } from "../types/requestPayload"; const TERMINAL_STATES = [ ExecutionState.CANCELLED, @@ -15,21 +15,16 @@ const TERMINAL_STATES = [ export class ExtendedClient extends ExecutionClient { async runQuery( queryID: number, - parameters?: QueryParameter[], + params?: ExecutionParams, pingFrequency: number = POLL_FREQUENCY_SECONDS, - performance?: ExecutionPerformance, ): Promise { log.info( logPrefix, `refreshing query https://dune.com/queries/${queryID} with parameters ${JSON.stringify( - parameters, + params, )}`, ); - const { execution_id: jobID } = await this.executeQuery( - queryID, - parameters, - performance, - ); + const { execution_id: jobID } = await this.executeQuery(queryID, params); let { state } = await this.getExecutionStatus(jobID); while (!TERMINAL_STATES.includes(state)) { log.info( diff --git a/src/types/requestPayload.ts b/src/types/requestPayload.ts index 6b78eaa..df6de14 100644 --- a/src/types/requestPayload.ts +++ b/src/types/requestPayload.ts @@ -1,5 +1,10 @@ import { QueryParameter } from "./queryParameter"; +export interface ExecutionParams { + query_parameters?: QueryParameter[]; + performance?: ExecutionPerformance; +} + export enum ExecutionPerformance { Medium = "medium", Large = "large", diff --git a/tests/e2e/client.spec.ts b/tests/e2e/client.spec.ts index aa6f533..cff8c74 100644 --- a/tests/e2e/client.spec.ts +++ b/tests/e2e/client.spec.ts @@ -72,17 +72,17 @@ describe("DuneClient: native routes", () => { QueryParameter.enum("ListField", "Option 1"), ]; // Execute and check state - const execution = await client.executeQuery(queryID, parameters); + const execution = await client.executeQuery(queryID, { + query_parameters: parameters, + }); expect(execution.execution_id).is.not.null; }); it("execute with Large tier performance", async () => { const client = new DuneClient(apiKey); - const execution = await client.executeQuery( - 1215383, - undefined, - ExecutionPerformance.Large, - ); + const execution = await client.executeQuery(1215383, { + performance: ExecutionPerformance.Large, + }); expect(execution.execution_id).is.not.null; }); @@ -191,9 +191,10 @@ describe("DuneClient: Errors", () => { const client = new DuneClient(apiKey); const queryID = 1215383; const invalidParameterName = "Invalid Parameter Name"; - const parameters = [QueryParameter.text(invalidParameterName, "")]; await expectAsyncThrow( - client.executeQuery(queryID, parameters), + client.executeQuery(queryID, { + query_parameters: [QueryParameter.text(invalidParameterName, "")], + }), `unknown parameters (${invalidParameterName})`, ); }); From 90750e58312e539915e759327dc82387cfdafe5b Mon Sep 17 00:00:00 2001 From: Ben Smith Date: Thu, 15 Feb 2024 21:40:06 +0100 Subject: [PATCH 3/4] fix some other issues --- src/api/execution.ts | 2 +- src/api/extensions.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/api/execution.ts b/src/api/execution.ts index 02eb68b..36ad266 100644 --- a/src/api/execution.ts +++ b/src/api/execution.ts @@ -61,7 +61,7 @@ export class ExecutionClient extends Router { queryID: number, parameters?: QueryParameter[], ): Promise { - return this.executeQuery(queryID, parameters); + return this.executeQuery(queryID, {query_parameters: parameters}); } /** diff --git a/src/api/extensions.ts b/src/api/extensions.ts index 88604ba..5a99fa2 100644 --- a/src/api/extensions.ts +++ b/src/api/extensions.ts @@ -58,7 +58,7 @@ export class ExtendedClient extends ExecutionClient { logPrefix, `results (from ${lastRun}) older than ${maxAgeHours} hours, re-running query.`, ); - results = await this.runQuery(queryId, parameters); + results = await this.runQuery(queryId, {query_parameters: parameters}); } return results; } @@ -71,6 +71,6 @@ export class ExtendedClient extends ExecutionClient { parameters?: QueryParameter[], pingFrequency: number = 1, ): Promise { - return this.runQuery(queryID, parameters, pingFrequency); + return this.runQuery(queryID, {query_parameters: parameters}, pingFrequency); } } From 9b15184597613782e645ff7483155a1a26fadc20 Mon Sep 17 00:00:00 2001 From: Ben Smith Date: Thu, 15 Feb 2024 21:42:40 +0100 Subject: [PATCH 4/4] update readme --- README.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index c776c44..1423d94 100644 --- a/README.md +++ b/README.md @@ -17,15 +17,17 @@ const { DUNE_API_KEY } = process.env; const client = new DuneClient(DUNE_API_KEY ?? ""); const queryID = 1215383; -const parameters = [ - QueryParameter.text("TextField", "Plain Text"), - QueryParameter.number("NumberField", 3.1415926535), - QueryParameter.date("DateField", "2022-05-04 00:00:00"), - QueryParameter.enum("ListField", "Option 1"), -]; +const params = { + query_parameters = [ + QueryParameter.text("TextField", "Plain Text"), + QueryParameter.number("NumberField", 3.1415926535), + QueryParameter.date("DateField", "2022-05-04 00:00:00"), + QueryParameter.enum("ListField", "Option 1"), + ] +}; client - .runQuery(queryID, parameters) + .runQuery(queryID, params) .then((executionResult) => console.log(executionResult.result?.rows)); // should look like