Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
import com.typesafe.config.ConfigFactory;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
Expand Down Expand Up @@ -6546,6 +6547,58 @@ SELECT itemDetails.item, MAX(itemDetails.date) AS latest_date
dataStoreName, iterator, "query/sub_query_join_response_with_nested_fields.json", 3);
}

@ParameterizedTest
@ArgumentsSource(MongoProvider.class)
void testDateConstantExpressionInFilterForMongo(String dataStoreName) throws IOException {
Collection collection = getCollection(dataStoreName);
Date currentDate = new Date(System.currentTimeMillis());

// Test that DateConstantExpression works in a filter for Mongo
Query query =
Query.builder()
.setFilter(
RelationalExpression.of(
IdentifierExpression.of("_lastUpdateTime"),
LTE,
ConstantExpression.of(currentDate)))
.addSelection(IdentifierExpression.of("item"))
.addSelection(IdentifierExpression.of("price"))
.addSelection(IdentifierExpression.of("quantity"))
.addSort(IdentifierExpression.of("price"), ASC)
.addSort(IdentifierExpression.of("quantity"), DESC)
.build();

// Verify results
Iterator<Document> iterator = collection.aggregate(query);
assertDocsAndSizeEqual(
dataStoreName, iterator, "query/filter_contains_date_constant_expression.json", 8);
}

@ParameterizedTest
@ArgumentsSource(PostgresProvider.class)
void testDateConstantExpressionInFilterForPostgresThrowsException(String dataStoreName) {
Collection collection = getCollection(dataStoreName);
Date currentDate = new Date(System.currentTimeMillis());

// Test that DateConstantExpression throws UnsupportedOperationException in a filter for
// Postgres
Query query =
Query.builder()
.setFilter(
RelationalExpression.of(
IdentifierExpression.of("_lastUpdateTime"),
LTE,
ConstantExpression.of(currentDate)))
.addSelection(IdentifierExpression.of("item"))
.build();

// This should throw UnsupportedOperationException for Postgres
assertThrows(
UnsupportedOperationException.class,
() -> collection.aggregate(query),
"DateConstantExpression should throw UnsupportedOperationException for Postgres");
}

private static Collection getCollection(final String dataStoreName) {
return getCollection(dataStoreName, COLLECTION_NAME);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
[
{
"item":"Shampoo",
"price":5,
"quantity":20
},
{
"item":"Shampoo",
"price":5,
"quantity":10
},
{
"item":"Comb",
"price":7.5,
"quantity":10
},
{
"item":"Comb",
"price":7.5,
"quantity":5
},
{
"item":"Soap",
"price":10,
"quantity":5
},
{
"item":"Soap",
"price":10,
"quantity":2
},
{
"item":"Soap",
"price":20,
"quantity":5
},
{
"item":"Mirror",
"price":20,
"quantity":1
}
]
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.hypertrace.core.documentstore.expression.impl;

import java.util.Date;
import java.util.List;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
Expand Down Expand Up @@ -43,6 +44,10 @@ public static ConstantExpression of(final Document value) {
return new DocumentConstantExpression(value);
}

public static ConstantExpression of(final Date value) {
return new DateConstantExpression(value);
}

public static ConstantExpression ofStrings(final List<String> values) {
return validateAndReturn(values);
}
Expand Down Expand Up @@ -96,4 +101,25 @@ public String toString() {
return "JSON(" + StringUtils.wrap(getValue().toJson(), "'") + ")";
}
}

public static class DateConstantExpression extends ConstantExpression {
private DateConstantExpression(final Date value) {
super(value);
}

@Override
public <T> T accept(final SelectTypeExpressionVisitor visitor) {
return visitor.visit(this);
}

@Override
public Date getValue() {
return (Date) value;
}

@Override
public String toString() {
return "DATE(" + StringUtils.wrap(getValue().toString(), "'") + ")";
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.mongodb.BasicDBObject;
import lombok.NoArgsConstructor;
import org.hypertrace.core.documentstore.expression.impl.ConstantExpression;
import org.hypertrace.core.documentstore.expression.impl.ConstantExpression.DateConstantExpression;
import org.hypertrace.core.documentstore.expression.impl.ConstantExpression.DocumentConstantExpression;

@NoArgsConstructor
Expand All @@ -30,6 +31,12 @@ public Object visit(final DocumentConstantExpression expression) {
}
}

@SuppressWarnings("unchecked")
@Override
public Object visit(final DateConstantExpression expression) {
return expression.getValue();
}

Object parse(final ConstantExpression expression) {
return expression.getValue();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import org.hypertrace.core.documentstore.expression.impl.AggregateExpression;
import org.hypertrace.core.documentstore.expression.impl.AliasedIdentifierExpression;
import org.hypertrace.core.documentstore.expression.impl.ConstantExpression;
import org.hypertrace.core.documentstore.expression.impl.ConstantExpression.DateConstantExpression;
import org.hypertrace.core.documentstore.expression.impl.ConstantExpression.DocumentConstantExpression;
import org.hypertrace.core.documentstore.expression.impl.FunctionExpression;
import org.hypertrace.core.documentstore.expression.impl.IdentifierExpression;
Expand Down Expand Up @@ -94,6 +95,16 @@ public Map<String, Object> visit(DocumentConstantExpression expression) {
expression.getValue().toString()));
}

@SuppressWarnings("unchecked")
@Override
public Map<String, Object> visit(DateConstantExpression expression) {
throw new UnsupportedOperationException(
String.format(
"Cannot sort a constant expression ($%s) in MongoDB."
+ "Set alias in selection and sort by the alias as identifier",
expression.getValue().toString()));
}

@SuppressWarnings("unchecked")
@Override
public Map<String, Object> visit(final AliasedIdentifierExpression expression) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.apache.commons.lang3.StringUtils;
import org.hypertrace.core.documentstore.expression.impl.AggregateExpression;
import org.hypertrace.core.documentstore.expression.impl.ConstantExpression;
import org.hypertrace.core.documentstore.expression.impl.ConstantExpression.DateConstantExpression;
import org.hypertrace.core.documentstore.expression.impl.FunctionExpression;
import org.hypertrace.core.documentstore.expression.impl.IdentifierExpression;
import org.hypertrace.core.documentstore.expression.type.SelectTypeExpression;
Expand Down Expand Up @@ -51,6 +52,21 @@ public Map<String, Object> visit(final ConstantExpression expression) {
return convertToMap(key, parsed);
}

@SuppressWarnings("unchecked")
@Override
public Map<String, Object> visit(final DateConstantExpression expression) {
final Object parsed;

try {
parsed = baseParser.visit(expression);
} catch (UnsupportedOperationException e) {
return Map.of();
}

final String key = getAlias(expression);
return convertToMap(key, parsed);
}

@SuppressWarnings("unchecked")
@Override
public Map<String, Object> visit(final FunctionExpression expression) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.hypertrace.core.documentstore.expression.impl.AggregateExpression;
import org.hypertrace.core.documentstore.expression.impl.AliasedIdentifierExpression;
import org.hypertrace.core.documentstore.expression.impl.ConstantExpression;
import org.hypertrace.core.documentstore.expression.impl.ConstantExpression.DateConstantExpression;
import org.hypertrace.core.documentstore.expression.impl.ConstantExpression.DocumentConstantExpression;
import org.hypertrace.core.documentstore.expression.impl.FunctionExpression;
import org.hypertrace.core.documentstore.expression.impl.IdentifierExpression;
Expand Down Expand Up @@ -113,6 +114,12 @@ public Optional<SelectionSpec> visit(final DocumentConstantExpression expression
return Optional.empty();
}

@SuppressWarnings("unchecked")
@Override
public Optional<SelectionSpec> visit(final DateConstantExpression expression) {
return Optional.empty();
}

@SuppressWarnings("unchecked")
@Override
public Optional<SelectionSpec> visit(final FunctionExpression expression) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import org.hypertrace.core.documentstore.expression.impl.AggregateExpression;
import org.hypertrace.core.documentstore.expression.impl.AliasedIdentifierExpression;
import org.hypertrace.core.documentstore.expression.impl.ConstantExpression;
import org.hypertrace.core.documentstore.expression.impl.ConstantExpression.DateConstantExpression;
import org.hypertrace.core.documentstore.expression.impl.ConstantExpression.DocumentConstantExpression;
import org.hypertrace.core.documentstore.expression.impl.FunctionExpression;
import org.hypertrace.core.documentstore.expression.impl.IdentifierExpression;
Expand Down Expand Up @@ -113,6 +114,12 @@ public SelectionSpec visit(final DocumentConstantExpression expression) {
return source;
}

@SuppressWarnings("unchecked")
@Override
public SelectionSpec visit(final DateConstantExpression expression) {
return source;
}

@SuppressWarnings("unchecked")
@Override
public SelectionSpec visit(final FunctionExpression expression) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import org.hypertrace.core.documentstore.expression.impl.AliasedIdentifierExpression;
import org.hypertrace.core.documentstore.expression.impl.ArrayIdentifierExpression;
import org.hypertrace.core.documentstore.expression.impl.ConstantExpression;
import org.hypertrace.core.documentstore.expression.impl.ConstantExpression.DateConstantExpression;
import org.hypertrace.core.documentstore.expression.impl.ConstantExpression.DocumentConstantExpression;
import org.hypertrace.core.documentstore.expression.impl.FunctionExpression;
import org.hypertrace.core.documentstore.expression.impl.IdentifierExpression;
Expand Down Expand Up @@ -37,4 +38,12 @@ default <T> T visit(final ArrayIdentifierExpression expression) {
default <T> T visit(final JsonIdentifierExpression expression) {
return visit((IdentifierExpression) expression);
}

/**
* Visit a DateConstantExpression. Default implementation throws UnsupportedOperationException.
* Override this method in implementations that support DateConstantExpression.
*/
default <T> T visit(final DateConstantExpression expression) {
throw new UnsupportedOperationException("DateConstantExpression is not supported");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import lombok.NoArgsConstructor;
import org.hypertrace.core.documentstore.expression.impl.ConstantExpression;
import org.hypertrace.core.documentstore.expression.impl.ConstantExpression.DateConstantExpression;
import org.hypertrace.core.documentstore.expression.impl.ConstantExpression.DocumentConstantExpression;
import org.hypertrace.core.documentstore.postgres.query.v1.PostgresQueryParser;

Expand Down Expand Up @@ -30,4 +31,9 @@ public Object visit(final ConstantExpression expression) {
public Object visit(final DocumentConstantExpression expression) {
return expression.getValue();
}

@Override
public Object visit(final DateConstantExpression expression) {
throw new UnsupportedOperationException("DateConstantExpression is not supported for Postgres");
}
}
Loading