22Extended functionality for the ExecutionAPI
33"""
44from __future__ import annotations
5+
6+ import logging
57import time
8+
69from io import BytesIO
710from typing import Union , Optional , Any
811
1922)
2023from dune_client .query import QueryBase , parse_query_object_or_id
2124from dune_client .types import QueryParameter
25+ from dune_client .util import age_in_hours
26+
27+ THREE_MONTHS_IN_HOURS = 2191
2228
2329
2430class ExtendedAPI (ExecutionAPI , QueryAPI ):
@@ -76,13 +82,17 @@ def run_query_dataframe(
7682 data = self .run_query_csv (query , ping_frequency , performance ).data
7783 return pandas .read_csv (data )
7884
79- def get_latest_result (self , query : Union [QueryBase , str , int ]) -> ResultsResponse :
85+ def get_latest_result (
86+ self ,
87+ query : Union [QueryBase , str , int ],
88+ max_age_hours : int = THREE_MONTHS_IN_HOURS ,
89+ ) -> ResultsResponse :
8090 """
8191 GET the latest results for a query_id without re-executing the query
8292 (doesn't use execution credits)
8393
8494 :param query: :class:`Query` object OR query id as string or int
85-
95+ :param max_age_hours: re-executes the query if result is older than max_age_hours
8696 https://dune.com/docs/api/api-reference/get-results/latest-results
8797 """
8898 params , query_id = parse_query_object_or_id (query )
@@ -91,7 +101,17 @@ def get_latest_result(self, query: Union[QueryBase, str, int]) -> ResultsRespons
91101 params = params ,
92102 )
93103 try :
94- return ResultsResponse .from_dict (response_json )
104+ results = ResultsResponse .from_dict (response_json )
105+ last_run = results .times .execution_ended_at
106+ if last_run and age_in_hours (last_run ) > max_age_hours :
107+ # Query older than specified max age
108+ logging .info (
109+ f"results (from { last_run } ) older than { max_age_hours } hours, re-running query"
110+ )
111+ results = self .run_query (
112+ query if isinstance (query , QueryBase ) else QueryBase (query_id )
113+ )
114+ return results
95115 except KeyError as err :
96116 raise DuneError (response_json , "ResultsResponse" , err ) from err
97117
0 commit comments