Skip to content

Commit

Permalink
Resolve Alias Issues in Legacy SQL with Filters (#2960)
Browse files Browse the repository at this point in the history
* Fix: Pagination of index aliases is not supported

Signed-off-by: Aparajita Pandey <[email protected]>

* fix: remove extra debug log

Signed-off-by: Aparajita Pandey <[email protected]>

* Integration testadded
Signed-off-by: Aparajita Pandey<[email protected]>

Signed-off-by: Aparajita Pandey <[email protected]>

* rollback change Signed-off-by: Aparajita Pandey<[email protected]>

Signed-off-by: Aparajita Pandey <[email protected]>

* Integration TestAdded Signed-off-by: Aparajita Pandey <[email protected]>

Signed-off-by: Aparajita Pandey <[email protected]>

* Integration TestAdded Signed-off-by: Aparajita Pandey <[email protected]>

Signed-off-by: Aparajita Pandey <[email protected]>

* SpotlessCheck Signed-off-by: Aparajita Pandey <[email protected]>

Signed-off-by: Aparajita Pandey <[email protected]>

---------

Signed-off-by: Aparajita Pandey <[email protected]>
  • Loading branch information
aparajita31pandey authored Oct 8, 2024
1 parent d7710d0 commit 564ab60
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -462,6 +462,12 @@ protected String makeRequest(String query, int fetch_size) {
return String.format("{ \"fetch_size\": \"%s\", \"query\": \"%s\" }", fetch_size, query);
}

protected String makeRequest(String query, int fetch_size, String filterQuery) {
return String.format(
"{ \"fetch_size\": \"%s\", \"query\": \"%s\", \"filter\" : %s }",
fetch_size, query, filterQuery);
}

protected String makeFetchLessRequest(String query) {
return String.format("{\n" + " \"query\": \"%s\"\n" + "}", query);
}
Expand Down
50 changes: 50 additions & 0 deletions integ-test/src/test/java/org/opensearch/sql/sql/PaginationIT.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.opensearch.sql.legacy.TestUtils.getResponseBody;
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_CALCS;
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_ONLINE;

Expand All @@ -18,6 +19,7 @@
import org.junit.Test;
import org.opensearch.client.Request;
import org.opensearch.client.RequestOptions;
import org.opensearch.client.Response;
import org.opensearch.client.ResponseException;
import org.opensearch.sql.common.setting.Settings;
import org.opensearch.sql.legacy.SQLIntegTestCase;
Expand Down Expand Up @@ -215,4 +217,52 @@ public void testQueryWithoutFrom() {
assertEquals(1, response.getInt("total"));
assertEquals(1, response.getJSONArray("datarows").getJSONArray(0).getInt(0));
}

@Test
public void testAlias() throws Exception {
String indexName = Index.ONLINE.getName();
String aliasName = "alias_ONLINE";
String filterQuery = "{\n" + " \"term\": {\n" + " \"107\": 72 \n" + " }\n" + "}";

// Execute the SQL query with filter
String selectQuery = "SELECT * FROM " + TEST_INDEX_ONLINE;
JSONObject initialResponse =
new JSONObject(executeFetchQuery(selectQuery, 10, "jdbc", filterQuery));
assertEquals(initialResponse.getInt("size"), 10);

// Create an alias
String createAliasQuery =
String.format(
"{ \"actions\": [ { \"add\": { \"index\": \"%s\", \"alias\": \"%s\" } } ] }",
indexName, aliasName);
Request createAliasRequest = new Request("POST", "/_aliases");
createAliasRequest.setJsonEntity(createAliasQuery);
JSONObject aliasResponse = new JSONObject(executeRequest(createAliasRequest));

// Assert that alias creation was acknowledged
assertTrue(aliasResponse.getBoolean("acknowledged"));

// Query using the alias
String aliasSelectQuery = String.format("SELECT * FROM %s", aliasName);
JSONObject aliasQueryResponse = new JSONObject(executeFetchQuery(aliasSelectQuery, 4, "jdbc"));
assertEquals(4, aliasQueryResponse.getInt("size"));

// Query using the alias with filter
JSONObject aliasFilteredResponse =
new JSONObject(executeFetchQuery(aliasSelectQuery, 4, "jdbc", filterQuery));
assertEquals(aliasFilteredResponse.getInt("size"), 4);
}

private String executeFetchQuery(String query, int fetchSize, String requestType, String filter)
throws IOException {
String endpoint = "/_plugins/_sql?format=" + requestType;
String requestBody = makeRequest(query, fetchSize, filter);

Request sqlRequest = new Request("POST", endpoint);
sqlRequest.setJsonEntity(requestBody);

Response response = client().performRequest(sqlRequest);
String responseString = getResponseBody(response, true);
return responseString;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
import java.util.stream.StreamSupport;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.opensearch.action.admin.indices.alias.get.GetAliasesRequest;
import org.opensearch.action.admin.indices.alias.get.GetAliasesResponse;
import org.opensearch.action.admin.indices.mapping.get.GetFieldMappingsRequest;
import org.opensearch.action.admin.indices.mapping.get.GetFieldMappingsResponse;
import org.opensearch.action.search.ClearScrollResponse;
Expand Down Expand Up @@ -164,7 +166,11 @@ private void populateResultSetFromDefaultCursor(DefaultCursor cursor) {
private void loadFromEsState(Query query) {
String indexName = fetchIndexName(query);
String[] fieldNames = fetchFieldsAsArray(query);

GetAliasesResponse getAliasesResponse =
client.admin().indices().getAliases(new GetAliasesRequest(indexName)).actionGet();
if (getAliasesResponse != null && !getAliasesResponse.getAliases().isEmpty()) {
indexName = getAliasesResponse.getAliases().keySet().iterator().next();
}
// Reset boolean in the case of JOIN query where multiple calls to loadFromEsState() are made
selectAll = isSimpleQuerySelectAll(query) || isJoinQuerySelectAll(query, fieldNames);

Expand Down

0 comments on commit 564ab60

Please sign in to comment.