1414
1515"""FastAPI endpoint for executing queries."""
1616
17+ from concurrent import futures
18+
1719import fastapi
1820import pydantic
1921import uvicorn
@@ -37,7 +39,7 @@ class ApiExecutorRequest(pydantic.BaseModel):
3739 source : str
3840 title : str | None = None
3941 query : str | None = None
40- query_path : str | None = None
42+ query_path : str | list [ str ] | None = None
4143 context : garf_executors .api_executor .ApiExecutionContext
4244
4345 @pydantic .model_validator (mode = 'after' )
@@ -49,7 +51,7 @@ def check_query_specified(self):
4951 return self
5052
5153 def model_post_init (self , __context__ ) -> None :
52- if self .query_path :
54+ if self .query_path and isinstance ( self . query_path , str ) :
5355 self .query = reader .FileReader ().read (self .query_path )
5456 if not self .title :
5557 self .title = str (self .query_path )
@@ -76,6 +78,36 @@ async def execute(request: ApiExecutorRequest) -> dict[str, str]:
7678 )
7779
7880
81+ @router .post ('/execute:batch' )
82+ async def execute_batch (request : ApiExecutorRequest ) -> dict [str , str ]:
83+ if not (concrete_api_fetcher := garf_executors .FETCHERS .get (request .source )):
84+ raise exceptions .GarfExecutorError (
85+ f'Source { request .source } is not available.'
86+ )
87+
88+ query_executor = garf_executors .api_executor .ApiQueryExecutor (
89+ concrete_api_fetcher (** request .context .fetcher_parameters )
90+ )
91+ file_reader = reader .FileReader ()
92+ results = []
93+ with futures .ThreadPoolExecutor () as executor :
94+ future_to_query = {
95+ executor .submit (
96+ query_executor .execute ,
97+ file_reader .read (query ),
98+ query ,
99+ request .context ,
100+ ): query
101+ for query in request .query_path
102+ }
103+ for future in futures .as_completed (future_to_query ):
104+ results .append (future .result ())
105+
106+ return fastapi .responses .JSONResponse (
107+ content = fastapi .encoders .jsonable_encoder ({'result' : results })
108+ )
109+
110+
79111if __name__ == '__main__' :
80112 app = fastapi .FastAPI ()
81113 app .include_router (router )
0 commit comments