HBASE-23646 Resolved remaining Checkstyle violations in tests of hbase-rest
Signed-off-by: Viraj Jasani <vjasani@apache.org>
This commit is contained in:
parent
99a59cf9e7
commit
2e3273f6ea
|
@ -36,4 +36,6 @@
|
|||
<suppress checks="MagicNumberCheck" files=".*Test\.java"/>
|
||||
<!-- Will not have a private constructor, because it is InterfaceAudience.Public -->
|
||||
<suppress checks="HideUtilityClassConstructor" files="org.apache.hadoop.hbase.util.ByteRangeUtils"/>
|
||||
<suppress checks="InnerAssignment" files="org.apache.hadoop.hbase.rest.PerformanceEvaluation"/>
|
||||
<suppress checks="EmptyBlock" files="org.apache.hadoop.hbase.rest.PerformanceEvaluation"/>
|
||||
</suppressions>
|
||||
|
|
|
@ -34,7 +34,6 @@ import org.mortbay.jetty.servlet.ServletHolder;
|
|||
import com.sun.jersey.spi.container.servlet.ServletContainer;
|
||||
|
||||
public class HBaseRESTTestingUtility {
|
||||
|
||||
private static final Log LOG = LogFactory.getLog(HBaseRESTTestingUtility.class);
|
||||
|
||||
private int testServletPort;
|
||||
|
@ -62,7 +61,7 @@ public class HBaseRESTTestingUtility {
|
|||
"jetty");
|
||||
|
||||
LOG.info("configured " + ServletContainer.class.getName());
|
||||
|
||||
|
||||
// set up Jetty and run the embedded server
|
||||
server = new Server(0);
|
||||
server.setSendServerVersion(false);
|
||||
|
@ -86,17 +85,19 @@ public class HBaseRESTTestingUtility {
|
|||
// get the port
|
||||
testServletPort = server.getConnectors()[0].getLocalPort();
|
||||
|
||||
LOG.info("started " + server.getClass().getName() + " on port " +
|
||||
LOG.info("started " + server.getClass().getName() + " on port " +
|
||||
testServletPort);
|
||||
}
|
||||
|
||||
public void shutdownServletContainer() {
|
||||
if (server != null) try {
|
||||
server.stop();
|
||||
server = null;
|
||||
RESTServlet.stop();
|
||||
} catch (Exception e) {
|
||||
LOG.warn(StringUtils.stringifyException(e));
|
||||
if (server != null) {
|
||||
try {
|
||||
server.stop();
|
||||
server = null;
|
||||
RESTServlet.stop();
|
||||
} catch (Exception e) {
|
||||
LOG.warn(StringUtils.stringifyException(e));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,6 +18,22 @@
|
|||
*/
|
||||
package org.apache.hadoop.hbase.rest;
|
||||
|
||||
import java.io.DataInput;
|
||||
import java.io.DataOutput;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintStream;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
import java.util.TreeMap;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.apache.hadoop.conf.Configuration;
|
||||
|
@ -59,6 +75,7 @@ import org.apache.hadoop.hbase.util.Bytes;
|
|||
import org.apache.hadoop.hbase.util.Hash;
|
||||
import org.apache.hadoop.hbase.util.MurmurHash;
|
||||
import org.apache.hadoop.hbase.util.Pair;
|
||||
|
||||
import org.apache.hadoop.io.LongWritable;
|
||||
import org.apache.hadoop.io.NullWritable;
|
||||
import org.apache.hadoop.io.Text;
|
||||
|
@ -76,22 +93,6 @@ import org.apache.hadoop.util.LineReader;
|
|||
import org.apache.hadoop.util.Tool;
|
||||
import org.apache.hadoop.util.ToolRunner;
|
||||
|
||||
import java.io.DataInput;
|
||||
import java.io.DataOutput;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintStream;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
import java.util.TreeMap;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* Script used evaluating Stargate performance and scalability. Runs a SG
|
||||
* client that steps through one of a set of hardcoded tests or 'experiments'
|
||||
|
@ -118,12 +119,12 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
private static final int ROWS_PER_GB = ONE_GB / ROW_LENGTH;
|
||||
|
||||
public static final TableName TABLE_NAME = TableName.valueOf("TestTable");
|
||||
public static final byte [] FAMILY_NAME = Bytes.toBytes("info");
|
||||
public static final byte [] QUALIFIER_NAME = Bytes.toBytes("data");
|
||||
public static final byte[] FAMILY_NAME = Bytes.toBytes("info");
|
||||
public static final byte[] QUALIFIER_NAME = Bytes.toBytes("data");
|
||||
private TableName tableName = TABLE_NAME;
|
||||
|
||||
protected HTableDescriptor TABLE_DESCRIPTOR;
|
||||
protected Map<String, CmdDescriptor> commands = new TreeMap<String, CmdDescriptor>();
|
||||
protected Map<String, CmdDescriptor> commands = new TreeMap<>();
|
||||
protected static Cluster cluster = new Cluster();
|
||||
|
||||
volatile Configuration conf;
|
||||
|
@ -141,6 +142,7 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
private Connection connection;
|
||||
|
||||
private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");
|
||||
|
||||
/**
|
||||
* Regex to parse lines in input file passed to mapreduce task.
|
||||
*/
|
||||
|
@ -159,11 +161,12 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
* Enum for map metrics. Keep it out here rather than inside in the Map
|
||||
* inner-class so we can find associated properties.
|
||||
*/
|
||||
protected static enum Counter {
|
||||
protected enum Counter {
|
||||
/** elapsed time */
|
||||
ELAPSED_TIME,
|
||||
/** number of rows */
|
||||
ROWS}
|
||||
ROWS
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
|
@ -199,8 +202,7 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
|
||||
protected void addCommandDescriptor(Class<? extends Test> cmdClass,
|
||||
String name, String description) {
|
||||
CmdDescriptor cmdDescriptor =
|
||||
new CmdDescriptor(cmdClass, name, description);
|
||||
CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);
|
||||
commands.put(name, cmdDescriptor);
|
||||
}
|
||||
|
||||
|
@ -211,30 +213,27 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
/**
|
||||
* Sets status
|
||||
* @param msg status message
|
||||
* @throws IOException
|
||||
* @throws IOException if setting the status fails
|
||||
*/
|
||||
void setStatus(final String msg) throws IOException;
|
||||
}
|
||||
|
||||
/**
|
||||
* This class works as the InputSplit of Performance Evaluation
|
||||
* MapReduce InputFormat, and the Record Value of RecordReader.
|
||||
* Each map task will only read one record from a PeInputSplit,
|
||||
* MapReduce InputFormat, and the Record Value of RecordReader.
|
||||
* Each map task will only read one record from a PeInputSplit,
|
||||
* the record value is the PeInputSplit itself.
|
||||
*/
|
||||
public static class PeInputSplit extends InputSplit implements Writable {
|
||||
private TableName tableName = TABLE_NAME;
|
||||
private int startRow = 0;
|
||||
private int rows = 0;
|
||||
private int totalRows = 0;
|
||||
private int clients = 0;
|
||||
private boolean flushCommits = false;
|
||||
private boolean writeToWAL = true;
|
||||
private boolean useTags = false;
|
||||
private int noOfTags = 0;
|
||||
|
||||
public PeInputSplit() {
|
||||
}
|
||||
private TableName tableName;
|
||||
private int startRow;
|
||||
private int rows;
|
||||
private int totalRows;
|
||||
private int clients;
|
||||
private boolean flushCommits;
|
||||
private boolean writeToWAL;
|
||||
private boolean useTags;
|
||||
private int noOfTags;
|
||||
|
||||
public PeInputSplit(TableName tableName, int startRow, int rows, int totalRows, int clients,
|
||||
boolean flushCommits, boolean writeToWAL, boolean useTags, int noOfTags) {
|
||||
|
@ -281,12 +280,12 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
}
|
||||
|
||||
@Override
|
||||
public long getLength() throws IOException, InterruptedException {
|
||||
public long getLength() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getLocations() throws IOException, InterruptedException {
|
||||
public String[] getLocations() {
|
||||
return new String[0];
|
||||
}
|
||||
|
||||
|
@ -332,13 +331,12 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
* It extends from FileInputFormat, want to use it's methods such as setInputPaths().
|
||||
*/
|
||||
public static class PeInputFormat extends FileInputFormat<NullWritable, PeInputSplit> {
|
||||
|
||||
@Override
|
||||
public List<InputSplit> getSplits(JobContext job) throws IOException {
|
||||
// generate splits
|
||||
List<InputSplit> splitList = new ArrayList<InputSplit>();
|
||||
List<InputSplit> splitList = new ArrayList<>();
|
||||
|
||||
for (FileStatus file: listStatus(job)) {
|
||||
for (FileStatus file : listStatus(job)) {
|
||||
if (file.isDirectory()) {
|
||||
continue;
|
||||
}
|
||||
|
@ -346,15 +344,15 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
FileSystem fs = path.getFileSystem(job.getConfiguration());
|
||||
FSDataInputStream fileIn = fs.open(path);
|
||||
LineReader in = new LineReader(fileIn, job.getConfiguration());
|
||||
int lineLen = 0;
|
||||
while(true) {
|
||||
int lineLen;
|
||||
while (true) {
|
||||
Text lineText = new Text();
|
||||
lineLen = in.readLine(lineText);
|
||||
if(lineLen <= 0) {
|
||||
break;
|
||||
if (lineLen <= 0) {
|
||||
break;
|
||||
}
|
||||
Matcher m = LINE_PATTERN.matcher(lineText.toString());
|
||||
if((m != null) && m.matches()) {
|
||||
if ((m != null) && m.matches()) {
|
||||
TableName tableName = TableName.valueOf(m.group(1));
|
||||
int startRow = Integer.parseInt(m.group(2));
|
||||
int rows = Integer.parseInt(m.group(3));
|
||||
|
@ -391,7 +389,7 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
|
||||
@Override
|
||||
public RecordReader<NullWritable, PeInputSplit> createRecordReader(InputSplit split,
|
||||
TaskAttemptContext context) {
|
||||
TaskAttemptContext context) {
|
||||
return new PeRecordReader();
|
||||
}
|
||||
|
||||
|
@ -402,38 +400,37 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
private PeInputSplit value = null;
|
||||
|
||||
@Override
|
||||
public void initialize(InputSplit split, TaskAttemptContext context)
|
||||
throws IOException, InterruptedException {
|
||||
public void initialize(InputSplit split, TaskAttemptContext context) {
|
||||
this.readOver = false;
|
||||
this.split = (PeInputSplit)split;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean nextKeyValue() throws IOException, InterruptedException {
|
||||
if(readOver) {
|
||||
public boolean nextKeyValue() {
|
||||
if (readOver) {
|
||||
return false;
|
||||
}
|
||||
|
||||
key = NullWritable.get();
|
||||
value = (PeInputSplit)split;
|
||||
value = split;
|
||||
|
||||
readOver = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NullWritable getCurrentKey() throws IOException, InterruptedException {
|
||||
public NullWritable getCurrentKey() {
|
||||
return key;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PeInputSplit getCurrentValue() throws IOException, InterruptedException {
|
||||
public PeInputSplit getCurrentValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getProgress() throws IOException, InterruptedException {
|
||||
if(readOver) {
|
||||
public float getProgress() {
|
||||
if (readOver) {
|
||||
return 1.0f;
|
||||
} else {
|
||||
return 0.0f;
|
||||
|
@ -441,7 +438,7 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void close() throws IOException {
|
||||
public void close() {
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
|
@ -462,7 +459,7 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
private PerformanceEvaluation pe;
|
||||
|
||||
@Override
|
||||
protected void setup(Context context) throws IOException, InterruptedException {
|
||||
protected void setup(Context context) {
|
||||
this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);
|
||||
|
||||
// this is required so that extensions of PE are instantiated within the
|
||||
|
@ -478,7 +475,7 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
}
|
||||
|
||||
private <Type> Class<? extends Type> forName(String className, Class<Type> type) {
|
||||
Class<? extends Type> clazz = null;
|
||||
Class<? extends Type> clazz;
|
||||
try {
|
||||
clazz = Class.forName(className).asSubclass(type);
|
||||
} catch (ClassNotFoundException e) {
|
||||
|
@ -513,11 +510,11 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* If table does not already exist, create.
|
||||
* @param c Client to use checking.
|
||||
* @param admin Client to use checking.
|
||||
* @return True if we created the table.
|
||||
* @throws IOException
|
||||
* @throws IOException if an operation on the table fails
|
||||
*/
|
||||
private boolean checkTable(RemoteAdmin admin) throws IOException {
|
||||
HTableDescriptor tableDescriptor = getTableDescriptor();
|
||||
|
@ -532,7 +529,7 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));
|
||||
}
|
||||
admin.createTable(tableDescriptor);
|
||||
LOG.info ("Table created with " + this.presplitRegions + " splits");
|
||||
LOG.info("Table created with " + this.presplitRegions + " splits");
|
||||
} else {
|
||||
boolean tableExists = admin.isTableAvailable(tableDescriptor.getTableName().getName());
|
||||
if (!tableExists) {
|
||||
|
@ -540,8 +537,8 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
LOG.info("Table " + tableDescriptor + " created");
|
||||
}
|
||||
}
|
||||
boolean tableExists = admin.isTableAvailable(tableDescriptor.getTableName().getName());
|
||||
return tableExists;
|
||||
|
||||
return admin.isTableAvailable(tableDescriptor.getTableName().getName());
|
||||
}
|
||||
|
||||
protected HTableDescriptor getTableDescriptor() {
|
||||
|
@ -564,27 +561,27 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
* @return splits : array of byte []
|
||||
*/
|
||||
protected byte[][] getSplits() {
|
||||
if (this.presplitRegions == 0)
|
||||
return new byte [0][];
|
||||
if (this.presplitRegions == 0) {
|
||||
return new byte[0][];
|
||||
}
|
||||
|
||||
int numSplitPoints = presplitRegions - 1;
|
||||
byte[][] splits = new byte[numSplitPoints][];
|
||||
int jump = this.R / this.presplitRegions;
|
||||
for (int i=0; i < numSplitPoints; i++) {
|
||||
for (int i = 0; i < numSplitPoints; i++) {
|
||||
int rowkey = jump * (1 + i);
|
||||
splits[i] = format(rowkey);
|
||||
}
|
||||
return splits;
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* We're to run multiple clients concurrently. Setup a mapreduce job. Run
|
||||
* one map per client. Then run a single reduce to sum the elapsed times.
|
||||
* @param cmd Command to run.
|
||||
* @throws IOException
|
||||
*/
|
||||
private void runNIsMoreThanOne(final Class<? extends Test> cmd)
|
||||
throws IOException, InterruptedException, ClassNotFoundException {
|
||||
throws IOException, InterruptedException, ClassNotFoundException {
|
||||
RemoteAdmin remoteAdmin = new RemoteAdmin(new Client(cluster), getConf());
|
||||
checkTable(remoteAdmin);
|
||||
if (nomapred) {
|
||||
|
@ -594,13 +591,13 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* Run all clients in this vm each to its own thread.
|
||||
* @param cmd Command to run.
|
||||
* @throws IOException
|
||||
* @param cmd Command to run
|
||||
* @throws IOException if creating a connection fails
|
||||
*/
|
||||
private void doMultipleClients(final Class<? extends Test> cmd) throws IOException {
|
||||
final List<Thread> threads = new ArrayList<Thread>(this.N);
|
||||
final List<Thread> threads = new ArrayList<>(this.N);
|
||||
final long[] timings = new long[this.N];
|
||||
final int perClientRows = R/N;
|
||||
final TableName tableName = this.tableName;
|
||||
|
@ -614,7 +611,7 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
final Connection connection = ConnectionFactory.createConnection(getConf());
|
||||
for (int i = 0; i < this.N; i++) {
|
||||
final int index = i;
|
||||
Thread t = new Thread ("TestClient-" + i) {
|
||||
Thread t = new Thread("TestClient-" + i) {
|
||||
@Override
|
||||
public void run() {
|
||||
super.run();
|
||||
|
@ -648,11 +645,11 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
};
|
||||
threads.add(t);
|
||||
}
|
||||
for (Thread t: threads) {
|
||||
for (Thread t : threads) {
|
||||
t.start();
|
||||
}
|
||||
for (Thread t: threads) {
|
||||
while(t.isAlive()) {
|
||||
for (Thread t : threads) {
|
||||
while (t.isAlive()) {
|
||||
try {
|
||||
t.join();
|
||||
} catch (InterruptedException e) {
|
||||
|
@ -674,15 +671,14 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
+ "\tAvg: " + (total / this.N) + "ms");
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* Run a mapreduce job. Run as many maps as asked-for clients.
|
||||
* Before we start up the job, write out an input file with instruction
|
||||
* per client regards which row they are to start on.
|
||||
* @param cmd Command to run.
|
||||
* @throws IOException
|
||||
*/
|
||||
private void doMapReduce(final Class<? extends Test> cmd) throws IOException,
|
||||
InterruptedException, ClassNotFoundException {
|
||||
private void doMapReduce(final Class<? extends Test> cmd)
|
||||
throws IOException, InterruptedException, ClassNotFoundException {
|
||||
Configuration conf = getConf();
|
||||
Path inputDir = writeInputFile(conf);
|
||||
conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());
|
||||
|
@ -708,11 +704,11 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
job.waitForCompletion(true);
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* Write input file of offsets-per-client for the mapreduce job.
|
||||
* @param c Configuration
|
||||
* @return Directory that contains file written.
|
||||
* @throws IOException
|
||||
* @throws IOException if creating the directory or the file fails
|
||||
*/
|
||||
private Path writeInputFile(final Configuration c) throws IOException {
|
||||
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
|
||||
|
@ -722,32 +718,30 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
FileSystem fs = FileSystem.get(c);
|
||||
fs.mkdirs(inputDir);
|
||||
Path inputFile = new Path(inputDir, "input.txt");
|
||||
PrintStream out = new PrintStream(fs.create(inputFile));
|
||||
// Make input random.
|
||||
Map<Integer, String> m = new TreeMap<Integer, String>();
|
||||
Map<Integer, String> m = new TreeMap<>();
|
||||
Hash h = MurmurHash.getInstance();
|
||||
int perClientRows = (this.R / this.N);
|
||||
try {
|
||||
try (PrintStream out = new PrintStream(fs.create(inputFile))) {
|
||||
for (int i = 0; i < 10; i++) {
|
||||
for (int j = 0; j < N; j++) {
|
||||
String s = "tableName=" + this.tableName +
|
||||
", startRow=" + ((j * perClientRows) + (i * (perClientRows/10))) +
|
||||
", perClientRunRows=" + (perClientRows / 10) +
|
||||
", totalRows=" + this.R +
|
||||
", clients=" + this.N +
|
||||
", flushCommits=" + this.flushCommits +
|
||||
", writeToWAL=" + this.writeToWAL +
|
||||
", useTags=" + this.useTags +
|
||||
", noOfTags=" + this.noOfTags;
|
||||
int hash = h.hash(Bytes.toBytes(s));
|
||||
m.put(hash, s);
|
||||
StringBuilder s = new StringBuilder();
|
||||
s.append("tableName=").append(tableName);
|
||||
s.append(", startRow=").append((j * perClientRows) + (i * (perClientRows / 10)));
|
||||
s.append(", perClientRunRows=").append(perClientRows / 10);
|
||||
s.append(", totalRows=").append(R);
|
||||
s.append(", clients=").append(N);
|
||||
s.append(", flushCommits=").append(flushCommits);
|
||||
s.append(", writeToWAL=").append(writeToWAL);
|
||||
s.append(", useTags=").append(useTags);
|
||||
s.append(", noOfTags=").append(noOfTags);
|
||||
int hash = h.hash(Bytes.toBytes(s.toString()));
|
||||
m.put(hash, s.toString());
|
||||
}
|
||||
}
|
||||
for (Map.Entry<Integer, String> e: m.entrySet()) {
|
||||
for (Map.Entry<Integer, String> e : m.entrySet()) {
|
||||
out.println(e.getValue());
|
||||
}
|
||||
} finally {
|
||||
out.close();
|
||||
}
|
||||
return inputDir;
|
||||
}
|
||||
|
@ -780,8 +774,8 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
}
|
||||
|
||||
/**
|
||||
* Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation.Test
|
||||
* tests}. This makes the reflection logic a little easier to understand...
|
||||
* Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation} tests
|
||||
* This makes the reflection logic a little easier to understand...
|
||||
*/
|
||||
static class TestOptions {
|
||||
private int startRow;
|
||||
|
@ -790,14 +784,11 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
private int numClientThreads;
|
||||
private TableName tableName;
|
||||
private boolean flushCommits;
|
||||
private boolean writeToWAL = true;
|
||||
private boolean useTags = false;
|
||||
private int noOfTags = 0;
|
||||
private boolean writeToWAL;
|
||||
private boolean useTags;
|
||||
private int noOfTags;
|
||||
private Connection connection;
|
||||
|
||||
TestOptions() {
|
||||
}
|
||||
|
||||
TestOptions(int startRow, int perClientRunRows, int totalRows, int numClientThreads,
|
||||
TableName tableName, boolean flushCommits, boolean writeToWAL, boolean useTags,
|
||||
int noOfTags, Connection connection) {
|
||||
|
@ -907,10 +898,11 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
}
|
||||
|
||||
abstract void testTakedown() throws IOException;
|
||||
/*
|
||||
|
||||
/**
|
||||
* Run test
|
||||
* @return Elapsed time.
|
||||
* @throws IOException
|
||||
* @throws IOException if something in the test fails
|
||||
*/
|
||||
long test() throws IOException {
|
||||
testSetup();
|
||||
|
@ -940,16 +932,16 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Test for individual row.
|
||||
* @param i Row index.
|
||||
*/
|
||||
/**
|
||||
* Test for individual row.
|
||||
* @param i Row index.
|
||||
*/
|
||||
abstract void testRow(final int i) throws IOException;
|
||||
}
|
||||
|
||||
static abstract class TableTest extends Test {
|
||||
protected Table table;
|
||||
|
||||
|
||||
public TableTest(Configuration conf, TestOptions options, Status status) {
|
||||
super(conf, options, status);
|
||||
}
|
||||
|
@ -1007,7 +999,6 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
int period = this.perClientRunRows / 100;
|
||||
return period == 0? this.perClientRunRows: period;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
|
@ -1036,12 +1027,12 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
s.close();
|
||||
}
|
||||
|
||||
protected abstract Pair<byte[],byte[]> getStartAndStopRow();
|
||||
protected abstract Pair<byte[], byte[]> getStartAndStopRow();
|
||||
|
||||
protected Pair<byte[], byte[]> generateStartAndStopRows(int maxRange) {
|
||||
int start = this.rand.nextInt(Integer.MAX_VALUE) % totalRows;
|
||||
int stop = start + maxRange;
|
||||
return new Pair<byte[],byte[]>(format(start), format(stop));
|
||||
return new Pair<>(format(start), format(stop));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -1112,7 +1103,6 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
int period = this.perClientRunRows / 100;
|
||||
return period == 0? this.perClientRunRows: period;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static class RandomWriteTest extends BufferedMutatorTest {
|
||||
|
@ -1158,7 +1148,6 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
super.testTakedown();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
void testRow(final int i) throws IOException {
|
||||
if (this.testScanner == null) {
|
||||
|
@ -1168,7 +1157,6 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
}
|
||||
testScanner.next();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static class SequentialReadTest extends TableTest {
|
||||
|
@ -1182,11 +1170,9 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
get.addColumn(FAMILY_NAME, QUALIFIER_NAME);
|
||||
table.get(get);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static class SequentialWriteTest extends BufferedMutatorTest {
|
||||
|
||||
SequentialWriteTest(Configuration conf, TestOptions options, Status status) {
|
||||
super(conf, options, status);
|
||||
}
|
||||
|
@ -1225,17 +1211,13 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
void testRow(int i) throws IOException {
|
||||
byte[] value = generateValue(this.rand);
|
||||
Scan scan = constructScan(value);
|
||||
ResultScanner scanner = null;
|
||||
try {
|
||||
scanner = this.table.getScanner(scan);
|
||||
try (ResultScanner scanner = this.table.getScanner(scan)) {
|
||||
while (scanner.next() != null) {
|
||||
}
|
||||
} finally {
|
||||
if (scanner != null) scanner.close();
|
||||
}
|
||||
}
|
||||
|
||||
protected Scan constructScan(byte[] valuePrefix) throws IOException {
|
||||
protected Scan constructScan(byte[] valuePrefix) {
|
||||
Filter filter = new SingleColumnValueFilter(
|
||||
FAMILY_NAME, QUALIFIER_NAME, CompareFilter.CompareOp.EQUAL,
|
||||
new BinaryComparator(valuePrefix)
|
||||
|
@ -1247,14 +1229,14 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* Format passed integer.
|
||||
* @param number
|
||||
* @return Returns zero-prefixed 10-byte wide decimal version of passed
|
||||
* number (Does absolute in case number is negative).
|
||||
* @param number the integer to format
|
||||
* @return Returns zero-prefixed 10-byte wide decimal version of passed number (Does absolute in
|
||||
* case number is negative).
|
||||
*/
|
||||
public static byte [] format(final int number) {
|
||||
byte [] b = new byte[DEFAULT_ROW_PREFIX_LENGTH + 10];
|
||||
byte[] b = new byte[DEFAULT_ROW_PREFIX_LENGTH + 10];
|
||||
int d = Math.abs(number);
|
||||
for (int i = b.length - 1; i >= 0; i--) {
|
||||
b[i] = (byte)((d % 10) + '0');
|
||||
|
@ -1264,10 +1246,10 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
}
|
||||
|
||||
public static byte[] generateData(final Random r, int length) {
|
||||
byte [] b = new byte [length];
|
||||
int i = 0;
|
||||
byte[] b = new byte [length];
|
||||
int i;
|
||||
|
||||
for(i = 0; i < (length-8); i += 8) {
|
||||
for (i = 0; i < (length-8); i += 8) {
|
||||
b[i] = (byte) (65 + r.nextInt(26));
|
||||
b[i+1] = b[i];
|
||||
b[i+2] = b[i];
|
||||
|
@ -1279,7 +1261,7 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
}
|
||||
|
||||
byte a = (byte) (65 + r.nextInt(26));
|
||||
for(; i < length; i++) {
|
||||
for (; i < length; i++) {
|
||||
b[i] = a;
|
||||
}
|
||||
return b;
|
||||
|
@ -1291,18 +1273,17 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
return b;
|
||||
}
|
||||
|
||||
static byte [] getRandomRow(final Random random, final int totalRows) {
|
||||
static byte[] getRandomRow(final Random random, final int totalRows) {
|
||||
return format(random.nextInt(Integer.MAX_VALUE) % totalRows);
|
||||
}
|
||||
|
||||
long runOneClient(final Class<? extends Test> cmd, final int startRow,
|
||||
final int perClientRunRows, final int totalRows,
|
||||
boolean flushCommits, boolean writeToWAL, boolean useTags, int noOfTags,
|
||||
Connection connection, final Status status)
|
||||
throws IOException {
|
||||
Connection connection, final Status status) throws IOException {
|
||||
status.setStatus("Start " + cmd + " at offset " + startRow + " for " +
|
||||
perClientRunRows + " rows");
|
||||
long totalElapsedTime = 0;
|
||||
long totalElapsedTime;
|
||||
|
||||
TestOptions options = new TestOptions(startRow, perClientRunRows,
|
||||
totalRows, N, tableName, flushCommits, writeToWAL, useTags, noOfTags, connection);
|
||||
|
@ -1334,7 +1315,7 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
}
|
||||
};
|
||||
|
||||
RemoteAdmin admin = null;
|
||||
RemoteAdmin admin;
|
||||
try {
|
||||
Client client = new Client(cluster);
|
||||
admin = new RemoteAdmin(client, getConf());
|
||||
|
@ -1346,8 +1327,8 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
}
|
||||
}
|
||||
|
||||
private void runTest(final Class<? extends Test> cmd) throws IOException,
|
||||
InterruptedException, ClassNotFoundException {
|
||||
private void runTest(final Class<? extends Test> cmd)
|
||||
throws IOException, InterruptedException, ClassNotFoundException {
|
||||
if (N == 1) {
|
||||
// If there is only one client and one HRegionServer, we assume nothing
|
||||
// has been set up at all.
|
||||
|
@ -1410,7 +1391,7 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
}
|
||||
|
||||
private void getArgs(final int start, final String[] args) {
|
||||
if(start + 1 > args.length) {
|
||||
if (start + 1 > args.length) {
|
||||
throw new IllegalArgumentException("must supply the number of clients");
|
||||
}
|
||||
N = Integer.parseInt(args[start]);
|
||||
|
@ -1545,9 +1526,6 @@ public class PerformanceEvaluation extends Configured implements Tool {
|
|||
return descriptor != null ? descriptor.getCmdClass() : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param args
|
||||
*/
|
||||
public static void main(final String[] args) throws Exception {
|
||||
int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);
|
||||
System.exit(res);
|
||||
|
|
|
@ -25,7 +25,8 @@ import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;
|
|||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.StringWriter;
|
||||
import java.util.*;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.ws.rs.core.MediaType;
|
||||
import javax.xml.bind.JAXBContext;
|
||||
|
@ -53,7 +54,6 @@ import org.junit.Before;
|
|||
import org.junit.BeforeClass;
|
||||
|
||||
public class RowResourceBase {
|
||||
|
||||
protected static final String TABLE = "TestRowResource";
|
||||
protected static final String CFA = "a";
|
||||
protected static final String CFB = "b";
|
||||
|
@ -175,8 +175,8 @@ public class RowResourceBase {
|
|||
assertEquals(Bytes.toString(cell.getValue()), value);
|
||||
}
|
||||
|
||||
protected static void checkIncrementValueXML(String table, String row, String column,
|
||||
long value) throws IOException, JAXBException {
|
||||
protected static void checkIncrementValueXML(String table, String row, String column, long value)
|
||||
throws IOException, JAXBException {
|
||||
Response response = getValueXML(table, row, column);
|
||||
assertEquals(200, response.getCode());
|
||||
assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));
|
||||
|
@ -258,16 +258,17 @@ public class RowResourceBase {
|
|||
assertEquals(Bytes.toLong(cell.getValue()), value);
|
||||
}
|
||||
|
||||
protected static Response checkAndPutValuePB(String url, String table,
|
||||
String row, String column, String valueToCheck, String valueToPut, HashMap<String,String> otherCells)
|
||||
throws IOException {
|
||||
protected static Response checkAndPutValuePB(String url, String table, String row, String column,
|
||||
String valueToCheck, String valueToPut, HashMap<String,String> otherCells)
|
||||
throws IOException {
|
||||
RowModel rowModel = new RowModel(row);
|
||||
rowModel.addCell(new CellModel(Bytes.toBytes(column),
|
||||
Bytes.toBytes(valueToPut)));
|
||||
|
||||
if(otherCells != null) {
|
||||
for (Map.Entry<String,String> entry :otherCells.entrySet()) {
|
||||
rowModel.addCell(new CellModel(Bytes.toBytes(entry.getKey()), Bytes.toBytes(entry.getValue())));
|
||||
if (otherCells != null) {
|
||||
for (Map.Entry<String,String> entry : otherCells.entrySet()) {
|
||||
rowModel.addCell(new CellModel(Bytes.toBytes(entry.getKey()),
|
||||
Bytes.toBytes(entry.getValue())));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -287,8 +288,10 @@ public class RowResourceBase {
|
|||
String column, String valueToCheck, String valueToPut) throws IOException {
|
||||
return checkAndPutValuePB(table,row,column,valueToCheck,valueToPut,null);
|
||||
}
|
||||
protected static Response checkAndPutValuePB(String table, String row,
|
||||
String column, String valueToCheck, String valueToPut, HashMap<String,String> otherCells) throws IOException {
|
||||
|
||||
protected static Response checkAndPutValuePB(String table, String row, String column,
|
||||
String valueToCheck, String valueToPut, HashMap<String,String> otherCells)
|
||||
throws IOException {
|
||||
StringBuilder path = new StringBuilder();
|
||||
path.append('/');
|
||||
path.append(table);
|
||||
|
@ -299,16 +302,17 @@ public class RowResourceBase {
|
|||
valueToCheck, valueToPut, otherCells);
|
||||
}
|
||||
|
||||
protected static Response checkAndPutValueXML(String url, String table,
|
||||
String row, String column, String valueToCheck, String valueToPut, HashMap<String,String> otherCells)
|
||||
throws IOException, JAXBException {
|
||||
protected static Response checkAndPutValueXML(String url, String table, String row, String column,
|
||||
String valueToCheck, String valueToPut, HashMap<String,String> otherCells)
|
||||
throws IOException, JAXBException {
|
||||
RowModel rowModel = new RowModel(row);
|
||||
rowModel.addCell(new CellModel(Bytes.toBytes(column),
|
||||
Bytes.toBytes(valueToPut)));
|
||||
|
||||
if(otherCells != null) {
|
||||
for (Map.Entry<String,String> entry :otherCells.entrySet()) {
|
||||
rowModel.addCell(new CellModel(Bytes.toBytes(entry.getKey()), Bytes.toBytes(entry.getValue())));
|
||||
if (otherCells != null) {
|
||||
for (Map.Entry<String,String> entry : otherCells.entrySet()) {
|
||||
rowModel.addCell(new CellModel(Bytes.toBytes(entry.getKey()),
|
||||
Bytes.toBytes(entry.getValue())));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -325,9 +329,8 @@ public class RowResourceBase {
|
|||
return response;
|
||||
}
|
||||
|
||||
protected static Response checkAndPutValueXML(String table, String row,
|
||||
String column, String valueToCheck, String valueToPut)
|
||||
throws IOException, JAXBException {
|
||||
protected static Response checkAndPutValueXML(String table, String row, String column,
|
||||
String valueToCheck, String valueToPut) throws IOException, JAXBException {
|
||||
return checkAndPutValueXML(table,row,column,valueToCheck,valueToPut, null);
|
||||
}
|
||||
|
||||
|
@ -349,9 +352,10 @@ public class RowResourceBase {
|
|||
throws IOException, JAXBException {
|
||||
RowModel rowModel = new RowModel(row);
|
||||
|
||||
if(cellsToDelete != null) {
|
||||
for (Map.Entry<String,String> entry :cellsToDelete.entrySet()) {
|
||||
rowModel.addCell(new CellModel(Bytes.toBytes(entry.getKey()), Bytes.toBytes(entry.getValue())));
|
||||
if (cellsToDelete != null) {
|
||||
for (Map.Entry<String,String> entry : cellsToDelete.entrySet()) {
|
||||
rowModel.addCell(new CellModel(Bytes.toBytes(entry.getKey()),
|
||||
Bytes.toBytes(entry.getValue())));
|
||||
}
|
||||
}
|
||||
// Add this at the end
|
||||
|
@ -371,8 +375,10 @@ public class RowResourceBase {
|
|||
String column, String valueToCheck) throws IOException, JAXBException {
|
||||
return checkAndDeleteXML(table, row, column, valueToCheck, null);
|
||||
}
|
||||
|
||||
protected static Response checkAndDeleteXML(String table, String row,
|
||||
String column, String valueToCheck, HashMap<String,String> cellsToDelete) throws IOException, JAXBException {
|
||||
String column, String valueToCheck, HashMap<String,String> cellsToDelete)
|
||||
throws IOException, JAXBException {
|
||||
StringBuilder path = new StringBuilder();
|
||||
path.append('/');
|
||||
path.append(table);
|
||||
|
@ -383,12 +389,13 @@ public class RowResourceBase {
|
|||
}
|
||||
|
||||
protected static Response checkAndDeleteJson(String table, String row,
|
||||
String column, String valueToCheck) throws IOException, JAXBException {
|
||||
String column, String valueToCheck) throws IOException {
|
||||
return checkAndDeleteJson(table, row, column, valueToCheck, null);
|
||||
}
|
||||
|
||||
protected static Response checkAndDeleteJson(String table, String row,
|
||||
String column, String valueToCheck, HashMap<String,String> cellsToDelete) throws IOException, JAXBException {
|
||||
String column, String valueToCheck, HashMap<String,String> cellsToDelete)
|
||||
throws IOException {
|
||||
StringBuilder path = new StringBuilder();
|
||||
path.append('/');
|
||||
path.append(table);
|
||||
|
@ -400,12 +407,13 @@ public class RowResourceBase {
|
|||
|
||||
protected static Response checkAndDeleteJson(String url, String table,
|
||||
String row, String column, String valueToCheck, HashMap<String,String> cellsToDelete)
|
||||
throws IOException, JAXBException {
|
||||
throws IOException {
|
||||
RowModel rowModel = new RowModel(row);
|
||||
|
||||
if(cellsToDelete != null) {
|
||||
for (Map.Entry<String,String> entry :cellsToDelete.entrySet()) {
|
||||
rowModel.addCell(new CellModel(Bytes.toBytes(entry.getKey()), Bytes.toBytes(entry.getValue())));
|
||||
if (cellsToDelete != null) {
|
||||
for (Map.Entry<String,String> entry : cellsToDelete.entrySet()) {
|
||||
rowModel.addCell(new CellModel(Bytes.toBytes(entry.getKey()),
|
||||
Bytes.toBytes(entry.getValue())));
|
||||
}
|
||||
}
|
||||
// Add this at the end
|
||||
|
@ -420,9 +428,8 @@ public class RowResourceBase {
|
|||
return response;
|
||||
}
|
||||
|
||||
protected static Response checkAndDeletePB(String table, String row,
|
||||
String column, String value) throws IOException {
|
||||
|
||||
protected static Response checkAndDeletePB(String table, String row, String column, String value)
|
||||
throws IOException {
|
||||
return checkAndDeletePB(table, row, column, value, null);
|
||||
}
|
||||
|
||||
|
@ -441,9 +448,10 @@ public class RowResourceBase {
|
|||
throws IOException {
|
||||
RowModel rowModel = new RowModel(row);
|
||||
|
||||
if(cellsToDelete != null) {
|
||||
for (Map.Entry<String,String> entry :cellsToDelete.entrySet()) {
|
||||
rowModel.addCell(new CellModel(Bytes.toBytes(entry.getKey()), Bytes.toBytes(entry.getValue())));
|
||||
if (cellsToDelete != null) {
|
||||
for (Map.Entry<String,String> entry : cellsToDelete.entrySet()) {
|
||||
rowModel.addCell(new CellModel(Bytes.toBytes(entry.getKey()),
|
||||
Bytes.toBytes(entry.getValue())));
|
||||
}
|
||||
}
|
||||
// Add this at the end
|
||||
|
@ -532,12 +540,12 @@ public class RowResourceBase {
|
|||
}
|
||||
|
||||
protected static void checkValueJSON(String table, String row, String column,
|
||||
String value) throws IOException, JAXBException {
|
||||
String value) throws IOException {
|
||||
Response response = getValueJson(table, row, column);
|
||||
assertEquals(200, response.getCode());
|
||||
assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));
|
||||
ObjectMapper mapper = new JacksonProvider()
|
||||
.locateMapper(CellSetModel.class, MediaType.APPLICATION_JSON_TYPE);
|
||||
ObjectMapper mapper = new JacksonProvider().locateMapper(CellSetModel.class,
|
||||
MediaType.APPLICATION_JSON_TYPE);
|
||||
CellSetModel cellSet = mapper.readValue(response.getBody(), CellSetModel.class);
|
||||
RowModel rowModel = cellSet.getRows().get(0);
|
||||
CellModel cell = rowModel.getCells().get(0);
|
||||
|
@ -546,7 +554,7 @@ public class RowResourceBase {
|
|||
}
|
||||
|
||||
protected static void checkIncrementValueJSON(String table, String row, String column,
|
||||
long value) throws IOException, JAXBException {
|
||||
long value) throws IOException {
|
||||
Response response = getValueJson(table, row, column);
|
||||
assertEquals(200, response.getCode());
|
||||
assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));
|
||||
|
@ -560,7 +568,7 @@ public class RowResourceBase {
|
|||
}
|
||||
|
||||
protected static Response putValueJson(String table, String row, String column,
|
||||
String value) throws IOException, JAXBException {
|
||||
String value) throws IOException {
|
||||
StringBuilder path = new StringBuilder();
|
||||
path.append('/');
|
||||
path.append(table);
|
||||
|
@ -572,7 +580,7 @@ public class RowResourceBase {
|
|||
}
|
||||
|
||||
protected static Response putValueJson(String url, String table, String row, String column,
|
||||
String value) throws IOException, JAXBException {
|
||||
String value) throws IOException {
|
||||
RowModel rowModel = new RowModel(row);
|
||||
rowModel.addCell(new CellModel(Bytes.toBytes(column),
|
||||
Bytes.toBytes(value)));
|
||||
|
@ -597,7 +605,7 @@ public class RowResourceBase {
|
|||
}
|
||||
|
||||
protected static Response appendValuePB(String table, String row, String column,
|
||||
String value) throws IOException, JAXBException {
|
||||
String value) throws IOException {
|
||||
StringBuilder path = new StringBuilder();
|
||||
path.append('/');
|
||||
path.append(table);
|
||||
|
@ -630,7 +638,7 @@ public class RowResourceBase {
|
|||
}
|
||||
|
||||
protected static Response incrementValuePB(String table, String row, String column,
|
||||
String value) throws IOException, JAXBException {
|
||||
String value) throws IOException {
|
||||
StringBuilder path = new StringBuilder();
|
||||
path.append('/');
|
||||
path.append(table);
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
/**
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
|
@ -16,7 +15,6 @@
|
|||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hadoop.hbase.rest;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
@ -30,7 +28,6 @@ import java.util.Collection;
|
|||
import java.util.List;
|
||||
import javax.ws.rs.core.MediaType;
|
||||
import javax.xml.bind.JAXBContext;
|
||||
import javax.xml.bind.JAXBException;
|
||||
|
||||
import org.apache.commons.httpclient.Header;
|
||||
import org.apache.hadoop.conf.Configuration;
|
||||
|
@ -48,6 +45,7 @@ import org.apache.hadoop.hbase.rest.model.RowModel;
|
|||
import org.apache.hadoop.hbase.rest.provider.JacksonProvider;
|
||||
import org.apache.hadoop.hbase.testclassification.MediumTests;
|
||||
import org.apache.hadoop.hbase.util.Bytes;
|
||||
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
@ -55,11 +53,9 @@ import org.junit.experimental.categories.Category;
|
|||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.Parameterized;
|
||||
|
||||
|
||||
@Category(MediumTests.class)
|
||||
@RunWith(Parameterized.class)
|
||||
public class TestMultiRowResource {
|
||||
|
||||
private static final TableName TABLE = TableName.valueOf("TestRowResource");
|
||||
private static final String CFA = "a";
|
||||
private static final String CFB = "b";
|
||||
|
@ -70,7 +66,6 @@ public class TestMultiRowResource {
|
|||
private static final String ROW_2 = "testrow6";
|
||||
private static final String VALUE_2 = "testvalue6";
|
||||
|
||||
|
||||
private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
|
||||
private static final HBaseRESTTestingUtility REST_TEST_UTIL = new HBaseRESTTestingUtility();
|
||||
|
||||
|
@ -94,7 +89,6 @@ public class TestMultiRowResource {
|
|||
csrfEnabled = csrf;
|
||||
}
|
||||
|
||||
|
||||
@BeforeClass
|
||||
public static void setUpBeforeClass() throws Exception {
|
||||
conf = TEST_UTIL.getConfiguration();
|
||||
|
@ -123,13 +117,11 @@ public class TestMultiRowResource {
|
|||
TEST_UTIL.shutdownMiniCluster();
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testMultiCellGetJSON() throws IOException, JAXBException {
|
||||
public void testMultiCellGetJSON() throws IOException {
|
||||
String row_5_url = "/" + TABLE + "/" + ROW_1 + "/" + COLUMN_1;
|
||||
String row_6_url = "/" + TABLE + "/" + ROW_2 + "/" + COLUMN_2;
|
||||
|
||||
|
||||
StringBuilder path = new StringBuilder();
|
||||
path.append("/");
|
||||
path.append(TABLE);
|
||||
|
@ -146,22 +138,19 @@ public class TestMultiRowResource {
|
|||
client.post(row_5_url, Constants.MIMETYPE_BINARY, Bytes.toBytes(VALUE_1), extraHdr);
|
||||
client.post(row_6_url, Constants.MIMETYPE_BINARY, Bytes.toBytes(VALUE_2), extraHdr);
|
||||
|
||||
|
||||
Response response = client.get(path.toString(), Constants.MIMETYPE_JSON);
|
||||
assertEquals(200, response.getCode());
|
||||
assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));
|
||||
|
||||
client.delete(row_5_url, extraHdr);
|
||||
client.delete(row_6_url, extraHdr);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMultiCellGetXML() throws IOException, JAXBException {
|
||||
public void testMultiCellGetXML() throws IOException {
|
||||
String row_5_url = "/" + TABLE + "/" + ROW_1 + "/" + COLUMN_1;
|
||||
String row_6_url = "/" + TABLE + "/" + ROW_2 + "/" + COLUMN_2;
|
||||
|
||||
|
||||
StringBuilder path = new StringBuilder();
|
||||
path.append("/");
|
||||
path.append(TABLE);
|
||||
|
@ -173,18 +162,16 @@ public class TestMultiRowResource {
|
|||
client.post(row_5_url, Constants.MIMETYPE_BINARY, Bytes.toBytes(VALUE_1), extraHdr);
|
||||
client.post(row_6_url, Constants.MIMETYPE_BINARY, Bytes.toBytes(VALUE_2), extraHdr);
|
||||
|
||||
|
||||
Response response = client.get(path.toString(), Constants.MIMETYPE_XML);
|
||||
assertEquals(200, response.getCode());
|
||||
assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));
|
||||
|
||||
client.delete(row_5_url, extraHdr);
|
||||
client.delete(row_6_url, extraHdr);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMultiCellGetWithColsJSON() throws IOException, JAXBException {
|
||||
public void testMultiCellGetWithColsJSON() throws IOException {
|
||||
String row_5_url = "/" + TABLE + "/" + ROW_1 + "/" + COLUMN_1;
|
||||
String row_6_url = "/" + TABLE + "/" + ROW_2 + "/" + COLUMN_2;
|
||||
|
||||
|
@ -214,11 +201,10 @@ public class TestMultiRowResource {
|
|||
|
||||
client.delete(row_5_url, extraHdr);
|
||||
client.delete(row_6_url, extraHdr);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMultiCellGetJSONNotFound() throws IOException, JAXBException {
|
||||
public void testMultiCellGetJSONNotFound() throws IOException {
|
||||
String row_5_url = "/" + TABLE + "/" + ROW_1 + "/" + COLUMN_1;
|
||||
|
||||
StringBuilder path = new StringBuilder();
|
||||
|
@ -242,7 +228,7 @@ public class TestMultiRowResource {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void testMultiCellGetWithColsInQueryPathJSON() throws IOException, JAXBException {
|
||||
public void testMultiCellGetWithColsInQueryPathJSON() throws IOException {
|
||||
String row_5_url = "/" + TABLE + "/" + ROW_1 + "/" + COLUMN_1;
|
||||
String row_6_url = "/" + TABLE + "/" + ROW_2 + "/" + COLUMN_2;
|
||||
|
||||
|
@ -274,4 +260,3 @@ public class TestMultiRowResource {
|
|||
client.delete(row_6_url, extraHdr);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
/*
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
|
@ -16,9 +15,12 @@
|
|||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hadoop.hbase.rest;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.StringWriter;
|
||||
import java.util.ArrayList;
|
||||
|
@ -32,7 +34,12 @@ import javax.xml.bind.Unmarshaller;
|
|||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.apache.hadoop.hbase.*;
|
||||
import org.apache.hadoop.hbase.HBaseTestingUtility;
|
||||
import org.apache.hadoop.hbase.HColumnDescriptor;
|
||||
import org.apache.hadoop.hbase.HConstants;
|
||||
import org.apache.hadoop.hbase.HTableDescriptor;
|
||||
import org.apache.hadoop.hbase.KeyValue;
|
||||
import org.apache.hadoop.hbase.TableName;
|
||||
import org.apache.hadoop.hbase.client.Admin;
|
||||
import org.apache.hadoop.hbase.client.Delete;
|
||||
import org.apache.hadoop.hbase.client.Put;
|
||||
|
@ -64,8 +71,6 @@ import org.apache.hadoop.hbase.rest.model.ScannerModel;
|
|||
import org.apache.hadoop.hbase.testclassification.MediumTests;
|
||||
import org.apache.hadoop.hbase.util.Bytes;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
@ -73,41 +78,40 @@ import org.junit.experimental.categories.Category;
|
|||
|
||||
@Category(MediumTests.class)
|
||||
public class TestScannersWithFilters {
|
||||
|
||||
private static final Log LOG = LogFactory.getLog(TestScannersWithFilters.class);
|
||||
|
||||
private static final TableName TABLE = TableName.valueOf("TestScannersWithFilters");
|
||||
|
||||
private static final byte [][] ROWS_ONE = {
|
||||
private static final byte[][] ROWS_ONE = {
|
||||
Bytes.toBytes("testRowOne-0"), Bytes.toBytes("testRowOne-1"),
|
||||
Bytes.toBytes("testRowOne-2"), Bytes.toBytes("testRowOne-3")
|
||||
};
|
||||
|
||||
private static final byte [][] ROWS_TWO = {
|
||||
private static final byte[][] ROWS_TWO = {
|
||||
Bytes.toBytes("testRowTwo-0"), Bytes.toBytes("testRowTwo-1"),
|
||||
Bytes.toBytes("testRowTwo-2"), Bytes.toBytes("testRowTwo-3")
|
||||
};
|
||||
|
||||
private static final byte [][] FAMILIES = {
|
||||
private static final byte[][] FAMILIES = {
|
||||
Bytes.toBytes("testFamilyOne"), Bytes.toBytes("testFamilyTwo")
|
||||
};
|
||||
|
||||
private static final byte [][] QUALIFIERS_ONE = {
|
||||
private static final byte[][] QUALIFIERS_ONE = {
|
||||
Bytes.toBytes("testQualifierOne-0"), Bytes.toBytes("testQualifierOne-1"),
|
||||
Bytes.toBytes("testQualifierOne-2"), Bytes.toBytes("testQualifierOne-3")
|
||||
};
|
||||
|
||||
private static final byte [][] QUALIFIERS_TWO = {
|
||||
private static final byte[][] QUALIFIERS_TWO = {
|
||||
Bytes.toBytes("testQualifierTwo-0"), Bytes.toBytes("testQualifierTwo-1"),
|
||||
Bytes.toBytes("testQualifierTwo-2"), Bytes.toBytes("testQualifierTwo-3")
|
||||
};
|
||||
|
||||
private static final byte [][] VALUES = {
|
||||
private static final byte[][] VALUES = {
|
||||
Bytes.toBytes("testValueOne"), Bytes.toBytes("testValueTwo")
|
||||
};
|
||||
|
||||
private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
|
||||
private static final HBaseRESTTestingUtility REST_TEST_UTIL =
|
||||
private static final HBaseRESTTestingUtility REST_TEST_UTIL =
|
||||
new HBaseRESTTestingUtility();
|
||||
private static Client client;
|
||||
private static JAXBContext context;
|
||||
|
@ -127,7 +131,7 @@ public class TestScannersWithFilters {
|
|||
ScannerModel.class);
|
||||
marshaller = context.createMarshaller();
|
||||
unmarshaller = context.createUnmarshaller();
|
||||
client = new Client(new Cluster().add("localhost",
|
||||
client = new Client(new Cluster().add("localhost",
|
||||
REST_TEST_UTIL.getServletPort()));
|
||||
Admin admin = TEST_UTIL.getHBaseAdmin();
|
||||
if (!admin.tableExists(TABLE)) {
|
||||
|
@ -137,64 +141,64 @@ public class TestScannersWithFilters {
|
|||
admin.createTable(htd);
|
||||
Table table = TEST_UTIL.getConnection().getTable(TABLE);
|
||||
// Insert first half
|
||||
for(byte [] ROW : ROWS_ONE) {
|
||||
for (byte[] ROW : ROWS_ONE) {
|
||||
Put p = new Put(ROW);
|
||||
p.setDurability(Durability.SKIP_WAL);
|
||||
for(byte [] QUALIFIER : QUALIFIERS_ONE) {
|
||||
for (byte[] QUALIFIER : QUALIFIERS_ONE) {
|
||||
p.add(FAMILIES[0], QUALIFIER, VALUES[0]);
|
||||
}
|
||||
table.put(p);
|
||||
}
|
||||
for(byte [] ROW : ROWS_TWO) {
|
||||
for (byte[] ROW : ROWS_TWO) {
|
||||
Put p = new Put(ROW);
|
||||
p.setDurability(Durability.SKIP_WAL);
|
||||
for(byte [] QUALIFIER : QUALIFIERS_TWO) {
|
||||
for (byte[] QUALIFIER : QUALIFIERS_TWO) {
|
||||
p.add(FAMILIES[1], QUALIFIER, VALUES[1]);
|
||||
}
|
||||
table.put(p);
|
||||
}
|
||||
|
||||
|
||||
// Insert second half (reverse families)
|
||||
for(byte [] ROW : ROWS_ONE) {
|
||||
for (byte[] ROW : ROWS_ONE) {
|
||||
Put p = new Put(ROW);
|
||||
p.setDurability(Durability.SKIP_WAL);
|
||||
for(byte [] QUALIFIER : QUALIFIERS_ONE) {
|
||||
for (byte[] QUALIFIER : QUALIFIERS_ONE) {
|
||||
p.add(FAMILIES[1], QUALIFIER, VALUES[0]);
|
||||
}
|
||||
table.put(p);
|
||||
}
|
||||
for(byte [] ROW : ROWS_TWO) {
|
||||
for (byte[] ROW : ROWS_TWO) {
|
||||
Put p = new Put(ROW);
|
||||
p.setDurability(Durability.SKIP_WAL);
|
||||
for(byte [] QUALIFIER : QUALIFIERS_TWO) {
|
||||
for (byte[] QUALIFIER : QUALIFIERS_TWO) {
|
||||
p.add(FAMILIES[0], QUALIFIER, VALUES[1]);
|
||||
}
|
||||
table.put(p);
|
||||
}
|
||||
|
||||
|
||||
// Delete the second qualifier from all rows and families
|
||||
for(byte [] ROW : ROWS_ONE) {
|
||||
for (byte[] ROW : ROWS_ONE) {
|
||||
Delete d = new Delete(ROW);
|
||||
d.deleteColumns(FAMILIES[0], QUALIFIERS_ONE[1]);
|
||||
d.deleteColumns(FAMILIES[1], QUALIFIERS_ONE[1]);
|
||||
table.delete(d);
|
||||
}
|
||||
for(byte [] ROW : ROWS_TWO) {
|
||||
}
|
||||
for (byte[] ROW : ROWS_TWO) {
|
||||
Delete d = new Delete(ROW);
|
||||
d.deleteColumns(FAMILIES[0], QUALIFIERS_TWO[1]);
|
||||
d.deleteColumns(FAMILIES[1], QUALIFIERS_TWO[1]);
|
||||
table.delete(d);
|
||||
}
|
||||
colsPerRow -= 2;
|
||||
|
||||
|
||||
// Delete the second rows from both groups, one column at a time
|
||||
for(byte [] QUALIFIER : QUALIFIERS_ONE) {
|
||||
for (byte[] QUALIFIER : QUALIFIERS_ONE) {
|
||||
Delete d = new Delete(ROWS_ONE[1]);
|
||||
d.deleteColumns(FAMILIES[0], QUALIFIER);
|
||||
d.deleteColumns(FAMILIES[1], QUALIFIER);
|
||||
table.delete(d);
|
||||
}
|
||||
for(byte [] QUALIFIER : QUALIFIERS_TWO) {
|
||||
for (byte[] QUALIFIER : QUALIFIERS_TWO) {
|
||||
Delete d = new Delete(ROWS_TWO[1]);
|
||||
d.deleteColumns(FAMILIES[0], QUALIFIER);
|
||||
d.deleteColumns(FAMILIES[1], QUALIFIER);
|
||||
|
@ -211,7 +215,7 @@ public class TestScannersWithFilters {
|
|||
TEST_UTIL.shutdownMiniCluster();
|
||||
}
|
||||
|
||||
private static void verifyScan(Scan s, long expectedRows, long expectedKeys)
|
||||
private static void verifyScan(Scan s, long expectedRows, long expectedKeys)
|
||||
throws Exception {
|
||||
ScannerModel model = ScannerModel.fromScan(s);
|
||||
model.setBatch(Integer.MAX_VALUE); // fetch it all at once
|
||||
|
@ -233,9 +237,9 @@ public class TestScannersWithFilters {
|
|||
unmarshaller.unmarshal(new ByteArrayInputStream(response.getBody()));
|
||||
|
||||
int rows = cells.getRows().size();
|
||||
assertTrue("Scanned too many rows! Only expected " + expectedRows +
|
||||
" total but scanned " + rows, expectedRows == rows);
|
||||
for (RowModel row: cells.getRows()) {
|
||||
assertEquals("Scanned too many rows! Only expected " + expectedRows +
|
||||
" total but scanned " + rows, expectedRows, rows);
|
||||
for (RowModel row : cells.getRows()) {
|
||||
int count = row.getCells().size();
|
||||
assertEquals("Expected " + expectedKeys + " keys per row but " +
|
||||
"returned " + count, expectedKeys, count);
|
||||
|
@ -246,8 +250,7 @@ public class TestScannersWithFilters {
|
|||
assertEquals(200, response.getCode());
|
||||
}
|
||||
|
||||
private static void verifyScanFull(Scan s, KeyValue [] kvs)
|
||||
throws Exception {
|
||||
private static void verifyScanFull(Scan s, KeyValue [] kvs) throws Exception {
|
||||
ScannerModel model = ScannerModel.fromScan(s);
|
||||
model.setBatch(Integer.MAX_VALUE); // fetch it all at once
|
||||
StringWriter writer = new StringWriter();
|
||||
|
@ -276,22 +279,28 @@ public class TestScannersWithFilters {
|
|||
Iterator<RowModel> i = cellSet.getRows().iterator();
|
||||
for (boolean done = true; done; row++) {
|
||||
done = i.hasNext();
|
||||
if (!done) break;
|
||||
if (!done) {
|
||||
break;
|
||||
}
|
||||
|
||||
RowModel rowModel = i.next();
|
||||
List<CellModel> cells = rowModel.getCells();
|
||||
if (cells.isEmpty()) break;
|
||||
assertTrue("Scanned too many keys! Only expected " + kvs.length +
|
||||
" total but already scanned " + (cells.size() + idx),
|
||||
if (cells.isEmpty()) {
|
||||
break;
|
||||
}
|
||||
|
||||
assertTrue("Scanned too many keys! Only expected " + kvs.length +
|
||||
" total but already scanned " + (cells.size() + idx),
|
||||
kvs.length >= idx + cells.size());
|
||||
for (CellModel cell: cells) {
|
||||
assertTrue("Row mismatch",
|
||||
assertTrue("Row mismatch",
|
||||
Bytes.equals(rowModel.getKey(), kvs[idx].getRow()));
|
||||
byte[][] split = KeyValue.parseColumn(cell.getColumn());
|
||||
assertTrue("Family mismatch",
|
||||
assertTrue("Family mismatch",
|
||||
Bytes.equals(split[0], kvs[idx].getFamily()));
|
||||
assertTrue("Qualifier mismatch",
|
||||
assertTrue("Qualifier mismatch",
|
||||
Bytes.equals(split[1], kvs[idx].getQualifier()));
|
||||
assertTrue("Value mismatch",
|
||||
assertTrue("Value mismatch",
|
||||
Bytes.equals(cell.getValue(), kvs[idx].getValue()));
|
||||
idx++;
|
||||
}
|
||||
|
@ -308,7 +317,7 @@ public class TestScannersWithFilters {
|
|||
marshaller.marshal(model, writer);
|
||||
LOG.debug(writer.toString());
|
||||
byte[] body = Bytes.toBytes(writer.toString());
|
||||
Response response = client.put("/" + TABLE + "/scanner",
|
||||
Response response = client.put("/" + TABLE + "/scanner",
|
||||
Constants.MIMETYPE_XML, body);
|
||||
assertEquals(201, response.getCode());
|
||||
String scannerURI = response.getLocation();
|
||||
|
@ -329,11 +338,17 @@ public class TestScannersWithFilters {
|
|||
int j = 0;
|
||||
for (boolean done = true; done; j++) {
|
||||
done = i.hasNext();
|
||||
if (!done) break;
|
||||
if (!done) {
|
||||
break;
|
||||
}
|
||||
|
||||
RowModel rowModel = i.next();
|
||||
List<CellModel> cells = rowModel.getCells();
|
||||
if (cells.isEmpty()) break;
|
||||
assertTrue("Scanned too many rows! Only expected " + expectedRows +
|
||||
if (cells.isEmpty()) {
|
||||
break;
|
||||
}
|
||||
|
||||
assertTrue("Scanned too many rows! Only expected " + expectedRows +
|
||||
" total but already scanned " + (j+1), expectedRows > j);
|
||||
assertEquals("Expected " + expectedKeys + " keys per row but " +
|
||||
"returned " + cells.size(), expectedKeys, cells.size());
|
||||
|
@ -347,7 +362,7 @@ public class TestScannersWithFilters {
|
|||
// No filter
|
||||
long expectedRows = numRows;
|
||||
long expectedKeys = colsPerRow;
|
||||
|
||||
|
||||
// Both families
|
||||
Scan s = new Scan();
|
||||
verifyScan(s, expectedRows, expectedKeys);
|
||||
|
@ -415,7 +430,7 @@ public class TestScannersWithFilters {
|
|||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1])
|
||||
};
|
||||
|
||||
|
||||
// Grab all 6 rows
|
||||
long expectedRows = 6;
|
||||
long expectedKeys = colsPerRow;
|
||||
|
@ -424,7 +439,7 @@ public class TestScannersWithFilters {
|
|||
verifyScan(s, expectedRows, expectedKeys);
|
||||
s.setFilter(new PageFilter(expectedRows));
|
||||
verifyScanFull(s, expectedKVs);
|
||||
|
||||
|
||||
// Grab first 4 rows (6 cols per row)
|
||||
expectedRows = 4;
|
||||
expectedKeys = colsPerRow;
|
||||
|
@ -433,7 +448,7 @@ public class TestScannersWithFilters {
|
|||
verifyScan(s, expectedRows, expectedKeys);
|
||||
s.setFilter(new PageFilter(expectedRows));
|
||||
verifyScanFull(s, Arrays.copyOf(expectedKVs, 24));
|
||||
|
||||
|
||||
// Grab first 2 rows
|
||||
expectedRows = 2;
|
||||
expectedKeys = colsPerRow;
|
||||
|
@ -450,20 +465,20 @@ public class TestScannersWithFilters {
|
|||
s.setFilter(new PageFilter(expectedRows));
|
||||
verifyScan(s, expectedRows, expectedKeys);
|
||||
s.setFilter(new PageFilter(expectedRows));
|
||||
verifyScanFull(s, Arrays.copyOf(expectedKVs, 6));
|
||||
verifyScanFull(s, Arrays.copyOf(expectedKVs, 6));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInclusiveStopFilter() throws Exception {
|
||||
// Grab rows from group one
|
||||
|
||||
|
||||
// If we just use start/stop row, we get total/2 - 1 rows
|
||||
long expectedRows = (numRows / 2) - 1;
|
||||
long expectedKeys = colsPerRow;
|
||||
Scan s = new Scan(Bytes.toBytes("testRowOne-0"),
|
||||
Scan s = new Scan(Bytes.toBytes("testRowOne-0"),
|
||||
Bytes.toBytes("testRowOne-3"));
|
||||
verifyScan(s, expectedRows, expectedKeys);
|
||||
|
||||
|
||||
// Now use start row with inclusive stop filter
|
||||
expectedRows = numRows / 2;
|
||||
s = new Scan(Bytes.toBytes("testRowOne-0"));
|
||||
|
@ -471,14 +486,14 @@ public class TestScannersWithFilters {
|
|||
verifyScan(s, expectedRows, expectedKeys);
|
||||
|
||||
// Grab rows from group two
|
||||
|
||||
|
||||
// If we just use start/stop row, we get total/2 - 1 rows
|
||||
expectedRows = (numRows / 2) - 1;
|
||||
expectedKeys = colsPerRow;
|
||||
s = new Scan(Bytes.toBytes("testRowTwo-0"),
|
||||
s = new Scan(Bytes.toBytes("testRowTwo-0"),
|
||||
Bytes.toBytes("testRowTwo-3"));
|
||||
verifyScan(s, expectedRows, expectedKeys);
|
||||
|
||||
|
||||
// Now use start row with inclusive stop filter
|
||||
expectedRows = numRows / 2;
|
||||
s = new Scan(Bytes.toBytes("testRowTwo-0"));
|
||||
|
@ -496,7 +511,7 @@ public class TestScannersWithFilters {
|
|||
Scan s = new Scan();
|
||||
s.setFilter(f);
|
||||
verifyScanNoEarlyOut(s, expectedRows, expectedKeys);
|
||||
|
||||
|
||||
// Match keys less than same qualifier
|
||||
// Expect only two keys (one from each family) in half the rows
|
||||
expectedRows = numRows / 2;
|
||||
|
@ -506,9 +521,8 @@ public class TestScannersWithFilters {
|
|||
s = new Scan();
|
||||
s.setFilter(f);
|
||||
verifyScanNoEarlyOut(s, expectedRows, expectedKeys);
|
||||
|
||||
// Match keys less than or equal
|
||||
// Expect four keys (two from each family) in half the rows
|
||||
|
||||
// Match keys less than or equal. Expect four keys (two from each family) in half the rows
|
||||
expectedRows = numRows / 2;
|
||||
expectedKeys = 4;
|
||||
f = new QualifierFilter(CompareOp.LESS_OR_EQUAL,
|
||||
|
@ -516,9 +530,8 @@ public class TestScannersWithFilters {
|
|||
s = new Scan();
|
||||
s.setFilter(f);
|
||||
verifyScanNoEarlyOut(s, expectedRows, expectedKeys);
|
||||
|
||||
// Match keys not equal
|
||||
// Expect four keys (two from each family)
|
||||
|
||||
// Match keys not equal. Expect four keys (two from each family)
|
||||
// Only look in first group of rows
|
||||
expectedRows = numRows / 2;
|
||||
expectedKeys = 4;
|
||||
|
@ -527,9 +540,8 @@ public class TestScannersWithFilters {
|
|||
s = new Scan(HConstants.EMPTY_START_ROW, Bytes.toBytes("testRowTwo"));
|
||||
s.setFilter(f);
|
||||
verifyScanNoEarlyOut(s, expectedRows, expectedKeys);
|
||||
|
||||
// Match keys greater or equal
|
||||
// Expect four keys (two from each family)
|
||||
|
||||
// Match keys greater or equal. Expect four keys (two from each family)
|
||||
// Only look in first group of rows
|
||||
expectedRows = numRows / 2;
|
||||
expectedKeys = 4;
|
||||
|
@ -538,9 +550,8 @@ public class TestScannersWithFilters {
|
|||
s = new Scan(HConstants.EMPTY_START_ROW, Bytes.toBytes("testRowTwo"));
|
||||
s.setFilter(f);
|
||||
verifyScanNoEarlyOut(s, expectedRows, expectedKeys);
|
||||
|
||||
// Match keys greater
|
||||
// Expect two keys (one from each family)
|
||||
|
||||
// Match keys greater. Expect two keys (one from each family)
|
||||
// Only look in first group of rows
|
||||
expectedRows = numRows / 2;
|
||||
expectedKeys = 2;
|
||||
|
@ -549,95 +560,92 @@ public class TestScannersWithFilters {
|
|||
s = new Scan(HConstants.EMPTY_START_ROW, Bytes.toBytes("testRowTwo"));
|
||||
s.setFilter(f);
|
||||
verifyScanNoEarlyOut(s, expectedRows, expectedKeys);
|
||||
|
||||
// Match keys not equal to
|
||||
// Look across rows and fully validate the keys and ordering
|
||||
// Expect varied numbers of keys, 4 per row in group one, 6 per row in
|
||||
// group two
|
||||
|
||||
// Match keys not equal to. Look across rows and fully validate the keys and ordering
|
||||
// Expect varied numbers of keys, 4 per row in group one, 6 per row in group two
|
||||
f = new QualifierFilter(CompareOp.NOT_EQUAL,
|
||||
new BinaryComparator(QUALIFIERS_ONE[2]));
|
||||
s = new Scan();
|
||||
s.setFilter(f);
|
||||
|
||||
|
||||
KeyValue [] kvs = {
|
||||
// testRowOne-0
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[0], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[0], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[1], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[1], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
// testRowOne-2
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[0], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[0], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[1], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[1], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
// testRowOne-3
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[0], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[0], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[1], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[1], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
// testRowTwo-0
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowTwo-2
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowTwo-3
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowOne-0
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[0], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[0], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[1], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[1], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
// testRowOne-2
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[0], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[0], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[1], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[1], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
// testRowOne-3
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[0], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[0], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[1], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[1], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
// testRowTwo-0
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowTwo-2
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowTwo-3
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
};
|
||||
verifyScanFull(s, kvs);
|
||||
|
||||
// Test across rows and groups with a regex
|
||||
// Filter out "test*-2"
|
||||
|
||||
// Test across rows and groups with a regex. Filter out "test*-2"
|
||||
// Expect 4 keys per row across both groups
|
||||
f = new QualifierFilter(CompareOp.NOT_EQUAL,
|
||||
new RegexStringComparator("test.+-2"));
|
||||
s = new Scan();
|
||||
s.setFilter(f);
|
||||
|
||||
|
||||
kvs = new KeyValue [] {
|
||||
// testRowOne-0
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[0], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[0], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[1], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[1], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
// testRowOne-2
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[0], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[0], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[1], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[1], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
// testRowOne-3
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[0], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[0], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[1], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[1], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
// testRowTwo-0
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowTwo-2
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowTwo-3
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowOne-0
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[0], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[0], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[1], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[1], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
// testRowOne-2
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[0], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[0], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[1], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[1], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
// testRowOne-3
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[0], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[0], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[1], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[1], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
// testRowTwo-0
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowTwo-2
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowTwo-3
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
};
|
||||
verifyScanFull(s, kvs);
|
||||
}
|
||||
|
@ -652,7 +660,7 @@ public class TestScannersWithFilters {
|
|||
Scan s = new Scan();
|
||||
s.setFilter(f);
|
||||
verifyScanNoEarlyOut(s, expectedRows, expectedKeys);
|
||||
|
||||
|
||||
// Match a two rows, one from each group, using regex
|
||||
expectedRows = 2;
|
||||
expectedKeys = colsPerRow;
|
||||
|
@ -661,7 +669,7 @@ public class TestScannersWithFilters {
|
|||
s = new Scan();
|
||||
s.setFilter(f);
|
||||
verifyScanNoEarlyOut(s, expectedRows, expectedKeys);
|
||||
|
||||
|
||||
// Match rows less than
|
||||
// Expect all keys in one row
|
||||
expectedRows = 1;
|
||||
|
@ -671,7 +679,7 @@ public class TestScannersWithFilters {
|
|||
s = new Scan();
|
||||
s.setFilter(f);
|
||||
verifyScanNoEarlyOut(s, expectedRows, expectedKeys);
|
||||
|
||||
|
||||
// Match rows less than or equal
|
||||
// Expect all keys in two rows
|
||||
expectedRows = 2;
|
||||
|
@ -681,7 +689,7 @@ public class TestScannersWithFilters {
|
|||
s = new Scan();
|
||||
s.setFilter(f);
|
||||
verifyScanNoEarlyOut(s, expectedRows, expectedKeys);
|
||||
|
||||
|
||||
// Match rows not equal
|
||||
// Expect all keys in all but one row
|
||||
expectedRows = numRows - 1;
|
||||
|
@ -691,7 +699,7 @@ public class TestScannersWithFilters {
|
|||
s = new Scan();
|
||||
s.setFilter(f);
|
||||
verifyScanNoEarlyOut(s, expectedRows, expectedKeys);
|
||||
|
||||
|
||||
// Match keys greater or equal
|
||||
// Expect all keys in all but one row
|
||||
expectedRows = numRows - 1;
|
||||
|
@ -701,7 +709,7 @@ public class TestScannersWithFilters {
|
|||
s = new Scan();
|
||||
s.setFilter(f);
|
||||
verifyScanNoEarlyOut(s, expectedRows, expectedKeys);
|
||||
|
||||
|
||||
// Match keys greater
|
||||
// Expect all keys in all but two rows
|
||||
expectedRows = numRows - 2;
|
||||
|
@ -711,7 +719,7 @@ public class TestScannersWithFilters {
|
|||
s = new Scan();
|
||||
s.setFilter(f);
|
||||
verifyScanNoEarlyOut(s, expectedRows, expectedKeys);
|
||||
|
||||
|
||||
// Match rows not equal to testRowTwo-2
|
||||
// Look across rows and fully validate the keys and ordering
|
||||
// Should see all keys in all rows but testRowTwo-2
|
||||
|
@ -719,46 +727,46 @@ public class TestScannersWithFilters {
|
|||
new BinaryComparator(Bytes.toBytes("testRowOne-2")));
|
||||
s = new Scan();
|
||||
s.setFilter(f);
|
||||
|
||||
|
||||
KeyValue [] kvs = {
|
||||
// testRowOne-0
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[0], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[0], QUALIFIERS_ONE[2], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[0], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[1], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[1], QUALIFIERS_ONE[2], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[1], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
// testRowOne-3
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[0], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[0], QUALIFIERS_ONE[2], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[0], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[1], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[1], QUALIFIERS_ONE[2], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[1], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
// testRowTwo-0
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowTwo-2
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowTwo-3
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowOne-0
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[0], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[0], QUALIFIERS_ONE[2], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[0], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[1], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[1], QUALIFIERS_ONE[2], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[1], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
// testRowOne-3
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[0], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[0], QUALIFIERS_ONE[2], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[0], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[1], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[1], QUALIFIERS_ONE[2], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[1], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
// testRowTwo-0
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowTwo-2
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowTwo-3
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
};
|
||||
verifyScanFull(s, kvs);
|
||||
|
||||
|
||||
// Test across rows and groups with a regex
|
||||
// Filter out everything that doesn't match "*-2"
|
||||
// Expect all keys in two rows
|
||||
|
@ -766,22 +774,22 @@ public class TestScannersWithFilters {
|
|||
new RegexStringComparator(".+-2"));
|
||||
s = new Scan();
|
||||
s.setFilter(f);
|
||||
|
||||
|
||||
kvs = new KeyValue [] {
|
||||
// testRowOne-2
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[0], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[0], QUALIFIERS_ONE[2], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[0], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[1], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[1], QUALIFIERS_ONE[2], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[1], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
// testRowTwo-2
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1])
|
||||
// testRowOne-2
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[0], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[0], QUALIFIERS_ONE[2], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[0], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[1], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[1], QUALIFIERS_ONE[2], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[1], QUALIFIERS_ONE[3], VALUES[0]),
|
||||
// testRowTwo-2
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1])
|
||||
};
|
||||
verifyScanFull(s, kvs);
|
||||
}
|
||||
|
@ -824,7 +832,7 @@ public class TestScannersWithFilters {
|
|||
s = new Scan();
|
||||
s.setFilter(f);
|
||||
verifyScanNoEarlyOut(s, expectedRows, expectedKeys);
|
||||
|
||||
|
||||
// Match values less than or equal
|
||||
// Expect all rows
|
||||
expectedRows = numRows;
|
||||
|
@ -844,7 +852,7 @@ public class TestScannersWithFilters {
|
|||
s = new Scan();
|
||||
s.setFilter(f);
|
||||
verifyScanNoEarlyOut(s, expectedRows, expectedKeys);
|
||||
|
||||
|
||||
// Match values not equal
|
||||
// Expect half the rows
|
||||
expectedRows = numRows / 2;
|
||||
|
@ -854,7 +862,7 @@ public class TestScannersWithFilters {
|
|||
s = new Scan();
|
||||
s.setFilter(f);
|
||||
verifyScanNoEarlyOut(s, expectedRows, expectedKeys);
|
||||
|
||||
|
||||
// Match values greater or equal
|
||||
// Expect all rows
|
||||
expectedRows = numRows;
|
||||
|
@ -864,7 +872,7 @@ public class TestScannersWithFilters {
|
|||
s = new Scan();
|
||||
s.setFilter(f);
|
||||
verifyScanNoEarlyOut(s, expectedRows, expectedKeys);
|
||||
|
||||
|
||||
// Match values greater
|
||||
// Expect half rows
|
||||
expectedRows = numRows / 2;
|
||||
|
@ -874,7 +882,7 @@ public class TestScannersWithFilters {
|
|||
s = new Scan();
|
||||
s.setFilter(f);
|
||||
verifyScanNoEarlyOut(s, expectedRows, expectedKeys);
|
||||
|
||||
|
||||
// Match values not equal to testValueOne
|
||||
// Look across rows and fully validate the keys and ordering
|
||||
// Should see all keys in all group two rows
|
||||
|
@ -882,29 +890,29 @@ public class TestScannersWithFilters {
|
|||
new BinaryComparator(Bytes.toBytes("testValueOne")));
|
||||
s = new Scan();
|
||||
s.setFilter(f);
|
||||
|
||||
|
||||
KeyValue [] kvs = {
|
||||
// testRowTwo-0
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowTwo-2
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowTwo-3
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowTwo-0
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowTwo-2
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowTwo-3
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
};
|
||||
verifyScanFull(s, kvs);
|
||||
}
|
||||
|
@ -917,36 +925,36 @@ public class TestScannersWithFilters {
|
|||
new BinaryComparator(Bytes.toBytes("testQualifierOne-2"))));
|
||||
Scan s = new Scan();
|
||||
s.setFilter(f);
|
||||
|
||||
|
||||
KeyValue [] kvs = {
|
||||
// testRowTwo-0
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowTwo-2
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowTwo-3
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowTwo-0
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowTwo-2
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
// testRowTwo-3
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[2], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[1], QUALIFIERS_TWO[3], VALUES[1]),
|
||||
};
|
||||
verifyScanFull(s, kvs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFilterList() throws Exception {
|
||||
// Test getting a single row, single key using Row, Qualifier, and Value
|
||||
// Test getting a single row, single key using Row, Qualifier, and Value
|
||||
// regular expression and substring filters
|
||||
// Use must pass all
|
||||
List<Filter> filters = new ArrayList<Filter>();
|
||||
|
@ -961,7 +969,7 @@ public class TestScannersWithFilters {
|
|||
s.addFamily(FAMILIES[0]);
|
||||
s.setFilter(f);
|
||||
KeyValue [] kvs = {
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[0], QUALIFIERS_ONE[2], VALUES[0])
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[0], QUALIFIERS_ONE[2], VALUES[0])
|
||||
};
|
||||
verifyScanFull(s, kvs);
|
||||
|
||||
|
@ -986,15 +994,13 @@ public class TestScannersWithFilters {
|
|||
s.setFilter(new FirstKeyOnlyFilter());
|
||||
// Expected KVs, the first KV from each of the remaining 6 rows
|
||||
KeyValue [] kvs = {
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[0], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[0], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[0], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1])
|
||||
new KeyValue(ROWS_ONE[0], FAMILIES[0], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[2], FAMILIES[0], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_ONE[3], FAMILIES[0], QUALIFIERS_ONE[0], VALUES[0]),
|
||||
new KeyValue(ROWS_TWO[0], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[2], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1]),
|
||||
new KeyValue(ROWS_TWO[3], FAMILIES[0], QUALIFIERS_TWO[0], VALUES[1])
|
||||
};
|
||||
verifyScanFull(s, kvs);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue