Skip to content
Closed
2 changes: 1 addition & 1 deletion .github/workflows/sql-odbc-main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ env:

jobs:
build-mac:
runs-on: macos-latest
runs-on: macos-10.15
defaults:
run:
working-directory: sql-odbc
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/sql-odbc-release-workflow.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ env:

jobs:
build-mac:
runs-on: macos-latest
runs-on: macos-11
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was this intentionally different from build?

defaults:
run:
working-directory: sql-odbc
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
import org.opensearch.sql.ast.expression.Not;
import org.opensearch.sql.ast.expression.Or;
import org.opensearch.sql.ast.expression.QualifiedName;
import org.opensearch.sql.ast.expression.Span;
import org.opensearch.sql.ast.expression.UnresolvedAttribute;
import org.opensearch.sql.ast.expression.UnresolvedExpression;
import org.opensearch.sql.ast.expression.When;
Expand All @@ -62,6 +63,7 @@
import org.opensearch.sql.exception.SemanticCheckException;
import org.opensearch.sql.expression.DSL;
import org.opensearch.sql.expression.Expression;
import org.opensearch.sql.expression.NamedExpression;
import org.opensearch.sql.expression.ReferenceExpression;
import org.opensearch.sql.expression.aggregation.AggregationState;
import org.opensearch.sql.expression.aggregation.Aggregator;
Expand All @@ -70,6 +72,7 @@
import org.opensearch.sql.expression.function.BuiltinFunctionName;
import org.opensearch.sql.expression.function.BuiltinFunctionRepository;
import org.opensearch.sql.expression.function.FunctionName;
import org.opensearch.sql.expression.span.SpanExpression;
import org.opensearch.sql.expression.window.aggregation.AggregateWindowFunction;

/**
Expand Down Expand Up @@ -258,6 +261,14 @@ public Expression visitQualifiedName(QualifiedName node, AnalysisContext context
return visitIdentifier(qualifierAnalyzer.unqualified(node), context);
}

@Override
public Expression visitSpan(Span node, AnalysisContext context) {
return new SpanExpression(
node.getField().accept(this, context),
node.getValue().accept(this, context),
node.getUnit());
}

private Expression visitIdentifier(String ident, AnalysisContext context) {
TypeEnvironment typeEnv = context.peek();
ReferenceExpression ref = DSL.ref(ident,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,11 @@
import org.opensearch.sql.ast.AbstractNodeVisitor;
import org.opensearch.sql.ast.expression.Alias;
import org.opensearch.sql.ast.expression.QualifiedName;
import org.opensearch.sql.ast.expression.Span;
import org.opensearch.sql.ast.expression.UnresolvedExpression;
import org.opensearch.sql.expression.DSL;
import org.opensearch.sql.expression.NamedExpression;
import org.opensearch.sql.expression.span.SpanExpression;

/**
* Analyze the Alias node in the {@link AnalysisContext} to construct the list of
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
import org.opensearch.sql.ast.expression.Not;
import org.opensearch.sql.ast.expression.Or;
import org.opensearch.sql.ast.expression.QualifiedName;
import org.opensearch.sql.ast.expression.Span;
import org.opensearch.sql.ast.expression.UnresolvedArgument;
import org.opensearch.sql.ast.expression.UnresolvedAttribute;
import org.opensearch.sql.ast.expression.When;
Expand Down Expand Up @@ -249,4 +250,8 @@ public T visitUnresolvedArgument(UnresolvedArgument node, C context) {
public T visitLimit(Limit node, C context) {
return visitChildren(node, context);
}

public T visitSpan(Span node, C context) {
return visitChildren(node, context);
}
}
6 changes: 6 additions & 0 deletions core/src/main/java/org/opensearch/sql/ast/dsl/AstDSL.java
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@
import org.opensearch.sql.ast.expression.Not;
import org.opensearch.sql.ast.expression.Or;
import org.opensearch.sql.ast.expression.QualifiedName;
import org.opensearch.sql.ast.expression.Span;
import org.opensearch.sql.ast.expression.SpanUnit;
import org.opensearch.sql.ast.expression.UnresolvedArgument;
import org.opensearch.sql.ast.expression.UnresolvedAttribute;
import org.opensearch.sql.ast.expression.UnresolvedExpression;
Expand Down Expand Up @@ -381,6 +383,10 @@ public static List<Argument> defaultSortFieldArgs() {
return exprList(argument("asc", booleanLiteral(true)), argument("type", nullLiteral()));
}

public static Span span(UnresolvedExpression field, UnresolvedExpression value, SpanUnit unit) {
return new Span(field, value, unit);
}

public static Sort sort(UnresolvedPlan input, Field... sorts) {
return new Sort(input, Arrays.asList(sorts));
}
Expand Down
46 changes: 46 additions & 0 deletions core/src/main/java/org/opensearch/sql/ast/expression/Span.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* SPDX-License-Identifier: Apache-2.0
*
* The OpenSearch Contributors require contributions made to
* this file be licensed under the Apache-2.0 license or a
* compatible open source license.
*
* Modifications Copyright OpenSearch Contributors. See
* GitHub history for details.
*
*/

package org.opensearch.sql.ast.expression;

import com.google.common.collect.ImmutableList;
import java.util.List;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
import org.opensearch.sql.ast.AbstractNodeVisitor;

/**
* Span expression node.
* Params include field expression and the span value.
*/
@Getter
@EqualsAndHashCode(callSuper = false)
@RequiredArgsConstructor
@ToString
public class Span extends UnresolvedExpression {
private final UnresolvedExpression field;
private final UnresolvedExpression value;
private final SpanUnit unit;

@Override
public List<UnresolvedExpression> getChild() {
return ImmutableList.of(field, value);
}

@Override
public <R, C> R accept(AbstractNodeVisitor<R, C> nodeVisitor, C context) {
return nodeVisitor.visitSpan(this, context);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
/*
* SPDX-License-Identifier: Apache-2.0
*
* The OpenSearch Contributors require contributions made to
* this file be licensed under the Apache-2.0 license or a
* compatible open source license.
*
* Modifications Copyright OpenSearch Contributors. See
* GitHub history for details.
*
*/

package org.opensearch.sql.ast.expression;

import com.google.common.collect.ImmutableList;
import java.util.List;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public enum SpanUnit {
UNKNOWN("unknown"),
NONE(""),
MILLISECOND("ms"),
MS("ms"),
SECOND("s"),
S("s"),
MINUTE("m"),
m("m"),
HOUR("h"),
H("h"),
DAY("d"),
D("d"),
WEEK("w"),
W("w"),
MONTH("M"),
M("M"),
QUARTER("q"),
Q("q"),
YEAR("y"),
Y("y");

private final String name;
private static final List<SpanUnit> SPAN_UNITS;

static {
ImmutableList.Builder<SpanUnit> builder = ImmutableList.builder();
SPAN_UNITS = builder.add(SpanUnit.values()).build();
}

/**
* Util method to get span unit given the unit name.
*/
public static SpanUnit of(String unit) {
switch (unit) {
case "":
return NONE;
case "M":
return M;
case "m":
return m;
default:
return SPAN_UNITS.stream()
.filter(v -> unit.equalsIgnoreCase(v.name()))
.findFirst()
.orElse(UNKNOWN);
}
}

public static String getName(SpanUnit unit) {
return unit.name;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,8 @@ public static ExprValue intervalValue(TemporalAmount value) {
*/
public static ExprValue tupleValue(Map<String, Object> map) {
LinkedHashMap<String, ExprValue> valueMap = new LinkedHashMap<>();
map.forEach((k, v) -> valueMap.put(k, fromObjectValue(v)));
map.forEach((k, v) -> valueMap
.put(k, v instanceof ExprValue ? (ExprValue) v : fromObjectValue(v)));
return new ExprTupleValue(valueMap);
}

Expand Down
6 changes: 6 additions & 0 deletions core/src/main/java/org/opensearch/sql/expression/DSL.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import java.util.Arrays;
import java.util.Collections;
import lombok.RequiredArgsConstructor;
import org.opensearch.sql.ast.expression.SpanUnit;
import org.opensearch.sql.data.model.ExprShortValue;
import org.opensearch.sql.data.model.ExprValue;
import org.opensearch.sql.data.model.ExprValueUtils;
Expand All @@ -39,6 +40,7 @@
import org.opensearch.sql.expression.conditional.cases.WhenClause;
import org.opensearch.sql.expression.function.BuiltinFunctionName;
import org.opensearch.sql.expression.function.BuiltinFunctionRepository;
import org.opensearch.sql.expression.span.SpanExpression;
import org.opensearch.sql.expression.window.ranking.RankingWindowFunction;

@RequiredArgsConstructor
Expand Down Expand Up @@ -128,6 +130,10 @@ public static NamedAggregator named(String name, Aggregator aggregator) {
return new NamedAggregator(name, aggregator);
}

public static SpanExpression span(Expression field, Expression value, String unit) {
return new SpanExpression(field, value, SpanUnit.of(unit));
}

public FunctionExpression abs(Expression... expressions) {
return function(BuiltinFunctionName.ABS, expressions);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@

package org.opensearch.sql.expression;

import org.opensearch.sql.ast.expression.Span;
import org.opensearch.sql.expression.aggregation.Aggregator;
import org.opensearch.sql.expression.aggregation.NamedAggregator;
import org.opensearch.sql.expression.conditional.cases.CaseClause;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/*
* SPDX-License-Identifier: Apache-2.0
*
* The OpenSearch Contributors require contributions made to
* this file be licensed under the Apache-2.0 license or a
* compatible open source license.
*
* Modifications Copyright OpenSearch Contributors. See
* GitHub history for details.
*
*/

package org.opensearch.sql.expression.span;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
import org.opensearch.sql.ast.expression.SpanUnit;
import org.opensearch.sql.data.model.ExprValue;
import org.opensearch.sql.data.type.ExprType;
import org.opensearch.sql.expression.Expression;
import org.opensearch.sql.expression.ExpressionNodeVisitor;
import org.opensearch.sql.expression.env.Environment;

@RequiredArgsConstructor
@Getter
@ToString
@EqualsAndHashCode
public class SpanExpression implements Expression {
private final Expression field;
private final Expression value;
private final SpanUnit unit;

@Override
public ExprValue valueOf(Environment<Expression, ExprValue> valueEnv) {
return value.valueOf(valueEnv);
}

/**
* Return type follows the following table.
* FIELD VALUE RETURN_TYPE
* int/long integer int/long (field type)
* int/long double double
* float/double integer float/double (field type)
* float/double double float/double (field type)
* other any field type
*/
@Override
public ExprType type() {
if (field.type().isCompatible(value.type())) {
return field.type();
} else if (value.type().isCompatible(field.type())) {
return value.type();
} else {
return field.type();
}
}

@Override
public <T, C> T accept(ExpressionNodeVisitor<T, C> visitor, C context) {
return visitor.visitNode(this, context);
}
}
Loading