Check if a query can use read-only optimization
(&self, query: &str)
| 147 | |
| 148 | /// Check if a query can use read-only optimization |
| 149 | fn can_use_read_only_optimization(&self, query: &str) -> bool { |
| 150 | let query_upper = query.to_uppercase(); |
| 151 | |
| 152 | // Must be a SELECT query |
| 153 | if !query_upper.trim().starts_with("SELECT") { |
| 154 | return false; |
| 155 | } |
| 156 | |
| 157 | // Exclude complex queries that need full processing |
| 158 | if query_upper.contains("JOIN") || |
| 159 | query_upper.contains("UNION") || |
| 160 | query_upper.contains("SUBQUERY") || |
| 161 | query_upper.contains("WITH") || |
| 162 | query_upper.contains("CASE") || |
| 163 | query_upper.contains("WINDOW") || |
| 164 | query_upper.contains("RECURSIVE") { |
| 165 | return false; |
| 166 | } |
| 167 | |
| 168 | // Exclude queries with functions that might need translation |
| 169 | if query_upper.contains("NOW()") || |
| 170 | query_upper.contains("CURRENT_TIMESTAMP") || |
| 171 | query_upper.contains("CURRENT_DATE") || |
| 172 | query_upper.contains("CURRENT_TIME") || |
| 173 | query_upper.contains("::") || // Type casts |
| 174 | query_upper.contains("EXTRACT") || |
| 175 | query_upper.contains("DATE_TRUNC") { |
| 176 | return false; |
| 177 | } |
| 178 | |
| 179 | true |
| 180 | } |
| 181 | |
| 182 | /// Generate a normalized cache key for the query |
| 183 | fn generate_cache_key(&self, query: &str) -> String { |
no outgoing calls
no test coverage detected