Skip to content

Commit 7af5529

Browse files
committed
KYLIN-2341 report error on unsupported aggr func
1 parent 2057831 commit 7af5529

File tree

6 files changed

+44
-67
lines changed

6 files changed

+44
-67
lines changed

core-metadata/src/main/java/org/apache/kylin/metadata/model/FunctionDesc.java

+2-6
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
package org.apache.kylin.metadata.model;
2020

2121
import java.io.Serializable;
22-
import java.util.ArrayList;
2322
import java.util.Collections;
2423
import java.util.LinkedHashMap;
2524
import java.util.List;
@@ -41,6 +40,7 @@
4140

4241
/**
4342
*/
43+
@SuppressWarnings("serial")
4444
@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
4545
public class FunctionDesc implements Serializable {
4646

@@ -90,17 +90,13 @@ public void init(DataModelDesc model) {
9090
expression = expression.toUpperCase();
9191
returnDataType = DataType.getType(returnType);
9292

93-
ArrayList<TblColRef> colRefs = Lists.newArrayList();
9493
for (ParameterDesc p = parameter; p != null; p = p.getNextParameter()) {
9594
if (p.isColumnType()) {
9695
TblColRef colRef = model.findColumn(p.getValue());
9796
p.setValue(colRef.getIdentity());
98-
colRefs.add(colRef);
97+
p.setColRef(colRef);
9998
}
10099
}
101-
102-
if (parameter != null)
103-
parameter.setColRefs(colRefs);
104100
}
105101

106102
private void reInitMeasureType() {

core-metadata/src/main/java/org/apache/kylin/metadata/model/ParameterDesc.java

+30-27
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import java.io.Serializable;
2222
import java.io.UnsupportedEncodingException;
23+
import java.util.ArrayList;
2324
import java.util.Arrays;
2425
import java.util.List;
2526
import java.util.Set;
@@ -28,8 +29,6 @@
2829
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
2930
import com.fasterxml.jackson.annotation.JsonInclude;
3031
import com.fasterxml.jackson.annotation.JsonProperty;
31-
import com.google.common.collect.ImmutableList;
32-
import com.google.common.collect.Iterables;
3332
import com.google.common.collect.Sets;
3433

3534
/**
@@ -49,20 +48,14 @@ public static ParameterDesc newInstance(Object... objs) {
4948
TblColRef col = (TblColRef) obj;
5049
r.type = FunctionDesc.PARAMETER_TYPE_COLUMN;
5150
r.value = col.getIdentity();
52-
r.colRefs = ImmutableList.of(col);
51+
r.colRef = col;
5352
} else {
5453
r.type = FunctionDesc.PARAMETER_TYPE_CONSTANT;
5554
r.value = (String) obj;
5655
}
5756

5857
if (objs.length >= 2) {
5958
r.nextParameter = newInstance(Arrays.copyOfRange(objs, 1, objs.length));
60-
if (r.nextParameter.colRefs.size() > 0) {
61-
if (r.colRefs.isEmpty())
62-
r.colRefs = r.nextParameter.colRefs;
63-
else
64-
r.colRefs = ImmutableList.copyOf(Iterables.concat(r.colRefs, r.nextParameter.colRefs));
65-
}
6659
}
6760
return r;
6861
}
@@ -76,7 +69,8 @@ public static ParameterDesc newInstance(Object... objs) {
7669
@JsonInclude(JsonInclude.Include.NON_NULL)
7770
private ParameterDesc nextParameter;
7871

79-
private List<TblColRef> colRefs = ImmutableList.of();
72+
private TblColRef colRef = null;
73+
private List<TblColRef> allColRefsIncludingNexts = null;
8074
private Set<PlainParameter> plainParameters = null;
8175

8276
// Lazy evaluation
@@ -102,13 +96,28 @@ public String getValue() {
10296
void setValue(String value) {
10397
this.value = value;
10498
}
99+
100+
public TblColRef getColRef() {
101+
return colRef;
102+
}
105103

106-
public List<TblColRef> getColRefs() {
107-
return colRefs;
104+
void setColRef(TblColRef colRef) {
105+
this.colRef = colRef;
108106
}
109107

110-
void setColRefs(List<TblColRef> colRefs) {
111-
this.colRefs = colRefs;
108+
public List<TblColRef> getColRefs() {
109+
if (allColRefsIncludingNexts == null) {
110+
List<TblColRef> all = new ArrayList<>(2);
111+
ParameterDesc p = this;
112+
while (p != null) {
113+
if (p.isColumnType())
114+
all.add(p.getColRef());
115+
116+
p = p.nextParameter;
117+
}
118+
allColRefsIncludingNexts = all;
119+
}
120+
return allColRefsIncludingNexts;
112121
}
113122

114123
public ParameterDesc getNextParameter() {
@@ -132,17 +141,12 @@ public boolean equals(Object o) {
132141
return false;
133142

134143
ParameterDesc p = this, q = that;
135-
int refi = 0, refj = 0;
136144
for (; p != null && q != null; p = p.nextParameter, q = q.nextParameter) {
137145
if (p.isColumnType()) {
138146
if (q.isColumnType() == false)
139147
return false;
140-
if (refi >= this.colRefs.size() || refj >= that.colRefs.size())
141-
return false;
142-
if (this.colRefs.get(refi).equals(that.colRefs.get(refj)) == false)
148+
if (this.getColRef().equals(that.getColRef()) == false)
143149
return false;
144-
refi++;
145-
refj++;
146150
} else {
147151
if (q.isColumnType() == true)
148152
return false;
@@ -171,13 +175,14 @@ public boolean equalInArbitraryOrder(Object o) {
171175
@Override
172176
public int hashCode() {
173177
int result = type != null ? type.hashCode() : 0;
174-
result = 31 * result + (colRefs != null ? colRefs.hashCode() : 0);
178+
result = 31 * result + (colRef != null ? colRef.hashCode() : 0);
175179
return result;
176180
}
177181

178182
@Override
179183
public String toString() {
180-
return "ParameterDesc [type=" + type + ", value=" + value + ", nextParam=" + nextParameter + "]";
184+
String thisStr = isColumnType() ? colRef.toString() : value;
185+
return nextParameter == null ? thisStr : thisStr + "," + nextParameter.toString();
181186
}
182187

183188
/**
@@ -201,11 +206,9 @@ public boolean isColumnType() {
201206
static Set<PlainParameter> createFromParameterDesc(ParameterDesc parameterDesc) {
202207
Set<PlainParameter> result = Sets.newHashSet();
203208
ParameterDesc local = parameterDesc;
204-
List<TblColRef> totalColRef = parameterDesc.colRefs;
205-
Integer colIndex = 0;
206209
while (local != null) {
207210
if (local.isColumnType()) {
208-
result.add(createSingleColumnParameter(local, totalColRef.get(colIndex++)));
211+
result.add(createSingleColumnParameter(local));
209212
} else {
210213
result.add(createSingleValueParameter(local));
211214
}
@@ -221,11 +224,11 @@ static PlainParameter createSingleValueParameter(ParameterDesc parameterDesc) {
221224
return single;
222225
}
223226

224-
static PlainParameter createSingleColumnParameter(ParameterDesc parameterDesc, TblColRef colRef) {
227+
static PlainParameter createSingleColumnParameter(ParameterDesc parameterDesc) {
225228
PlainParameter single = new PlainParameter();
226229
single.type = parameterDesc.type;
227230
single.value = parameterDesc.value;
228-
single.colRef = colRef;
231+
single.colRef = parameterDesc.colRef;
229232
return single;
230233
}
231234

core-metadata/src/main/java/org/apache/kylin/metadata/model/TblColRef.java

+10
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,18 @@ public static boolean contains(String name) {
5454

5555
// used by projection rewrite, see OLAPProjectRel
5656
public static TblColRef newInnerColumn(String columnName, InnerDataTypeEnum dataType) {
57+
return newInnerColumn(columnName, dataType, null);
58+
}
59+
60+
// used by projection rewrite, see OLAPProjectRel
61+
public static TblColRef newInnerColumn(String columnName, InnerDataTypeEnum dataType, String parserDescription) {
5762
ColumnDesc column = new ColumnDesc();
5863
column.setName(columnName);
5964
TableDesc table = new TableDesc();
6065
column.setTable(table);
6166
TblColRef colRef = new TblColRef(column);
6267
colRef.markInnerColumn(dataType);
68+
colRef.parserDescription = parserDescription;
6369
return colRef;
6470
}
6571

@@ -101,6 +107,7 @@ public static TblColRef mockup(TableDesc table, int oneBasedColumnIndex, String
101107
private TableRef table;
102108
private ColumnDesc column;
103109
private String identity;
110+
private String parserDescription;
104111

105112
TblColRef(ColumnDesc column) {
106113
this.column = column;
@@ -198,6 +205,9 @@ public String getIdentity() {
198205

199206
@Override
200207
public String toString() {
208+
if (isInnerColumn() && parserDescription != null)
209+
return parserDescription;
210+
201211
String alias = table == null ? "UNKNOWN_MODEL" : table.getAlias();
202212
String tableName = column.getTable() == null ? "NULL" : column.getTable().getName();
203213
String tableIdentity = column.getTable() == null ? "NULL" : column.getTable().getIdentity();

kylin-it/src/test/resources/query/sql_casewhen/query04.sql

-30
This file was deleted.

query/src/main/java/org/apache/kylin/query/relnode/OLAPAggregateRel.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -262,9 +262,7 @@ private void buildAggregations() {
262262
}
263263
for (Integer index : aggCall.getArgList().subList(0, columnsCount)) {
264264
TblColRef column = inputColumnRowType.getColumnByIndex(index);
265-
if (!column.isInnerColumn()) {
266-
columns.add(column);
267-
}
265+
columns.add(column);
268266
}
269267
if (!columns.isEmpty()) {
270268
parameter = ParameterDesc.newInstance(columns.toArray(new TblColRef[columns.size()]));

query/src/main/java/org/apache/kylin/query/relnode/OLAPProjectRel.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ private TblColRef translateRexCall(RexCall call, ColumnRowType inputColumnRowTyp
204204
for (RexNode operand : call.getOperands()) {
205205
translateRexNode(operand, inputColumnRowType, fieldName, sourceCollector);
206206
}
207-
return TblColRef.newInnerColumn(fieldName, InnerDataTypeEnum.LITERAL);
207+
return TblColRef.newInnerColumn(fieldName, InnerDataTypeEnum.LITERAL, call.toString());
208208
}
209209

210210
@Override

0 commit comments

Comments
 (0)