This is an automated email from the ASF dual-hosted git repository.

stoty pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/phoenix.git


The following commit(s) were added to refs/heads/master by this push:
     new 89777400c4 PHOENIX-6889 Improve extraction of ENCODED_QUALIFIERs
89777400c4 is described below

commit 89777400c410bff8ef48b964898abdb6ad5e4e12
Author: Aron Meszaros <meszaros.aron.att...@gmail.com>
AuthorDate: Tue Feb 28 16:43:36 2023 +0100

    PHOENIX-6889 Improve extraction of ENCODED_QUALIFIERs
---
 .../apache/phoenix/end2end/ShowCreateTableIT.java  | 126 ++++++++++++++++----
 .../schema/tool/SchemaToolExtractionIT.java        |  10 +-
 .../schema/tool/SchemaExtractionProcessor.java     | 130 +++++++++++++++------
 3 files changed, 203 insertions(+), 63 deletions(-)

diff --git 
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ShowCreateTableIT.java 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ShowCreateTableIT.java
index 9b8619bf36..b9037e3b85 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ShowCreateTableIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ShowCreateTableIT.java
@@ -45,9 +45,7 @@ public class ShowCreateTableIT extends 
ParallelStatsDisabledIT {
         assertTrue(rs.next());
 
         String expected = "CREATE TABLE " + tableName + "(K VARCHAR NOT NULL 
PRIMARY KEY, " +
-                "INT INTEGER ENCODED_QUALIFIER " + 
(ENCODED_CQ_COUNTER_INITIAL_VALUE) +
-                ", INT2 INTEGER ENCODED_QUALIFIER " + 
(ENCODED_CQ_COUNTER_INITIAL_VALUE + 1) +
-                ") IMMUTABLE_STORAGE_SCHEME='ONE_CELL_PER_COLUMN'";
+                "INT INTEGER, INT2 INTEGER) 
IMMUTABLE_STORAGE_SCHEME='ONE_CELL_PER_COLUMN'";
         assertTrue("Expected: :" + expected + "\nResult: " + rs.getString(1),
                 rs.getString(1).equals(expected));
     }
@@ -64,8 +62,7 @@ public class ShowCreateTableIT extends 
ParallelStatsDisabledIT {
         assertTrue(rs.next());
 
         String expected = "CREATE TABLE \"" + tableName + "\"(K VARCHAR NOT 
NULL PRIMARY KEY, " +
-                "INT INTEGER ENCODED_QUALIFIER " + 
(ENCODED_CQ_COUNTER_INITIAL_VALUE) +
-                ") IMMUTABLE_STORAGE_SCHEME='ONE_CELL_PER_COLUMN'";
+                "INT INTEGER) IMMUTABLE_STORAGE_SCHEME='ONE_CELL_PER_COLUMN'";
         assertTrue("Expected: :" + expected + "\nResult: " + rs.getString(1),
                 rs.getString(1).equals(expected));
     }
@@ -84,8 +81,7 @@ public class ShowCreateTableIT extends 
ParallelStatsDisabledIT {
         assertTrue(rs.next());
 
         String expected = "CREATE TABLE " + tableFullName + "(K VARCHAR NOT 
NULL PRIMARY KEY, " +
-                "INT INTEGER ENCODED_QUALIFIER " + 
(ENCODED_CQ_COUNTER_INITIAL_VALUE) +
-                ") IMMUTABLE_STORAGE_SCHEME='ONE_CELL_PER_COLUMN'";
+                "INT INTEGER) IMMUTABLE_STORAGE_SCHEME='ONE_CELL_PER_COLUMN'";
         assertTrue("Expected: :" + expected + "\nResult: " + rs.getString(1),
                 rs.getString(1).equals(expected));
     }
@@ -108,14 +104,42 @@ public class ShowCreateTableIT extends 
ParallelStatsDisabledIT {
         ResultSet rs = conn.createStatement().executeQuery("SHOW CREATE TABLE 
" + tableName );
         assertTrue(rs.next());
 
+        String expected = "CREATE TABLE " + tableName + "(K VARCHAR NOT NULL 
PRIMARY KEY, " +
+                "\"dF\".INT1 INTEGER, \"dF\".INT2 INTEGER, A.INT3 INTEGER, 
A.INT4 INTEGER, " +
+                "\"b\".INT5 INTEGER, B.INT6 INTEGER) " +
+                "IMMUTABLE_ROWS=true, DEFAULT_COLUMN_FAMILY='dF'";
+        assertTrue("Expected: :" + expected + "\nResult: " + rs.getString(1),
+                rs.getString(1).equals(expected));
+    }
+
+    @Test
+    public void testShowCreateTableDefaultFamilyNonConsecutive() throws 
Exception {
+        Properties props = new Properties();
+        Connection conn = DriverManager.getConnection(getUrl(), props);
+        String tableName = generateUniqueName();
+        String ddl = "CREATE IMMUTABLE TABLE \"" + tableName + "\"(K VARCHAR 
NOT NULL PRIMARY KEY, " +
+                "INT1 INTEGER, " +
+                "INT2 INTEGER, " +
+                "a.INT3 INTEGER, " +
+                "\"A\".INT4 INTEGER, " +
+                "\"b\".INT5 INTEGER, " +
+                "\"B\".INT6 INTEGER) " +
+                "DEFAULT_COLUMN_FAMILY='dF'";
+        conn.createStatement().execute(ddl);
+
+        String dropInt2 = "ALTER TABLE " + tableName + " DROP COLUMN INT2, 
INT4, INT5";
+        conn.createStatement().execute(dropInt2);
+
+        ResultSet rs = conn.createStatement().executeQuery("SHOW CREATE TABLE 
" + tableName );
+        assertTrue(rs.next());
+
         String expected = "CREATE TABLE " + tableName + "(K VARCHAR NOT NULL 
PRIMARY KEY, " +
                 "\"dF\".INT1 INTEGER ENCODED_QUALIFIER " + 
(ENCODED_CQ_COUNTER_INITIAL_VALUE) +
-                ", \"dF\".INT2 INTEGER ENCODED_QUALIFIER " + 
(ENCODED_CQ_COUNTER_INITIAL_VALUE + 1) +
                 ", A.INT3 INTEGER ENCODED_QUALIFIER " + 
(ENCODED_CQ_COUNTER_INITIAL_VALUE) +
-                ", A.INT4 INTEGER ENCODED_QUALIFIER " + 
(ENCODED_CQ_COUNTER_INITIAL_VALUE + 1) +
-                ", \"b\".INT5 INTEGER ENCODED_QUALIFIER " + 
(ENCODED_CQ_COUNTER_INITIAL_VALUE) +
-                ", B.INT6 INTEGER ENCODED_QUALIFIER " + 
(ENCODED_CQ_COUNTER_INITIAL_VALUE) +
-                ") IMMUTABLE_ROWS=true, DEFAULT_COLUMN_FAMILY='dF'";
+                ", B.INT6 INTEGER) " +
+                "IMMUTABLE_ROWS=true, DEFAULT_COLUMN_FAMILY='dF' 
COLUMN_QUALIFIER_COUNTER " +
+                "('A'=" + (ENCODED_CQ_COUNTER_INITIAL_VALUE + 2) +
+                ", 'dF'=" + (ENCODED_CQ_COUNTER_INITIAL_VALUE + 2) + ")";
         assertTrue("Expected: :" + expected + "\nResult: " + rs.getString(1),
                 rs.getString(1).equals(expected));
     }
@@ -139,10 +163,10 @@ public class ShowCreateTableIT extends 
ParallelStatsDisabledIT {
     }
 
     @Test
-    public void testShowCreateTableColumnQualifierDrop() throws Exception {
+    public void testShowCreateTableColumnQualifierNonConsecutive() throws 
Exception {
         Properties props = new Properties();
         Connection conn = DriverManager.getConnection(getUrl(), props);
-        String tableName = generateUniqueName();;
+        String tableName = generateUniqueName();
         String ddl = "CREATE TABLE " + tableName + "(K VARCHAR NOT NULL 
PRIMARY KEY, " +
                 "INT INTEGER, INT2 INTEGER, INT3 INTEGER)";
         conn.createStatement().execute(ddl);
@@ -160,6 +184,42 @@ public class ShowCreateTableIT extends 
ParallelStatsDisabledIT {
                 "('" + DEFAULT_COLUMN_FAMILY +"'=" + 
(ENCODED_CQ_COUNTER_INITIAL_VALUE + 3) + ")";
         assertTrue("Expected: :" + expected + "\nResult: " + rs.getString(1),
                 rs.getString(1).equals(expected));
+
+        tableName = generateUniqueName();
+        ddl = "CREATE TABLE " + tableName + "(K VARCHAR NOT NULL PRIMARY KEY, 
" +
+                "INT INTEGER, INT2 INTEGER, INT3 INTEGER)";
+        conn.createStatement().execute(ddl);
+
+        dropInt2 = "ALTER TABLE " + tableName + " DROP COLUMN INT";
+        conn.createStatement().execute(dropInt2);
+
+        rs = conn.createStatement().executeQuery("SHOW CREATE TABLE \"" + 
tableName + "\"");
+        assertTrue(rs.next());
+
+        expected = "CREATE TABLE " + tableName + "(K VARCHAR NOT NULL PRIMARY 
KEY, " +
+                "INT2 INTEGER ENCODED_QUALIFIER " + 
(ENCODED_CQ_COUNTER_INITIAL_VALUE + 1) +
+                ", INT3 INTEGER ENCODED_QUALIFIER " + 
(ENCODED_CQ_COUNTER_INITIAL_VALUE + 2) +
+                ") IMMUTABLE_STORAGE_SCHEME='ONE_CELL_PER_COLUMN'";
+        assertTrue("Expected: :" + expected + "\nResult: " + rs.getString(1),
+                rs.getString(1).equals(expected));
+
+        tableName = generateUniqueName();
+        ddl = "CREATE TABLE " + tableName + "(K VARCHAR NOT NULL PRIMARY KEY, 
" +
+                "INT INTEGER, INT2 INTEGER, INT3 INTEGER)";
+        conn.createStatement().execute(ddl);
+
+        dropInt2 = "ALTER TABLE " + tableName + " DROP COLUMN INT2";
+        conn.createStatement().execute(dropInt2);
+
+        rs = conn.createStatement().executeQuery("SHOW CREATE TABLE \"" + 
tableName + "\"");
+        assertTrue(rs.next());
+
+        expected = "CREATE TABLE " + tableName + "(K VARCHAR NOT NULL PRIMARY 
KEY, " +
+                "INT INTEGER ENCODED_QUALIFIER " + 
(ENCODED_CQ_COUNTER_INITIAL_VALUE) +
+                ", INT3 INTEGER ENCODED_QUALIFIER " + 
(ENCODED_CQ_COUNTER_INITIAL_VALUE + 2) +
+                ") IMMUTABLE_STORAGE_SCHEME='ONE_CELL_PER_COLUMN'";
+        assertTrue("Expected: :" + expected + "\nResult: " + rs.getString(1),
+                rs.getString(1).equals(expected));
     }
 
     @Test
@@ -202,15 +262,13 @@ public class ShowCreateTableIT extends 
ParallelStatsDisabledIT {
         assertTrue(rs.next());
 
         String expected = "CREATE TABLE " + tableName + "(K VARCHAR NOT NULL 
PRIMARY KEY, " +
-                "A.INT INTEGER ENCODED_QUALIFIER " + 
(ENCODED_CQ_COUNTER_INITIAL_VALUE) +
-                ", B.INT2 INTEGER ENCODED_QUALIFIER " + 
(ENCODED_CQ_COUNTER_INITIAL_VALUE) +
-                ") IMMUTABLE_ROWS=true";
+                "A.INT INTEGER, B.INT2 INTEGER) IMMUTABLE_ROWS=true";
         assertTrue("Expected: :" + expected + "\nResult: " + rs.getString(1),
                 rs.getString(1).equals(expected));
     }
 
     @Test
-    public void testShowCreateTableColumnQualifierMultipleFamiliesDrop() 
throws Exception {
+    public void 
testShowCreateTableColumnQualifierMultipleFamiliesNonConsecutive() throws 
Exception {
         Properties props = new Properties();
         Connection conn = DriverManager.getConnection(getUrl(), props);
         String tableName = generateUniqueName();;
@@ -220,18 +278,38 @@ public class ShowCreateTableIT extends 
ParallelStatsDisabledIT {
                 "IMMUTABLE_STORAGE_SCHEME=SINGLE_CELL_ARRAY_WITH_OFFSETS";
         conn.createStatement().execute(ddl);
 
-        String dropInt3 = "ALTER TABLE " + tableName + " DROP COLUMN INT4";
-        conn.createStatement().execute(dropInt3);
+        String dropInt = "ALTER TABLE " + tableName + " DROP COLUMN INT4";
+        conn.createStatement().execute(dropInt);
 
         ResultSet rs = conn.createStatement().executeQuery("SHOW CREATE TABLE 
\"" + tableName + "\"");
         assertTrue(rs.next());
 
         String expected = "CREATE TABLE " + tableName + "(K VARCHAR NOT NULL 
PRIMARY KEY, " +
+                "A.INT INTEGER, A.INT2 INTEGER, B.INT3 INTEGER 
ENCODED_QUALIFIER " +
+                (ENCODED_CQ_COUNTER_INITIAL_VALUE) + ") IMMUTABLE_ROWS=true " +
+                "COLUMN_QUALIFIER_COUNTER ('B'=" + 
(ENCODED_CQ_COUNTER_INITIAL_VALUE + 2) + ")";
+        assertTrue("Expected: :" + expected + "\nResult: " + rs.getString(1),
+                rs.getString(1).equals(expected));
+
+
+        tableName = generateUniqueName();;
+        ddl = "CREATE IMMUTABLE TABLE " + tableName +
+                "(K VARCHAR NOT NULL PRIMARY KEY, A.INT INTEGER, A.INT2 
INTEGER, " +
+                "B.INT3 INTEGER, B.INT4 INTEGER) " +
+                "IMMUTABLE_STORAGE_SCHEME=SINGLE_CELL_ARRAY_WITH_OFFSETS";
+        conn.createStatement().execute(ddl);
+
+        dropInt = "ALTER TABLE " + tableName + " DROP COLUMN INT2, INT3";
+        conn.createStatement().execute(dropInt);
+
+        rs = conn.createStatement().executeQuery("SHOW CREATE TABLE \"" + 
tableName + "\"");
+        assertTrue(rs.next());
+
+        expected = "CREATE TABLE " + tableName + "(K VARCHAR NOT NULL PRIMARY 
KEY, " +
                 "A.INT INTEGER ENCODED_QUALIFIER " + 
(ENCODED_CQ_COUNTER_INITIAL_VALUE) +
-                ", A.INT2 INTEGER ENCODED_QUALIFIER " + 
(ENCODED_CQ_COUNTER_INITIAL_VALUE + 1) +
-                ", B.INT3 INTEGER ENCODED_QUALIFIER " + 
(ENCODED_CQ_COUNTER_INITIAL_VALUE) +
-                ") IMMUTABLE_ROWS=true COLUMN_QUALIFIER_COUNTER ('B'=" + 
(ENCODED_CQ_COUNTER_INITIAL_VALUE + 2)
-                + ")";
+                ", B.INT4 INTEGER ENCODED_QUALIFIER " +
+                (ENCODED_CQ_COUNTER_INITIAL_VALUE + 1) + ") 
IMMUTABLE_ROWS=true " +
+                "COLUMN_QUALIFIER_COUNTER ('A'=" + 
(ENCODED_CQ_COUNTER_INITIAL_VALUE + 2) + ")";
         assertTrue("Expected: :" + expected + "\nResult: " + rs.getString(1),
                 rs.getString(1).equals(expected));
     }
diff --git 
a/phoenix-core/src/it/java/org/apache/phoenix/schema/tool/SchemaToolExtractionIT.java
 
b/phoenix-core/src/it/java/org/apache/phoenix/schema/tool/SchemaToolExtractionIT.java
index d4a2aaa2d3..b4bd32d734 100644
--- 
a/phoenix-core/src/it/java/org/apache/phoenix/schema/tool/SchemaToolExtractionIT.java
+++ 
b/phoenix-core/src/it/java/org/apache/phoenix/schema/tool/SchemaToolExtractionIT.java
@@ -66,8 +66,7 @@ public class SchemaToolExtractionIT extends 
ParallelStatsEnabledIT {
         String schemaName = generateUniqueName();
         String pTableFullName = SchemaUtil.getQualifiedTableName(schemaName, 
tableName);
         String createTableStmt = "CREATE TABLE "+ pTableFullName + "(K VARCHAR 
NOT NULL PRIMARY KEY, "
-                + "V1 VARCHAR ENCODED_QUALIFIER 11, V2 VARCHAR 
ENCODED_QUALIFIER 12) " +
-                "TTL=2592000, IMMUTABLE_ROWS=TRUE, DISABLE_WAL=TRUE";
+                + "V1 VARCHAR, V2 VARCHAR) TTL=2592000, IMMUTABLE_ROWS=TRUE, 
DISABLE_WAL=TRUE";
         List<String> queries = new ArrayList<String>(){};
         queries.add(createTableStmt);
         String result = runSchemaExtractionTool(schemaName, tableName, null, 
queries);
@@ -80,8 +79,7 @@ public class SchemaToolExtractionIT extends 
ParallelStatsEnabledIT {
         String schemaName = "lowecaseschemaname1";
         String pTableFullName = SchemaUtil.getEscapedTableName(schemaName, 
tableName);
         String createTableStmt = "CREATE TABLE "+ pTableFullName + 
"(\"smallK\" VARCHAR NOT NULL PRIMARY KEY, "
-                + "\"asd\".V1 VARCHAR ENCODED_QUALIFIER 11, \"foo\".\"bar\" 
VARCHAR ENCODED_QUALIFIER 11) " +
-                "TTL=2592000, IMMUTABLE_ROWS=true, DISABLE_WAL=true";
+                + "\"asd\".V1 VARCHAR, \"foo\".\"bar\" VARCHAR) TTL=2592000, 
IMMUTABLE_ROWS=true, DISABLE_WAL=true";
         List<String> queries = new ArrayList<String>(){};
         queries.add(createTableStmt);
         String result = runSchemaExtractionTool("\"" + schemaName + "\"", "\"" 
+ tableName + "\"", null, queries);
@@ -418,8 +416,8 @@ public class SchemaToolExtractionIT extends 
ParallelStatsEnabledIT {
         String query = "create table " + pTableFullName +
                 "(a_char CHAR(15) NOT NULL, " +
                 "b_char CHAR(10) NOT NULL, " +
-                "c_var_array VARCHAR ARRAY ENCODED_QUALIFIER 11, " +
-                "d_char_array CHAR(15) ARRAY[3] ENCODED_QUALIFIER 12 " +
+                "c_var_array VARCHAR ARRAY, " +
+                "d_char_array CHAR(15) ARRAY[3] " +
                 "CONSTRAINT PK PRIMARY KEY (a_char, b_char)) " +
                 "TTL=2592000, IMMUTABLE_STORAGE_SCHEME='ONE_CELL_PER_COLUMN', 
REPLICATION_SCOPE=1";
         List<String> queries = new ArrayList<String>(){};
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/schema/tool/SchemaExtractionProcessor.java
 
b/phoenix-core/src/main/java/org/apache/phoenix/schema/tool/SchemaExtractionProcessor.java
index 41a8d16afd..7e3913249a 100644
--- 
a/phoenix-core/src/main/java/org/apache/phoenix/schema/tool/SchemaExtractionProcessor.java
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/schema/tool/SchemaExtractionProcessor.java
@@ -32,16 +32,17 @@ import org.apache.phoenix.mapreduce.util.ConnectionUtil;
 import org.apache.phoenix.query.ConnectionQueryServices;
 import org.apache.phoenix.query.QueryConstants;
 import org.apache.phoenix.schema.PColumn;
+import org.apache.phoenix.schema.PColumnFamily;
 import org.apache.phoenix.schema.PTable;
 import org.apache.phoenix.schema.PTableType;
 import org.apache.phoenix.schema.SortOrder;
-import org.apache.phoenix.util.MetaDataUtil;
 import org.apache.phoenix.util.PhoenixRuntime;
 import org.apache.phoenix.util.SchemaUtil;
 
 import java.io.IOException;
 import java.sql.Connection;
 import java.sql.SQLException;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.HashMap;
 import java.util.Map;
@@ -49,6 +50,7 @@ import java.util.Set;
 import java.util.List;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.stream.Collectors;
 
 import static 
org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.TRANSACTION_PROVIDER;
 import static 
org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.UPDATE_CACHE_FREQUENCY;
@@ -94,11 +96,11 @@ public class SchemaExtractionProcessor implements 
SchemaProcessor {
         if (ddl != null) {
             return ddl;
         }
-        if(this.table.getType().equals(PTableType.TABLE)) {
+        if (this.table.getType().equals(PTableType.TABLE)) {
             ddl = extractCreateTableDDL(this.table);
-        } else if(this.table.getType().equals(PTableType.INDEX)) {
+        } else if (this.table.getType().equals(PTableType.INDEX)) {
             ddl = extractCreateIndexDDL(this.table);
-        } else if(this.table.getType().equals(PTableType.VIEW)) {
+        } else if (this.table.getType().equals(PTableType.VIEW)) {
             ddl = extractCreateViewDDL(this.table);
         }
         return ddl;
@@ -151,7 +153,7 @@ public class SchemaExtractionProcessor implements 
SchemaProcessor {
             indexPKName.add(indexColumn);
             indexSortOrderMap.put(indexColumn, indexedColumn.getSortOrder());
         }
-        for(PColumn pColumn : dataPK) {
+        for (PColumn pColumn : dataPK) {
             dataPKName.add(pColumn.getName().getString());
         }
 
@@ -162,11 +164,11 @@ public class SchemaExtractionProcessor implements 
SchemaProcessor {
         }
 
         for (String column : indexPKName) {
-            if(indexedColumnsBuilder.length()!=0) {
+            if (indexedColumnsBuilder.length()!=0) {
                 indexedColumnsBuilder.append(", ");
             }
             indexedColumnsBuilder.append(column);
-            if(indexSortOrderMap.containsKey(column)
+            if (indexSortOrderMap.containsKey(column)
                     && indexSortOrderMap.get(column) != 
SortOrder.getDefault()) {
                 indexedColumnsBuilder.append(" ");
                 indexedColumnsBuilder.append(indexSortOrderMap.get(column));
@@ -177,14 +179,14 @@ public class SchemaExtractionProcessor implements 
SchemaProcessor {
 
     private List<PColumn> getSymmetricDifferencePColumns(List<PColumn> 
firstList, List<PColumn> secondList) {
         List<PColumn> effectivePK = new ArrayList<>();
-        for(PColumn column : firstList) {
-            if(secondList.contains(column)) {
+        for (PColumn column : firstList) {
+            if (secondList.contains(column)) {
                 continue;
             }
             effectivePK.add(column);
         }
-        for(PColumn column : secondList) {
-            if(firstList.contains(column)) {
+        for (PColumn column : secondList) {
+            if (firstList.contains(column)) {
                 continue;
             }
             effectivePK.add(column);
@@ -197,7 +199,7 @@ public class SchemaExtractionProcessor implements 
SchemaProcessor {
             return null;
         }
         String [] columnNameSplit = columnName.split(":");
-        if(columnNameSplit[0].equals("") || 
columnNameSplit[0].equalsIgnoreCase(defaultCF) ||
+        if (columnNameSplit[0].equals("") || 
columnNameSplit[0].equalsIgnoreCase(defaultCF) ||
                 (defaultCF.startsWith("L#") && 
columnNameSplit[0].equalsIgnoreCase(defaultCF.substring(2)))) {
             return formatColumnOrExpression(columnNameSplit[1]);
         } else {
@@ -228,10 +230,10 @@ public class SchemaExtractionProcessor implements 
SchemaProcessor {
         StringBuilder coveredColumnsBuilder = new StringBuilder();
         List<PColumn> pkColumns = indexPTable.getColumns();
         for (PColumn cc : pkColumns) {
-            if(coveredColumnsBuilder.length()!=0) {
+            if (coveredColumnsBuilder.length()!=0) {
                 coveredColumnsBuilder.append(", ");
             }
-            if(cc.getFamilyName()!=null) {
+            if (cc.getFamilyName()!=null) {
                 String indexColumn = 
extractIndexColumn(cc.getName().getString(), defaultCF);
                 if (indexColumn != null) {
                     coveredColumnsBuilder.append(indexColumn);
@@ -248,7 +250,7 @@ public class SchemaExtractionProcessor implements 
SchemaProcessor {
         outputBuilder.append("(");
         outputBuilder.append(indexedColumnString);
         outputBuilder.append(")");
-        if(!coveredColumnString.equals("")) {
+        if (!coveredColumnString.equals("")) {
             outputBuilder.append(" INCLUDE (");
             outputBuilder.append(coveredColumnString);
             outputBuilder.append(")");
@@ -275,7 +277,7 @@ public class SchemaExtractionProcessor implements 
SchemaProcessor {
         String columnInfoString = getColumnInfoStringForView(table, baseTable);
 
         String whereClause = table.getViewStatement();
-        if(whereClause != null) {
+        if (whereClause != null) {
             whereClause = whereClause.substring(whereClause.indexOf("WHERE"));
         }
         return generateCreateViewDDL(columnInfoString, quotedBaseTableName,
@@ -332,7 +334,7 @@ public class SchemaExtractionProcessor implements 
SchemaProcessor {
             if 
(key.equalsIgnoreCase(ColumnFamilyDescriptorBuilder.COMPRESSION)) {
                 defaultProps.put(key, "NONE");
             }
-            
if(key.equalsIgnoreCase(ColumnFamilyDescriptorBuilder.DATA_BLOCK_ENCODING)) {
+            if 
(key.equalsIgnoreCase(ColumnFamilyDescriptorBuilder.DATA_BLOCK_ENCODING)) {
                 defaultProps.put(key, 
String.valueOf(SchemaUtil.DEFAULT_DATA_BLOCK_ENCODING));
             }
         }
@@ -344,7 +346,7 @@ public class SchemaExtractionProcessor implements 
SchemaProcessor {
         for (Map.Entry<Bytes, Bytes> entry : propsMap.entrySet()) {
             Bytes key = entry.getKey();
             Bytes value = entry.getValue();
-            if(Bytes.toString(key.get()).contains("coprocessor") || 
Bytes.toString(key.get()).contains(
+            if (Bytes.toString(key.get()).contains("coprocessor") || 
Bytes.toString(key.get()).contains(
                     TableDescriptorBuilder.IS_META)) {
                 continue;
             }
@@ -355,12 +357,12 @@ public class SchemaExtractionProcessor implements 
SchemaProcessor {
 
     private void setHColumnFamilyProperties(ColumnFamilyDescriptor[] 
columnDescriptors) {
         Map<Bytes, Bytes> propsMap = columnDescriptors[0].getValues();
-        for(Map.Entry<Bytes, Bytes> entry : propsMap.entrySet()) {
+        for (Map.Entry<Bytes, Bytes> entry : propsMap.entrySet()) {
             Bytes key = entry.getKey();
             Bytes globalValue = entry.getValue();
             Map<String, String> cfToPropertyValueMap = new HashMap<String, 
String>();
             Set<Bytes> cfPropertyValueSet = new HashSet<>();
-            for(ColumnFamilyDescriptor columnDescriptor: columnDescriptors) {
+            for (ColumnFamilyDescriptor columnDescriptor: columnDescriptors) {
                 String columnFamilyName = 
Bytes.toString(columnDescriptor.getName());
                 Bytes value = columnDescriptor.getValues().get(key);
                 // check if it is universal properties
@@ -372,7 +374,7 @@ public class SchemaExtractionProcessor implements 
SchemaProcessor {
                 cfPropertyValueSet.add(value);
             }
             if (cfPropertyValueSet.size() > 1) {
-                for(Map.Entry<String, String> mapEntry: 
cfToPropertyValueMap.entrySet()) {
+                for (Map.Entry<String, String> mapEntry: 
cfToPropertyValueMap.entrySet()) {
                     definedProps.put(String.format("%s.%s",  
mapEntry.getKey(), Bytes.toString(key.get())), mapEntry.getValue());
                 }
             } else {
@@ -383,10 +385,10 @@ public class SchemaExtractionProcessor implements 
SchemaProcessor {
 
     private void setPTableProperties(PTable table) {
         Map <String, String> map = table.getPropertyValues();
-        for(Map.Entry<String, String> entry : map.entrySet()) {
+        for (Map.Entry<String, String> entry : map.entrySet()) {
             String key = entry.getKey();
             String value = entry.getValue();
-            if(value != null) {
+            if (value != null) {
                 definedProps.put(key, value);
             }
         }
@@ -432,7 +434,7 @@ public class SchemaExtractionProcessor implements 
SchemaProcessor {
 
     private String convertPropertiesToString(boolean forIndex) {
         StringBuilder optionBuilder = new StringBuilder();
-        for(Map.Entry<String, String> entry : definedProps.entrySet()) {
+        for (Map.Entry<String, String> entry : definedProps.entrySet()) {
             String key = entry.getKey();
             String value = entry.getValue();
             String columnFamilyName = QueryConstants.DEFAULT_COLUMN_FAMILY;
@@ -445,7 +447,7 @@ public class SchemaExtractionProcessor implements 
SchemaProcessor {
                 key = colPropKey[1];
             }
 
-            if(value!=null && (shouldGenerateWithDefaults || 
(defaultProps.get(key) != null && !value.equals(defaultProps.get(key))))) {
+            if (value!=null && (shouldGenerateWithDefaults || 
(defaultProps.get(key) != null && !value.equals(defaultProps.get(key))))) {
                 if (forIndex) {
                     // cannot set these for index
                     if (key.equals(UPDATE_CACHE_FREQUENCY)) {
@@ -466,7 +468,7 @@ public class SchemaExtractionProcessor implements 
SchemaProcessor {
                         key : String.format("\"%s\".%s", columnFamilyName, 
key);
                 // properties value that corresponds to a number will not need 
single quotes around it
                 // properties value that corresponds to a boolean value will 
not need single quotes around it
-                if(!(NumberUtils.isNumber(value)) &&
+                if (!(NumberUtils.isNumber(value)) &&
                         !(value.equalsIgnoreCase(Boolean.TRUE.toString()) 
||value.equalsIgnoreCase(Boolean.FALSE.toString()))) {
                     value= "'" + value + "'";
                 }
@@ -488,7 +490,7 @@ public class SchemaExtractionProcessor implements 
SchemaProcessor {
     }
 
     public Connection getConnection() throws SQLException {
-        if(tenantId!=null) {
+        if (tenantId!=null) {
             conf.set(PhoenixRuntime.TENANT_ID_ATTRIB, tenantId);
         }
         return ConnectionUtil.getInputConnection(conf);
@@ -502,25 +504,87 @@ public class SchemaExtractionProcessor implements 
SchemaProcessor {
         return getColumnInfoString(table, colInfo, columns, pkColumns);
     }
 
-    private boolean shouldContainQualifier(PTable table, List<PColumn> columns)
+    private boolean hasEncodedQualifier(PTable table)
     {
-        if (columns.size() == 0 || shouldGenerateWithDefaults) {
+        return table.getColumns().size() > 0
+                && !shouldGenerateWithDefaults
+                && table.getType() == PTableType.TABLE
+                && table.getEncodingScheme() != 
PTable.QualifierEncodingScheme.NON_ENCODED_QUALIFIERS;
+    }
+
+    private boolean areEncodedIdsComplete(List<Integer> encodedIds, Integer 
initialID,
+                                         Integer lastEncodedID) {
+        if (encodedIds.size() == 0) {
+            return true;
+        }
+        if (encodedIds.get(0) > initialID ||
+                encodedIds.get(encodedIds.size() - 1) < lastEncodedID) {
             return false;
         }
-
-        return table.getType() == PTableType.TABLE && 
table.getEncodingScheme() != 
PTable.QualifierEncodingScheme.NON_ENCODED_QUALIFIERS;
+        for (int i = 1; i < encodedIds.size(); i++) {
+            if (encodedIds.get(i - 1) + 1 != encodedIds.get(i)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private List<String> getNonConsecutiveQualifierFamilies(PTable table) {
+        List<String> ret = new ArrayList<>();
+        if (!hasEncodedQualifier(table)) {
+            return ret;
+        }
+
+        PTable.QualifierEncodingScheme scheme = table.getEncodingScheme();
+        PTable.EncodedCQCounter encodedCQCounter = table.getEncodedCQCounter();
+        if (table.getImmutableStorageScheme() == 
SINGLE_CELL_ARRAY_WITH_OFFSETS) {
+            // For this scheme we track column qualifier counters at the 
column family level
+            for (PColumnFamily colFamily : table.getColumnFamilies()) {
+                String colFamilyName = colFamily.getName().getString();
+                List<Integer> encodedIds = colFamily.getColumns().stream()
+                        .filter(c -> !table.getPKColumns().contains(c))
+                        .map(pColumn -> 
scheme.decode(pColumn.getColumnQualifierBytes()))
+                        .collect(Collectors.toList());
+                Collections.sort(encodedIds);
+                if (!areEncodedIdsComplete(encodedIds,
+                        QueryConstants.ENCODED_CQ_COUNTER_INITIAL_VALUE,
+                        encodedCQCounter.getNextQualifier(colFamilyName) - 1)) 
{
+                    ret.add(colFamilyName);
+                }
+            }
+        } else {
+            // For other schemes, column qualifier counters are tracked using 
the default column
+            // family.
+            List<Integer> encodedIds = table.getColumns().stream()
+                    .filter(c -> !table.getPKColumns().contains(c))
+                    .map(pColumn -> 
scheme.decode(pColumn.getColumnQualifierBytes()))
+                    .collect(Collectors.toList());
+            Collections.sort(encodedIds);
+            String defaultFamilyName = table.getDefaultFamilyName() == null ?
+                    QueryConstants.DEFAULT_COLUMN_FAMILY
+                    : table.getDefaultFamilyName().getString();
+            if (!areEncodedIdsComplete(encodedIds,
+                    QueryConstants.ENCODED_CQ_COUNTER_INITIAL_VALUE,
+                    encodedCQCounter.getNextQualifier(defaultFamilyName) - 1)) 
{
+                ret = table.getColumnFamilies().stream()
+                        .map(pColumnFamily -> 
pColumnFamily.getName().getString())
+                        .collect(Collectors.toList());
+            }
+        }
+        return ret;
     }
 
     private String getColumnInfoString(PTable table, StringBuilder colInfo, 
List<PColumn> columns,
             List<PColumn> pkColumns) {
-        boolean appendQualifier = shouldContainQualifier(table, columns);
+        List<String> nonConsecutiveCounterFamilies = 
getNonConsecutiveQualifierFamilies(table);
         ArrayList<String> colDefs = new ArrayList<>(columns.size());
         for (PColumn col : columns) {
             String def = extractColumn(col);
             if (pkColumns.size() == 1 && pkColumns.contains(col)) {
                 def += " PRIMARY KEY" + extractPKColumnAttributes(col);
             }
-            if (appendQualifier && !pkColumns.contains(col)) {
+            if (!pkColumns.contains(col)
+                    && 
nonConsecutiveCounterFamilies.contains(col.getFamilyName().getString())) {
                 def += " ENCODED_QUALIFIER " +
                         
table.getEncodingScheme().decode(col.getColumnQualifierBytes());
             }

Reply via email to