Skip to content

Commit eee57aa

Browse files
committed
Add position() to V2 engine (#177)
Signed-off-by: Margarit Hakobyan <margarith@bitquilltech.com> Rbased
1 parent f4ee6d0 commit eee57aa

File tree

6 files changed

+73
-0
lines changed

6 files changed

+73
-0
lines changed

core/src/main/java/org/opensearch/sql/analysis/ExpressionAnalyzer.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.opensearch.sql.ast.expression.Literal;
3535
import org.opensearch.sql.ast.expression.Not;
3636
import org.opensearch.sql.ast.expression.Or;
37+
import org.opensearch.sql.ast.expression.PositionFunction;
3738
import org.opensearch.sql.ast.expression.QualifiedName;
3839
import org.opensearch.sql.ast.expression.RelevanceFieldList;
3940
import org.opensearch.sql.ast.expression.Span;
@@ -201,6 +202,13 @@ public Expression visitHighlightFunction(HighlightFunction node, AnalysisContext
201202
return new HighlightExpression(expr);
202203
}
203204

205+
@Override
206+
public Expression visitPositionFunction(PositionFunction node, AnalysisContext context) {
207+
Expression stringPatternExpr = node.getStringPatternExpr().accept(this, context);
208+
Expression searchStringExpr = node.getSearchStringExpr().accept(this, context);
209+
return DSL.position(stringPatternExpr, searchStringExpr);
210+
}
211+
204212
@Override
205213
public Expression visitIn(In node, AnalysisContext context) {
206214
return visitIn(node.getField(), node.getValueList(), context);

core/src/main/java/org/opensearch/sql/ast/AbstractNodeVisitor.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.opensearch.sql.ast.expression.Map;
2727
import org.opensearch.sql.ast.expression.Not;
2828
import org.opensearch.sql.ast.expression.Or;
29+
import org.opensearch.sql.ast.expression.PositionFunction;
2930
import org.opensearch.sql.ast.expression.QualifiedName;
3031
import org.opensearch.sql.ast.expression.RelevanceFieldList;
3132
import org.opensearch.sql.ast.expression.Span;
@@ -273,6 +274,10 @@ public T visitHighlightFunction(HighlightFunction node, C context) {
273274
return visitChildren(node, context);
274275
}
275276

277+
public T visitPositionFunction(PositionFunction node, C context) {
278+
return visitChildren(node, context);
279+
}
280+
276281
public T visitStatement(Statement node, C context) {
277282
return visit(node, context);
278283
}

core/src/main/java/org/opensearch/sql/ast/dsl/AstDSL.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.opensearch.sql.ast.expression.Not;
3333
import org.opensearch.sql.ast.expression.Or;
3434
import org.opensearch.sql.ast.expression.ParseMethod;
35+
import org.opensearch.sql.ast.expression.PositionFunction;
3536
import org.opensearch.sql.ast.expression.QualifiedName;
3637
import org.opensearch.sql.ast.expression.Span;
3738
import org.opensearch.sql.ast.expression.SpanUnit;
@@ -283,6 +284,11 @@ public UnresolvedExpression highlight(UnresolvedExpression fieldName,
283284
return new HighlightFunction(fieldName, arguments);
284285
}
285286

287+
public UnresolvedExpression position(UnresolvedExpression stringPatternExpr,
288+
UnresolvedExpression searchStringExpr) {
289+
return new PositionFunction(stringPatternExpr, searchStringExpr);
290+
}
291+
286292
public UnresolvedExpression window(UnresolvedExpression function,
287293
List<UnresolvedExpression> partitionByList,
288294
List<Pair<SortOption, UnresolvedExpression>> sortList) {
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package org.opensearch.sql.ast.expression;
7+
8+
import java.util.Arrays;
9+
import java.util.List;
10+
import lombok.AllArgsConstructor;
11+
import lombok.EqualsAndHashCode;
12+
import lombok.Getter;
13+
import lombok.ToString;
14+
import org.opensearch.sql.ast.AbstractNodeVisitor;
15+
16+
17+
/**
18+
* Expression node of Position function.
19+
*/
20+
@AllArgsConstructor
21+
@EqualsAndHashCode(callSuper = false)
22+
@Getter
23+
@ToString
24+
public class PositionFunction extends UnresolvedExpression {
25+
@Getter
26+
private UnresolvedExpression stringPatternExpr;
27+
@Getter
28+
private UnresolvedExpression searchStringExpr;
29+
30+
@Override
31+
public List<UnresolvedExpression> getChild() {
32+
return Arrays.asList(stringPatternExpr, searchStringExpr);
33+
}
34+
35+
@Override
36+
public <R, C> R accept(AbstractNodeVisitor<R, C> nodeVisitor, C context) {
37+
return nodeVisitor.visitPositionFunction(this, context);
38+
}
39+
}

core/src/main/java/org/opensearch/sql/expression/DSL.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,10 @@ public static FunctionExpression position(Expression... expressions) {
234234
return compile(FunctionProperties.None, BuiltinFunctionName.POSITION, expressions);
235235
}
236236

237+
public static FunctionExpression position(Expression... expressions) {
238+
return compile(BuiltinFunctionName.POSITION, expressions);
239+
}
240+
237241
public static FunctionExpression truncate(Expression... expressions) {
238242
return compile(FunctionProperties.None, BuiltinFunctionName.TRUNCATE, expressions);
239243
}

core/src/test/java/org/opensearch/sql/analysis/NamedExpressionAnalyzerTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.opensearch.sql.ast.expression.Alias;
1717
import org.opensearch.sql.ast.expression.HighlightFunction;
1818
import org.opensearch.sql.ast.expression.Literal;
19+
import org.opensearch.sql.ast.expression.PositionFunction;
1920
import org.opensearch.sql.expression.NamedExpression;
2021
import org.springframework.context.annotation.Configuration;
2122
import org.springframework.test.context.ContextConfiguration;
@@ -48,4 +49,14 @@ void visit_highlight() {
4849
NamedExpression analyze = analyzer.analyze(alias, analysisContext);
4950
assertEquals("highlight(fieldA)", analyze.getNameOrAlias());
5051
}
52+
53+
@Test
54+
void visit_position() {
55+
Alias alias = AstDSL.alias("position(fieldA IN fieldB)",
56+
new PositionFunction(AstDSL.stringLiteral("fieldA"), AstDSL.stringLiteral("fieldB")));
57+
NamedExpressionAnalyzer analyzer = new NamedExpressionAnalyzer(expressionAnalyzer);
58+
59+
NamedExpression analyze = analyzer.analyze(alias, analysisContext);
60+
assertEquals("position(fieldA IN fieldB)", analyze.getNameOrAlias());
61+
}
5162
}

0 commit comments

Comments
 (0)