{"action":"created","comment":{"url":"https://api.github.com/repos/apache/phoenix/pulls/comments/191932416","pull_request_review_id":124604773,"id":191932416,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDE5MTkzMjQxNg==","diff_hunk":"@@ -479,179 +498,355 @@ private void addTenantIdFilter(StringBuilder buf, String tenantIdPattern) {\n     private static void appendConjunction(StringBuilder buf) {\n         buf.append(buf.length() == 0 ? \"\" : \" and \");\n     }\n-\n-    @Override\n+    \n+    private static final PColumnImpl TENANT_ID_COLUMN = new PColumnImpl(PNameFactory.newName(TENANT_ID),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PVarchar.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, DATA_TYPE_BYTES, HConstants.LATEST_TIMESTAMP);\n+    private static final PColumnImpl TABLE_SCHEM_COLUMN = new PColumnImpl(PNameFactory.newName(TABLE_SCHEM),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PVarchar.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, DATA_TYPE_BYTES, HConstants.LATEST_TIMESTAMP);\n+    private static final PColumnImpl TABLE_NAME_COLUMN = new PColumnImpl(PNameFactory.newName(TABLE_NAME),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PVarchar.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, DATA_TYPE_BYTES, HConstants.LATEST_TIMESTAMP);\n+    private static final PColumnImpl COLUMN_NAME_COLUMN = new PColumnImpl(PNameFactory.newName(COLUMN_NAME),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PVarchar.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, DATA_TYPE_BYTES, HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl DATA_TYPE_COLUMN = new PColumnImpl(PNameFactory.newName(DATA_TYPE),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PInteger.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, DATA_TYPE_BYTES, HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl TYPE_NAME_COLUMN = new PColumnImpl(PNameFactory.newName(TYPE_NAME),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PVarchar.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, Bytes.toBytes(TYPE_NAME), HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl COLUMN_SIZE_COLUMN = new PColumnImpl(PNameFactory.newName(COLUMN_SIZE),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PInteger.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, COLUMN_SIZE_BYTES, HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl BUFFER_LENGTH_COLUMN = new PColumnImpl(PNameFactory.newName(BUFFER_LENGTH),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PInteger.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, Bytes.toBytes(BUFFER_LENGTH), HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl DECIMAL_DIGITS_COLUMN = new PColumnImpl(PNameFactory.newName(DECIMAL_DIGITS),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PInteger.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, DECIMAL_DIGITS_BYTES, HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl NUM_PREC_RADIX_COLUMN = new PColumnImpl(PNameFactory.newName(NUM_PREC_RADIX),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PInteger.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, Bytes.toBytes(NUM_PREC_RADIX), HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl NULLABLE_COLUMN = new PColumnImpl(PNameFactory.newName(NULLABLE),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PInteger.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, NULLABLE_BYTES, HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl REMARKS_COLUMN = new PColumnImpl(PNameFactory.newName(REMARKS),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PVarchar.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, Bytes.toBytes(REMARKS), HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl COLUMN_DEF_COLUMN = new PColumnImpl(PNameFactory.newName(COLUMN_DEF),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PVarchar.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, Bytes.toBytes(COLUMN_DEF), HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl SQL_DATA_TYPE_COLUMN = new PColumnImpl(PNameFactory.newName(SQL_DATA_TYPE),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PInteger.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, Bytes.toBytes(SQL_DATA_TYPE), HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl SQL_DATETIME_SUB_COLUMN = new PColumnImpl(PNameFactory.newName(SQL_DATETIME_SUB),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PInteger.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, Bytes.toBytes(SQL_DATETIME_SUB), HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl CHAR_OCTET_LENGTH_COLUMN = new PColumnImpl(PNameFactory.newName(COLUMN_SIZE),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PInteger.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, Bytes.toBytes(CHAR_OCTET_LENGTH), HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl ORDINAL_POSITION_COLUMN = new PColumnImpl(PNameFactory.newName(ORDINAL_POSITION),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PInteger.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, ORDINAL_POSITION_BYTES, HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl IS_NULLABLE_COLUMN = new PColumnImpl(PNameFactory.newName(IS_NULLABLE),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PVarchar.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, Bytes.toBytes(IS_NULLABLE), HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl SCOPE_CATALOG_COLUMN = new PColumnImpl(PNameFactory.newName(SCOPE_CATALOG),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PVarchar.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, Bytes.toBytes(SCOPE_CATALOG), HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl SCOPE_SCHEMA_COLUMN = new PColumnImpl(PNameFactory.newName(SCOPE_SCHEMA),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PVarchar.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, Bytes.toBytes(SCOPE_SCHEMA), HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl SCOPE_TABLE_COLUMN = new PColumnImpl(PNameFactory.newName(SCOPE_TABLE),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PVarchar.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, Bytes.toBytes(SCOPE_TABLE), HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl SOURCE_DATA_TYPE_COLUMN = new PColumnImpl(PNameFactory.newName(SOURCE_DATA_TYPE),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PVarchar.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, Bytes.toBytes(SOURCE_DATA_TYPE), HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl IS_AUTOINCREMENT_COLUMN = new PColumnImpl(PNameFactory.newName(COLUMN_SIZE),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PSmallint.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, Bytes.toBytes(SCOPE_CATALOG), HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl ARRAY_SIZE_COLUMN = new PColumnImpl(PNameFactory.newName(ARRAY_SIZE),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PInteger.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, ARRAY_SIZE_BYTES, HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl COLUMN_FAMILY_COLUMN = new PColumnImpl(PNameFactory.newName(COLUMN_FAMILY),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PVarchar.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, COLUMN_FAMILY_BYTES, HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl TYPE_ID_COLUMN = new PColumnImpl(PNameFactory.newName(COLUMN_SIZE),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PInteger.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, Bytes.toBytes(TYPE_ID), HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl VIEW_CONSTANT_COLUMN = new PColumnImpl(PNameFactory.newName(VIEW_CONSTANT),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PVarbinary.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, VIEW_CONSTANT_BYTES, HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl MULTI_TENANT_COLUMN = new PColumnImpl(PNameFactory.newName(MULTI_TENANT),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PBoolean.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, MULTI_TENANT_BYTES, HConstants.LATEST_TIMESTAMP);\n+\tprivate static final PColumnImpl KEY_SEQ_COLUMN = new PColumnImpl(PNameFactory.newName(KEY_SEQ),\n+\t\t\tPNameFactory.newName(TABLE_FAMILY_BYTES), PSmallint.INSTANCE, null, null, false, 1, SortOrder.getDefault(),\n+\t\t\t0, null, false, null, false, false, KEY_SEQ_BYTES, HConstants.LATEST_TIMESTAMP);\n+\t\n+\tprivate static final List<PColumnImpl> PK_DATUM_LIST = Lists.newArrayList(TENANT_ID_COLUMN, TABLE_SCHEM_COLUMN, TABLE_NAME_COLUMN, COLUMN_NAME_COLUMN);\n+\t\n+\tprivate static final RowProjector GET_COLUMNS_ROW_PROJECTOR = new RowProjector(\n+\t\t\tArrays.<ColumnProjector> asList(\n+\t\t\t\t\tnew ExpressionProjector(TABLE_CAT, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew RowKeyColumnExpression(TENANT_ID_COLUMN,\n+\t\t\t\t\t\t\t\t\tnew RowKeyValueAccessor(PK_DATUM_LIST, 0)), false),\n+\t\t\t\t\tnew ExpressionProjector(TABLE_SCHEM, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew RowKeyColumnExpression(TABLE_SCHEM_COLUMN,\n+\t\t\t\t\t\t\t\t\tnew RowKeyValueAccessor(PK_DATUM_LIST, 1)), false),\n+\t\t\t\t\tnew ExpressionProjector(TABLE_NAME, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew RowKeyColumnExpression(TABLE_NAME_COLUMN,\n+\t\t\t\t\t\t\t\t\tnew RowKeyValueAccessor(PK_DATUM_LIST, 2)), false),\n+\t\t\t\t\tnew ExpressionProjector(COLUMN_NAME, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew RowKeyColumnExpression(COLUMN_NAME_COLUMN,\n+\t\t\t\t\t\t\t\t\tnew RowKeyValueAccessor(PK_DATUM_LIST, 3)), false),\n+\t\t\t\t\tnew ExpressionProjector(DATA_TYPE, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(DATA_TYPE_COLUMN), false),\n+\t\t\t\t\tnew ExpressionProjector(TYPE_NAME, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(TYPE_NAME_COLUMN), false),\n+\t\t\t\t\tnew ExpressionProjector(COLUMN_SIZE, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(COLUMN_SIZE_COLUMN), false),\n+\t\t\t\t\tnew ExpressionProjector(BUFFER_LENGTH, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(BUFFER_LENGTH_COLUMN), false),\n+\t\t\t\t\tnew ExpressionProjector(DECIMAL_DIGITS, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(DECIMAL_DIGITS_COLUMN), false),\n+\t\t\t\t\tnew ExpressionProjector(NUM_PREC_RADIX, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(NUM_PREC_RADIX_COLUMN), false),\n+\t\t\t\t\tnew ExpressionProjector(NULLABLE, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(NULLABLE_COLUMN), false),\n+\t\t\t\t\tnew ExpressionProjector(REMARKS, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(REMARKS_COLUMN), false),\n+\t\t\t\t\tnew ExpressionProjector(COLUMN_DEF, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(COLUMN_DEF_COLUMN), false),\n+\t\t\t\t\tnew ExpressionProjector(SQL_DATA_TYPE, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(SQL_DATA_TYPE_COLUMN), false),\n+\t\t\t\t\tnew ExpressionProjector(SQL_DATETIME_SUB, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(SQL_DATETIME_SUB_COLUMN), false),\n+\t\t\t\t\tnew ExpressionProjector(CHAR_OCTET_LENGTH, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(CHAR_OCTET_LENGTH_COLUMN), false),\n+\t\t\t\t\tnew ExpressionProjector(ORDINAL_POSITION, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(ORDINAL_POSITION_COLUMN), false),\n+\t\t\t\t\tnew ExpressionProjector(IS_NULLABLE, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(IS_NULLABLE_COLUMN), false),\n+\t\t\t\t\tnew ExpressionProjector(SCOPE_CATALOG, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(SCOPE_CATALOG_COLUMN), false),\n+\t\t\t\t\tnew ExpressionProjector(SCOPE_SCHEMA, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(SCOPE_SCHEMA_COLUMN), false),\n+\t\t\t\t\tnew ExpressionProjector(SCOPE_TABLE, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(SCOPE_TABLE_COLUMN), false),\n+\t\t\t\t\tnew ExpressionProjector(SOURCE_DATA_TYPE, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(SOURCE_DATA_TYPE_COLUMN), false),\n+\t\t\t\t\tnew ExpressionProjector(IS_AUTOINCREMENT, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(IS_AUTOINCREMENT_COLUMN), false),\n+\t\t\t\t\tnew ExpressionProjector(ARRAY_SIZE, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(ARRAY_SIZE_COLUMN), false),\n+\t\t\t\t\tnew ExpressionProjector(COLUMN_FAMILY, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(COLUMN_FAMILY_COLUMN), false),\n+\t\t\t\t\tnew ExpressionProjector(TYPE_ID, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(TYPE_ID_COLUMN), false),\n+\t\t\t\t\tnew ExpressionProjector(VIEW_CONSTANT, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(VIEW_CONSTANT_COLUMN), false),\n+\t\t\t\t\tnew ExpressionProjector(MULTI_TENANT, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(MULTI_TENANT_COLUMN), false),\n+\t\t\t\t\tnew ExpressionProjector(KEY_SEQ, SYSTEM_CATALOG,\n+\t\t\t\t\t\t\tnew KeyValueColumnExpression(KEY_SEQ_COLUMN), false)\n+\t\t\t\t\t), 0, true);\n+\t\n+\tprivate boolean match(String str, String pattern) throws SQLException {\n+\t\tLiteralExpression strExpr = LiteralExpression.newConstant(str, PVarchar.INSTANCE, SortOrder.ASC);\n+\t\tLiteralExpression patternExpr = LiteralExpression.newConstant(pattern, PVarchar.INSTANCE, SortOrder.ASC);\n+\t\tList<Expression> children = Arrays.<Expression>asList(strExpr, patternExpr);\n+\t\tLikeExpression likeExpr = StringBasedLikeExpression.create(children, LikeType.CASE_SENSITIVE);\n+\t\tImmutableBytesWritable ptr = new ImmutableBytesWritable();\n+\t\tboolean evaluated = likeExpr.evaluate(null, ptr);\n+\t\tBoolean result = (Boolean)likeExpr.getDataType().toObject(ptr);\n+\t\tif (evaluated) {\n+\t\t\treturn result;\n+\t\t}\n+\t\treturn false;\n+\t}\n+    \n+\t@Override\n     public ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern)\n             throws SQLException {\n-        StringBuilder buf = new StringBuilder(\"select \\n \" +\n-                TENANT_ID + \" \" + TABLE_CAT + \",\" + // use this for tenant id\n-                TABLE_SCHEM + \",\" +\n-                TABLE_NAME + \" ,\" +\n-                COLUMN_NAME + \",\" +\n-                ExternalSqlTypeIdFunction.NAME + \"(\" + DATA_TYPE + \") AS \" + DATA_TYPE + \",\" +\n-                SqlTypeNameFunction.NAME + \"(\" + DATA_TYPE + \") AS \" + TYPE_NAME + \",\" +\n-                COLUMN_SIZE + \",\" +\n-                BUFFER_LENGTH + \",\" +\n-                DECIMAL_DIGITS + \",\" +\n-                NUM_PREC_RADIX + \",\" +\n-                NULLABLE + \",\" +\n-                REMARKS + \",\" +\n-                COLUMN_DEF + \",\" +\n-                SQL_DATA_TYPE + \",\" +\n-                SQL_DATETIME_SUB + \",\" +\n-                CHAR_OCTET_LENGTH + \",\" +\n-                \"CASE WHEN \" + TENANT_POS_SHIFT + \" THEN \" + ORDINAL_POSITION + \"-1 ELSE \" + ORDINAL_POSITION + \" END AS \" + ORDINAL_POSITION + \",\" +\n-                \"CASE \" + NULLABLE + \" WHEN \" + DatabaseMetaData.attributeNoNulls +  \" THEN '\" + Boolean.FALSE.toString() + \"' WHEN \" + DatabaseMetaData.attributeNullable + \" THEN '\" + Boolean.TRUE.toString() + \"' END AS \" + IS_NULLABLE + \",\" +\n-                SCOPE_CATALOG + \",\" +\n-                SCOPE_SCHEMA + \",\" +\n-                SCOPE_TABLE + \",\" +\n-                SOURCE_DATA_TYPE + \",\" +\n-                IS_AUTOINCREMENT + \",\" +\n-                ARRAY_SIZE + \",\" +\n-                COLUMN_FAMILY + \",\" +\n-                DATA_TYPE + \" \" + TYPE_ID + \",\" +// raw type id for potential internal consumption\n-                VIEW_CONSTANT + \",\" +\n-                MULTI_TENANT + \",\" +\n-                \"CASE WHEN \" + TENANT_POS_SHIFT + \" THEN \" + KEY_SEQ + \"-1 ELSE \" + KEY_SEQ + \" END AS \" + KEY_SEQ +\n-                \" from \" + SYSTEM_CATALOG + \" \" + SYSTEM_CATALOG_ALIAS + \"(\" + TENANT_POS_SHIFT + \" BOOLEAN)\");\n-        StringBuilder where = new StringBuilder();\n-        addTenantIdFilter(where, catalog);\n-        if (schemaPattern != null) {\n-            appendConjunction(where);\n-            where.append(TABLE_SCHEM + (schemaPattern.length() == 0 ? \" is null\" : \" like '\" + StringUtil.escapeStringConstant(schemaPattern) + \"'\" ));\n-        }\n-        if (tableNamePattern != null && tableNamePattern.length() > 0) {\n-            appendConjunction(where);\n-            where.append(TABLE_NAME + \" like '\" + StringUtil.escapeStringConstant(tableNamePattern) + \"'\" );\n-        }\n-        // Allow a \".\" in columnNamePattern for column family match\n-        String colPattern = null;\n-        if (columnNamePattern != null && columnNamePattern.length() > 0) {\n+\t\tboolean isTenantSpecificConnection = connection.getTenantId() != null;\n+    \tList<Tuple> tuples = Lists.newArrayListWithExpectedSize(10);\n+    \tResultSet rs = getTables(catalog, schemaPattern, tableNamePattern, null);\n+    \twhile (rs.next()) {\n+    \t\tString schemaName = rs.getString(TABLE_SCHEM);\n+    \t\tboolean systemTable = SYSTEM_CATALOG_SCHEMA.equals(schemaName);\n+    \t\t// Allow a \".\" in columnNamePattern for column family match\n+            String colPattern = null;\n             String cfPattern = null;\n-            int index = columnNamePattern.indexOf('.');\n-            if (index <= 0) {\n-                colPattern = columnNamePattern;\n-            } else {\n-                cfPattern = columnNamePattern.substring(0, index);\n-                if (columnNamePattern.length() > index+1) {\n-                    colPattern = columnNamePattern.substring(index+1);\n+            if (columnNamePattern != null && columnNamePattern.length() > 0) {\n+                int index = columnNamePattern.indexOf('.');\n+                if (index <= 0) {\n+                    colPattern = columnNamePattern;\n+                } else {\n+                    cfPattern = columnNamePattern.substring(0, index);\n+                    if (columnNamePattern.length() > index+1) {\n+                        colPattern = columnNamePattern.substring(index+1);\n+                    }\n                 }\n             }\n-            if (cfPattern != null && cfPattern.length() > 0) { // if null or empty, will pick up all columns\n-                // Will pick up only KV columns\n-                appendConjunction(where);\n-                where.append(COLUMN_FAMILY + \" like '\" + StringUtil.escapeStringConstant(cfPattern) + \"'\" );\n-            }\n-            if (colPattern != null && colPattern.length() > 0) {\n-                appendConjunction(where);\n-                where.append(COLUMN_NAME + \" like '\" + StringUtil.escapeStringConstant(colPattern) + \"'\" );\n-            }\n-        }\n-        if (colPattern == null || colPattern.length() == 0) {\n-            appendConjunction(where);\n-            where.append(COLUMN_NAME + \" is not null\" );\n-            appendConjunction(where);\n-            where.append(LINK_TYPE + \" is null\" );\n-        }\n-        boolean isTenantSpecificConnection = connection.getTenantId() != null;\n-        if (isTenantSpecificConnection) {\n-            buf.append(\" where (\" + where + \") OR (\"\n-                    + COLUMN_FAMILY + \" is null AND \" +  COLUMN_NAME + \" is null)\");\n-        } else {\n-            buf.append(\" where \" + where);\n-        }\n-        buf.append(\" order by \" + TENANT_ID + \",\" + TABLE_SCHEM + \",\" + TABLE_NAME + \",\" + SYSTEM_CATALOG_ALIAS + \".\" + ORDINAL_POSITION);\n-\n-        Statement stmt;\n-        if (isTenantSpecificConnection) {\n-            stmt = connection.createStatement(new PhoenixStatementFactory() {\n-                @Override\n-                public PhoenixStatement newStatement(PhoenixConnection connection) {\n-                    return new PhoenixStatement(connection) {\n-                        @Override\n-                        public PhoenixResultSet newResultSet(ResultIterator iterator, RowProjector projector,\n-                                StatementContext context) throws SQLException {\n-                            return new PhoenixResultSet(new TenantColumnFilteringIterator(iterator, projector),\n-                                    projector, context);\n-                        }\n-                    };\n+\t\t\tString tableName = rs.getString(TABLE_NAME);\n+    \t\tString tenantId = rs.getString(TABLE_CAT);\n+    \t\tString fullTableName = SchemaUtil.getTableName(schemaName, tableName);\n+    \t\t// if its a SYSTEM table we prevent the rpc to fetch the table so look it up in the cache\n+\t\t\tPTable table = systemTable ? PhoenixRuntime.getTable(connection, fullTableName)\n+\t\t\t\t\t: PhoenixRuntime.getTableNoCache(connection, fullTableName);\n+    \t\tboolean isSalted = table.getBucketNum()!=null;\n+    \t\tboolean tenantColSkipped = false;\n+    \t\tfor (PColumn column : table.getColumns()) {\n+    \t\t\tif (isTenantSpecificConnection && column.equals(table.getPKColumns().get(0))) {\n+    \t\t\t\t// skip the tenant column\n+    \t\t\t\ttenantColSkipped = true;\n+    \t\t\t\tcontinue;\n+    \t\t\t}\n+    \t\t\tString columnFamily = column.getFamilyName()!=null ? column.getFamilyName().getString() : null;\n+    \t\t\tString columnName = column.getName().getString();\n+    \t\t\tif (cfPattern != null && cfPattern.length() > 0) { // if null or empty, will pick up all columns\n+    \t\t\t\tif (columnFamily==null || !match(columnFamily, cfPattern)) {\n+    \t\t\t\t\tcontinue;\n+    \t\t\t\t}\n                 }\n-            });\n-        } else {\n-            stmt = connection.createStatement();\n-        }\n-        return stmt.executeQuery(buf.toString());\n-    }\n-    \n-//    private ColumnResolver getColumnResolverForCatalogTable() throws SQLException {\n-//        TableRef tableRef = new TableRef(getTable(connection, SYSTEM_CATALOG_NAME));\n-//        return FromCompiler.getResolver(tableRef);\n-//    }\n-    \n-    /**\n-     * Filters the tenant id column out of a column metadata result set (thus, where each row is a column definition).\n-     * The tenant id is by definition the first column of the primary key, but the primary key does not necessarily\n-     * start at the first column. Assumes columns are sorted on ordinal position.\n-     */\n-    private static class TenantColumnFilteringIterator extends DelegateResultIterator {\n-        private final RowProjector rowProjector;\n-        private final int columnFamilyIndex;\n-        private final int columnNameIndex;\n-        private final int multiTenantIndex;\n-        private final int keySeqIndex;\n-        private boolean inMultiTenantTable;\n-        private boolean tenantColumnSkipped;\n-\n-        private TenantColumnFilteringIterator(ResultIterator delegate, RowProjector rowProjector) throws SQLException {\n-            super(delegate);\n-            this.rowProjector = rowProjector;\n-            this.columnFamilyIndex = rowProjector.getColumnIndex(COLUMN_FAMILY);\n-            this.columnNameIndex = rowProjector.getColumnIndex(COLUMN_NAME);\n-            this.multiTenantIndex = rowProjector.getColumnIndex(MULTI_TENANT);\n-            this.keySeqIndex = rowProjector.getColumnIndex(KEY_SEQ);\n-        }\n-\n-        @Override\n-        public Tuple next() throws SQLException {\n-            Tuple tuple = super.next();\n-\n-            while (tuple != null\n-                    && getColumn(tuple, columnFamilyIndex) == null && getColumn(tuple, columnNameIndex) == null) {\n-                // new table, check if it is multitenant\n-                inMultiTenantTable = getColumn(tuple, multiTenantIndex) == Boolean.TRUE;\n-                tenantColumnSkipped = false;\n-                // skip row representing table\n-                tuple = super.next();\n-            }\n-\n-            if (tuple != null && inMultiTenantTable && !tenantColumnSkipped) {\n-                Object value = getColumn(tuple, keySeqIndex);\n-                if (value != null && ((Number)value).longValue() == 1L) {\n-                    tenantColumnSkipped = true;\n-                    // skip tenant id primary key column\n-                    return next();\n+                if (colPattern != null && colPattern.length() > 0) {\n+                \tif (!match(columnName, colPattern)) {\n+                \t\tcontinue;\n+                \t}\n                 }\n-            }\n-\n-            if (tuple != null && tenantColumnSkipped) {\n-                ResultTuple resultTuple = (ResultTuple)tuple;\n-                List<Cell> cells = resultTuple.getResult().listCells();\n-                KeyValue kv = new KeyValue(resultTuple.getResult().getRow(), TABLE_FAMILY_BYTES,\n-                        TENANT_POS_SHIFT_BYTES, PDataType.TRUE_BYTES);\n-                List<Cell> newCells = Lists.newArrayListWithCapacity(cells.size() + 1);\n-                newCells.addAll(cells);\n-                newCells.add(kv);\n-                Collections.sort(newCells, KeyValue.COMPARATOR);\n-                tuple = new ResultTuple(Result.create(newCells));\n-            }\n-            return tuple;\n-        }\n-\n-        private Object getColumn(Tuple tuple, int index) throws SQLException {\n-            ColumnProjector projector = this.rowProjector.getColumnProjector(index);\n-            PDataType type = projector.getExpression().getDataType();\n-            return projector.getValue(tuple, type, new ImmutableBytesPtr());\n-        }\n+                // generate row key\n+                // TENANT_ID, TABLE_SCHEM, TABLE_NAME , COLUMN_NAME are row key columns\n+                byte[] rowKey =\n+                        SchemaUtil.getColumnKey(tenantId, schemaName, tableName, columnName, null);\n+\n+                // add one cell for each column info\n+                List<Cell> cells = Lists.newArrayListWithCapacity(25);\n+                // DATA_TYPE\n+                cells.add(KeyValueUtil.newKeyValue(rowKey, TABLE_FAMILY_BYTES, DATA_TYPE_BYTES,\n+                    MetaDataProtocol.MIN_TABLE_TIMESTAMP,\n+                    PInteger.INSTANCE.toBytes(column.getDataType().getResultSetSqlType())));\n+                // TYPE_NAME\n+                cells.add(KeyValueUtil.newKeyValue(rowKey, TABLE_FAMILY_BYTES,\n+                    Bytes.toBytes(TYPE_NAME), MetaDataProtocol.MIN_TABLE_TIMESTAMP,\n+                    column.getDataType().getSqlTypeNameBytes()));\n+                // COLUMN_SIZE\n+                cells.add(\n+                    KeyValueUtil.newKeyValue(rowKey, TABLE_FAMILY_BYTES, COLUMN_SIZE_BYTES,\n+                        MetaDataProtocol.MIN_TABLE_TIMESTAMP,\n+                        column.getMaxLength() != null\n+                                ? PInteger.INSTANCE.toBytes(column.getMaxLength())\n+                                : ByteUtil.EMPTY_BYTE_ARRAY));\n+                // BUFFER_LENGTH\n+                cells.add(KeyValueUtil.newKeyValue(rowKey, TABLE_FAMILY_BYTES,\n+                    Bytes.toBytes(BUFFER_LENGTH), MetaDataProtocol.MIN_TABLE_TIMESTAMP,\n+                    ByteUtil.EMPTY_BYTE_ARRAY));\n+                // DECIMAL_DIGITS\n+                cells.add(KeyValueUtil.newKeyValue(rowKey, TABLE_FAMILY_BYTES, DECIMAL_DIGITS_BYTES,\n+                    MetaDataProtocol.MIN_TABLE_TIMESTAMP,\n+                    column.getScale() != null ? PInteger.INSTANCE.toBytes(column.getScale())\n+                            : ByteUtil.EMPTY_BYTE_ARRAY));\n+                // NUM_PREC_RADIX\n+                cells.add(KeyValueUtil.newKeyValue(rowKey, TABLE_FAMILY_BYTES,\n+                    Bytes.toBytes(NUM_PREC_RADIX), MetaDataProtocol.MIN_TABLE_TIMESTAMP,\n+                    ByteUtil.EMPTY_BYTE_ARRAY));\n+                // NULLABLE\n+                cells.add(KeyValueUtil.newKeyValue(rowKey, TABLE_FAMILY_BYTES, NULLABLE_BYTES,\n+                    MetaDataProtocol.MIN_TABLE_TIMESTAMP,\n+                    PInteger.INSTANCE.toBytes(SchemaUtil.getIsNullableInt(column.isNullable()))));\n+                // REMARKS\n+                cells.add(\n+                    KeyValueUtil.newKeyValue(rowKey, TABLE_FAMILY_BYTES, Bytes.toBytes(REMARKS),\n+                        MetaDataProtocol.MIN_TABLE_TIMESTAMP, ByteUtil.EMPTY_BYTE_ARRAY));","path":"phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java","position":508,"original_position":508,"commit_id":"5b6b357f0da6b006a5209c23af9adb720094e340","original_commit_id":"5b6b357f0da6b006a5209c23af9adb720094e340","user":{"login":"JamesRTaylor","id":6176299,"node_id":"MDQ6VXNlcjYxNzYyOTk=","avatar_url":"https://avatars0.githubusercontent.com/u/6176299?v=4","gravatar_id":"","url":"https://api.github.com/users/JamesRTaylor","html_url":"https://github.com/JamesRTaylor","followers_url":"https://api.github.com/users/JamesRTaylor/followers","following_url":"https://api.github.com/users/JamesRTaylor/following{/other_user}","gists_url":"https://api.github.com/users/JamesRTaylor/gists{/gist_id}","starred_url":"https://api.github.com/users/JamesRTaylor/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JamesRTaylor/subscriptions","organizations_url":"https://api.github.com/users/JamesRTaylor/orgs","repos_url":"https://api.github.com/users/JamesRTaylor/repos","events_url":"https://api.github.com/users/JamesRTaylor/events{/privacy}","received_events_url":"https://api.github.com/users/JamesRTaylor/received_events","type":"User","site_admin":false},"body":"Is it required to add a cell for REMARKS since it will never have a value?","created_at":"2018-05-30T21:42:33Z","updated_at":"2018-05-30T21:42:34Z","html_url":"https://github.com/apache/phoenix/pull/303#discussion_r191932416","pull_request_url":"https://api.github.com/repos/apache/phoenix/pulls/303","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/apache/phoenix/pulls/comments/191932416"},"html":{"href":"https://github.com/apache/phoenix/pull/303#discussion_r191932416"},"pull_request":{"href":"https://api.github.com/repos/apache/phoenix/pulls/303"}}},"pull_request":{"url":"https://api.github.com/repos/apache/phoenix/pulls/303","id":191212959,"node_id":"MDExOlB1bGxSZXF1ZXN0MTkxMjEyOTU5","html_url":"https://github.com/apache/phoenix/pull/303","diff_url":"https://github.com/apache/phoenix/pull/303.diff","patch_url":"https://github.com/apache/phoenix/pull/303.patch","issue_url":"https://api.github.com/repos/apache/phoenix/issues/303","number":303,"state":"open","locked":false,"title":"PHOENIX-3534 Support multi region SYSTEM.CATALOG table","user":{"login":"twdsilva","id":5653678,"node_id":"MDQ6VXNlcjU2NTM2Nzg=","avatar_url":"https://avatars1.githubusercontent.com/u/5653678?v=4","gravatar_id":"","url":"https://api.github.com/users/twdsilva","html_url":"https://github.com/twdsilva","followers_url":"https://api.github.com/users/twdsilva/followers","following_url":"https://api.github.com/users/twdsilva/following{/other_user}","gists_url":"https://api.github.com/users/twdsilva/gists{/gist_id}","starred_url":"https://api.github.com/users/twdsilva/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/twdsilva/subscriptions","organizations_url":"https://api.github.com/users/twdsilva/orgs","repos_url":"https://api.github.com/users/twdsilva/repos","events_url":"https://api.github.com/users/twdsilva/events{/privacy}","received_events_url":"https://api.github.com/users/twdsilva/received_events","type":"User","site_admin":false},"body":"\r\nThis patch adds two new LinkTypes EXCLUDED_COLUMNS (used to represent a column that has been dropped) and VIEW_INDEX_PARENT_TABLE (used to link an index on a view to its parent). Views and view indexes no longer store columns derived from their ancestors in their metadata. When they are resolved the ancestors are looked up and added to the PTable that is returned to the client (see combineColumns in MetadataEndpointImpl). The PTable in the server side metadata cache only stores the  columns created in the view/view index and not derived columns. \r\nWe do not propagate metadata changes made to a parent to all its children.  While adding  columns to a base table, we no longer lock all the children in the view hierarchy, we only validate that the columns being added does not conflict with an existing base table column. We also don't lock children while dropping a parent table column. When dropping a parent column we also drop any view indexes that need the column. This patch does not handle the case when there are concurrent changes (eg. adding a conflicting column or creating a new view index that requires a parent column that is being dropped). That will be handled in a follow-up patch. \r\nWhile dropping a parent table, we don't drop all the child views metadata. This metadata needs to be cleaned-up (maybe at compaction time?) which will be handled in a follow-up patch. \r\n\r\nThere are a few test failures I am working through, which I will fix soon and update the PR. \r\n@JamesRTaylor can you please review?\r\n\r\nFYI @karanmehta93  @ChinmaySKulkarni \r\n","created_at":"2018-05-29T17:08:46Z","updated_at":"2018-05-30T21:42:34Z","closed_at":null,"merged_at":null,"merge_commit_sha":null,"assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/apache/phoenix/pulls/303/commits","review_comments_url":"https://api.github.com/repos/apache/phoenix/pulls/303/comments","review_comment_url":"https://api.github.com/repos/apache/phoenix/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/phoenix/issues/303/comments","statuses_url":"https://api.github.com/repos/apache/phoenix/statuses/5b6b357f0da6b006a5209c23af9adb720094e340","head":{"label":"twdsilva:PHOENIX-3534","ref":"PHOENIX-3534","sha":"5b6b357f0da6b006a5209c23af9adb720094e340","user":{"login":"twdsilva","id":5653678,"node_id":"MDQ6VXNlcjU2NTM2Nzg=","avatar_url":"https://avatars1.githubusercontent.com/u/5653678?v=4","gravatar_id":"","url":"https://api.github.com/users/twdsilva","html_url":"https://github.com/twdsilva","followers_url":"https://api.github.com/users/twdsilva/followers","following_url":"https://api.github.com/users/twdsilva/following{/other_user}","gists_url":"https://api.github.com/users/twdsilva/gists{/gist_id}","starred_url":"https://api.github.com/users/twdsilva/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/twdsilva/subscriptions","organizations_url":"https://api.github.com/users/twdsilva/orgs","repos_url":"https://api.github.com/users/twdsilva/repos","events_url":"https://api.github.com/users/twdsilva/events{/privacy}","received_events_url":"https://api.github.com/users/twdsilva/received_events","type":"User","site_admin":false},"repo":{"id":28112898,"node_id":"MDEwOlJlcG9zaXRvcnkyODExMjg5OA==","name":"phoenix","full_name":"twdsilva/phoenix","owner":{"login":"twdsilva","id":5653678,"node_id":"MDQ6VXNlcjU2NTM2Nzg=","avatar_url":"https://avatars1.githubusercontent.com/u/5653678?v=4","gravatar_id":"","url":"https://api.github.com/users/twdsilva","html_url":"https://github.com/twdsilva","followers_url":"https://api.github.com/users/twdsilva/followers","following_url":"https://api.github.com/users/twdsilva/following{/other_user}","gists_url":"https://api.github.com/users/twdsilva/gists{/gist_id}","starred_url":"https://api.github.com/users/twdsilva/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/twdsilva/subscriptions","organizations_url":"https://api.github.com/users/twdsilva/orgs","repos_url":"https://api.github.com/users/twdsilva/repos","events_url":"https://api.github.com/users/twdsilva/events{/privacy}","received_events_url":"https://api.github.com/users/twdsilva/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/twdsilva/phoenix","description":"Mirror of Apache Phoenix","fork":true,"url":"https://api.github.com/repos/twdsilva/phoenix","forks_url":"https://api.github.com/repos/twdsilva/phoenix/forks","keys_url":"https://api.github.com/repos/twdsilva/phoenix/keys{/key_id}","collaborators_url":"https://api.github.com/repos/twdsilva/phoenix/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/twdsilva/phoenix/teams","hooks_url":"https://api.github.com/repos/twdsilva/phoenix/hooks","issue_events_url":"https://api.github.com/repos/twdsilva/phoenix/issues/events{/number}","events_url":"https://api.github.com/repos/twdsilva/phoenix/events","assignees_url":"https://api.github.com/repos/twdsilva/phoenix/assignees{/user}","branches_url":"https://api.github.com/repos/twdsilva/phoenix/branches{/branch}","tags_url":"https://api.github.com/repos/twdsilva/phoenix/tags","blobs_url":"https://api.github.com/repos/twdsilva/phoenix/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/twdsilva/phoenix/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/twdsilva/phoenix/git/refs{/sha}","trees_url":"https://api.github.com/repos/twdsilva/phoenix/git/trees{/sha}","statuses_url":"https://api.github.com/repos/twdsilva/phoenix/statuses/{sha}","languages_url":"https://api.github.com/repos/twdsilva/phoenix/languages","stargazers_url":"https://api.github.com/repos/twdsilva/phoenix/stargazers","contributors_url":"https://api.github.com/repos/twdsilva/phoenix/contributors","subscribers_url":"https://api.github.com/repos/twdsilva/phoenix/subscribers","subscription_url":"https://api.github.com/repos/twdsilva/phoenix/subscription","commits_url":"https://api.github.com/repos/twdsilva/phoenix/commits{/sha}","git_commits_url":"https://api.github.com/repos/twdsilva/phoenix/git/commits{/sha}","comments_url":"https://api.github.com/repos/twdsilva/phoenix/comments{/number}","issue_comment_url":"https://api.github.com/repos/twdsilva/phoenix/issues/comments{/number}","contents_url":"https://api.github.com/repos/twdsilva/phoenix/contents/{+path}","compare_url":"https://api.github.com/repos/twdsilva/phoenix/compare/{base}...{head}","merges_url":"https://api.github.com/repos/twdsilva/phoenix/merges","archive_url":"https://api.github.com/repos/twdsilva/phoenix/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/twdsilva/phoenix/downloads","issues_url":"https://api.github.com/repos/twdsilva/phoenix/issues{/number}","pulls_url":"https://api.github.com/repos/twdsilva/phoenix/pulls{/number}","milestones_url":"https://api.github.com/repos/twdsilva/phoenix/milestones{/number}","notifications_url":"https://api.github.com/repos/twdsilva/phoenix/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/twdsilva/phoenix/labels{/name}","releases_url":"https://api.github.com/repos/twdsilva/phoenix/releases{/id}","deployments_url":"https://api.github.com/repos/twdsilva/phoenix/deployments","created_at":"2014-12-17T00:09:33Z","updated_at":"2018-05-29T18:17:21Z","pushed_at":"2018-05-30T18:52:44Z","git_url":"git://github.com/twdsilva/phoenix.git","ssh_url":"git@github.com:twdsilva/phoenix.git","clone_url":"https://github.com/twdsilva/phoenix.git","svn_url":"https://github.com/twdsilva/phoenix","homepage":null,"size":39139,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"apache:master","ref":"master","sha":"b19fde2c5f2b4df957b9d880a1a7a7036f45453a","user":{"login":"apache","id":47359,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQ3MzU5","avatar_url":"https://avatars0.githubusercontent.com/u/47359?v=4","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"repo":{"id":20473418,"node_id":"MDEwOlJlcG9zaXRvcnkyMDQ3MzQxOA==","name":"phoenix","full_name":"apache/phoenix","owner":{"login":"apache","id":47359,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQ3MzU5","avatar_url":"https://avatars0.githubusercontent.com/u/47359?v=4","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/apache/phoenix","description":"Mirror of Apache Phoenix","fork":false,"url":"https://api.github.com/repos/apache/phoenix","forks_url":"https://api.github.com/repos/apache/phoenix/forks","keys_url":"https://api.github.com/repos/apache/phoenix/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache/phoenix/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache/phoenix/teams","hooks_url":"https://api.github.com/repos/apache/phoenix/hooks","issue_events_url":"https://api.github.com/repos/apache/phoenix/issues/events{/number}","events_url":"https://api.github.com/repos/apache/phoenix/events","assignees_url":"https://api.github.com/repos/apache/phoenix/assignees{/user}","branches_url":"https://api.github.com/repos/apache/phoenix/branches{/branch}","tags_url":"https://api.github.com/repos/apache/phoenix/tags","blobs_url":"https://api.github.com/repos/apache/phoenix/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache/phoenix/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache/phoenix/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache/phoenix/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache/phoenix/statuses/{sha}","languages_url":"https://api.github.com/repos/apache/phoenix/languages","stargazers_url":"https://api.github.com/repos/apache/phoenix/stargazers","contributors_url":"https://api.github.com/repos/apache/phoenix/contributors","subscribers_url":"https://api.github.com/repos/apache/phoenix/subscribers","subscription_url":"https://api.github.com/repos/apache/phoenix/subscription","commits_url":"https://api.github.com/repos/apache/phoenix/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache/phoenix/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache/phoenix/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache/phoenix/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache/phoenix/contents/{+path}","compare_url":"https://api.github.com/repos/apache/phoenix/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache/phoenix/merges","archive_url":"https://api.github.com/repos/apache/phoenix/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache/phoenix/downloads","issues_url":"https://api.github.com/repos/apache/phoenix/issues{/number}","pulls_url":"https://api.github.com/repos/apache/phoenix/pulls{/number}","milestones_url":"https://api.github.com/repos/apache/phoenix/milestones{/number}","notifications_url":"https://api.github.com/repos/apache/phoenix/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache/phoenix/labels{/name}","releases_url":"https://api.github.com/repos/apache/phoenix/releases{/id}","deployments_url":"https://api.github.com/repos/apache/phoenix/deployments","created_at":"2014-06-04T07:00:08Z","updated_at":"2018-05-27T04:31:12Z","pushed_at":"2018-05-30T19:47:33Z","git_url":"git://github.com/apache/phoenix.git","ssh_url":"git@github.com:apache/phoenix.git","clone_url":"https://github.com/apache/phoenix.git","svn_url":"https://github.com/apache/phoenix","homepage":null,"size":45072,"stargazers_count":467,"watchers_count":467,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":586,"mirror_url":null,"archived":false,"open_issues_count":157,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":586,"open_issues":157,"watchers":467,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/phoenix/pulls/303"},"html":{"href":"https://github.com/apache/phoenix/pull/303"},"issue":{"href":"https://api.github.com/repos/apache/phoenix/issues/303"},"comments":{"href":"https://api.github.com/repos/apache/phoenix/issues/303/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/phoenix/pulls/303/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/phoenix/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/phoenix/pulls/303/commits"},"statuses":{"href":"https://api.github.com/repos/apache/phoenix/statuses/5b6b357f0da6b006a5209c23af9adb720094e340"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"JamesRTaylor"}}