Skip to content

Commit 5ffabfb

Browse files
committed
Merge remote-tracking branch 'origin/main' into issues/4063
Signed-off-by: Yuanchun Shen <yuanchu@amazon.com>
2 parents 730a968 + c518022 commit 5ffabfb

148 files changed

Lines changed: 6562 additions & 1495 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,5 +52,7 @@ http-client.env.json
5252
/doctest/opensearch-job-scheduler/
5353
.factorypath
5454

55-
# Claude Code files
56-
.claude/
55+
# Coding agent files (could be symlinks)
56+
.claude
57+
.clinerules
58+
memory-bank

common/src/main/java/org/opensearch/sql/common/setting/Settings.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,15 @@ public enum Key {
3030
PATTERN_MAX_SAMPLE_COUNT("plugins.ppl.pattern.max.sample.count"),
3131
PATTERN_BUFFER_LIMIT("plugins.ppl.pattern.buffer.limit"),
3232
PPL_REX_MAX_MATCH_LIMIT("plugins.ppl.rex.max_match.limit"),
33+
PPL_SYNTAX_LEGACY_PREFERRED("plugins.ppl.syntax.legacy.preferred"),
3334

3435
/** Enable Calcite as execution engine */
3536
CALCITE_ENGINE_ENABLED("plugins.calcite.enabled"),
3637
CALCITE_FALLBACK_ALLOWED("plugins.calcite.fallback.allowed"),
3738
CALCITE_PUSHDOWN_ENABLED("plugins.calcite.pushdown.enabled"),
3839
CALCITE_PUSHDOWN_ROWCOUNT_ESTIMATION_FACTOR(
3940
"plugins.calcite.pushdown.rowcount.estimation.factor"),
41+
CALCITE_SUPPORT_ALL_JOIN_TYPES("plugins.calcite.all_join_types.allowed"),
4042

4143
/** Query Settings. */
4244
FIELD_TYPE_TOLERANCE("plugins.query.field_type_tolerance"),

core/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ dependencies {
5454
api "com.fasterxml.jackson.core:jackson-core:${versions.jackson}"
5555
api "com.fasterxml.jackson.core:jackson-databind:${versions.jackson_databind}"
5656
api "com.fasterxml.jackson.core:jackson-annotations:${versions.jackson}"
57+
api "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:${versions.jackson}"
5758
api group: 'com.google.code.gson', name: 'gson', version: '2.8.9'
5859
api group: 'com.tdunning', name: 't-digest', version: '3.3'
5960
api "net.minidev:json-smart:${versions.json_smart}"

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -880,7 +880,11 @@ private LogicalAggregation analyzeAggregation(
880880
groupBys.forEach(
881881
group ->
882882
newEnv.define(new Symbol(Namespace.FIELD_NAME, group.getNameOrAlias()), group.type()));
883-
return new LogicalAggregation(child, aggregators, groupBys);
883+
884+
Argument.ArgumentMap statsArgs = Argument.ArgumentMap.of(node.getArgExprList());
885+
boolean bucketNullable =
886+
(Boolean) statsArgs.getOrDefault(Argument.BUCKET_NULLABLE, Literal.TRUE).getValue();
887+
return new LogicalAggregation(child, aggregators, groupBys, bucketNullable);
884888
}
885889

886890
private Aggregation analyzePatternsAgg(Patterns node) {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,7 @@ public static List<Argument> defaultStatsArgs() {
449449
argument("partitions", intLiteral(1)),
450450
argument("allnum", booleanLiteral(false)),
451451
argument("delim", stringLiteral(" ")),
452+
argument(Argument.BUCKET_NULLABLE, booleanLiteral(true)),
452453
argument("dedupsplit", booleanLiteral(false)));
453454
}
454455

core/src/main/java/org/opensearch/sql/ast/expression/Argument.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
@RequiredArgsConstructor
2121
@EqualsAndHashCode(callSuper = false)
2222
public class Argument extends UnresolvedExpression {
23+
public static final String BUCKET_NULLABLE = "bucket_nullable";
24+
2325
private final String argName;
2426
private final Literal value;
2527

@@ -39,15 +41,24 @@ public static class ArgumentMap {
3941
private final Map<String, Literal> map;
4042

4143
public ArgumentMap(List<Argument> arguments) {
42-
this.map =
43-
arguments.stream()
44-
.collect(java.util.stream.Collectors.toMap(Argument::getArgName, Argument::getValue));
44+
if (arguments == null || arguments.isEmpty()) {
45+
this.map = Map.of();
46+
} else {
47+
this.map =
48+
arguments.stream()
49+
.collect(
50+
java.util.stream.Collectors.toMap(Argument::getArgName, Argument::getValue));
51+
}
4552
}
4653

4754
public static ArgumentMap of(List<Argument> arguments) {
4855
return new ArgumentMap(arguments);
4956
}
5057

58+
public static ArgumentMap empty() {
59+
return new ArgumentMap(null);
60+
}
61+
5162
/**
5263
* Get argument value by name.
5364
*
@@ -57,5 +68,9 @@ public static ArgumentMap of(List<Argument> arguments) {
5768
public Literal get(String name) {
5869
return map.get(name);
5970
}
71+
72+
public Literal getOrDefault(String name, Literal literal) {
73+
return map.getOrDefault(name, literal);
74+
}
6075
}
6176
}

core/src/main/java/org/opensearch/sql/ast/expression/Literal.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,9 @@ public <R, C> R accept(AbstractNodeVisitor<R, C> nodeVisitor, C context) {
4646
public String toString() {
4747
return String.valueOf(value);
4848
}
49+
50+
public static Literal TRUE = new Literal(true, DataType.BOOLEAN);
51+
public static Literal FALSE = new Literal(false, DataType.BOOLEAN);
52+
public static Literal ZERO = new Literal(0, DataType.INTEGER);
53+
public static Literal ONE = new Literal(1, DataType.INTEGER);
4954
}

core/src/main/java/org/opensearch/sql/ast/tree/Join.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import lombok.RequiredArgsConstructor;
1616
import lombok.ToString;
1717
import org.opensearch.sql.ast.AbstractNodeVisitor;
18+
import org.opensearch.sql.ast.expression.Argument;
19+
import org.opensearch.sql.ast.expression.Field;
1820
import org.opensearch.sql.ast.expression.UnresolvedExpression;
1921

2022
@ToString
@@ -28,20 +30,26 @@ public class Join extends UnresolvedPlan {
2830
private final JoinType joinType;
2931
private final Optional<UnresolvedExpression> joinCondition;
3032
private final JoinHint joinHint;
33+
private final Optional<List<Field>> joinFields;
34+
private final Argument.ArgumentMap argumentMap;
3135

3236
public Join(
3337
UnresolvedPlan right,
3438
Optional<String> leftAlias,
3539
Optional<String> rightAlias,
3640
JoinType joinType,
3741
Optional<UnresolvedExpression> joinCondition,
38-
JoinHint joinHint) {
42+
JoinHint joinHint,
43+
Optional<List<Field>> joinFields,
44+
Argument.ArgumentMap argumentMap) {
3945
this.right = right;
4046
this.leftAlias = leftAlias;
4147
this.rightAlias = rightAlias;
4248
this.joinType = joinType;
4349
this.joinCondition = joinCondition;
4450
this.joinHint = joinHint;
51+
this.joinFields = joinFields;
52+
this.argumentMap = argumentMap;
4553
}
4654

4755
@Override
@@ -89,6 +97,11 @@ public enum JoinType {
8997
FULL
9098
}
9199

100+
/** RIGHT, CROSS, FULL are performance sensitive join types */
101+
public static List<JoinType> highCostJoinTypes() {
102+
return List.of(JoinType.RIGHT, JoinType.CROSS, JoinType.FULL);
103+
}
104+
92105
@Getter
93106
@RequiredArgsConstructor
94107
public static class JoinHint {

core/src/main/java/org/opensearch/sql/ast/tree/Rex.java

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,38 +23,52 @@
2323
public class Rex extends UnresolvedPlan {
2424

2525
public enum RexMode {
26-
EXTRACT
26+
EXTRACT,
27+
SED
2728
}
2829

2930
/** Field to extract from. */
3031
private final UnresolvedExpression field;
3132

32-
/** Pattern with named capture groups. */
33+
/** Pattern with named capture groups or sed expression. */
3334
private final Literal pattern;
3435

35-
/** Rex mode (only EXTRACT supported). */
36+
/** Rex mode (extract or sed). */
3637
private final RexMode mode;
3738

3839
/** Maximum number of matches (optional). */
3940
private final Optional<Integer> maxMatch;
4041

42+
/** Offset field name for position tracking (optional). */
43+
private final Optional<String> offsetField;
44+
4145
/** Child Plan. */
4246
@Setter private UnresolvedPlan child;
4347

4448
public Rex(UnresolvedExpression field, Literal pattern) {
45-
this(field, pattern, RexMode.EXTRACT, Optional.empty());
49+
this(field, pattern, RexMode.EXTRACT, Optional.empty(), Optional.empty());
4650
}
4751

4852
public Rex(UnresolvedExpression field, Literal pattern, Optional<Integer> maxMatch) {
49-
this(field, pattern, RexMode.EXTRACT, maxMatch);
53+
this(field, pattern, RexMode.EXTRACT, maxMatch, Optional.empty());
5054
}
5155

5256
public Rex(
5357
UnresolvedExpression field, Literal pattern, RexMode mode, Optional<Integer> maxMatch) {
58+
this(field, pattern, mode, maxMatch, Optional.empty());
59+
}
60+
61+
public Rex(
62+
UnresolvedExpression field,
63+
Literal pattern,
64+
RexMode mode,
65+
Optional<Integer> maxMatch,
66+
Optional<String> offsetField) {
5467
this.field = field;
5568
this.pattern = pattern;
5669
this.mode = mode;
5770
this.maxMatch = maxMatch;
71+
this.offsetField = offsetField;
5872
}
5973

6074
@Override

0 commit comments

Comments
 (0)