|
61 | 61 | import org.opensearch.sql.legacy.request.SqlRequestParam; |
62 | 62 | import org.opensearch.sql.legacy.rewriter.matchtoterm.VerificationException; |
63 | 63 | import org.opensearch.sql.legacy.utils.JsonPrettyFormatter; |
| 64 | +import org.opensearch.sql.legacy.utils.QueryDataAnonymizer; |
64 | 65 | import org.opensearch.sql.sql.domain.SQLQueryRequest; |
65 | 66 | import org.opensearch.transport.client.Client; |
66 | 67 | import org.opensearch.transport.client.node.NodeClient; |
@@ -158,32 +159,52 @@ protected RestChannelConsumer prepareRequest(RestRequest request, NodeClient cli |
158 | 159 | final SQLQueryRequest finalRequest = newSqlRequest; |
159 | 160 | return channel -> { |
160 | 161 | if (!analyticsRouter.apply(finalRequest, channel)) { |
161 | | - // Not an analytics query — delegate to normal SQL engine |
162 | | - try { |
163 | | - newSqlQueryHandler |
164 | | - .prepareRequest( |
165 | | - finalRequest, |
166 | | - (ch, ex) -> { |
167 | | - try { |
168 | | - Format fmt = SqlRequestParam.getFormat(request.params()); |
169 | | - QueryAction qa = explainRequest(client, sqlRequest, fmt); |
170 | | - executeSqlRequest(request, qa, client, ch); |
171 | | - } catch (Exception e) { |
172 | | - handleException(ch, e); |
173 | | - } |
174 | | - }, |
175 | | - this::handleException) |
176 | | - .accept(channel); |
177 | | - } catch (Exception e) { |
178 | | - handleException(channel, e); |
179 | | - } |
| 162 | + delegateToV2Engine(request, client, sqlRequest, finalRequest, format, channel); |
180 | 163 | } |
181 | 164 | }; |
182 | 165 | } catch (Exception e) { |
183 | 166 | return channel -> handleException(channel, e); |
184 | 167 | } |
185 | 168 | } |
186 | 169 |
|
| 170 | + /** Delegate a SQL query to the V2 engine with legacy fallback. */ |
| 171 | + private void delegateToV2Engine( |
| 172 | + RestRequest request, |
| 173 | + NodeClient client, |
| 174 | + SqlRequest sqlRequest, |
| 175 | + SQLQueryRequest sqlQueryRequest, |
| 176 | + Format format, |
| 177 | + RestChannel channel) { |
| 178 | + try { |
| 179 | + newSqlQueryHandler |
| 180 | + .prepareRequest( |
| 181 | + sqlQueryRequest, |
| 182 | + (restChannel, exception) -> { |
| 183 | + try { |
| 184 | + if (sqlQueryRequest.isExplainRequest()) { |
| 185 | + LOG.info( |
| 186 | + "Request is falling back to old SQL engine due to: " |
| 187 | + + exception.getMessage()); |
| 188 | + } |
| 189 | + LOG.info( |
| 190 | + "[{}] Request {} is not supported and falling back to old SQL engine", |
| 191 | + QueryContext.getRequestId(), |
| 192 | + sqlQueryRequest); |
| 193 | + LOG.info( |
| 194 | + "Request Query: {}", QueryDataAnonymizer.anonymizeData(sqlRequest.getSql())); |
| 195 | + QueryAction queryAction = explainRequest(client, sqlRequest, format); |
| 196 | + executeSqlRequest(request, queryAction, client, restChannel); |
| 197 | + } catch (Exception e) { |
| 198 | + handleException(restChannel, e); |
| 199 | + } |
| 200 | + }, |
| 201 | + this::handleException) |
| 202 | + .accept(channel); |
| 203 | + } catch (Exception e) { |
| 204 | + handleException(channel, e); |
| 205 | + } |
| 206 | + } |
| 207 | + |
187 | 208 | private void handleException(RestChannel restChannel, Exception exception) { |
188 | 209 | logAndPublishMetrics(exception); |
189 | 210 | if (exception instanceof OpenSearchException) { |
|
0 commit comments