@@ -38,6 +38,7 @@ async def query(
38
38
dto : QueryDTO ,
39
39
dry_run : Annotated [bool , Query (alias = "dryRun" )] = False ,
40
40
cache_enable : Annotated [bool , Query (alias = "cacheEnable" )] = False ,
41
+ override_cache : Annotated [bool , Query (alias = "overrideCache" )] = False ,
41
42
limit : int | None = None ,
42
43
headers : Annotated [str | None , Header ()] = None ,
43
44
java_engine_connector : JavaEngineConnector = Depends (get_java_engine_connector ),
@@ -69,24 +70,59 @@ async def query(
69
70
70
71
if cache_enable :
71
72
cached_result = query_cache_manager .get (
72
- str ( data_source ) , dto .sql , dto .connection_info
73
+ data_source , dto .sql , dto .connection_info
73
74
)
74
75
cache_hit = cached_result is not None
75
76
76
- if cache_hit :
77
- span .add_event ("cache hit" )
78
- response = ORJSONResponse (to_json (cached_result ))
79
- response .headers ["X-Cache-Hit" ] = str (cache_hit ).lower ()
80
- return response
81
- else :
82
- result = connector .query (rewritten_sql , limit = limit )
83
- if cache_enable :
77
+ match (cache_enable , cache_hit , override_cache ):
78
+ # case 1 cache hit read
79
+ case (True , True , False ):
80
+ span .add_event ("cache hit" )
81
+ response = ORJSONResponse (to_json (cached_result ))
82
+ response .headers ["X-Cache-Hit" ] = "true"
83
+ response .headers ["X-Cache-Create-At" ] = str (
84
+ query_cache_manager .get_cache_file_timestamp (
85
+ data_source , dto .sql , dto .connection_info
86
+ )
87
+ )
88
+ # case 2 cache hit but override cache
89
+ case (True , True , True ):
90
+ result = connector .query (rewritten_sql , limit = limit )
91
+ response = ORJSONResponse (to_json (result ))
92
+ # because we override the cache, so we need to set the cache hit to false
93
+ response .headers ["X-Cache-Hit" ] = "false"
94
+ response .headers ["X-Cache-Create-At" ] = str (
95
+ query_cache_manager .get_cache_file_timestamp (
96
+ data_source , dto .sql , dto .connection_info
97
+ )
98
+ )
99
+ query_cache_manager .set (
100
+ data_source , dto .sql , result , dto .connection_info
101
+ )
102
+ response .headers ["X-Cache-Override" ] = "true"
103
+ response .headers ["X-Cache-Override-At" ] = str (
104
+ query_cache_manager .get_cache_file_timestamp (
105
+ data_source , dto .sql , dto .connection_info
106
+ )
107
+ )
108
+ # case 3 and case 4 cache miss read (first time cache read need to create cache)
109
+ # no matter the cache override or not, we need to create cache
110
+ case (True , False , _):
111
+ result = connector .query (rewritten_sql , limit = limit )
112
+
113
+ # set cache
84
114
query_cache_manager .set (
85
115
data_source , dto .sql , result , dto .connection_info
86
116
)
87
- response = ORJSONResponse (to_json (result ))
88
- response .headers ["X-Cache-Hit" ] = str (cache_hit ).lower ()
89
- return response
117
+ response = ORJSONResponse (to_json (result ))
118
+ response .headers ["X-Cache-Hit" ] = "false"
119
+ # case 5~8 Other cases (cache is not enabled)
120
+ case (False , _, _):
121
+ result = connector .query (rewritten_sql , limit = limit )
122
+ response = ORJSONResponse (to_json (result ))
123
+ response .headers ["X-Cache-Hit" ] = "false"
124
+
125
+ return response
90
126
except Exception as e :
91
127
logger .warning (
92
128
"Failed to execute v3 query, fallback to v2: {}\n " + MIGRATION_MESSAGE ,
@@ -97,6 +133,7 @@ async def query(
97
133
dto ,
98
134
dry_run ,
99
135
cache_enable ,
136
+ override_cache ,
100
137
limit ,
101
138
java_engine_connector ,
102
139
query_cache_manager ,
0 commit comments