jpisaac commented on a change in pull request #580: [DO NOT MERGE] Initial
commit for IT tests on EmptyColumn
URL: https://github.com/apache/phoenix/pull/580#discussion_r332787809
##########
File path:
phoenix-core/src/it/java/org/apache/phoenix/end2end/EmptyColumnIT.java
##########
@@ -63,851 +62,1006 @@
import org.slf4j.LoggerFactory;
/**
- *
* Each column in HBase can have a different timestamp depending on when it
gets updated.
* The timestamp of the EMPTY_COLUMN can serve as the timestamp of the row (a
row in PHOENIX)
* and can be used to determine TTL expiration of a row in PHOENIX.
- *
- * These tests are to validate our expectations of the EMPTY_COLUMN behavior.
- * Checks :-
- * 1. Behavior for various tables, views (global and tenant), indexes (global
and local)
- * 2. Behavior under different CF's combinations.
- * 3. Behavior under different COLUMN ENCODINGS
+ * These tests are to validate our expectations of the EMPTY_COLUMN behavior.
+ * Checks :-
+ * 1. Behavior for various tables, views (global and tenant), indexes (global
and local)
+ * 2. Behavior under different CF's combinations.
+ * 3. Behavior under different COLUMN ENCODINGS
*/
public class EmptyColumnIT extends ParallelStatsDisabledIT {
- private static final Logger logger =
LoggerFactory.getLogger(EmptyColumnIT.class);
- private static int DEFAULT_NUM_ROWS = 5;
-
- private static class ExpectedTestResults {
- int numTableRowsExpected;
- int numTableIndexRowsExpected;
- int numViewIndexRowsExpected;
-
- public ExpectedTestResults(int numTableRowsExpected,
- int
numTableIndexRowsExpected,
- int
numViewIndexRowsExpected) {
- this.numTableRowsExpected = numTableRowsExpected;
- this.numTableIndexRowsExpected =
numTableIndexRowsExpected;
- this.numViewIndexRowsExpected =
numViewIndexRowsExpected;
- }
- }
+ private static final Logger LOGGER =
LoggerFactory.getLogger(EmptyColumnIT.class);
+ private static int DEFAULT_NUM_ROWS = 5;
// Scans the HBase rows directly for the empty column and asserts
- private void assertAllHBaseRowsHaveEmptyColumnCell(byte[]
hbaseTableName, byte[] emptyColumnFamilyName, byte[] emptyColumnName, long
minTimestamp, int expectedRows) throws IOException, SQLException {
-
- try (Table tbl = driver.getConnectionQueryServices(getUrl(),
TestUtil.TEST_PROPERTIES)
-
.getTable(hbaseTableName)) {
-
- Scan allRows = new Scan();
- allRows.setMaxVersions(1);
- allRows.setTimeRange(minTimestamp, minTimestamp +
Integer.MAX_VALUE);
- ResultScanner scanner = tbl.getScanner(allRows);
- int numMatchingRows = 0;
- for (Result result = scanner.next(); result != null;
result = scanner.next()) {
- numMatchingRows +=
result.containsColumn(emptyColumnFamilyName, emptyColumnName) ? 1 : 0;
- }
-
- assertEquals(String.format(
- "Expected rows do match for table = %s
at timestamp %d",
- Bytes.toString(hbaseTableName),
- minTimestamp), expectedRows,
numMatchingRows);
- }
-
- }
-
- /**
- * -----------------
- * Test methods
- * -----------------
- */
-
-
-
- @Ignore("fails with java.lang.ArrayIndexOutOfBoundsException: -1 ,
fails for both Table and GlobalView indexes")
- // https://issues.apache.org/jira/browse/PHOENIX-5317
- // https://issues.apache.org/jira/browse/PHOENIX-5322
- public void testWithBasicTenantViewAndTableIndex() throws Exception {
-
- // Define the test schema.
- OtherOptions otherOptions = new OtherOptions();
- otherOptions.setTableCFs(Lists.newArrayList(null, "A", "B"));
-
- TableOptions tableOptions = TableOptions.withDefaults();
- tableOptions.getTablePKColumns().add("ID");
- tableOptions.getTablePKColumnTypes().add("CHAR(15)");
-
- GlobalViewOptions globalViewOptions = new GlobalViewOptions();
- globalViewOptions.setGlobalViewColumns(GLOBAL_VIEW_COLUMNS);
- globalViewOptions.setGlobalViewColumnTypes(COLUMN_TYPES);
- otherOptions.setGlobalViewCFs(Lists.newArrayList(null, "A",
"B"));
-
- final SchemaBuilder schemaBuilder = new SchemaBuilder(getUrl());
- schemaBuilder
- .withTableOptions(tableOptions)
- .withGlobalViewOptions(globalViewOptions)
- .withSimpleTenantView()
- .withOtherOptions(otherOptions)
- .build();
-
- schemaBuilder
- .withTableIndexDefaults()
- .build();
-
- // Define the test data.
- DataSupplier dataSupplier = new DataSupplier() {
- @Override
- public List<Object> getValues(int rowIndex) {
- Random rnd = new Random();
- String id = String.format("00A0y000%07d",
rowIndex);
- String col1 = String.format("a%05d", rowIndex +
rnd.nextInt(MAX_ROWS));
- String col2 = String.format("b%05d", rowIndex +
rnd.nextInt(MAX_ROWS));
- String col3 = String.format("c%05d", rowIndex +
rnd.nextInt(MAX_ROWS));
- String col4 = String.format("d%05d", rowIndex +
rnd.nextInt(MAX_ROWS));
- String col5 = String.format("e%05d", rowIndex +
rnd.nextInt(MAX_ROWS));
- String col6 = String.format("f%05d", rowIndex +
rnd.nextInt(MAX_ROWS));
- return Lists.newArrayList(new Object[] {id,
col1, col2, col3, col4, col5, col6});
- }
- };
-
- // Create a test data writer for the above schema.
- DataWriter dataWriter = new BasicDataWriter();
- String tenantConnectUrl = getUrl() + ';' + TENANT_ID_ATTRIB +
'=' + schemaBuilder.getDataOptions().getTenantId();
- try (Connection connection =
DriverManager.getConnection(tenantConnectUrl)) {
- connection.setAutoCommit(true);
- dataWriter.setConnection(connection);
- dataWriter.setDataSupplier(dataSupplier);
- dataWriter.setUpsertColumns(Lists.newArrayList("ID",
"COL1", "COL2", "COL3", "COL4", "COL5", "COL6"));
-
dataWriter.setTargetEntity(schemaBuilder.getEntityTenantViewName());
-
- // Write the data and run validations
- ExpectedTestResults expectedTestResults = new
ExpectedTestResults(DEFAULT_NUM_ROWS, DEFAULT_NUM_ROWS, 0);
- upsertDataAndRunValidations(DEFAULT_NUM_ROWS,
expectedTestResults, dataWriter, schemaBuilder, null);
- }
- }
-
- @Ignore //(" Fails with java.lang.ArrayIndexOutOfBoundsException: 127")
- // https://issues.apache.org/jira/browse/PHOENIX-5317
- // https://issues.apache.org/jira/browse/PHOENIX-5322
- public void testWhenCustomTenantViewWithPKAndGlobalIndex() throws
Exception {
-
- final SchemaBuilder schemaBuilder = new SchemaBuilder(getUrl());
- schemaBuilder
- .withTableDefaults()
- .withGlobalViewDefaults()
- .withGlobalViewIndexDefaults()
- .withTenantViewDefaults()
- .build();
-
-
- // Define the test data.
- DataSupplier dataSupplier = new DataSupplier() {
-
- @Override
- public List<Object> getValues(int rowIndex) {
- String id = String.format("00A0y000%07d",
rowIndex);
- String zid = String.format("0050z000%07d",
rowIndex);
-
- return Lists.newArrayList(new Object[] {id,
zid, "a", "b", "c", "d", "e", "f", "g", "h", "i"});
- }
- };
-
- // Create a test data writer for the above schema.
- DataWriter dataWriter = new BasicDataWriter();
- String tenantConnectUrl = getUrl() + ';' + TENANT_ID_ATTRIB +
'=' + schemaBuilder.getDataOptions().getTenantId();
- try (Connection connection =
DriverManager.getConnection(tenantConnectUrl)) {
- connection.setAutoCommit(true);
- dataWriter.setConnection(connection);
- dataWriter.setDataSupplier(dataSupplier);
- dataWriter.setUpsertColumns(Lists.newArrayList("ID",
"ZID", "COL1", "COL2", "COL3", "COL4", "COL5", "COL6", "COL7", "COL8", "COL9"));
-
dataWriter.setTargetEntity(schemaBuilder.getEntityTenantViewName());
-
- // Write the data and run validations
- ExpectedTestResults expectedTestResults = new
ExpectedTestResults(DEFAULT_NUM_ROWS, 0, 0);
- upsertDataAndRunValidations(DEFAULT_NUM_ROWS,
expectedTestResults, dataWriter, schemaBuilder, null);
- }
- }
-
- @Test
- public void testWithBasicTableAndNoAdditionalCols() throws Exception {
-
- // Define the test schema.
- TableOptions tableOptions = TableOptions.withDefaults();
- tableOptions.getTablePKColumns().add("ID");
- tableOptions.getTablePKColumnTypes().add("CHAR(15)");
- tableOptions.getTableColumns().clear();
- tableOptions.getTableColumnTypes().clear();
-
- final SchemaBuilder schemaBuilder = new SchemaBuilder(getUrl());
- schemaBuilder
- .withTableOptions(tableOptions)
- .build();
-
- // Define the test data.
- DataSupplier dataSupplier = new DataSupplier() {
-
- final String orgId = String.format("00D0x000%s",
schemaBuilder.getDataOptions().getUniqueName());
- final String kp =
SchemaUtil.normalizeIdentifier(schemaBuilder.getEntityKeyPrefix());
-
- @Override
- public List<Object> getValues(int rowIndex) {
- String id = String.format("00A0y000%07d",
rowIndex);
- return Lists.newArrayList(new Object[] {orgId,
kp, id});
- }
- };
-
- // Create a test data writer for the above schema.
- DataWriter dataWriter = new BasicDataWriter();
- try (Connection connection =
DriverManager.getConnection(getUrl())) {
- connection.setAutoCommit(true);
- dataWriter.setConnection(connection);
- dataWriter.setDataSupplier(dataSupplier);
- dataWriter.setUpsertColumns(Lists.newArrayList("OID",
"KP", "ID"));
-
dataWriter.setTargetEntity(schemaBuilder.getEntityTableName());
-
- // Write the data and run validations
- ExpectedTestResults expectedTestResults = new
ExpectedTestResults(DEFAULT_NUM_ROWS, 0, 0);
- upsertDataAndRunValidations(DEFAULT_NUM_ROWS,
expectedTestResults, dataWriter, schemaBuilder, null);
- }
- }
-
- @Test
- public void testWithGlobalViewAndNoAdditionalCols() throws Exception {
-
- // Define the test schema.
- TableOptions tableOptions = TableOptions.withDefaults();
- tableOptions.getTableColumns().clear();
- tableOptions.getTableColumnTypes().clear();
-
- GlobalViewOptions globalViewOptions =
GlobalViewOptions.withDefaults();
- globalViewOptions.getGlobalViewColumns().clear();
- globalViewOptions.getGlobalViewColumnTypes().clear();
-
- final SchemaBuilder schemaBuilder = new SchemaBuilder(getUrl());
- schemaBuilder
- .withTableOptions(tableOptions)
- .withGlobalViewOptions(globalViewOptions)
- .build();
-
- // Define the test data.
- DataSupplier dataSupplier = new DataSupplier() {
-
- final String orgId = String.format("00D0x000%s",
schemaBuilder.getDataOptions().getUniqueName());
- final String kp =
SchemaUtil.normalizeIdentifier(schemaBuilder.getEntityKeyPrefix());
-
- @Override
- public List<Object> getValues(int rowIndex) {
- String id = String.format("00A0y000%07d",
rowIndex);
- return Lists.newArrayList(new Object[] {orgId,
kp, id});
- }
- };
-
- // Create a test data writer for the above schema.
- DataWriter dataWriter = new BasicDataWriter();
- try (Connection connection =
DriverManager.getConnection(getUrl())) {
- connection.setAutoCommit(true);
- dataWriter.setConnection(connection);
- dataWriter.setDataSupplier(dataSupplier);
- dataWriter.setUpsertColumns(Lists.newArrayList("OID",
"KP", "ID"));
-
dataWriter.setTargetEntity(schemaBuilder.getEntityGlobalViewName());
-
- // Write the data and run validations
- ExpectedTestResults expectedTestResults = new
ExpectedTestResults(DEFAULT_NUM_ROWS, 0, 0);
- upsertDataAndRunValidations(DEFAULT_NUM_ROWS,
expectedTestResults, dataWriter, schemaBuilder, null);
- }
- }
-
-
- @Test
- public void testWithCustomTenantViewAndTenantOnlyColumns() throws
Exception {
-
- TableOptions tableOptions = TableOptions.withDefaults();
- tableOptions.getTableColumns().clear();
- tableOptions.getTableColumnTypes().clear();
-
- // Define the test schema.
- final SchemaBuilder schemaBuilder = new SchemaBuilder(getUrl());
- schemaBuilder
- .withTableOptions(tableOptions)
- .withTenantViewDefaults()
- .build();
-
- // Define the test data.
- DataSupplier dataSupplier = new DataSupplier() {
-
- final String orgId = String.format("00D0x000%s",
schemaBuilder.getDataOptions().getUniqueName());
- final String kp =
SchemaUtil.normalizeIdentifier(schemaBuilder.getEntityKeyPrefix());
-
- @Override
- public List<Object> getValues(int rowIndex) {
- Random rnd = new Random();
- String zid = String.format("00A0y000%07d",
rowIndex);
- String col7 = String.format("g%05d", rowIndex +
rnd.nextInt(MAX_ROWS));
- String col8 = String.format("h%05d", rowIndex +
rnd.nextInt(MAX_ROWS));
- String col9 = String.format("i%05d", rowIndex +
rnd.nextInt(MAX_ROWS));
- return Lists.newArrayList(new Object[] {orgId,
kp, zid, col7, col8, col9});
- }
- };
-
- // Create a test data writer for the above schema.
- DataWriter dataWriter = new BasicDataWriter();
- String tenantConnectUrl = getUrl() + ';' + TENANT_ID_ATTRIB +
'=' + schemaBuilder.getDataOptions().getTenantId();
- try (Connection connection =
DriverManager.getConnection(tenantConnectUrl)) {
- connection.setAutoCommit(true);
- dataWriter.setConnection(connection);
- dataWriter.setDataSupplier(dataSupplier);
- dataWriter.setUpsertColumns(Lists.newArrayList("OID",
"KP", "ZID", "COL7", "COL8", "COL9"));
-
dataWriter.setTargetEntity(schemaBuilder.getEntityTenantViewName());
-
- // dataSupplier.upsertValues column positions to be
used for partial updates.
- List<Integer> columnsForPartialUpdates =
Lists.newArrayList(0,1,2,3,5);
- // Write the data and run validations
- ExpectedTestResults expectedTestResults = new
ExpectedTestResults(DEFAULT_NUM_ROWS, 0, 0);
- upsertDataAndRunValidations(DEFAULT_NUM_ROWS,
expectedTestResults, dataWriter, schemaBuilder, columnsForPartialUpdates);
- }
- }
-
- /**
- * This test uses a simple table and NO indexes and
- * run with different combinations of table properties and column
family options.
- */
- @Test
- public void testWhenTableWithNoIndexAndVariousOptions() throws
Exception {
-
- for (String additionalProps :
Lists.newArrayList("COLUMN_ENCODED_BYTES=0", "DEFAULT_COLUMN_FAMILY='Z'")) {
-
- StringBuilder withTableProps = new StringBuilder();
-
withTableProps.append("MULTI_TENANT=true,").append(additionalProps);
-
- for (OtherOptions options :
getTableColumnFamilyOptions()) {
-
- // Define the test schema.
- TableOptions tableOptions =
TableOptions.withDefaults();
- tableOptions.getTablePKColumns().add("ID");
-
tableOptions.getTablePKColumnTypes().add("CHAR(15)");
-
tableOptions.setTableProps(withTableProps.toString());
-
- final SchemaBuilder schemaBuilder = new
SchemaBuilder(getUrl());
- schemaBuilder
- .withTableOptions(tableOptions)
- .withOtherOptions(options)
- .build();
-
- // Define the test data.
- DataSupplier dataSupplier = new DataSupplier() {
-
- final String orgId =
String.format("00D0x000%s", schemaBuilder.getDataOptions().getUniqueName());
- final String kp =
SchemaUtil.normalizeIdentifier(schemaBuilder.getEntityKeyPrefix());
-
- @Override
- public List<Object> getValues(int
rowIndex) {
- Random rnd = new Random();
- String id =
String.format("00A0y000%07d", rowIndex);
- String col1 =
String.format("a%05d", rowIndex + rnd.nextInt(MAX_ROWS));
- String col2 =
String.format("b%05d", rowIndex + rnd.nextInt(MAX_ROWS));
- String col3 =
String.format("c%05d", rowIndex + rnd.nextInt(MAX_ROWS));
- return Lists.newArrayList(new
Object[] {orgId, kp, id, col1, col2, col3});
- }
- };
-
- // Create a test data writer for the above
schema.
- DataWriter dataWriter = new BasicDataWriter();
- try (Connection connection =
DriverManager.getConnection(getUrl())) {
- connection.setAutoCommit(true);
- dataWriter.setConnection(connection);
-
dataWriter.setDataSupplier(dataSupplier);
-
dataWriter.setUpsertColumns(Lists.newArrayList("OID", "KP", "ID", "COL1",
"COL2", "COL3"));
-
dataWriter.setTargetEntity(schemaBuilder.getEntityTableName());
-
- // dataSupplier.upsertValues column
positions to be used for partial updates.
- List<Integer> columnsForPartialUpdates
= Lists.newArrayList(0,1,2,3,5);
- // Write the data and run validations
- ExpectedTestResults expectedTestResults
= new ExpectedTestResults(DEFAULT_NUM_ROWS, 0, 0);
-
upsertDataAndRunValidations(DEFAULT_NUM_ROWS, expectedTestResults, dataWriter,
schemaBuilder, columnsForPartialUpdates);
- }
- }
- }
- }
-
- /**
- * This test uses a simple table and index and
- * run with different combinations of table properties, index types
(local or global) and column family options.
- */
- @Test
- public void testWhenTableWithIndexAndVariousOptions() throws Exception {
-
- // Run for different combinations of table properties, index
types (local or global) and column family options.
- for (String additionalProps :
Lists.newArrayList("COLUMN_ENCODED_BYTES=0", "DEFAULT_COLUMN_FAMILY='Z'")) {
-
- StringBuilder withTableProps = new StringBuilder();
-
withTableProps.append("MULTI_TENANT=true,").append(additionalProps);
-
- for (boolean isTableIndexLocal :
Lists.newArrayList(true, false)) {
- for (OtherOptions options :
getTableColumnFamilyOptions()) {
-
- // Define the test table schema.
- TableOptions tableOptions =
TableOptions.withDefaults();
-
tableOptions.getTablePKColumns().add("ID");
-
tableOptions.getTablePKColumnTypes().add("CHAR(15)");
-
tableOptions.setTableProps(withTableProps.toString());
-
- // Define the index on the test table.
- TableIndexOptions tableIndexOptions =
TableIndexOptions.withDefaults();
-
tableIndexOptions.setLocal(isTableIndexLocal);
-
- // Build the schema with the above
options
- final SchemaBuilder schemaBuilder = new
SchemaBuilder(getUrl());
- schemaBuilder
-
.withTableOptions(tableOptions)
-
.withTableIndexOptions(tableIndexOptions)
-
.withOtherOptions(options)
- .build();
-
- // Define the test data provider.
- DataSupplier dataSupplier = new
DataSupplier() {
-
- final String orgId =
String.format("00D0x000%s", schemaBuilder.getDataOptions().getUniqueName());
- final String kp =
SchemaUtil.normalizeIdentifier(schemaBuilder.getEntityKeyPrefix());
-
- @Override
- public List<Object>
getValues(int rowIndex) {
- Random rnd = new
Random();
- String id =
String.format("00A0y000%07d", rowIndex);
- String col1 =
String.format("a%05d", rowIndex + rnd.nextInt(MAX_ROWS));
- String col2 =
String.format("b%05d", rowIndex + rnd.nextInt(MAX_ROWS));
- String col3 =
String.format("c%05d", rowIndex + rnd.nextInt(MAX_ROWS));
- return
Lists.newArrayList(new Object[] {orgId, kp, id, col1, col2, col3});
- }
- };
-
- // Create a test data writer for the
above schema.
- DataWriter dataWriter = new
BasicDataWriter();
- try (Connection connection =
DriverManager.getConnection(getUrl())) {
- connection.setAutoCommit(true);
-
dataWriter.setConnection(connection);
-
dataWriter.setDataSupplier(dataSupplier);
-
dataWriter.setUpsertColumns(Lists.newArrayList("OID", "KP", "ID", "COL1",
"COL2", "COL3"));
-
dataWriter.setTargetEntity(schemaBuilder.getEntityTableName());
-
- // dataSupplier.upsertValues
column positions to be used for partial updates.
- List<Integer>
columnsForPartialUpdates = Lists.newArrayList(0,1,2,3,5);
- // COL3 is the include column
for the table index in this schema => index pos of 2
- // and there are no global and
view indexes.
- List<Integer>
includeColumnPositionOfIndexes = Lists.newArrayList(2,null,null);
-
- /**
- * When table indexes are local
i.e index rows are co-located.
- * AND
- * When there are more than one
index and the CFs of the include columns match.
- * Then the # of index rows in
the table (when local) and in the index table (when global)
- * is => # of rows * # of
indexes
- *
- * But in this schema there is
only one index =>
- * # of index rows = # of
upserted rows.
- */
-
- // Write the data and run
validations
- ExpectedTestResults
expectedTestResults = new ExpectedTestResults(DEFAULT_NUM_ROWS,
DEFAULT_NUM_ROWS, 0);
-
upsertDataAndRunValidations(DEFAULT_NUM_ROWS, expectedTestResults, dataWriter,
schemaBuilder, columnsForPartialUpdates, includeColumnPositionOfIndexes);
- }
- }
- }
- }
- }
-
- /**
- * This test uses a tenant view hierarchy => table -> globalView ->
tenantView
- * Run with different combinations of table properties, index types
(local or global) and column family options.*
- */
- @Test
- public void testWhenCustomTenantViewWithNoIndexAndVariousOptions()
throws Exception {
- for (String additionalProps :
Lists.newArrayList("COLUMN_ENCODED_BYTES=0", "DEFAULT_COLUMN_FAMILY='Z'")) {
-
- StringBuilder withTableProps = new StringBuilder();
-
withTableProps.append("MULTI_TENANT=true,").append(additionalProps);
-
- for (OtherOptions options :
getTableAndGlobalAndTenantColumnFamilyOptions()) {
-
- // Define the test schema
- TableOptions tableOptions =
TableOptions.withDefaults();
-
tableOptions.setTableProps(withTableProps.toString());
-
- TenantViewOptions tenantViewOptions = new
TenantViewOptions();
-
tenantViewOptions.setTenantViewColumns(Lists.newArrayList(TENANT_VIEW_COLUMNS));
-
tenantViewOptions.setTenantViewColumnTypes(Lists.newArrayList(COLUMN_TYPES));
-
-
- final SchemaBuilder schemaBuilder = new
SchemaBuilder(getUrl());
- schemaBuilder
- .withTableOptions(tableOptions)
- .withGlobalViewDefaults()
-
.withTenantViewOptions(tenantViewOptions)
- .withOtherOptions(options)
- .build();
-
-
- // Define the test data.
- DataSupplier dataSupplier = new DataSupplier() {
- @Override
- public List<Object> getValues(int
rowIndex) {
- Random rnd = new Random();
- String id =
String.format("00A0y000%07d", rowIndex);
- String col1 =
String.format("a%05d", rowIndex + rnd.nextInt(MAX_ROWS));
- String col2 =
String.format("b%05d", rowIndex + rnd.nextInt(MAX_ROWS));
- String col3 =
String.format("c%05d", rowIndex + rnd.nextInt(MAX_ROWS));
- String col4 =
String.format("d%05d", rowIndex + rnd.nextInt(MAX_ROWS));
- String col5 =
String.format("e%05d", rowIndex + rnd.nextInt(MAX_ROWS));
- String col6 =
String.format("f%05d", rowIndex + rnd.nextInt(MAX_ROWS));
- String col7 =
String.format("g%05d", rowIndex + rnd.nextInt(MAX_ROWS));
- String col8 =
String.format("h%05d", rowIndex + rnd.nextInt(MAX_ROWS));
- String col9 =
String.format("i%05d", rowIndex + rnd.nextInt(MAX_ROWS));
-
- return Lists.newArrayList(new
Object[] {id, col1, col2, col3, col4, col5, col6, col7, col8, col9});
- }
- };
-
- // Create a test data writer for the above
schema.
- DataWriter dataWriter = new BasicDataWriter();
- String tenantConnectUrl = getUrl() + ';' +
TENANT_ID_ATTRIB + '=' + schemaBuilder.getDataOptions().getTenantId();
- try (Connection connection =
DriverManager.getConnection(tenantConnectUrl)) {
- connection.setAutoCommit(true);
- dataWriter.setConnection(connection);
-
dataWriter.setDataSupplier(dataSupplier);
-
dataWriter.setUpsertColumns(Lists.newArrayList("ID", "COL1", "COL2", "COL3",
"COL4", "COL5", "COL6", "COL7", "COL8", "COL9"));
-
dataWriter.setTargetEntity(schemaBuilder.getEntityTenantViewName());
-
- // dataSupplier.upsertValues column
positions to be used for partial updates.
- List<Integer> columnsForPartialUpdates
= Lists.newArrayList(0,7,9);
- // Write the data and run validations
- ExpectedTestResults expectedTestResults
= new ExpectedTestResults(DEFAULT_NUM_ROWS, 0, 0);
-
upsertDataAndRunValidations(DEFAULT_NUM_ROWS, expectedTestResults, dataWriter,
schemaBuilder, columnsForPartialUpdates);
- }
- }
- }
- }
-
- @Ignore ("Fails with - Expected rows do match for table = xxxx at
timestamp xxx expected:<5> but was:<10>")
- // https://issues.apache.org/jira/browse/PHOENIX-5476
- public void testWhenCustomTenantViewWithIndexAndVariousOptions() throws
Exception {
- for (String additionalProps :
Lists.newArrayList("COLUMN_ENCODED_BYTES=0", "DEFAULT_COLUMN_FAMILY='Z'")) {
-
- StringBuilder withTableProps = new StringBuilder();
-
withTableProps.append("MULTI_TENANT=true,").append(additionalProps);
-
- for (boolean isGlobalViewLocal :
Lists.newArrayList(true, false)) {
- for (boolean isTenantViewLocal :
Lists.newArrayList(true, false)) {
- for (OtherOptions options :
getTableAndGlobalAndTenantColumnFamilyOptions()) {
-
- // Define the test schema
- TableOptions tableOptions =
TableOptions.withDefaults();
-
tableOptions.setTableProps(withTableProps.toString());
-
- GlobalViewIndexOptions
globalViewIndexOptions = GlobalViewIndexOptions.withDefaults();
-
globalViewIndexOptions.setLocal(isGlobalViewLocal);
-
- TenantViewOptions
tenantViewOptions = new TenantViewOptions();
-
tenantViewOptions.setTenantViewColumns(Lists.newArrayList(TENANT_VIEW_COLUMNS));
-
tenantViewOptions.setTenantViewColumnTypes(Lists.newArrayList(COLUMN_TYPES));
-
- TenantViewIndexOptions
tenantViewIndexOptions = TenantViewIndexOptions.withDefaults();
-
tenantViewIndexOptions.setLocal(isTenantViewLocal);
-
- final SchemaBuilder
schemaBuilder = new SchemaBuilder(getUrl());
- schemaBuilder
-
.withTableOptions(tableOptions)
-
.withGlobalViewDefaults()
-
.withGlobalViewIndexOptions(globalViewIndexOptions)
-
.withTenantViewOptions(tenantViewOptions)
-
.withTenantViewIndexOptions(tenantViewIndexOptions)
-
.withOtherOptions(options)
- .build();
-
-
- // Define the test data.
- DataSupplier dataSupplier = new
DataSupplier() {
-
- @Override
- public List<Object>
getValues(int rowIndex) {
- Random rnd =
new Random();
- String id =
String.format("00A0y000%07d", rowIndex);
- String col1 =
String.format("a%05d", rowIndex + rnd.nextInt(MAX_ROWS));
- String col2 =
String.format("b%05d", rowIndex + rnd.nextInt(MAX_ROWS));
- String col3 =
String.format("c%05d", rowIndex + rnd.nextInt(MAX_ROWS));
- String col4 =
String.format("d%05d", rowIndex + rnd.nextInt(MAX_ROWS));
- String col5 =
String.format("e%05d", rowIndex + rnd.nextInt(MAX_ROWS));
- String col6 =
String.format("f%05d", rowIndex + rnd.nextInt(MAX_ROWS));
- String col7 =
String.format("g%05d", rowIndex + rnd.nextInt(MAX_ROWS));
- String col8 =
String.format("h%05d", rowIndex + rnd.nextInt(MAX_ROWS));
- String col9 =
String.format("i%05d", rowIndex + rnd.nextInt(MAX_ROWS));
-
- return
Lists.newArrayList(new Object[] {id, col1, col2, col3, col4, col5, col6, col7,
col8, col9});
- }
- };
-
- // Create a test data writer
for the above schema.
- DataWriter dataWriter = new
BasicDataWriter();
- String tenantConnectUrl =
getUrl() + ';' + TENANT_ID_ATTRIB + '=' +
schemaBuilder.getDataOptions().getTenantId();
- try (Connection connection =
DriverManager.getConnection(tenantConnectUrl)) {
-
connection.setAutoCommit(true);
-
dataWriter.setConnection(connection);
-
dataWriter.setDataSupplier(dataSupplier);
-
dataWriter.setUpsertColumns(Lists.newArrayList("ID", "COL1", "COL2", "COL3",
"COL4", "COL5", "COL6", "COL7", "COL8", "COL9"));
-
dataWriter.setTargetEntity(schemaBuilder.getEntityTenantViewName());
-
- // upsertValues column
positions to be used for partial updates.
- List<Integer>
columnsForPartialUpdates = Lists.newArrayList(0,7,9);
- // No index for table.
- // COL6 is the include
column for the global view index => index pos of 2
- // COL7 is the include
column for the tenant view index => index pos of 0
- List<Integer>
includeColumnPositionOfIndexes = Lists.newArrayList(null,2,0);
- // Write the data and
run validations
- try {
-
logger.debug(String.format("### BEGIN %s",
schemaBuilder.getOtherOptions().getTestName())) ;
- /**
- * WHEN global
and tenant view indexes are either both local or both global i.e index rows are
co-located.
- * AND
- * WHEN the CFs
of the include columns match.
- * THEN the #
of index rows in the table (when local) and in the index table (when global)
- * # of index
rows => # of upserted rows * # of indexes
- * ELSE
- * # of index
rows => # of upserted rows
- */
-
ExpectedTestResults expectedTestResults = new
ExpectedTestResults(DEFAULT_NUM_ROWS, 0, DEFAULT_NUM_ROWS);
- boolean
colocated = !(isGlobalViewLocal ^ isTenantViewLocal);
- boolean
cfsAreNull = (options.getGlobalViewCFs().get(2) == null &&
options.getGlobalViewCFs().get(2) == options.getTenantViewCFs().get(0));
- boolean
cfsAreNotNullButEqual = !(cfsAreNull) &&
(options.getGlobalViewCFs().get(2).equalsIgnoreCase(options.getTenantViewCFs().get(0)));
- if (colocated
&& (cfsAreNull || cfsAreNotNullButEqual)) {
-
expectedTestResults = new ExpectedTestResults(DEFAULT_NUM_ROWS, 0,
DEFAULT_NUM_ROWS*2);
- }
-
upsertDataAndRunValidations(DEFAULT_NUM_ROWS, expectedTestResults, dataWriter,
schemaBuilder, columnsForPartialUpdates, includeColumnPositionOfIndexes);
-
logger.debug(String.format("### Case => [GlobalView (local) = %b, TenantView
(local) = %b] : %s", isGlobalViewLocal, isTenantViewLocal, "Passed")) ;
- }
- catch (AssertionError
ae) {
-
logger.debug(String.format("### Case => [GlobalView (local) = %b, TenantView
(local) = %b] : %s", isGlobalViewLocal, isTenantViewLocal, ae.getMessage())) ;
- }
- finally {
-
logger.debug(String.format("### END %s",
schemaBuilder.getOtherOptions().getTestName())) ;
- }
- }
- }
- }
- }
- }
- }
-
-
- private void upsertDataAndRunValidations(int numRowsToUpsert,
ExpectedTestResults expectedTestResults, DataWriter dataWriter, SchemaBuilder
schemaBuilder, List<Integer> overriddenColumnsPositions) throws IOException,
SQLException {
-
- //Insert for the first time and validate them.
-
validateEmptyColumnsAreUpdated(upsertData(dataWriter,numRowsToUpsert),
expectedTestResults, schemaBuilder, Lists.newArrayList(new Integer[] {}));
- // Update the above rows and validate the same.
- validateEmptyColumnsAreUpdated(upsertData(dataWriter,
numRowsToUpsert), expectedTestResults, schemaBuilder, Lists.newArrayList(new
Integer[] {}));
-
- if (overriddenColumnsPositions != null &&
overriddenColumnsPositions.size() > 0) {
-
dataWriter.setColumnPositionsToUpdate(overriddenColumnsPositions);
- }
- // Upsert and validate the partially updated rows.
- validateEmptyColumnsAreUpdated(upsertData(dataWriter,
numRowsToUpsert), expectedTestResults, schemaBuilder, Lists.newArrayList(new
Integer[] {}));
- }
-
- private void upsertDataAndRunValidations(int numRowsToUpsert,
ExpectedTestResults expectedTestResults, DataWriter dataWriter, SchemaBuilder
schemaBuilder, List<Integer> overriddenColumnsPositions, List<Integer>
indexedCFPositions) throws IOException, SQLException {
-
- //Insert for the first time and validate them.
- validateEmptyColumnsAreUpdated(upsertData(dataWriter,
numRowsToUpsert), expectedTestResults, schemaBuilder, indexedCFPositions);
- // Update the above rows and validate the same.
- validateEmptyColumnsAreUpdated(upsertData(dataWriter,
numRowsToUpsert), expectedTestResults, schemaBuilder, indexedCFPositions);
-
- if (overriddenColumnsPositions != null &&
overriddenColumnsPositions.size() > 0) {
-
dataWriter.setColumnPositionsToUpdate(overriddenColumnsPositions);
- }
- // Upsert and validate the partially updated rows.
- validateEmptyColumnsAreUpdated(upsertData(dataWriter,
numRowsToUpsert), expectedTestResults, schemaBuilder, indexedCFPositions);
- }
-
-
- private long upsertData(DataWriter dataWriter, int numRowsToUpsert)
throws SQLException {
- // Upsert rows
- long earliestTimestamp = System.currentTimeMillis();
- for (int i=0;i<numRowsToUpsert;i++) {
- dataWriter.upsertRow(i);
- }
- return earliestTimestamp;
- }
-
-
- private void validateEmptyColumnsAreUpdated(long earliestTimestamp,
ExpectedTestResults expectedTestResults, SchemaBuilder schemaBuilder,
List<Integer> indexedCFPositions) throws IOException, SQLException {
-
- // Base table's empty CF and column name
- PTable table = schemaBuilder.getBaseTable();
- byte[] emptyColumnFamilyName =
SchemaUtil.getEmptyColumnFamily(table);
- byte[] emptyColumnName = table.getEncodingScheme() ==
PTable.QualifierEncodingScheme.NON_ENCODED_QUALIFIERS
- ? QueryConstants.EMPTY_COLUMN_BYTES
- :
table.getEncodingScheme().encode(QueryConstants.ENCODED_EMPTY_COLUMN_NAME);
-
- byte[] hbaseBaseTableName =
SchemaUtil.getTableNameAsBytes(table.getSchemaName().getString(),
table.getTableName().getString());
- byte[] hbaseIndexTableName = Bytes.toBytes("");
- byte[] indexColumnFamilyName = Bytes.toBytes("");
-
- byte[] hbaseGlobalViewIndexTableName = Bytes.toBytes("");
- byte[] globalViewIndexCFName = Bytes.toBytes("");
-
- byte[] hbaseTenantViewIndexTableName = Bytes.toBytes("");
- byte[] tenantViewIndexCFName = Bytes.toBytes("");
-
- boolean assertOnIndexTable = false;
- boolean assertOnGlobalIndexTable = false;
- boolean assertOnTenantIndexTable = false;
-
-
- // Find the index CF name when table index exists.
- if (schemaBuilder.isTableIndexEnabled() &&
schemaBuilder.isTableIndexCreated() && indexedCFPositions.size() > 0) {
- String tableIndexName = String.format("IDX_%s",
table.getTableName().getString());
- // The table holding the index data - depends on
whether index is local or global.
- hbaseIndexTableName =
schemaBuilder.getTableIndexOptions().isLocal() ? hbaseBaseTableName :
SchemaUtil.getTableNameAsBytes(table.getSchemaName().getString(),
tableIndexName);
- String testDataColumnFamilyName =
schemaBuilder.getOtherOptions().getTableCFs().get(indexedCFPositions.get(0));
- String dataColumnFamilyName = testDataColumnFamilyName
== null ? Bytes.toString(emptyColumnFamilyName) : testDataColumnFamilyName;
- indexColumnFamilyName =
Bytes.toBytes(schemaBuilder.getTableIndexOptions().isLocal() ?
IndexUtil.getLocalIndexColumnFamily(dataColumnFamilyName) :
dataColumnFamilyName);
- logger.debug(String.format("### Table Index CF name :
%s, Table Index table name : %s", Bytes.toString(indexColumnFamilyName),
Bytes.toString(hbaseIndexTableName)));
- assertOnIndexTable = true;
- }
-
- // Find the index CF name when global view index exists.
- if (schemaBuilder.isGlobalViewIndexEnabled() &&
schemaBuilder.isGlobalViewIndexCreated() && indexedCFPositions.size() > 0) {
- String viewIndexSchemaName = String.format("_IDX_%s",
table.getSchemaName().getString());
- hbaseGlobalViewIndexTableName =
schemaBuilder.getGlobalViewIndexOptions().isLocal() ? hbaseBaseTableName :
SchemaUtil.getTableNameAsBytes(viewIndexSchemaName,
table.getTableName().getString());
-
- String testDataColumnFamilyName =
schemaBuilder.getOtherOptions().getGlobalViewCFs().get(indexedCFPositions.get(1));
- String dataColumnFamilyName = testDataColumnFamilyName
== null ? Bytes.toString(emptyColumnFamilyName) : testDataColumnFamilyName;
- globalViewIndexCFName =
Bytes.toBytes(schemaBuilder.getGlobalViewIndexOptions().isLocal() ?
IndexUtil.getLocalIndexColumnFamily(dataColumnFamilyName) :
dataColumnFamilyName);
- logger.info(String.format("### Global View Index CF
name : %s, Global View Index table name : %s",
Bytes.toString(indexColumnFamilyName),
Bytes.toString(hbaseGlobalViewIndexTableName)));
- assertOnGlobalIndexTable = true;
- }
-
-
- // Find the index CF name when tenant view index exists.
- if (schemaBuilder.isTenantViewIndexEnabled() &&
schemaBuilder.isTenantViewIndexCreated() && indexedCFPositions.size() > 0) {
- String viewIndexSchemaName = String.format("_IDX_%s",
table.getSchemaName().getString());
- hbaseTenantViewIndexTableName =
schemaBuilder.getTenantViewIndexOptions().isLocal() ? hbaseBaseTableName :
SchemaUtil.getTableNameAsBytes(viewIndexSchemaName,
table.getTableName().getString());
-
- String testDataColumnFamilyName =
schemaBuilder.getOtherOptions().getTenantViewCFs().get(indexedCFPositions.get(2));
- String dataColumnFamilyName = testDataColumnFamilyName
== null ? Bytes.toString(emptyColumnFamilyName) : testDataColumnFamilyName;
- tenantViewIndexCFName =
Bytes.toBytes(schemaBuilder.getTenantViewIndexOptions().isLocal() ?
IndexUtil.getLocalIndexColumnFamily(dataColumnFamilyName) :
dataColumnFamilyName);
- logger.info(String.format("### Tenant Index CF name :
%s, Tenant Index table name : %s", Bytes.toString(indexColumnFamilyName),
Bytes.toString(hbaseTenantViewIndexTableName)));
- assertOnTenantIndexTable = true;
- }
-
- // Assert on base table rows
- assertAllHBaseRowsHaveEmptyColumnCell(hbaseBaseTableName,
emptyColumnFamilyName, emptyColumnName, earliestTimestamp,
expectedTestResults.numTableRowsExpected);
- // Assert on index table rows
- if (assertOnIndexTable) {
-
assertAllHBaseRowsHaveEmptyColumnCell(hbaseIndexTableName,
indexColumnFamilyName, emptyColumnName, earliestTimestamp,
expectedTestResults.numTableIndexRowsExpected);
- }
- // Assert on global view index table rows
- if (assertOnGlobalIndexTable) {
-
assertAllHBaseRowsHaveEmptyColumnCell(hbaseGlobalViewIndexTableName,
globalViewIndexCFName, emptyColumnName, earliestTimestamp,
expectedTestResults.numViewIndexRowsExpected);
- }
- // Assert on tenant view index table rows
- if (assertOnTenantIndexTable) {
-
assertAllHBaseRowsHaveEmptyColumnCell(hbaseTenantViewIndexTableName,
tenantViewIndexCFName, emptyColumnName, earliestTimestamp,
expectedTestResults.numViewIndexRowsExpected);
- }
- }
-
- private List<ConnectOptions> getConnectOptions() {
- List<ConnectOptions> testCases = Lists.newArrayList();
-
- ConnectOptions defaultConnectOptions = new ConnectOptions();
- testCases.add(defaultConnectOptions);
-
- ConnectOptions globalOnlyConnectOptions = new ConnectOptions();
- globalOnlyConnectOptions.setUseGlobalConnectionOnly(true);
- testCases.add(globalOnlyConnectOptions);
-
- ConnectOptions tenantOnlyConnectOptions = new ConnectOptions();
-
tenantOnlyConnectOptions.setUseTenantConnectionForGlobalView(true);
- testCases.add(tenantOnlyConnectOptions);
-
- return testCases;
- }
-
- private List<OtherOptions> getTableColumnFamilyOptions() {
-
- List<OtherOptions> testCases = Lists.newArrayList();
-
- OtherOptions testCaseWhenAllCFMatch = new OtherOptions();
- testCaseWhenAllCFMatch.setTestName("testCaseWhenAllCFMatch");
- testCaseWhenAllCFMatch.setTableCFs(Lists.newArrayList("A", "A",
"A"));
- testCases.add(testCaseWhenAllCFMatch);
-
- OtherOptions testCaseWhenManyCFs = new OtherOptions();
- testCaseWhenManyCFs.setTestName("testCaseWhenManyCFs");
- testCaseWhenManyCFs.setTableCFs(Lists.newArrayList(null, "A",
"B"));
- testCases.add(testCaseWhenManyCFs);
-
- OtherOptions testCaseWhenAllCFsAreSpecified = new
OtherOptions();
-
testCaseWhenAllCFsAreSpecified.setTestName("testCaseWhenAllCFsAreSpecified");
-
testCaseWhenAllCFsAreSpecified.setTableCFs(Lists.newArrayList("A", "A", "B"));
- testCases.add(testCaseWhenAllCFsAreSpecified);
-
- OtherOptions testCaseWhenDefaultCFs = new OtherOptions();
- testCaseWhenDefaultCFs.setTestName("testCaseWhenDefaultCFs");
- testCaseWhenDefaultCFs.setTableCFs(Lists.newArrayList((String)
null, null, null));
- testCases.add(testCaseWhenDefaultCFs);
- return testCases;
-
- }
-
- private List<OtherOptions>
getTableAndGlobalAndTenantColumnFamilyOptions() {
-
- List<OtherOptions> testCases = Lists.newArrayList();
-
- OtherOptions testCaseWhenAllCFMatchAndAllDefault = new
OtherOptions();
-
testCaseWhenAllCFMatchAndAllDefault.setTestName("testCaseWhenAllCFMatchAndAllDefault");
-
testCaseWhenAllCFMatchAndAllDefault.setTableCFs(Lists.newArrayList((String)null,
null, null));
-
testCaseWhenAllCFMatchAndAllDefault.setGlobalViewCFs(Lists.newArrayList((String)null,
null, null));
-
testCaseWhenAllCFMatchAndAllDefault.setTenantViewCFs(Lists.newArrayList((String)
null, null, null));
- testCases.add(testCaseWhenAllCFMatchAndAllDefault);
-
- OtherOptions testCaseWhenAllCFMatchAndSame = new OtherOptions();
-
testCaseWhenAllCFMatchAndSame.setTestName("testCaseWhenAllCFMatchAndSame");
-
testCaseWhenAllCFMatchAndSame.setTableCFs(Lists.newArrayList("A", "A", "A"));
-
testCaseWhenAllCFMatchAndSame.setGlobalViewCFs(Lists.newArrayList("A", "A",
"A"));
-
testCaseWhenAllCFMatchAndSame.setTenantViewCFs(Lists.newArrayList("A", "A",
"A"));
- testCases.add(testCaseWhenAllCFMatchAndSame);
-
- OtherOptions testCaseWhenAllCFMatch = new OtherOptions();
- testCaseWhenAllCFMatch.setTestName("testCaseWhenAllCFMatch");
- testCaseWhenAllCFMatch.setTableCFs(Lists.newArrayList(null,
"A", "B"));
-
testCaseWhenAllCFMatch.setGlobalViewCFs(Lists.newArrayList(null, "A", "B"));
-
testCaseWhenAllCFMatch.setTenantViewCFs(Lists.newArrayList(null, "A", "B"));
- testCases.add(testCaseWhenAllCFMatch);
-
- OtherOptions testCaseWhenTableCFsAreDiff = new OtherOptions();
-
testCaseWhenTableCFsAreDiff.setTestName("testCaseWhenTableCFsAreDiff");
-
testCaseWhenTableCFsAreDiff.setTableCFs(Lists.newArrayList(null, "A", "B"));
-
testCaseWhenTableCFsAreDiff.setGlobalViewCFs(Lists.newArrayList("A", "A", "B"));
-
testCaseWhenTableCFsAreDiff.setTenantViewCFs(Lists.newArrayList("A", "A", "B"));
- testCases.add(testCaseWhenTableCFsAreDiff);
-
- OtherOptions testCaseWhenGlobalAndTenantCFsAreDiff = new
OtherOptions();
-
testCaseWhenGlobalAndTenantCFsAreDiff.setTestName("testCaseWhenGlobalAndTenantCFsAreDiff");
-
testCaseWhenGlobalAndTenantCFsAreDiff.setTableCFs(Lists.newArrayList(null, "A",
"B"));
-
testCaseWhenGlobalAndTenantCFsAreDiff.setGlobalViewCFs(Lists.newArrayList("A",
"A", "A"));
-
testCaseWhenGlobalAndTenantCFsAreDiff.setTenantViewCFs(Lists.newArrayList("B",
"B", "B"));
- testCases.add(testCaseWhenGlobalAndTenantCFsAreDiff);
-
- OtherOptions testCaseWhenNoDefaultCF = new OtherOptions();
- testCaseWhenNoDefaultCF.setTestName("testCaseWhenNoDefaultCF");
- testCaseWhenNoDefaultCF.setTableCFs(Lists.newArrayList("A",
"A", "B"));
-
testCaseWhenNoDefaultCF.setGlobalViewCFs(Lists.newArrayList("A", "A", "B"));
-
testCaseWhenNoDefaultCF.setTenantViewCFs(Lists.newArrayList("A", "A", "B"));
- testCases.add(testCaseWhenNoDefaultCF);
-
- OtherOptions
testCaseWhenNoDefaultCFAndGlobalAndTenantCFsAreDiff = new OtherOptions();
-
testCaseWhenNoDefaultCFAndGlobalAndTenantCFsAreDiff.setTestName("testCaseWhenNoDefaultCFAndGlobalAndTenantCFsAreDiff");
-
testCaseWhenNoDefaultCFAndGlobalAndTenantCFsAreDiff.setTableCFs(Lists.newArrayList("A",
"A", "B"));
-
testCaseWhenNoDefaultCFAndGlobalAndTenantCFsAreDiff.setGlobalViewCFs(Lists.newArrayList("B",
"B", "B"));
-
testCaseWhenNoDefaultCFAndGlobalAndTenantCFsAreDiff.setTenantViewCFs(Lists.newArrayList("A",
"A", "A"));
-
testCases.add(testCaseWhenNoDefaultCFAndGlobalAndTenantCFsAreDiff);
+ private void assertAllHBaseRowsHaveEmptyColumnCell(byte[] hbaseTableName,
+ byte[] emptyColumnFamilyName, byte[] emptyColumnName, long
minTimestamp,
+ int expectedRows) throws IOException, SQLException {
+
+ try (Table tbl = driver.getConnectionQueryServices(getUrl(),
TestUtil.TEST_PROPERTIES)
+ .getTable(hbaseTableName)) {
+
+ Scan allRows = new Scan();
+ allRows.setMaxVersions(1);
+ allRows.setTimeRange(minTimestamp, minTimestamp +
Integer.MAX_VALUE);
Review comment:
Will remove the maxVersion on Scan.
The time range allows the test writer to specify the time range and the
expected record count therein thus easier to specify the assert conditions.
I will add the check for max timestamp.
----------------------------------------------------------------
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:
[email protected]
With regards,
Apache Git Services