diff --git a/core/src/main/java/org/opensearch/sql/expression/NamedExpression.java b/core/src/main/java/org/opensearch/sql/expression/NamedExpression.java index 03118311a9..a813c2a6d6 100644 --- a/core/src/main/java/org/opensearch/sql/expression/NamedExpression.java +++ b/core/src/main/java/org/opensearch/sql/expression/NamedExpression.java @@ -60,6 +60,6 @@ public T accept(ExpressionNodeVisitor visitor, C context) { @Override public String toString() { - return getNameOrAlias(); + return Strings.isNullOrEmpty(alias) ? name : name + " AS " + alias; } } diff --git a/core/src/test/java/org/opensearch/sql/executor/ExplainTest.java b/core/src/test/java/org/opensearch/sql/executor/ExplainTest.java index eaeae07242..7dbccbca84 100644 --- a/core/src/test/java/org/opensearch/sql/executor/ExplainTest.java +++ b/core/src/test/java/org/opensearch/sql/executor/ExplainTest.java @@ -77,7 +77,7 @@ void can_explain_project_filter_table_scan() { new ExplainResponse( new ExplainResponseNode( "ProjectOperator", - Map.of("fields", "[name, age]"), + Map.of("fields", "[full_name AS name, age]"), singletonList( new ExplainResponseNode( "FilterOperator", diff --git a/integ-test/src/test/java/org/opensearch/sql/legacy/ExplainIT.java b/integ-test/src/test/java/org/opensearch/sql/legacy/ExplainIT.java index 27f8eca3ef..8f59b25f70 100644 --- a/integ-test/src/test/java/org/opensearch/sql/legacy/ExplainIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/legacy/ExplainIT.java @@ -271,4 +271,23 @@ public void testContentTypeOfExplainRequestShouldBeJson() throws IOException { assertEquals("application/json; charset=UTF-8", response.getHeader("content-type")); } + + @Test + public void explainAlias() throws IOException { + + String expectedOutputFilePath = + TestUtils.getResourceFilePath("src/test/resources/expectedOutput/alias_explain.json"); + String expectedOutput = + Files.toString(new File(expectedOutputFilePath), StandardCharsets.UTF_8) + .replaceAll("\r", ""); + + String result = + explainQuery( + String.format( + "SELECT city, (age + 1) AS agePlusOne, (balance + 1000) as newBalance FROM %s LIMIT" + + " 10", + TEST_INDEX_ACCOUNT)); + Assert.assertThat( + result.replaceAll("\\s+", ""), equalTo(expectedOutput.replaceAll("\\s+", ""))); + } } diff --git a/integ-test/src/test/resources/expectedOutput/alias_explain.json b/integ-test/src/test/resources/expectedOutput/alias_explain.json new file mode 100644 index 0000000000..5665bae667 --- /dev/null +++ b/integ-test/src/test/resources/expectedOutput/alias_explain.json @@ -0,0 +1,17 @@ +{ + "root": { + "name": "ProjectOperator", + "description": { + "fields": "[city, (age+1) AS agePlusOne, (balance+1000) AS newBalance]" + }, + "children": [ + { + "name": "OpenSearchIndexScan", + "description": { + "request": "OpenSearchQueryRequest(indexName=opensearch-sql_test_index_account,sourceBuilder={\"from\":0,\"size\":10,\"timeout\":\"1m\",\"_source\":{\"includes\":[\"age\",\"city\",\"balance\"],\"excludes\":[]}},searchDone=false)" + }, + "children": [] + } + ] + } +}