HBASE-1646 Scan-s can't set a Filter
git-svn-id: https://svn.apache.org/repos/asf/hadoop/hbase/trunk@793431 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
67f428cc42
commit
c493cd3bcc
|
@ -257,6 +257,7 @@ Release 0.20.0 - Unreleased
|
|||
HBASE-1644 Result.row is cached in getRow; this breaks MapReduce
|
||||
(Doğacan Güney via Stack)
|
||||
HBASE-1639 clean checkout with empty hbase-site.xml, zk won't start
|
||||
HBASE-1646 Scan-s can't set a Filter (Doğacan Güney via Stack)
|
||||
|
||||
IMPROVEMENTS
|
||||
HBASE-1089 Add count of regions on filesystem to master UI; add percentage
|
||||
|
|
|
@ -25,10 +25,10 @@ import org.apache.hadoop.hbase.HConstants;
|
|||
import org.apache.hadoop.hbase.KeyValue;
|
||||
import org.apache.hadoop.hbase.filter.Filter;
|
||||
import org.apache.hadoop.hbase.filter.RowFilterInterface;
|
||||
import org.apache.hadoop.hbase.io.HbaseObjectWritable;
|
||||
import org.apache.hadoop.hbase.io.TimeRange;
|
||||
import org.apache.hadoop.hbase.util.Bytes;
|
||||
import org.apache.hadoop.io.Writable;
|
||||
import org.apache.hadoop.io.WritableFactories;
|
||||
|
||||
import java.io.DataInput;
|
||||
import java.io.DataOutput;
|
||||
|
@ -476,21 +476,31 @@ public class Scan implements Writable {
|
|||
return sb.toString();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private Writable createForName(String className) {
|
||||
try {
|
||||
Class<? extends Writable> clazz =
|
||||
(Class<? extends Writable>) Class.forName(className);
|
||||
return WritableFactories.newInstance(clazz, new Configuration());
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new RuntimeException("Can't find class " + className);
|
||||
}
|
||||
}
|
||||
|
||||
//Writable
|
||||
public void readFields(final DataInput in)
|
||||
throws IOException {
|
||||
this.startRow = Bytes.readByteArray(in);
|
||||
this.stopRow = Bytes.readByteArray(in);
|
||||
this.maxVersions = in.readInt();
|
||||
boolean hasFilter = in.readBoolean();
|
||||
if(hasFilter) {
|
||||
this.filter = (Filter)HbaseObjectWritable.readObject(in,
|
||||
new Configuration());
|
||||
if(in.readBoolean()) {
|
||||
this.filter = (Filter)createForName(Bytes.toString(Bytes.readByteArray(in)));
|
||||
this.filter.readFields(in);
|
||||
}
|
||||
boolean hasOldFilter = in.readBoolean();
|
||||
if (hasOldFilter) {
|
||||
this.oldFilter = (RowFilterInterface)HbaseObjectWritable.readObject(in,
|
||||
new Configuration());
|
||||
if (in.readBoolean()) {
|
||||
this.oldFilter =
|
||||
(RowFilterInterface)createForName(Bytes.toString(Bytes.readByteArray(in)));
|
||||
this.oldFilter.readFields(in);
|
||||
}
|
||||
this.tr = new TimeRange();
|
||||
tr.readFields(in);
|
||||
|
@ -518,15 +528,15 @@ public class Scan implements Writable {
|
|||
out.writeBoolean(false);
|
||||
} else {
|
||||
out.writeBoolean(true);
|
||||
HbaseObjectWritable.writeObject(out, this.filter,
|
||||
Filter.class, null);
|
||||
Bytes.writeByteArray(out, Bytes.toBytes(filter.getClass().getName()));
|
||||
filter.write(out);
|
||||
}
|
||||
if (this.oldFilter == null) {
|
||||
out.writeBoolean(false);
|
||||
} else {
|
||||
out.writeBoolean(true);
|
||||
HbaseObjectWritable.writeObject(out, this.oldFilter,
|
||||
RowFilterInterface.class, null);
|
||||
Bytes.writeByteArray(out, Bytes.toBytes(oldFilter.getClass().getName()));
|
||||
oldFilter.write(out);
|
||||
}
|
||||
tr.write(out);
|
||||
out.writeInt(familyMap.size());
|
||||
|
|
|
@ -22,12 +22,11 @@ package org.apache.hadoop.hbase;
|
|||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.NavigableSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.apache.hadoop.hbase.client.Delete;
|
||||
import org.apache.hadoop.hbase.client.Get;
|
||||
|
@ -35,6 +34,8 @@ import org.apache.hadoop.hbase.client.Put;
|
|||
import org.apache.hadoop.hbase.client.Result;
|
||||
import org.apache.hadoop.hbase.client.RowLock;
|
||||
import org.apache.hadoop.hbase.client.Scan;
|
||||
import org.apache.hadoop.hbase.filter.Filter;
|
||||
import org.apache.hadoop.hbase.filter.PrefixFilter;
|
||||
import org.apache.hadoop.hbase.io.BatchOperation;
|
||||
import org.apache.hadoop.hbase.io.BatchUpdate;
|
||||
import org.apache.hadoop.hbase.io.Cell;
|
||||
|
@ -44,7 +45,6 @@ import org.apache.hadoop.hbase.io.TimeRange;
|
|||
import org.apache.hadoop.hbase.util.Bytes;
|
||||
import org.apache.hadoop.hbase.util.Writables;
|
||||
import org.apache.hadoop.io.DataInputBuffer;
|
||||
import org.apache.hadoop.io.Writable;
|
||||
|
||||
/**
|
||||
* Test HBase Writables serializations
|
||||
|
@ -370,6 +370,15 @@ public class TestSerialization extends HBaseTestCase {
|
|||
for(byte[] column : set){
|
||||
assertTrue(desSet.contains(column));
|
||||
}
|
||||
|
||||
// Test filters are serialized properly.
|
||||
scan = new Scan(startRow);
|
||||
byte [] prefix = Bytes.toBytes(getName());
|
||||
scan.setFilter(new PrefixFilter(prefix));
|
||||
sb = Writables.getBytes(scan);
|
||||
desScan = (Scan)Writables.getWritable(sb, new Scan());
|
||||
Filter f = desScan.getFilter();
|
||||
assertTrue(f instanceof PrefixFilter);
|
||||
}
|
||||
|
||||
assertEquals(scan.getMaxVersions(), desScan.getMaxVersions());
|
||||
|
|
Loading…
Reference in New Issue