Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add virtual columns support. #86

Merged
merged 2 commits into from
Aug 10, 2019
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Next Next commit
Add virtual columns support.
  • Loading branch information
vchimishuk committed Feb 19, 2019
commit a7105aef028f28c438920d50b3b73222a574d635
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,9 @@ Supported Features
* ThetaSketchEstimate
* ThetaSketchSetOp

#### Virtual Columns
* Expression

#### Granularity
* Duration
* Period
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import in.zapr.druid.druidry.granularity.Granularity;
import in.zapr.druid.druidry.postAggregator.DruidPostAggregator;
import in.zapr.druid.druidry.query.DruidQuery;
import in.zapr.druid.druidry.virtualColumn.DruidVirtualColumn;
import lombok.EqualsAndHashCode;
import lombok.Getter;

Expand All @@ -35,6 +36,7 @@
public abstract class DruidAggregationQuery extends DruidQuery {
protected List<Interval> intervals;
protected Granularity granularity;
protected List<DruidVirtualColumn> virtualColumns;
protected DruidFilter filter;
protected List<DruidAggregator> aggregations;
protected List<DruidPostAggregator> postAggregations;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import in.zapr.druid.druidry.limitSpec.DefaultLimitSpec;
import in.zapr.druid.druidry.postAggregator.DruidPostAggregator;
import in.zapr.druid.druidry.query.QueryType;
import in.zapr.druid.druidry.virtualColumn.DruidVirtualColumn;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
Expand All @@ -50,6 +51,7 @@ private DruidGroupByQuery(@NonNull String dataSource,
@NonNull List<DruidDimension> dimensions,
DefaultLimitSpec limitSpec,
@NonNull Granularity granularity,
List<DruidVirtualColumn> virtualColumns,
DruidFilter filter,
List<DruidAggregator> aggregators,
List<DruidPostAggregator> postAggregators,
Expand All @@ -61,10 +63,11 @@ private DruidGroupByQuery(@NonNull String dataSource,
this.dimensions = dimensions;
this.limitSpec = limitSpec;
this.granularity = granularity;
this.virtualColumns = virtualColumns;
this.filter = filter;
this.aggregations = aggregators;
this.postAggregations = postAggregators;
this.intervals = intervals;
this.context = context;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import in.zapr.druid.druidry.granularity.Granularity;
import in.zapr.druid.druidry.postAggregator.DruidPostAggregator;
import in.zapr.druid.druidry.query.QueryType;
import in.zapr.druid.druidry.virtualColumn.DruidVirtualColumn;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
Expand All @@ -42,6 +43,7 @@ public class DruidTimeSeriesQuery extends DruidAggregationQuery {
@Builder
private DruidTimeSeriesQuery(@NonNull String dataSource, Boolean descending,
@NonNull List<Interval> intervals, @NonNull Granularity granularity,
List<DruidVirtualColumn> virtualColumns,
DruidFilter filter, List<DruidAggregator> aggregators,
List<DruidPostAggregator> postAggregators, Context context) {

Expand All @@ -50,6 +52,7 @@ private DruidTimeSeriesQuery(@NonNull String dataSource, Boolean descending,
this.descending = descending;
this.intervals = intervals;
this.granularity = granularity;
this.virtualColumns = virtualColumns;
this.filter = filter;
this.aggregations = aggregators;
this.postAggregations = postAggregators;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import in.zapr.druid.druidry.postAggregator.DruidPostAggregator;
import in.zapr.druid.druidry.query.QueryType;
import in.zapr.druid.druidry.topNMetric.TopNMetric;
import in.zapr.druid.druidry.virtualColumn.DruidVirtualColumn;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
Expand All @@ -49,6 +50,7 @@ public class DruidTopNQuery extends DruidAggregationQuery {
private DruidTopNQuery(@NonNull String dataSource,
@NonNull List<Interval> intervals,
@NonNull Granularity granularity,
List<DruidVirtualColumn> virtualColumns,
DruidFilter filter,
List<DruidAggregator> aggregators,
List<DruidPostAggregator> postAggregators,
Expand All @@ -61,6 +63,7 @@ private DruidTopNQuery(@NonNull String dataSource,
this.dataSource = dataSource;
this.intervals = intervals;
this.granularity = granularity;
this.virtualColumns = virtualColumns;
this.filter = filter;
this.aggregations = aggregators;
this.postAggregations = postAggregators;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package in.zapr.druid.druidry.virtualColumn;

import in.zapr.druid.druidry.dimension.enums.OutputType;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NonNull;

@Getter
@EqualsAndHashCode
public abstract class DruidVirtualColumn {
abhi-zapr marked this conversation as resolved.
Show resolved Hide resolved
@NonNull
protected String type;

@NonNull
protected String name;

protected OutputType outputType;
abhi-zapr marked this conversation as resolved.
Show resolved Hide resolved
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package in.zapr.druid.druidry.virtualColumn;

import javax.annotation.Nonnull;

import in.zapr.druid.druidry.dimension.enums.OutputType;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NonNull;

@Getter
@EqualsAndHashCode(callSuper = true)
public class ExpressionVirtualColumn extends DruidVirtualColumn {
abhi-zapr marked this conversation as resolved.
Show resolved Hide resolved
private static final String EXPRESSION_VIRTUAL_COLUMN = "expression";

@NonNull
private String expression;

public ExpressionVirtualColumn(@NonNull String name, @Nonnull String expression) {
abhi-zapr marked this conversation as resolved.
Show resolved Hide resolved
this(name, expression, OutputType.FLOAT);
}

public ExpressionVirtualColumn(@NonNull String name, @Nonnull String expression, OutputType outputType) {
this.type = EXPRESSION_VIRTUAL_COLUMN;
this.name = name;
this.outputType = outputType;
this.expression = expression;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package in.zapr.druid.druidry.virtualColumn;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import org.json.JSONException;
import org.json.JSONObject;
import org.skyscreamer.jsonassert.JSONAssert;
import org.skyscreamer.jsonassert.JSONCompareMode;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import in.zapr.druid.druidry.dimension.enums.OutputType;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class ExpressionVirtualColumnTest {
abhi-zapr marked this conversation as resolved.
Show resolved Hide resolved
private static ObjectMapper objectMapper;

@BeforeClass
public void init() {
objectMapper = new ObjectMapper();
}

@Test
public void testGeneratedJSON() throws JsonProcessingException, JSONException {
ExpressionVirtualColumn column = new ExpressionVirtualColumn("foo", "a + b");
JSONObject expected = new JSONObject();
expected.put("type", "expression");
expected.put("name", "foo");
expected.put("outputType", "FLOAT");
expected.put("expression", "a + b");
String output = objectMapper.writeValueAsString(column);
JSONAssert.assertEquals(expected.toString(), output, JSONCompareMode.NON_EXTENSIBLE);

column = new ExpressionVirtualColumn("bar", "a + b", OutputType.LONG);
expected = new JSONObject();
expected.put("type", "expression");
expected.put("name", "bar");
expected.put("outputType", "LONG");
expected.put("expression", "a + b");
output = objectMapper.writeValueAsString(column);
JSONAssert.assertEquals(expected.toString(), output, JSONCompareMode.NON_EXTENSIBLE);
}
}