You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by li...@apache.org on 2016/12/14 10:31:28 UTC
[6/8] kylin git commit: KYLIN-2277 half way, almost done,
need test case
KYLIN-2277 half way, almost done, need test case
Project: http://git-wip-us.apache.org/repos/asf/kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/9cffc100
Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/9cffc100
Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/9cffc100
Branch: refs/heads/KYLIN-2277
Commit: 9cffc1005ef3be074cb09427eb1df75f64510da7
Parents: e6e330a
Author: Yang Li <li...@apache.org>
Authored: Tue Dec 13 23:45:55 2016 +0800
Committer: Li Yang <li...@apache.org>
Committed: Wed Dec 14 15:41:19 2016 +0800
----------------------------------------------------------------------
.../calcite/sql2rel/SqlToRelConverter.java | 46 +++++++++++++++++++-
1 file changed, 45 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/kylin/blob/9cffc100/atopcalcite/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
----------------------------------------------------------------------
diff --git a/atopcalcite/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java b/atopcalcite/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
index d223cdf..7e00b8c 100644
--- a/atopcalcite/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
+++ b/atopcalcite/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
@@ -67,6 +67,7 @@ import org.apache.calcite.rel.stream.Delta;
import org.apache.calcite.rel.stream.LogicalDelta;
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rel.type.RelDataTypeFactory;
+import org.apache.calcite.rel.type.RelDataTypeFactory.FieldInfoBuilder;
import org.apache.calcite.rel.type.RelDataTypeField;
import org.apache.calcite.rex.RexBuilder;
import org.apache.calcite.rex.RexCall;
@@ -194,6 +195,7 @@ import static org.apache.calcite.util.Static.RESOURCE;
* - getInSubqueryThreshold(), was `20`, now `Integer.MAX_VALUE`
* - isTrimUnusedFields(), override to false
* - AggConverter.translateAgg(...), skip column reading for COUNT(COL), for https://jirap.corp.ebay.com/browse/KYLIN-104
+ * - convertQuery(), call hackSelectStar() at the end
*/
/**
@@ -553,7 +555,49 @@ public class SqlToRelConverter {
}
final RelDataType validatedRowType = validator.getValidatedNodeType(query);
- return RelRoot.of(result, validatedRowType, query.getKind()).withCollation(collation);
+ return hackSelectStar(query, RelRoot.of(result, validatedRowType, query.getKind()).withCollation(collation));
+ }
+
+ /* OVERRIDE POINT */
+ private RelRoot hackSelectStar(SqlNode query, RelRoot root) {
+ if (!(root.rel instanceof LogicalProject))
+ return root;
+
+ LogicalProject rootPrj = (LogicalProject) root.rel;
+ if (!rootPrj.getInput().getClass().getSimpleName().equals("OLAPTableScan"))
+ return root;
+
+ RelNode scan = rootPrj.getInput();
+ if (rootPrj.getRowType().getFieldCount() < scan.getRowType().getFieldCount())
+ return root;
+
+ RelDataType inType = scan.getRowType();
+ List<String> inFields = inType.getFieldNames();
+ List<RexNode> projExp = new ArrayList<>();
+ List<Pair<Integer, String>> projFields = new ArrayList<>();
+ FieldInfoBuilder projTypeBuilder = getCluster().getTypeFactory().builder();
+ FieldInfoBuilder validTypeBuilder = getCluster().getTypeFactory().builder();
+ SqlNodeList selectList = ((SqlSelect) query).getSelectList();
+ SqlNodeList newSelectList = new SqlNodeList(selectList.getParserPosition());
+ for (int i = 0; i < inFields.size(); i++) {
+ if (!inFields.get(i).endsWith("_")) {
+ RexBuilder rexBuilder = getCluster().getRexBuilder();
+ projExp.add(rexBuilder.makeInputRef(scan, i));
+ projFields.add(Pair.of(projFields.size(), inFields.get(i)));
+ projTypeBuilder.add(inType.getFieldList().get(i));
+ validTypeBuilder.add(root.validatedRowType.getFieldList().get(i));
+ newSelectList.add(selectList.get(i));
+ }
+ }
+
+ RelDataType projRowType = getCluster().getTypeFactory().createStructType(projTypeBuilder);
+ RelDataType validRowType = getCluster().getTypeFactory().createStructType(validTypeBuilder);
+ root = new RelRoot(LogicalProject.create(scan, projExp, projRowType), validRowType, root.kind, projFields, root.collation);
+
+ ((SqlSelect) query).setSelectList(newSelectList);
+ validator.setValidatedNodeType(query, validRowType);
+
+ return root;
}
private static boolean isStream(SqlNode query) {