forked from opensearch-project/sql
-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Legacy fall back with JSON format #237
Merged
Merged
Changes from 36 commits
Commits
Show all changes
40 commits
Select commit
Hold shift + click to select a range
9f2ad1d
Implement json support for V2 engine
margarit-h 3167ee5
Reverted some changes
margarit-h 5e7a28d
Removed some fields
margarit-h ab98db4
minor fix
margarit-h 26920d0
Added a unit test, cleaned up
margarit-h 543773e
Returning raw OpenSearch response when type is json
margarit-h 3f23122
Add an integration test, fix checkstyle errors
margarit-h 1365ae0
Made new engine fallback to legacy for in memory operations for json …
GumpacG 8e43ba6
Address build failures
799a4ce
Added legacy fall back
GumpacG a82de60
Refactored fall back logic to use visitor design pattern
GumpacG f11274f
Added unit tests
GumpacG 16af6ea
Revert "Address build failures"
GumpacG 7a782c7
Removed unnecessary IT
GumpacG 52a3c99
Addressed PR feedback
GumpacG b676acd
Removed unnecessary context
GumpacG f7c5ee6
Added fall back for Filter functions
GumpacG bdb0ff6
Made new engine fallback to legacy for in memory operations for json …
GumpacG 7b4fea1
Address build failures
581e7fe
Added legacy fall back
GumpacG d882830
Refactored fall back logic to use visitor design pattern
GumpacG 7ecc76e
Added unit tests
GumpacG 1a85ff0
Revert "Address build failures"
GumpacG bb2d8e4
Removed unnecessary IT
GumpacG ce02e9d
Addressed PR feedback
GumpacG dbe5067
Removed unnecessary context
GumpacG 4ff206b
Added fall back for Filter functions
GumpacG 44fd436
Merge branch 'dev-json-fallback' of github.com:Bit-Quill/opensearch-p…
GumpacG a31dc27
Address build failures (#1366)
bee2102
Fixed checkstyle errors
GumpacG 74f88ae
Addressed PR comments and fixed the visitor
GumpacG 6785f23
Added comment to visitor class
GumpacG 9e733aa
Addressed PR comments to improve visitor class
GumpacG 232196d
Added unit tests for JsonSupportVisitor
GumpacG e0e2365
Added helper function for SQLServiceTest
GumpacG b60da69
Added expected failures
GumpacG c2cb0f3
Reworked the visitor class to have type Void instead of Boolean
GumpacG 3bd7865
Resolved merge conflicts
GumpacG 9233d7c
Fixed typo
GumpacG 3335354
Added github link for tracking issue
GumpacG File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
119 changes: 119 additions & 0 deletions
119
core/src/main/java/org/opensearch/sql/analysis/JsonSupportVisitor.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,119 @@ | ||
/* | ||
* Copyright OpenSearch Contributors | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package org.opensearch.sql.analysis; | ||
|
||
import org.apache.commons.lang3.StringUtils; | ||
import org.opensearch.sql.ast.AbstractNodeVisitor; | ||
import org.opensearch.sql.ast.Node; | ||
import org.opensearch.sql.ast.expression.Alias; | ||
import org.opensearch.sql.ast.expression.Cast; | ||
import org.opensearch.sql.ast.expression.Function; | ||
import org.opensearch.sql.ast.expression.Literal; | ||
import org.opensearch.sql.ast.tree.Aggregation; | ||
import org.opensearch.sql.ast.tree.Project; | ||
|
||
/** | ||
* This visitor's sole purpose is to throw UnsupportedOperationExceptions | ||
* for unsupported features in the new engine when JSON format is specified. | ||
* Unsupported features in V2 are ones the produce results that differ from | ||
* legacy results. | ||
*/ | ||
public class JsonSupportVisitor extends AbstractNodeVisitor<Boolean, JsonSupportVisitorContext> { | ||
@Override | ||
public Boolean visit(Node node, JsonSupportVisitorContext context) { | ||
return visitChildren(node, context); | ||
} | ||
|
||
@Override | ||
public Boolean visitChildren(Node node, JsonSupportVisitorContext context) { | ||
for (Node child : node.getChild()) { | ||
if (!child.accept(this, context)) { | ||
return Boolean.FALSE; | ||
} | ||
} | ||
return Boolean.TRUE; | ||
} | ||
|
||
@Override | ||
public Boolean visitAggregation(Aggregation node, JsonSupportVisitorContext context) { | ||
if (node.getGroupExprList().isEmpty()) { | ||
return Boolean.TRUE; | ||
} else { | ||
context.setUnsupportedOperationException(new UnsupportedOperationException( | ||
"Queries with aggregation are not yet supported with json format in the new engine")); | ||
return Boolean.FALSE; | ||
} | ||
} | ||
|
||
@Override | ||
public Boolean visitFunction(Function node, JsonSupportVisitorContext context) { | ||
// Supported if outside of Project | ||
if (!context.isVisitingProject()) { | ||
return Boolean.TRUE; | ||
} | ||
|
||
// queries with function calls are not supported. | ||
context.setUnsupportedOperationException(new UnsupportedOperationException( | ||
"Queries with functions are not yet supported with json format in the new engine")); | ||
return Boolean.FALSE; | ||
} | ||
|
||
@Override | ||
public Boolean visitLiteral(Literal node, JsonSupportVisitorContext context) { | ||
// Supported if outside of Project | ||
if (!context.isVisitingProject()) { | ||
return Boolean.TRUE; | ||
} | ||
|
||
// queries with literal values are not supported | ||
context.setUnsupportedOperationException(new UnsupportedOperationException( | ||
"Queries with literals are not yet supported with json format in the new engine")); | ||
return Boolean.FALSE; | ||
} | ||
|
||
@Override | ||
public Boolean visitCast(Cast node, JsonSupportVisitorContext context) { | ||
// Supported if outside of Project | ||
if (!context.isVisitingProject()) { | ||
return Boolean.TRUE; | ||
} | ||
|
||
// Queries with cast are not supported | ||
context.setUnsupportedOperationException(new UnsupportedOperationException( | ||
"Queries with casts are not yet supported with json format in the new engine")); | ||
return Boolean.FALSE; | ||
} | ||
|
||
@Override | ||
public Boolean visitAlias(Alias node, JsonSupportVisitorContext context) { | ||
// Supported if outside of Project | ||
if (!context.isVisitingProject()) { | ||
return Boolean.TRUE; | ||
} | ||
|
||
// Alias node is accepted if it does not have a user-defined alias | ||
// and if the delegated expression is accepted. | ||
if (StringUtils.isEmpty(node.getAlias())) { | ||
return node.getDelegated().accept(this, context); | ||
} else { | ||
context.setUnsupportedOperationException(new UnsupportedOperationException( | ||
"Queries with aliases are not yet supported with json format in the new engine")); | ||
return Boolean.FALSE; | ||
} | ||
} | ||
|
||
@Override | ||
public Boolean visitProject(Project node, JsonSupportVisitorContext context) { | ||
boolean isSupported = visit(node, context); | ||
|
||
context.setVisitingProject(true); | ||
isSupported = isSupported ? node.getProjectList().stream() | ||
.allMatch(e -> e.accept(this, context)) : Boolean.FALSE; | ||
context.setVisitingProject(false); | ||
|
||
return isSupported; | ||
} | ||
} |
22 changes: 22 additions & 0 deletions
22
core/src/main/java/org/opensearch/sql/analysis/JsonSupportVisitorContext.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
/* | ||
* Copyright OpenSearch Contributors | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package org.opensearch.sql.analysis; | ||
|
||
import lombok.Getter; | ||
import lombok.Setter; | ||
|
||
/** | ||
* The context used for JsonSupportVisitor. | ||
*/ | ||
public class JsonSupportVisitorContext { | ||
@Getter | ||
@Setter | ||
private boolean isVisitingProject = false; | ||
|
||
@Getter | ||
@Setter | ||
private UnsupportedOperationException unsupportedOperationException; | ||
} |
111 changes: 111 additions & 0 deletions
111
core/src/test/java/org/opensearch/sql/analysis/JsonSupportVisitorTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,111 @@ | ||
/* | ||
* Copyright OpenSearch Contributors | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package org.opensearch.sql.analysis; | ||
|
||
import static org.junit.jupiter.api.Assertions.assertFalse; | ||
import static org.junit.jupiter.api.Assertions.assertTrue; | ||
import static org.opensearch.sql.ast.dsl.AstDSL.qualifiedName; | ||
|
||
import com.google.common.collect.ImmutableList; | ||
import java.util.Collections; | ||
import org.junit.jupiter.api.Test; | ||
import org.opensearch.sql.ast.dsl.AstDSL; | ||
import org.opensearch.sql.ast.expression.Literal; | ||
import org.opensearch.sql.ast.expression.UnresolvedExpression; | ||
import org.opensearch.sql.ast.tree.UnresolvedPlan; | ||
|
||
class JsonSupportVisitorTest { | ||
@Test | ||
public void visitLiteralInProject() { | ||
UnresolvedPlan project = AstDSL.project( | ||
AstDSL.relation("table", "table"), | ||
AstDSL.intLiteral(1)); | ||
assertFalse(project.accept(new JsonSupportVisitor(), new JsonSupportVisitorContext())); | ||
} | ||
|
||
@Test | ||
public void visitLiteralOutsideProject() { | ||
Literal intLiteral = AstDSL.intLiteral(1); | ||
assertTrue(intLiteral.accept(new JsonSupportVisitor(), new JsonSupportVisitorContext())); | ||
} | ||
|
||
@Test | ||
public void visitCastInProject() { | ||
UnresolvedPlan project = AstDSL.project( | ||
AstDSL.relation("table", "table"), | ||
AstDSL.cast(AstDSL.intLiteral(1), AstDSL.stringLiteral("INT"))); | ||
assertFalse(project.accept(new JsonSupportVisitor(), new JsonSupportVisitorContext())); | ||
} | ||
|
||
@Test | ||
public void visitCastOutsideProject() { | ||
UnresolvedExpression intCast = AstDSL.cast( | ||
AstDSL.intLiteral(1), | ||
AstDSL.stringLiteral("INT")); | ||
assertTrue(intCast.accept(new JsonSupportVisitor(), new JsonSupportVisitorContext())); | ||
} | ||
|
||
@Test | ||
public void visitAliasInProject() { | ||
UnresolvedPlan project = AstDSL.project( | ||
AstDSL.relation("table", "table"), | ||
AstDSL.alias("alias", AstDSL.intLiteral(1))); | ||
assertFalse(project.accept(new JsonSupportVisitor(), new JsonSupportVisitorContext())); | ||
} | ||
|
||
@Test | ||
public void visitAliasInProjectWithDelegated() { | ||
UnresolvedPlan project = AstDSL.project( | ||
AstDSL.relation("table", "table"), | ||
AstDSL.alias("alias", AstDSL.intLiteral(1), "alias")); | ||
assertFalse(project.accept(new JsonSupportVisitor(), new JsonSupportVisitorContext())); | ||
} | ||
|
||
@Test | ||
public void visitAliasOutsideProject() { | ||
UnresolvedExpression alias = AstDSL.alias("alias", AstDSL.intLiteral(1)); | ||
assertTrue(alias.accept(new JsonSupportVisitor(), new JsonSupportVisitorContext())); | ||
} | ||
|
||
@Test | ||
public void visitFunctionInProject() { | ||
UnresolvedPlan function = AstDSL.project( | ||
AstDSL.relation("table", "table"), | ||
AstDSL.function("abs", AstDSL.intLiteral(-1))); | ||
assertFalse(function.accept(new JsonSupportVisitor(), new JsonSupportVisitorContext())); | ||
} | ||
|
||
@Test | ||
public void visitFunctionOutsideProject() { | ||
UnresolvedExpression function = AstDSL.function("abs", AstDSL.intLiteral(-1)); | ||
assertTrue(function.accept(new JsonSupportVisitor(), new JsonSupportVisitorContext())); | ||
} | ||
|
||
@Test | ||
public void visitAggregationWithGroupExprList() { | ||
UnresolvedPlan projectAggr = AstDSL.project(AstDSL.agg( | ||
AstDSL.relation("table", "table"), | ||
Collections.emptyList(), | ||
Collections.emptyList(), | ||
ImmutableList.of(AstDSL.alias("alias", qualifiedName("integer_value"))), | ||
Collections.emptyList())); | ||
assertFalse(projectAggr.accept(new JsonSupportVisitor(), new JsonSupportVisitorContext())); | ||
} | ||
|
||
@Test | ||
public void visitAggregationWithAggExprList() { | ||
UnresolvedPlan aggregation = AstDSL.agg( | ||
AstDSL.relation("table", "table"), | ||
ImmutableList.of( | ||
AstDSL.alias("AVG(alias)", | ||
AstDSL.aggregate("AVG", | ||
qualifiedName("integer_value")))), | ||
Collections.emptyList(), | ||
Collections.emptyList(), | ||
Collections.emptyList()); | ||
assertTrue(aggregation.accept(new JsonSupportVisitor(), new JsonSupportVisitorContext())); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Change type to
Void
and only throw exceptions.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Addressed in c2cb0f3