Skip to content

Commit

Permalink
DRILL-3316: Ensure different Sql handlers go through same planning ph…
Browse files Browse the repository at this point in the history
…ases.
  • Loading branch information
jinfengni committed Jun 20, 2015
1 parent 4c44466 commit ffae169
Show file tree
Hide file tree
Showing 7 changed files with 188 additions and 178 deletions.
Expand Up @@ -18,16 +18,13 @@
package org.apache.drill.exec.planner.sql.handlers; package org.apache.drill.exec.planner.sql.handlers;


import java.io.IOException; import java.io.IOException;
import java.math.BigDecimal;
import java.util.AbstractList;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;


import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import org.apache.calcite.plan.RelOptCluster; import org.apache.calcite.plan.RelOptCluster;
import org.apache.calcite.plan.RelOptUtil;
import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rel.type.RelDataTypeField; import org.apache.calcite.rel.type.RelDataTypeField;
Expand All @@ -39,24 +36,18 @@
import org.apache.calcite.tools.RelConversionException; import org.apache.calcite.tools.RelConversionException;
import org.apache.calcite.tools.ValidationException; import org.apache.calcite.tools.ValidationException;


import org.apache.calcite.util.Pair;
import org.apache.drill.common.exceptions.UserException; import org.apache.drill.common.exceptions.UserException;
import org.apache.drill.common.expression.SchemaPath;
import org.apache.drill.common.types.TypeProtos;
import org.apache.drill.exec.expr.TypeHelper;
import org.apache.drill.exec.physical.PhysicalPlan; import org.apache.drill.exec.physical.PhysicalPlan;
import org.apache.drill.exec.physical.base.PhysicalOperator; import org.apache.drill.exec.physical.base.PhysicalOperator;
import org.apache.drill.exec.planner.logical.DrillRel; import org.apache.drill.exec.planner.logical.DrillRel;
import org.apache.drill.exec.planner.logical.DrillScreenRel; import org.apache.drill.exec.planner.logical.DrillScreenRel;
import org.apache.drill.exec.planner.logical.DrillStoreRel;
import org.apache.drill.exec.planner.logical.DrillWriterRel; import org.apache.drill.exec.planner.logical.DrillWriterRel;
import org.apache.drill.exec.planner.physical.Prel; import org.apache.drill.exec.planner.physical.Prel;
import org.apache.drill.exec.planner.physical.ProjectAllowDupPrel; import org.apache.drill.exec.planner.physical.ProjectAllowDupPrel;
import org.apache.drill.exec.planner.physical.ProjectPrel; import org.apache.drill.exec.planner.physical.ProjectPrel;
import org.apache.drill.exec.planner.physical.WriterPrel; import org.apache.drill.exec.planner.physical.WriterPrel;
import org.apache.drill.exec.planner.physical.visitor.BasePrelVisitor; import org.apache.drill.exec.planner.physical.visitor.BasePrelVisitor;
import org.apache.drill.exec.planner.sql.DrillSqlOperator; import org.apache.drill.exec.planner.sql.DrillSqlOperator;
import org.apache.drill.exec.planner.sql.DrillSqlWorker;
import org.apache.drill.exec.planner.sql.SchemaUtilites; import org.apache.drill.exec.planner.sql.SchemaUtilites;
import org.apache.drill.exec.planner.sql.parser.SqlCreateTable; import org.apache.drill.exec.planner.sql.parser.SqlCreateTable;
import org.apache.drill.exec.store.AbstractSchema; import org.apache.drill.exec.store.AbstractSchema;
Expand All @@ -72,10 +63,15 @@ public CreateTableHandler(SqlHandlerConfig config, Pointer<String> textPlan) {
@Override @Override
public PhysicalPlan getPlan(SqlNode sqlNode) throws ValidationException, RelConversionException, IOException, ForemanSetupException { public PhysicalPlan getPlan(SqlNode sqlNode) throws ValidationException, RelConversionException, IOException, ForemanSetupException {
SqlCreateTable sqlCreateTable = unwrap(sqlNode, SqlCreateTable.class); SqlCreateTable sqlCreateTable = unwrap(sqlNode, SqlCreateTable.class);

final String newTblName = sqlCreateTable.getName(); final String newTblName = sqlCreateTable.getName();

final ConvertedRelNode convertedRelNode = validateAndConvert(sqlCreateTable.getQuery());
final RelDataType validatedRowType = convertedRelNode.getValidatedRowType();
final RelNode queryRelNode = convertedRelNode.getConvertedNode();


final RelNode newTblRelNode = final RelNode newTblRelNode =
SqlHandlerUtil.resolveNewTableRel(false, planner, sqlCreateTable.getFieldNames(), sqlCreateTable.getQuery()); SqlHandlerUtil.resolveNewTableRel(false, sqlCreateTable.getFieldNames(), validatedRowType, queryRelNode);




final AbstractSchema drillSchema = final AbstractSchema drillSchema =
Expand All @@ -93,7 +89,7 @@ public PhysicalPlan getPlan(SqlNode sqlNode) throws ValidationException, RelConv
log("Optiq Logical", newTblRelNodeWithPCol); log("Optiq Logical", newTblRelNodeWithPCol);


// Convert the query to Drill Logical plan and insert a writer operator on top. // Convert the query to Drill Logical plan and insert a writer operator on top.
DrillRel drel = convertToDrel(newTblRelNodeWithPCol, drillSchema, newTblName, sqlCreateTable.getPartitionColumns()); DrillRel drel = convertToDrel(newTblRelNodeWithPCol, drillSchema, newTblName, sqlCreateTable.getPartitionColumns(), newTblRelNode.getRowType());
log("Drill Logical", drel); log("Drill Logical", drel);
Prel prel = convertToPrel(drel, newTblRelNode.getRowType(), sqlCreateTable.getPartitionColumns()); Prel prel = convertToPrel(drel, newTblRelNode.getRowType(), sqlCreateTable.getPartitionColumns());
log("Drill Physical", prel); log("Drill Physical", prel);
Expand All @@ -104,14 +100,10 @@ public PhysicalPlan getPlan(SqlNode sqlNode) throws ValidationException, RelConv
return plan; return plan;
} }


private DrillRel convertToDrel(RelNode relNode, AbstractSchema schema, String tableName, List<String> partitionColumns) private DrillRel convertToDrel(RelNode relNode, AbstractSchema schema, String tableName, List<String> partitionColumns, RelDataType queryRowType)
throws RelConversionException { throws RelConversionException, SqlUnsupportedException {
RelNode convertedRelNode = planner.transform(DrillSqlWorker.LOGICAL_RULES,
relNode.getTraitSet().plus(DrillRel.DRILL_LOGICAL), relNode);


if (convertedRelNode instanceof DrillStoreRel) { final DrillRel convertedRelNode = convertToDrel(relNode);
throw new UnsupportedOperationException();
}


DrillWriterRel writerRel = new DrillWriterRel(convertedRelNode.getCluster(), convertedRelNode.getTraitSet(), DrillWriterRel writerRel = new DrillWriterRel(convertedRelNode.getCluster(), convertedRelNode.getTraitSet(),
convertedRelNode, schema.createNewTable(tableName, partitionColumns)); convertedRelNode, schema.createNewTable(tableName, partitionColumns));
Expand Down

0 comments on commit ffae169

Please sign in to comment.