Skip to content

Commit a774807

Browse files
committed
chore: cleaned up code and added docs
1 parent 986c619 commit a774807

7 files changed

Lines changed: 35 additions & 23 deletions

File tree

document-store/src/integrationTest/java/org/hypertrace/core/documentstore/DocStoreQueryV1Test.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3508,9 +3508,7 @@ SELECT item, MAX(date) AS latest_date
35083508
*/
35093509
Query subQuery =
35103510
Query.builder()
3511-
.addSelection(
3512-
SelectionSpec.of(
3513-
IdentifierExpression.of("item")))
3511+
.addSelection(SelectionSpec.of(IdentifierExpression.of("item")))
35143512
.addSelection(
35153513
SelectionSpec.of(
35163514
AggregateExpression.of(
@@ -3541,14 +3539,14 @@ SELECT item, MAX(date) AS latest_date
35413539
RelationalOperator.EQ,
35423540
AliasedIdentifierExpression.builder()
35433541
.name("item")
3544-
.alias("latest")
3542+
.contextAlias("latest")
35453543
.build()),
35463544
RelationalExpression.of(
35473545
IdentifierExpression.of("date"),
35483546
RelationalOperator.EQ,
35493547
AliasedIdentifierExpression.builder()
35503548
.name("latest_date")
3551-
.alias("latest")
3549+
.contextAlias("latest")
35523550
.build())))
35533551
.build();
35543552

document-store/src/main/java/org/hypertrace/core/documentstore/expression/impl/AliasedIdentifierExpression.java

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,28 @@
55
import org.hypertrace.core.documentstore.parser.SelectTypeExpressionVisitor;
66

77
/**
8-
* Expression representing an identifier/column name with an alias
8+
* Expression for referencing an identifier/column name within a context having an alias.
99
*
10-
* <p>Example: AliasedIdentifierExpression.of("col1", "col1_alias");
10+
* <p>Example: In this query: <code>
11+
* SELECT item, quantity, date
12+
* FROM <implicit_collection>
13+
* JOIN (
14+
* SELECT item, MAX(date) AS latest_date
15+
* FROM <implicit_collection>
16+
* GROUP BY item
17+
* ) AS latest
18+
* ON item = latest.item
19+
* ORDER BY `item` ASC;
20+
* </code> the rhs of the join condition "latest.item" can be expressed as: <code>
21+
* AliasedIdentifierExpression.builder().name("item").alias("alias1").build() </code>
1122
*/
1223
@Value
1324
public class AliasedIdentifierExpression extends IdentifierExpression {
14-
String alias;
25+
String contextAlias;
1526

16-
private AliasedIdentifierExpression(final String name, final String alias) {
27+
private AliasedIdentifierExpression(final String name, final String contextAlias) {
1728
super(name);
18-
this.alias = alias;
29+
this.contextAlias = contextAlias;
1930
}
2031

2132
@Override
@@ -25,7 +36,7 @@ public <T> T accept(final SelectTypeExpressionVisitor visitor) {
2536

2637
@Override
2738
public String toString() {
28-
return "`" + getAlias() + "." + getName() + "`";
39+
return "`" + getContextAlias() + "." + getName() + "`";
2940
}
3041

3142
public static AliasedIdentifierExpressionBuilder builder() {
@@ -34,24 +45,25 @@ public static AliasedIdentifierExpressionBuilder builder() {
3445

3546
public static class AliasedIdentifierExpressionBuilder {
3647
private String name;
37-
private String alias;
48+
private String contextAlias;
3849

3950
public AliasedIdentifierExpressionBuilder name(final String name) {
4051
this.name = name;
4152
return this;
4253
}
4354

44-
public AliasedIdentifierExpressionBuilder alias(final String alias) {
45-
this.alias = alias;
55+
public AliasedIdentifierExpressionBuilder contextAlias(final String contextAlias) {
56+
this.contextAlias = contextAlias;
4657
return this;
4758
}
4859

4960
public AliasedIdentifierExpression build() {
5061
Preconditions.checkArgument(
5162
this.name != null && !this.name.isBlank(), "name is null or blank");
5263
Preconditions.checkArgument(
53-
this.alias != null && !this.alias.isBlank(), "alias is null or blank");
54-
return new AliasedIdentifierExpression(this.name, this.alias);
64+
this.contextAlias != null && !this.contextAlias.isBlank(),
65+
"contextAlias is null or blank");
66+
return new AliasedIdentifierExpression(this.name, this.contextAlias);
5567
}
5668
}
5769
}

document-store/src/main/java/org/hypertrace/core/documentstore/expression/impl/SubQueryJoinExpression.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
/**
1313
* Expression representing a join operation where the right side expression is a subquery. Note that
1414
* this currently supports a self-join only, so the collection to be joined with is implicit.
15+
*
16+
* <p>For an example of using this expression, see the testSelfJoinWithSubQuery method in
17+
* DocStoreQueryV1Test.
1518
*/
1619
@Value
1720
@Builder(toBuilder = true)

document-store/src/main/java/org/hypertrace/core/documentstore/mongo/query/parser/MongoAliasedIdentifierExpressionParser.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,15 @@
22

33
import lombok.NoArgsConstructor;
44
import org.hypertrace.core.documentstore.expression.impl.AliasedIdentifierExpression;
5+
import org.hypertrace.core.documentstore.mongo.MongoUtils;
56

67
@NoArgsConstructor
78
public final class MongoAliasedIdentifierExpressionParser extends MongoSelectTypeExpressionParser {
89

9-
MongoAliasedIdentifierExpressionParser(final MongoSelectTypeExpressionParser baseParser) {
10-
super(baseParser);
11-
}
12-
1310
@SuppressWarnings("unchecked")
1411
@Override
1512
public String visit(final AliasedIdentifierExpression expression) {
16-
return "$" + parse(expression);
13+
return MongoUtils.PREFIX + parse(expression);
1714
}
1815

1916
String parse(final AliasedIdentifierExpression expression) {

document-store/src/main/java/org/hypertrace/core/documentstore/mongo/query/parser/MongoLetClauseBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ public BasicDBObject visit(DocumentArrayFilterExpression expression) {
9696
private BasicDBObject createLetClause(
9797
AliasedIdentifierExpression aliasedExpression, String subQueryAlias) {
9898
BasicDBObject letClause = new BasicDBObject();
99-
if (aliasedExpression.getAlias().equals(subQueryAlias)) {
99+
if (aliasedExpression.getContextAlias().equals(subQueryAlias)) {
100100
letClause.put(aliasedExpression.getName(), "$" + aliasedExpression.getName());
101101
}
102102
return letClause;

document-store/src/main/java/org/hypertrace/core/documentstore/mongo/query/parser/filter/MongoRelationalFilterParserFactory.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ class MongoRelationalFilterContext {
2424

2525
@Default FilterLocation location = OUTSIDE_EXPR;
2626
@Default MongoSelectTypeExpressionParser lhsParser = new MongoIdentifierExpressionParser();
27-
// FIXME: how to parse AliasedIdentifierExpression / IdentifierExpression in rhs?
2827
@Default MongoSelectTypeExpressionParser rhsParser = new MongoConstantExpressionParser();
2928
}
3029

document-store/src/main/java/org/hypertrace/core/documentstore/parser/FromTypeExpressionVisitor.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
public interface FromTypeExpressionVisitor {
77
<T> T visit(UnnestExpression unnestExpression);
88

9+
/*
10+
* Subquery join expression is not supported by default. Override this method to support it.
11+
*/
912
default <T> T visit(SubQueryJoinExpression subQueryJoinExpression) {
1013
throw new UnsupportedOperationException("This operation is not supported");
1114
}

0 commit comments

Comments
 (0)