You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@phoenix.apache.org by GitBox <gi...@apache.org> on 2020/07/14 17:24:35 UTC

[GitHub] [phoenix] tkhurana commented on a change in pull request #806: PHOENIX-5946: Implement SchemaExtractionTool utility to get effective…

tkhurana commented on a change in pull request #806:
URL: https://github.com/apache/phoenix/pull/806#discussion_r454025895



##########
File path: phoenix-core/src/it/java/org/apache/phoenix/end2end/SchemaExtractionToolIT.java
##########
@@ -0,0 +1,164 @@
+package org.apache.phoenix.end2end;
+
+import org.apache.phoenix.jdbc.PhoenixConnection;
+import org.apache.phoenix.query.BaseTest;
+import org.apache.phoenix.schema.SchemaExtractionTool;
+import org.apache.phoenix.util.PropertiesUtil;
+import org.apache.phoenix.util.ReadOnlyProps;
+import org.apache.phoenix.util.SchemaUtil;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.util.Collections;
+
+import java.util.Map;
+import java.util.Properties;
+
+import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES;
+
+public class SchemaExtractionToolIT extends BaseTest {
+
+    @BeforeClass
+    public static void setup() throws Exception {
+        Map<String, String> props = Collections.emptyMap();
+        setUpTestDriver(new ReadOnlyProps(props.entrySet().iterator()));
+    }
+
+    @Test
+    public void testCreateTableStatement() throws Exception {
+        String tableName = generateUniqueName();
+        String schemaName = generateUniqueName();
+        Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+        String properties = "TTL=2592000,IMMUTABLE_ROWS=true,DISABLE_MIGRATION=true,DISABLE_SOR=true,DISABLE_WAL=true";
+
+        try (Connection conn = DriverManager.getConnection(getUrl(), props)) {
+
+            String pTableFullName = SchemaUtil.getQualifiedTableName(schemaName, tableName);
+            conn.createStatement().execute("CREATE TABLE "+pTableFullName + "(k VARCHAR NOT NULL PRIMARY KEY, v1 VARCHAR, v2 VARCHAR)"
+                    + properties);
+            conn.commit();
+            String [] args = {"-tb", tableName, "-s", schemaName};
+
+            SchemaExtractionTool set = new SchemaExtractionTool();
+            set.setConf(conn.unwrap(PhoenixConnection.class).getQueryServices().getConfiguration());
+            set.run(args);
+            String actualProperties = set.output.substring(set.output.lastIndexOf(")")+1).replace(" ","");
+            Assert.assertEquals(5, actualProperties.split(",").length);

Review comment:
       The test is only comparing the properties but not the entire create table statement.

##########
File path: phoenix-core/src/main/java/org/apache/phoenix/schema/SchemaExtractionTool.java
##########
@@ -0,0 +1,473 @@
+package org.apache.phoenix.schema;
+
+import com.google.common.collect.Sets;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+import org.apache.commons.cli.PosixParser;
+import org.apache.commons.lang.StringUtils;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.conf.Configured;
+import org.apache.hadoop.hbase.HBaseConfiguration;
+import org.apache.hadoop.hbase.HColumnDescriptor;
+import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
+import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.util.Tool;
+import org.apache.hadoop.util.ToolRunner;
+import org.apache.phoenix.jdbc.PhoenixConnection;
+import org.apache.phoenix.mapreduce.util.ConnectionUtil;
+import org.apache.phoenix.query.ConnectionQueryServices;
+import org.apache.phoenix.util.PhoenixRuntime;
+import org.apache.phoenix.util.SchemaUtil;
+
+import java.io.FileWriter;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Logger;
+
+import static org.apache.hadoop.hbase.HColumnDescriptor.BLOOMFILTER;
+import static org.apache.hadoop.hbase.HColumnDescriptor.COMPRESSION;
+import static org.apache.hadoop.hbase.HColumnDescriptor.DATA_BLOCK_ENCODING;
+import static org.apache.hadoop.hbase.HTableDescriptor.IS_META;
+import static org.apache.phoenix.util.MetaDataUtil.VIEW_INDEX_ID_COLUMN_NAME;
+import static org.apache.phoenix.util.SchemaUtil.DEFAULT_DATA_BLOCK_ENCODING;
+
+public class SchemaExtractionTool extends Configured implements Tool {
+
+    private static final Logger LOGGER = Logger.getLogger(SchemaExtractionTool.class.getName());
+    private static final Option HELP_OPTION = new Option("h", "help",
+            false, "Help");
+    private static final Option TABLE_OPTION = new Option("tb", "table", true,
+            "[Required] Table name ex. table1");
+    private static final Option SCHEMA_OPTION = new Option("s", "schema", true,
+            "[Optional] Schema name ex. schema");
+
+    private String pTableName;
+    private String pSchemaName;
+
+    private static final String CREATE_TABLE = "CREATE TABLE %s";
+    private static final String CREATE_INDEX = "CREATE %sINDEX %s ON %s";
+    private static final String CREATE_VIEW = "CREATE VIEW %s%s AS SELECT * FROM %s%s";
+    public static Configuration conf;
+    Map<String, String> defaultProps = new HashMap<>();
+    Map<String, String> definedProps = new HashMap<>();
+    public String output;
+
+    @Override
+    public int run(String[] args) throws Exception {
+        populateToolAttributes(args);
+        conf = HBaseConfiguration.addHbaseResources(getConf());
+        PTable table = getPTable(pSchemaName, pTableName);
+        output = getDDL(table);
+        return 0;
+    }
+
+    private String getDDL(PTable table) throws Exception {
+        String ddl = null;
+        if(table.getType().equals(PTableType.TABLE)) {
+            ddl = extractCreateTableDDL(table);
+        } else if(table.getType().equals(PTableType.INDEX)) {
+            ddl = extractCreateIndexDDL(table);
+        } else if(table.getType().equals(PTableType.VIEW)) {
+            ddl = extractCreateViewDDL(table);
+        }
+        return ddl;
+    }
+
+    protected String extractCreateIndexDDL(PTable indexPTable)
+            throws SQLException {
+        String pSchemaName = indexPTable.getSchemaName().getString();
+        String pTableName = indexPTable.getTableName().getString();
+
+        String baseTableName = indexPTable.getParentTableName().getString();
+        String baseTableFullName = SchemaUtil.getQualifiedTableName(indexPTable.getSchemaName().getString(), baseTableName);
+        PTable dataPTable = getPTable(baseTableFullName);
+
+        String defaultCF = SchemaUtil.getEmptyColumnFamilyAsString(indexPTable);
+        String indexedColumnsString = getIndexedColumnsString(indexPTable, dataPTable, defaultCF);
+        String coveredColumnsString = getCoveredColumnsString(indexPTable, defaultCF);
+
+        return generateIndexDDLString(baseTableFullName, indexedColumnsString, coveredColumnsString,
+                indexPTable.getIndexType().equals(PTable.IndexType.LOCAL), pSchemaName, pTableName);
+    }
+
+    //TODO: Indexed on an expression
+    // test with different default CF, key is a included column
+    private String getIndexedColumnsString(PTable indexPTable, PTable dataPTable, String defaultCF) {
+
+        List<PColumn> indexPK = indexPTable.getPKColumns();
+        List<PColumn> dataPK = dataPTable.getPKColumns();
+        Set<String> indexPkSet = new HashSet<>();
+        Set<String> dataPkSet = new HashSet<>();
+        Map<String, SortOrder> sortOrderMap = new HashMap<>();
+        StringBuilder indexedColumnsBuilder = new StringBuilder();
+        for (PColumn indexedColumn : indexPK) {
+            String indexColumn = extractIndexColumn(indexedColumn.getName().getString(), defaultCF);
+            if(indexColumn.equalsIgnoreCase(VIEW_INDEX_ID_COLUMN_NAME)) {
+                continue;
+            }
+            indexPkSet.add(indexColumn);
+            sortOrderMap.put(indexColumn, indexedColumn.getSortOrder());
+        }
+
+        for(PColumn pColumn : dataPK) {
+            dataPkSet.add(pColumn.getName().getString());
+        }
+
+        Set<String> effectivePK = Sets.symmetricDifference(indexPkSet, dataPkSet);
+        if (effectivePK.isEmpty()) {
+            effectivePK = indexPkSet;
+        }
+        for (String column : effectivePK) {
+            if(indexedColumnsBuilder.length()!=0) {
+                indexedColumnsBuilder.append(", ");
+            }
+            indexedColumnsBuilder.append(column);
+            if(sortOrderMap.get(column)!= SortOrder.getDefault()) {
+                indexedColumnsBuilder.append(" ");
+                indexedColumnsBuilder.append(sortOrderMap.get(column));
+            }
+        }
+        return indexedColumnsBuilder.toString();
+    }
+
+    private String extractIndexColumn(String columnName, String defaultCF) {
+        String [] columnNameSplit = columnName.split(":");
+        if(columnNameSplit[0].equals("") || columnNameSplit[0].equalsIgnoreCase(defaultCF)) {
+            return columnNameSplit[1];
+        } else {
+            return columnName.replace(":", ".");
+        }
+    }
+
+    private String getCoveredColumnsString(PTable indexPTable, String defaultCF) {
+        StringBuilder coveredColumnsBuilder = new StringBuilder();
+        List<PColumn> pkColumns = indexPTable.getColumns();
+        for (PColumn cc : pkColumns) {
+            if(coveredColumnsBuilder.length()!=0) {
+                coveredColumnsBuilder.append(", ");
+            }
+            if(cc.getFamilyName()!=null) {
+                String indexColumn = extractIndexColumn(cc.getName().getString(), defaultCF);
+                coveredColumnsBuilder.append(indexColumn);
+            }
+        }
+        return coveredColumnsBuilder.toString();
+    }
+
+    protected String generateIndexDDLString(String baseTableFullName, String indexedColumnString, String coveredColumnString, boolean local, String pSchemaName, String pTableName) {
+        StringBuilder outputBuilder = new StringBuilder(String.format(CREATE_INDEX, local ? "LOCAL " : "", pTableName, baseTableFullName));
+        outputBuilder.append("(");
+        outputBuilder.append(indexedColumnString);
+        outputBuilder.append(")");
+        if(!coveredColumnString.equals("")) {
+            outputBuilder.append(" INCLUDE (");
+            outputBuilder.append(coveredColumnString);
+            outputBuilder.append(")");
+        }
+        return outputBuilder.toString();
+    }
+
+    PTable getPTable(String pTableFullName) throws SQLException {
+        try (Connection conn = getConnection()) {
+            return PhoenixRuntime.getTable(conn, pTableFullName);
+        }
+    }
+
+    protected String extractCreateViewDDL(PTable table) throws SQLException {
+        String pSchemaName = table.getSchemaName().getString();
+        String pTableName = table.getTableName().getString();
+        String baseTableName = table.getParentTableName().getString();
+        String baseTableFullName = SchemaUtil.getQualifiedTableName(pSchemaName, baseTableName);
+        PTable baseTable = getPTable(baseTableFullName);
+        String columnInfoString = getColumnInfoString(table, baseTable);
+
+        String whereClause = table.getViewStatement();
+        if(whereClause != null) {
+            whereClause = whereClause.substring(whereClause.indexOf("WHERE"));
+        }
+        return generateCreateViewDDL(columnInfoString, baseTableFullName, whereClause == null ? "" : " "+whereClause, pSchemaName, pTableName);
+    }
+
+    private String generateCreateViewDDL(String columnInfoString, String baseTableFullName, String whereClause, String pSchemaName, String pTableName) {
+        String viewFullName = SchemaUtil.getQualifiedTableName(pSchemaName, pTableName);
+        StringBuilder outputBuilder = new StringBuilder(String.format(CREATE_VIEW, viewFullName, columnInfoString, baseTableFullName, whereClause));
+        return outputBuilder.toString();
+    }
+
+    public String extractCreateTableDDL(PTable table) throws IOException, SQLException {
+
+        String pSchemaName = table.getSchemaName().getString();
+        String pTableName = table.getTableName().getString();
+
+        ConnectionQueryServices cqsi = getCQSIObject();
+        HTableDescriptor htd = getHTableDescriptor(cqsi, table);
+        HColumnDescriptor hcd = htd.getFamily(SchemaUtil.getEmptyColumnFamily(table));
+
+        populateDefaultProperties(table);
+        setPTableProperties(table);
+        setHTableProperties(htd);
+        setHColumnFamilyProperties(hcd);
+
+        String columnInfoString = getColumnInfoString(table, null);

Review comment:
       might be better if we have 2 different APIs getColumnInfoStringForTable and getColumnInfoStringForView rather than using null

##########
File path: phoenix-core/src/main/java/org/apache/phoenix/schema/SchemaExtractionTool.java
##########
@@ -0,0 +1,473 @@
+package org.apache.phoenix.schema;
+
+import com.google.common.collect.Sets;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+import org.apache.commons.cli.PosixParser;
+import org.apache.commons.lang.StringUtils;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.conf.Configured;
+import org.apache.hadoop.hbase.HBaseConfiguration;
+import org.apache.hadoop.hbase.HColumnDescriptor;
+import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
+import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.util.Tool;
+import org.apache.hadoop.util.ToolRunner;
+import org.apache.phoenix.jdbc.PhoenixConnection;
+import org.apache.phoenix.mapreduce.util.ConnectionUtil;
+import org.apache.phoenix.query.ConnectionQueryServices;
+import org.apache.phoenix.util.PhoenixRuntime;
+import org.apache.phoenix.util.SchemaUtil;
+
+import java.io.FileWriter;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Logger;
+
+import static org.apache.hadoop.hbase.HColumnDescriptor.BLOOMFILTER;
+import static org.apache.hadoop.hbase.HColumnDescriptor.COMPRESSION;
+import static org.apache.hadoop.hbase.HColumnDescriptor.DATA_BLOCK_ENCODING;
+import static org.apache.hadoop.hbase.HTableDescriptor.IS_META;
+import static org.apache.phoenix.util.MetaDataUtil.VIEW_INDEX_ID_COLUMN_NAME;
+import static org.apache.phoenix.util.SchemaUtil.DEFAULT_DATA_BLOCK_ENCODING;
+
+public class SchemaExtractionTool extends Configured implements Tool {
+
+    private static final Logger LOGGER = Logger.getLogger(SchemaExtractionTool.class.getName());
+    private static final Option HELP_OPTION = new Option("h", "help",
+            false, "Help");
+    private static final Option TABLE_OPTION = new Option("tb", "table", true,
+            "[Required] Table name ex. table1");
+    private static final Option SCHEMA_OPTION = new Option("s", "schema", true,
+            "[Optional] Schema name ex. schema");
+
+    private String pTableName;
+    private String pSchemaName;
+
+    private static final String CREATE_TABLE = "CREATE TABLE %s";
+    private static final String CREATE_INDEX = "CREATE %sINDEX %s ON %s";
+    private static final String CREATE_VIEW = "CREATE VIEW %s%s AS SELECT * FROM %s%s";
+    public static Configuration conf;
+    Map<String, String> defaultProps = new HashMap<>();
+    Map<String, String> definedProps = new HashMap<>();
+    public String output;
+
+    @Override
+    public int run(String[] args) throws Exception {
+        populateToolAttributes(args);
+        conf = HBaseConfiguration.addHbaseResources(getConf());
+        PTable table = getPTable(pSchemaName, pTableName);
+        output = getDDL(table);
+        return 0;
+    }
+
+    private String getDDL(PTable table) throws Exception {
+        String ddl = null;
+        if(table.getType().equals(PTableType.TABLE)) {
+            ddl = extractCreateTableDDL(table);
+        } else if(table.getType().equals(PTableType.INDEX)) {
+            ddl = extractCreateIndexDDL(table);
+        } else if(table.getType().equals(PTableType.VIEW)) {
+            ddl = extractCreateViewDDL(table);
+        }
+        return ddl;
+    }
+
+    protected String extractCreateIndexDDL(PTable indexPTable)
+            throws SQLException {
+        String pSchemaName = indexPTable.getSchemaName().getString();
+        String pTableName = indexPTable.getTableName().getString();
+
+        String baseTableName = indexPTable.getParentTableName().getString();
+        String baseTableFullName = SchemaUtil.getQualifiedTableName(indexPTable.getSchemaName().getString(), baseTableName);
+        PTable dataPTable = getPTable(baseTableFullName);
+
+        String defaultCF = SchemaUtil.getEmptyColumnFamilyAsString(indexPTable);
+        String indexedColumnsString = getIndexedColumnsString(indexPTable, dataPTable, defaultCF);
+        String coveredColumnsString = getCoveredColumnsString(indexPTable, defaultCF);
+
+        return generateIndexDDLString(baseTableFullName, indexedColumnsString, coveredColumnsString,
+                indexPTable.getIndexType().equals(PTable.IndexType.LOCAL), pSchemaName, pTableName);
+    }
+
+    //TODO: Indexed on an expression
+    // test with different default CF, key is a included column
+    private String getIndexedColumnsString(PTable indexPTable, PTable dataPTable, String defaultCF) {
+
+        List<PColumn> indexPK = indexPTable.getPKColumns();
+        List<PColumn> dataPK = dataPTable.getPKColumns();
+        Set<String> indexPkSet = new HashSet<>();
+        Set<String> dataPkSet = new HashSet<>();
+        Map<String, SortOrder> sortOrderMap = new HashMap<>();
+        StringBuilder indexedColumnsBuilder = new StringBuilder();
+        for (PColumn indexedColumn : indexPK) {
+            String indexColumn = extractIndexColumn(indexedColumn.getName().getString(), defaultCF);
+            if(indexColumn.equalsIgnoreCase(VIEW_INDEX_ID_COLUMN_NAME)) {
+                continue;
+            }
+            indexPkSet.add(indexColumn);
+            sortOrderMap.put(indexColumn, indexedColumn.getSortOrder());
+        }
+
+        for(PColumn pColumn : dataPK) {
+            dataPkSet.add(pColumn.getName().getString());
+        }
+
+        Set<String> effectivePK = Sets.symmetricDifference(indexPkSet, dataPkSet);
+        if (effectivePK.isEmpty()) {
+            effectivePK = indexPkSet;
+        }
+        for (String column : effectivePK) {
+            if(indexedColumnsBuilder.length()!=0) {
+                indexedColumnsBuilder.append(", ");
+            }
+            indexedColumnsBuilder.append(column);
+            if(sortOrderMap.get(column)!= SortOrder.getDefault()) {
+                indexedColumnsBuilder.append(" ");
+                indexedColumnsBuilder.append(sortOrderMap.get(column));
+            }
+        }
+        return indexedColumnsBuilder.toString();
+    }
+
+    private String extractIndexColumn(String columnName, String defaultCF) {
+        String [] columnNameSplit = columnName.split(":");
+        if(columnNameSplit[0].equals("") || columnNameSplit[0].equalsIgnoreCase(defaultCF)) {
+            return columnNameSplit[1];
+        } else {
+            return columnName.replace(":", ".");
+        }
+    }
+
+    private String getCoveredColumnsString(PTable indexPTable, String defaultCF) {
+        StringBuilder coveredColumnsBuilder = new StringBuilder();
+        List<PColumn> pkColumns = indexPTable.getColumns();
+        for (PColumn cc : pkColumns) {
+            if(coveredColumnsBuilder.length()!=0) {
+                coveredColumnsBuilder.append(", ");
+            }
+            if(cc.getFamilyName()!=null) {
+                String indexColumn = extractIndexColumn(cc.getName().getString(), defaultCF);
+                coveredColumnsBuilder.append(indexColumn);
+            }
+        }
+        return coveredColumnsBuilder.toString();
+    }
+
+    protected String generateIndexDDLString(String baseTableFullName, String indexedColumnString, String coveredColumnString, boolean local, String pSchemaName, String pTableName) {
+        StringBuilder outputBuilder = new StringBuilder(String.format(CREATE_INDEX, local ? "LOCAL " : "", pTableName, baseTableFullName));
+        outputBuilder.append("(");
+        outputBuilder.append(indexedColumnString);
+        outputBuilder.append(")");
+        if(!coveredColumnString.equals("")) {
+            outputBuilder.append(" INCLUDE (");
+            outputBuilder.append(coveredColumnString);
+            outputBuilder.append(")");
+        }
+        return outputBuilder.toString();
+    }
+
+    PTable getPTable(String pTableFullName) throws SQLException {
+        try (Connection conn = getConnection()) {
+            return PhoenixRuntime.getTable(conn, pTableFullName);
+        }
+    }
+
+    protected String extractCreateViewDDL(PTable table) throws SQLException {
+        String pSchemaName = table.getSchemaName().getString();
+        String pTableName = table.getTableName().getString();
+        String baseTableName = table.getParentTableName().getString();
+        String baseTableFullName = SchemaUtil.getQualifiedTableName(pSchemaName, baseTableName);
+        PTable baseTable = getPTable(baseTableFullName);
+        String columnInfoString = getColumnInfoString(table, baseTable);
+
+        String whereClause = table.getViewStatement();
+        if(whereClause != null) {
+            whereClause = whereClause.substring(whereClause.indexOf("WHERE"));
+        }
+        return generateCreateViewDDL(columnInfoString, baseTableFullName, whereClause == null ? "" : " "+whereClause, pSchemaName, pTableName);
+    }
+
+    private String generateCreateViewDDL(String columnInfoString, String baseTableFullName, String whereClause, String pSchemaName, String pTableName) {
+        String viewFullName = SchemaUtil.getQualifiedTableName(pSchemaName, pTableName);
+        StringBuilder outputBuilder = new StringBuilder(String.format(CREATE_VIEW, viewFullName, columnInfoString, baseTableFullName, whereClause));
+        return outputBuilder.toString();
+    }
+
+    public String extractCreateTableDDL(PTable table) throws IOException, SQLException {
+
+        String pSchemaName = table.getSchemaName().getString();
+        String pTableName = table.getTableName().getString();
+
+        ConnectionQueryServices cqsi = getCQSIObject();
+        HTableDescriptor htd = getHTableDescriptor(cqsi, table);
+        HColumnDescriptor hcd = htd.getFamily(SchemaUtil.getEmptyColumnFamily(table));
+
+        populateDefaultProperties(table);
+        setPTableProperties(table);
+        setHTableProperties(htd);
+        setHColumnFamilyProperties(hcd);
+
+        String columnInfoString = getColumnInfoString(table, null);
+        String propertiesString = convertPropertiesToString();
+
+        return generateTableDDLString(columnInfoString, propertiesString, pSchemaName, pTableName);
+    }
+    private String generateTableDDLString(String columnInfoString,String propertiesString,String pSchemaName,String pTableName) {
+        String pTableFullName = SchemaUtil.getQualifiedTableName(pSchemaName, pTableName);
+        StringBuilder outputBuilder = new StringBuilder(String.format(CREATE_TABLE, pTableFullName));
+        outputBuilder.append(columnInfoString).append(" ").append(propertiesString);
+        return outputBuilder.toString();
+    }
+
+    private void populateDefaultProperties(PTable table) {
+        Map<String, String> propsMap = HColumnDescriptor.getDefaultValues();
+        for (Map.Entry<String, String> entry : propsMap.entrySet()) {
+            String key = entry.getKey();
+            String value = entry.getValue();
+            defaultProps.put(key, value);
+            if(key.equalsIgnoreCase(BLOOMFILTER) || key.equalsIgnoreCase(COMPRESSION)) {
+                defaultProps.put(key, "NONE");
+            }
+            if(key.equalsIgnoreCase(DATA_BLOCK_ENCODING)) {
+                defaultProps.put(key, String.valueOf(DEFAULT_DATA_BLOCK_ENCODING));
+            }
+        }
+        defaultProps.putAll(table.getDefaultValues());
+    }
+
+    private void setHTableProperties(HTableDescriptor htd) {
+        Map<ImmutableBytesWritable, ImmutableBytesWritable> propsMap = htd.getValues();
+        for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> entry : propsMap.entrySet()) {
+            ImmutableBytesWritable key = entry.getKey();
+            ImmutableBytesWritable value = entry.getValue();
+            if(Bytes.toString(key.get()).contains("coprocessor") || Bytes.toString(key.get()).contains(IS_META)) {
+                continue;
+            }
+            defaultProps.put(Bytes.toString(key.get()), "false");
+            definedProps.put(Bytes.toString(key.get()), Bytes.toString(value.get()));
+        }
+    }
+
+    private void setHColumnFamilyProperties(HColumnDescriptor columnDescriptor) {
+        Map<ImmutableBytesWritable, ImmutableBytesWritable> propsMap = columnDescriptor.getValues();
+        for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> entry : propsMap.entrySet()) {
+            ImmutableBytesWritable key = entry.getKey();
+            ImmutableBytesWritable value = entry.getValue();
+            definedProps.put(Bytes.toString(key.get()), Bytes.toString(value.get()));
+        }
+    }
+
+    private void setPTableProperties(PTable table) {
+        Map <String, String> map = table.getValues();
+        for(Map.Entry<String, String> entry : map.entrySet()) {
+            String key = entry.getKey();
+            String value = entry.getValue();
+            if(value != null) {
+                definedProps.put(key, value);
+            }
+        }
+    }
+
+    private HTableDescriptor getHTableDescriptor(ConnectionQueryServices cqsi, PTable table)
+            throws SQLException, IOException {
+        return cqsi.getAdmin().getTableDescriptor(
+                TableName.valueOf(table.getPhysicalName().getString()));
+    }
+
+    private String convertPropertiesToString() {
+        StringBuilder optionBuilder = new StringBuilder();
+
+        for(Map.Entry<String, String> entry : definedProps.entrySet()) {
+            String key = entry.getKey();
+            String value = entry.getValue();
+            if(value!=null && defaultProps.get(key) != null && !value.equals(defaultProps.get(key))) {
+                if (optionBuilder.length() != 0) {
+                    optionBuilder.append(", ");
+                }
+                optionBuilder.append(key+"="+value);
+            }
+        }
+        return optionBuilder.toString();
+    }
+
+    private PTable getPTable(String pSchemaName, String pTableName) throws SQLException {
+        String pTableFullName = SchemaUtil.getQualifiedTableName(pSchemaName, pTableName);
+        return getPTable(pTableFullName);
+    }
+
+    private ConnectionQueryServices getCQSIObject() throws SQLException {
+        try(Connection conn = getConnection()) {
+            return conn.unwrap(PhoenixConnection.class).getQueryServices();
+        }
+    }
+
+    public static Connection getConnection() throws SQLException {
+        return ConnectionUtil.getInputConnection(conf);
+    }
+
+    private String getColumnInfoString(PTable table, PTable baseTable) {

Review comment:
       As mentioned above also, it might be cleaner to refactor this API into two different APIs for table and view and move common functionality to a shared function.




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org