Repository: phoenix Updated Branches: refs/heads/calcite 1ef5a298f -> 17888a272
Adapt column mapping sequence for Phoenix column family support Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/17888a27 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/17888a27 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/17888a27 Branch: refs/heads/calcite Commit: 17888a2720c4314d0f8c5287b5fe7ca838509c39 Parents: 1ef5a29 Author: maryannxue <maryann....@gmail.com> Authored: Mon Oct 3 10:59:49 2016 -0700 Committer: maryannxue <maryann....@gmail.com> Committed: Mon Oct 3 10:59:49 2016 -0700 ---------------------------------------------------------------------- .../apache/phoenix/calcite/BaseCalciteIT.java | 18 ++++- .../phoenix/calcite/CalciteLocalIndexIT.java | 6 +- .../apache/phoenix/calcite/TableMapping.java | 75 ++++++++++---------- 3 files changed, 56 insertions(+), 43 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/17888a27/phoenix-core/src/it/java/org/apache/phoenix/calcite/BaseCalciteIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/calcite/BaseCalciteIT.java b/phoenix-core/src/it/java/org/apache/phoenix/calcite/BaseCalciteIT.java index e192dc6..05d825d 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/calcite/BaseCalciteIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/calcite/BaseCalciteIT.java @@ -39,6 +39,7 @@ import java.text.DecimalFormat; import java.util.List; import java.util.Map; import java.util.Properties; +import java.util.regex.Pattern; import org.apache.calcite.avatica.util.ArrayImpl; import org.apache.calcite.config.CalciteConnectionProperty; @@ -168,12 +169,27 @@ public class BaseCalciteIT extends BaseHBaseManagedTimeIT { } public Sql explainIs(String expected) throws SQLException { + return checkExplain(expected, true); + } + + public Sql explainMatches(String expected) throws SQLException { + return checkExplain(expected, false); + } + + private Sql checkExplain(String expected, boolean exact) throws SQLException { final Statement statement = start.getConnection().createStatement(); final ResultSet resultSet = statement.executeQuery(start.getExplainPlanString() + " " + sql); String explain = QueryUtil.getExplainPlan(resultSet); resultSet.close(); statement.close(); - Assert.assertEquals(explain, expected); + if (exact) { + Assert.assertEquals(explain, expected); + } else { + Assert.assertTrue( + "Explain plan \"" + explain + + "\" does not match \"" + expected + "\"", + explain.matches(expected)); + } return this; } http://git-wip-us.apache.org/repos/asf/phoenix/blob/17888a27/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteLocalIndexIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteLocalIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteLocalIndexIT.java index 02cf2a1..7b6c279 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteLocalIndexIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteLocalIndexIT.java @@ -65,9 +65,9 @@ public class CalciteLocalIndexIT extends BaseCalciteIndexIT { " PhoenixTableScan(table=[[phoenix, IDX_FULL]])\n")*/ .close(); start(true, 1000f).sql("select a_string, b_string from aTable where a_string = 'a'") - .explainIs("PhoenixToEnumerableConverter\n" + - " PhoenixServerProject(A_STRING=[$0], B_STRING=[$3])\n" + - " PhoenixTableScan(table=[[phoenix, IDX1]], filter=[=($0, 'a')])\n") + .explainMatches("PhoenixToEnumerableConverter\n" + + " PhoenixServerProject\\((0:)?A_STRING=\\[\\$0\\], (0:)?B_STRING=\\[\\$3\\]\\)\n" + + " PhoenixTableScan\\(table=\\[\\[phoenix, IDX1\\]\\], filter=\\[=\\(\\$0, 'a'\\)\\]\\)\n") .close(); start(true, 1000f).sql("select a_string, b_string from aTable where b_string = 'b'") .explainIs("PhoenixToEnumerableConverter\n" + http://git-wip-us.apache.org/repos/asf/phoenix/blob/17888a27/phoenix-core/src/main/java/org/apache/phoenix/calcite/TableMapping.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/TableMapping.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/TableMapping.java index a8dd9d2..a00facf 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/TableMapping.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/TableMapping.java @@ -6,7 +6,6 @@ import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; -import java.util.Iterator; import java.util.List; import java.util.Set; @@ -31,6 +30,7 @@ import org.apache.phoenix.index.IndexMaintainer; import org.apache.phoenix.jdbc.PhoenixConnection; import org.apache.phoenix.schema.ColumnRef; import org.apache.phoenix.schema.PColumn; +import org.apache.phoenix.schema.PColumnFamily; import org.apache.phoenix.schema.PName; import org.apache.phoenix.schema.PNameFactory; import org.apache.phoenix.schema.PTable; @@ -42,7 +42,6 @@ import org.apache.phoenix.schema.KeyValueSchema.KeyValueSchemaBuilder; import org.apache.phoenix.schema.PTable.IndexType; import org.apache.phoenix.util.ByteUtil; import org.apache.phoenix.util.IndexUtil; -import org.apache.phoenix.util.MetaDataUtil; import org.apache.phoenix.util.SchemaUtil; import com.google.common.collect.Lists; @@ -74,25 +73,8 @@ public class TableMapping { this.mappedColumns = Lists.newArrayList(); this.mappedColumns.addAll(getMappedColumns(tableRef.getTable())); this.extendedColumnsOffset = mappedColumns.size(); - Set<String> names = Sets.newHashSet(); - for (PColumn column : this.mappedColumns) { - names.add(column.getName().getString()); - } - PTable dataTable = dataTableRef.getTable(); - List<PColumn> projectedColumns = new ArrayList<PColumn>(); - for (PColumn sourceColumn : dataTable.getColumns()) { - if (!SchemaUtil.isPKColumn(sourceColumn)) { - String colName = IndexUtil.getIndexColumnName(sourceColumn); - if (!names.contains(colName)) { - ColumnRef sourceColumnRef = - new ColumnRef(dataTableRef, sourceColumn.getPosition()); - PColumn column = new ProjectedColumn(PNameFactory.newName(colName), - sourceColumn.getFamilyName(), projectedColumns.size(), - sourceColumn.isNullable(), sourceColumnRef); - projectedColumns.add(column); - } - } - } + final PTable dataTable = dataTableRef.getTable(); + final List<PColumn> projectedColumns = getDataTableMappedColumns(dataTableRef, mappedColumns); this.mappedColumns.addAll(projectedColumns); PTable extendedTable = PTableImpl.makePTable(dataTable.getTenantId(), TupleProjectionCompiler.PROJECTED_TABLE_SCHEMA, dataTable.getName(), @@ -108,7 +90,7 @@ public class TableMapping { this.extendedTableRef = new TableRef(extendedTable); } } - + public TableRef getTableRef() { return tableRef; } @@ -342,28 +324,43 @@ public class TableMapping { } private static List<PColumn> getMappedColumns(PTable pTable) { - if (pTable.getBucketNum() == null - && !pTable.isMultiTenant() - && pTable.getViewIndexId() == null) { - return pTable.getColumns(); + int initPosition = + (pTable.getBucketNum() ==null ? 0 : 1) + + (pTable.isMultiTenant() ? 1 : 0) + + (pTable.getViewIndexId() == null ? 0 : 1); + List<PColumn> columns = Lists.newArrayListWithExpectedSize(pTable.getColumns().size() - initPosition); + for (int i = initPosition; i < pTable.getPKColumns().size(); i++) { + columns.add(pTable.getPKColumns().get(i)); } - - List<PColumn> columns = Lists.newArrayList(pTable.getColumns()); - if (pTable.getViewIndexId() != null) { - for (Iterator<PColumn> iter = columns.iterator(); iter.hasNext();) { - if (iter.next().getName().getString().equals(MetaDataUtil.getViewIndexIdColumnName())) { - iter.remove(); - break; - } + for (PColumnFamily family : pTable.getColumnFamilies()) { + for (PColumn column : family.getColumns()) { + columns.add(column); } } - if (pTable.isMultiTenant()) { - columns.remove(pTable.getBucketNum() == null ? 0 : 1); + + return columns; + } + + private static List<PColumn> getDataTableMappedColumns(TableRef dataTableRef, List<PColumn> mappedColumns) { + Set<String> names = Sets.newHashSet(); + for (PColumn column : mappedColumns) { + names.add(column.getName().getString()); } - if (pTable.getBucketNum() != null) { - columns.remove(0); + List<PColumn> projectedColumns = new ArrayList<PColumn>(); + for (PColumnFamily cf : dataTableRef.getTable().getColumnFamilies()) { + for (PColumn sourceColumn : cf.getColumns()) { + String colName = IndexUtil.getIndexColumnName(sourceColumn); + if (!names.contains(colName)) { + ColumnRef sourceColumnRef = + new ColumnRef(dataTableRef, sourceColumn.getPosition()); + PColumn column = new ProjectedColumn(PNameFactory.newName(colName), + cf.getName(), projectedColumns.size(), + sourceColumn.isNullable(), sourceColumnRef); + projectedColumns.add(column); + } + } } - return columns; + return projectedColumns; } }