From 73731d923126efdfd48152ce3db4dac84f7415f9 Mon Sep 17 00:00:00 2001 From: Enis Soztutar Date: Fri, 5 Sep 2014 18:48:38 -0700 Subject: [PATCH] HBASE-10841 Scan,Get,Put,Delete,etc setters should consistently return this --- .../apache/hadoop/hbase/client/Append.java | 59 +++++++++++++++- .../hadoop/hbase/client/Attributes.java | 2 +- .../apache/hadoop/hbase/client/Delete.java | 59 +++++++++++++++- .../org/apache/hadoop/hbase/client/Get.java | 46 ++++++++++++- .../apache/hadoop/hbase/client/Increment.java | 57 ++++++++++++++++ .../apache/hadoop/hbase/client/Mutation.java | 24 ++++--- .../hbase/client/OperationWithAttributes.java | 11 ++- .../org/apache/hadoop/hbase/client/Put.java | 56 ++++++++++++++++ .../org/apache/hadoop/hbase/client/Query.java | 15 +++-- .../org/apache/hadoop/hbase/client/Scan.java | 67 ++++++++++++++++--- .../hadoop/hbase/client/TestOperation.java | 52 +++++++++++++- hbase-shell/src/main/ruby/hbase/table.rb | 4 +- 12 files changed, 415 insertions(+), 37 deletions(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Append.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Append.java index 05bca9f2fc0..054c9b4985b 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Append.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Append.java @@ -20,12 +20,16 @@ package org.apache.hadoop.hbase.client; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.NavigableMap; +import java.util.UUID; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.KeyValueUtil; +import org.apache.hadoop.hbase.security.access.Permission; +import org.apache.hadoop.hbase.security.visibility.CellVisibility; import org.apache.hadoop.hbase.util.Bytes; /** @@ -50,8 +54,9 @@ public class Append extends Mutation { * A client that is not interested in the result can save network * bandwidth setting this to false. */ - public void setReturnResults(boolean returnResults) { + public Append setReturnResults(boolean returnResults) { setAttribute(RETURN_RESULTS, Bytes.toBytes(returnResults)); + return this; } /** @@ -127,4 +132,56 @@ public class Append extends Mutation { this.familyMap.put(family, list); return this; } + + @Override + public Append setAttribute(String name, byte[] value) { + return (Append) super.setAttribute(name, value); + } + + @Override + public Append setId(String id) { + return (Append) super.setId(id); + } + + @Override + @Deprecated + public Append setWriteToWAL(boolean write) { + return (Append) super.setWriteToWAL(write); + } + + @Override + public Append setDurability(Durability d) { + return (Append) super.setDurability(d); + } + + @Override + public Append setFamilyCellMap(NavigableMap> map) { + return (Append) super.setFamilyCellMap(map); + } + + @Override + @Deprecated + public Append setFamilyMap(NavigableMap> map) { + return (Append) super.setFamilyMap(map); + } + + @Override + public Append setClusterIds(List clusterIds) { + return (Append) super.setClusterIds(clusterIds); + } + + @Override + public Append setCellVisibility(CellVisibility expression) { + return (Append) super.setCellVisibility(expression); + } + + @Override + public Append setACL(String user, Permission perms) { + return (Append) super.setACL(user, perms); + } + + @Override + public Append setACL(Map perms) { + return (Append) super.setACL(perms); + } } diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Attributes.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Attributes.java index b1307780bdb..e918351df40 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Attributes.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Attributes.java @@ -34,7 +34,7 @@ public interface Attributes { * @param name attribute name * @param value attribute value */ - void setAttribute(String name, byte[] value); + Attributes setAttribute(String name, byte[] value); /** * Gets an attribute diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Delete.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Delete.java index 0b6d618d68b..ccba194c32f 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Delete.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Delete.java @@ -23,6 +23,8 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.NavigableMap; +import java.util.UUID; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; @@ -30,6 +32,8 @@ import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellUtil; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.KeyValue; +import org.apache.hadoop.hbase.security.access.Permission; +import org.apache.hadoop.hbase.security.visibility.CellVisibility; import org.apache.hadoop.hbase.util.Bytes; /** @@ -308,11 +312,12 @@ public class Delete extends Mutation implements Comparable { * * @param timestamp */ - public void setTimestamp(long timestamp) { + public Delete setTimestamp(long timestamp) { if (timestamp < 0) { throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + timestamp); } this.ts = timestamp; + return this; } @Override @@ -323,4 +328,56 @@ public class Delete extends Mutation implements Comparable { map.put("ts", this.ts); return map; } + + @Override + public Delete setAttribute(String name, byte[] value) { + return (Delete) super.setAttribute(name, value); + } + + @Override + public Delete setId(String id) { + return (Delete) super.setId(id); + } + + @Override + @Deprecated + public Delete setWriteToWAL(boolean write) { + return (Delete) super.setWriteToWAL(write); + } + + @Override + public Delete setDurability(Durability d) { + return (Delete) super.setDurability(d); + } + + @Override + public Delete setFamilyCellMap(NavigableMap> map) { + return (Delete) super.setFamilyCellMap(map); + } + + @Override + @Deprecated + public Delete setFamilyMap(NavigableMap> map) { + return (Delete) super.setFamilyMap(map); + } + + @Override + public Delete setClusterIds(List clusterIds) { + return (Delete) super.setClusterIds(clusterIds); + } + + @Override + public Delete setCellVisibility(CellVisibility expression) { + return (Delete) super.setCellVisibility(expression); + } + + @Override + public Delete setACL(String user, Permission perms) { + return (Delete) super.setACL(user, perms); + } + + @Override + public Delete setACL(Map perms) { + return (Delete) super.setACL(perms); + } } diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Get.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Get.java index 2d1348f9944..2a872f48b86 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Get.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Get.java @@ -36,6 +36,8 @@ import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.filter.Filter; import org.apache.hadoop.hbase.io.TimeRange; +import org.apache.hadoop.hbase.security.access.Permission; +import org.apache.hadoop.hbase.security.visibility.Authorizations; import org.apache.hadoop.hbase.util.Bytes; /** @@ -114,16 +116,18 @@ public class Get extends Query return checkExistenceOnly; } - public void setCheckExistenceOnly(boolean checkExistenceOnly) { + public Get setCheckExistenceOnly(boolean checkExistenceOnly) { this.checkExistenceOnly = checkExistenceOnly; + return this; } public boolean isClosestRowBefore() { return closestRowBefore; } - public void setClosestRowBefore(boolean closestRowBefore) { + public Get setClosestRowBefore(boolean closestRowBefore) { this.closestRowBefore = closestRowBefore; + return this; } /** @@ -253,8 +257,9 @@ public class Get extends Query * @param cacheBlocks if false, default settings are overridden and blocks * will not be cached */ - public void setCacheBlocks(boolean cacheBlocks) { + public Get setCacheBlocks(boolean cacheBlocks) { this.cacheBlocks = cacheBlocks; + return this; } /** @@ -442,4 +447,39 @@ public class Get extends Query // TODO: This is wrong. Can't have two gets the same just because on same row. return compareTo(other) == 0; } + + @Override + public Get setAttribute(String name, byte[] value) { + return (Get) super.setAttribute(name, value); + } + + @Override + public Get setId(String id) { + return (Get) super.setId(id); + } + + @Override + public Get setAuthorizations(Authorizations authorizations) { + return (Get) super.setAuthorizations(authorizations); + } + + @Override + public Get setACL(Map perms) { + return (Get) super.setACL(perms); + } + + @Override + public Get setACL(String user, Permission perms) { + return (Get) super.setACL(user, perms); + } + + @Override + public Get setConsistency(Consistency consistency) { + return (Get) super.setConsistency(consistency); + } + + @Override + public Get setReplicaId(int Id) { + return (Get) super.setReplicaId(Id); + } } diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Increment.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Increment.java index 0af469588a1..1560da5098e 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Increment.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Increment.java @@ -23,6 +23,7 @@ import java.util.List; import java.util.Map; import java.util.NavigableMap; import java.util.TreeMap; +import java.util.UUID; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; @@ -30,6 +31,8 @@ import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.KeyValueUtil; import org.apache.hadoop.hbase.io.TimeRange; +import org.apache.hadoop.hbase.security.access.Permission; +import org.apache.hadoop.hbase.security.visibility.CellVisibility; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.ClassSize; @@ -166,6 +169,7 @@ public class Increment extends Mutation implements Comparable { * Method for retrieving the number of families to increment from * @return number of families */ + @Override public int numFamilies() { return this.familyMap.size(); } @@ -274,7 +278,60 @@ public class Increment extends Mutation implements Comparable { return compareTo(other) == 0; } + @Override protected long extraHeapSize(){ return HEAP_OVERHEAD; } + + @Override + public Increment setAttribute(String name, byte[] value) { + return (Increment) super.setAttribute(name, value); + } + + @Override + public Increment setId(String id) { + return (Increment) super.setId(id); + } + + @Override + @Deprecated + public Increment setWriteToWAL(boolean write) { + return (Increment) super.setWriteToWAL(write); + } + + @Override + public Increment setDurability(Durability d) { + return (Increment) super.setDurability(d); + } + + @Override + public Increment setFamilyCellMap(NavigableMap> map) { + return (Increment) super.setFamilyCellMap(map); + } + + @Override + @Deprecated + public Increment setFamilyMap(NavigableMap> map) { + return (Increment) super.setFamilyMap(map); + } + + @Override + public Increment setClusterIds(List clusterIds) { + return (Increment) super.setClusterIds(clusterIds); + } + + @Override + public Increment setCellVisibility(CellVisibility expression) { + return (Increment) super.setCellVisibility(expression); + } + + @Override + public Increment setACL(String user, Permission perms) { + return (Increment) super.setACL(user, perms); + } + + @Override + public Increment setACL(Map perms) { + return (Increment) super.setACL(perms); + } } \ No newline at end of file diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Mutation.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Mutation.java index e8535b7a5ba..ae14aac76db 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Mutation.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Mutation.java @@ -226,16 +226,18 @@ public abstract class Mutation extends OperationWithAttributes implements Row, C * @deprecated Use {@link #setDurability(Durability)} instead. */ @Deprecated - public void setWriteToWAL(boolean write) { + public Mutation setWriteToWAL(boolean write) { setDurability(write ? Durability.USE_DEFAULT : Durability.SKIP_WAL); + return this; } /** * Set the durability for this mutation * @param d */ - public void setDurability(Durability d) { + public Mutation setDurability(Durability d) { this.durability = d; + return this; } /** Get the current durability */ @@ -254,10 +256,11 @@ public abstract class Mutation extends OperationWithAttributes implements Row, C /** * Method for setting the put's familyMap */ - public void setFamilyCellMap(NavigableMap> map) { + public Mutation setFamilyCellMap(NavigableMap> map) { // TODO: Shut this down or move it up to be a Constructor. Get new object rather than change // this internal data member. this.familyMap = map; + return this; } /** @@ -284,12 +287,13 @@ public abstract class Mutation extends OperationWithAttributes implements Row, C * @deprecated use {@link #setFamilyCellMap(NavigableMap)} instead. */ @Deprecated - public void setFamilyMap(NavigableMap> map) { + public Mutation setFamilyMap(NavigableMap> map) { TreeMap> fm = new TreeMap>(Bytes.BYTES_COMPARATOR); for (Map.Entry> e : map.entrySet()) { fm.put(e.getKey(), Lists.newArrayList(e.getValue())); } this.familyMap = fm; + return this; } /** @@ -326,7 +330,7 @@ public abstract class Mutation extends OperationWithAttributes implements Row, C * Marks that the clusters with the given clusterIds have consumed the mutation * @param clusterIds of the clusters that have consumed the mutation */ - public void setClusterIds(List clusterIds) { + public Mutation setClusterIds(List clusterIds) { ByteArrayDataOutput out = ByteStreams.newDataOutput(); out.writeInt(clusterIds.size()); for (UUID clusterId : clusterIds) { @@ -334,6 +338,7 @@ public abstract class Mutation extends OperationWithAttributes implements Row, C out.writeLong(clusterId.getLeastSignificantBits()); } setAttribute(CONSUMED_CLUSTER_IDS, out.toByteArray()); + return this; } /** @@ -357,9 +362,10 @@ public abstract class Mutation extends OperationWithAttributes implements Row, C * It is illegal to set CellVisibility on Delete mutation. * @param expression */ - public void setCellVisibility(CellVisibility expression) { + public Mutation setCellVisibility(CellVisibility expression) { this.setAttribute(VisibilityConstants.VISIBILITY_LABELS_ATTR_KEY, ProtobufUtil .toCellVisibility(expression).toByteArray()); + return this; } /** @@ -437,21 +443,23 @@ public abstract class Mutation extends OperationWithAttributes implements Row, C * @param user User short name * @param perms Permissions for the user */ - public void setACL(String user, Permission perms) { + public Mutation setACL(String user, Permission perms) { setAttribute(AccessControlConstants.OP_ATTRIBUTE_ACL, ProtobufUtil.toUsersAndPermissions(user, perms).toByteArray()); + return this; } /** * @param perms A map of permissions for a user or users */ - public void setACL(Map perms) { + public Mutation setACL(Map perms) { ListMultimap permMap = ArrayListMultimap.create(); for (Map.Entry entry : perms.entrySet()) { permMap.put(entry.getKey(), entry.getValue()); } setAttribute(AccessControlConstants.OP_ATTRIBUTE_ACL, ProtobufUtil.toUsersAndPermissions(permMap).toByteArray()); + return this; } /** diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/OperationWithAttributes.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/OperationWithAttributes.java index 6855fee162d..9188e1943fc 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/OperationWithAttributes.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/OperationWithAttributes.java @@ -37,9 +37,10 @@ public abstract class OperationWithAttributes extends Operation implements Attri // used for uniquely identifying an operation public static final String ID_ATRIBUTE = "_operation.attributes.id"; - public void setAttribute(String name, byte[] value) { + @Override + public OperationWithAttributes setAttribute(String name, byte[] value) { if (attributes == null && value == null) { - return; + return this; } if (attributes == null) { @@ -54,8 +55,10 @@ public abstract class OperationWithAttributes extends Operation implements Attri } else { attributes.put(name, value); } + return this; } + @Override public byte[] getAttribute(String name) { if (attributes == null) { return null; @@ -64,6 +67,7 @@ public abstract class OperationWithAttributes extends Operation implements Attri return attributes.get(name); } + @Override public Map getAttributesMap() { if (attributes == null) { return Collections.emptyMap(); @@ -92,8 +96,9 @@ public abstract class OperationWithAttributes extends Operation implements Attri * @param id * id to set for the scan */ - public void setId(String id) { + public OperationWithAttributes setId(String id) { setAttribute(ID_ATRIBUTE, Bytes.toBytes(id)); + return this; } /** diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Put.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Put.java index 3fa4f4b7508..9ba261497a7 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Put.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Put.java @@ -24,7 +24,9 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.NavigableMap; import java.util.TreeMap; +import java.util.UUID; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; @@ -34,6 +36,8 @@ import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.Tag; import org.apache.hadoop.hbase.io.HeapSize; +import org.apache.hadoop.hbase.security.access.Permission; +import org.apache.hadoop.hbase.security.visibility.CellVisibility; import org.apache.hadoop.hbase.util.Bytes; /** @@ -416,4 +420,56 @@ public class Put extends Mutation implements HeapSize, Comparable { } return filteredList; } + + @Override + public Put setAttribute(String name, byte[] value) { + return (Put) super.setAttribute(name, value); + } + + @Override + public Put setId(String id) { + return (Put) super.setId(id); + } + + @Override + @Deprecated + public Put setWriteToWAL(boolean write) { + return (Put) super.setWriteToWAL(write); + } + + @Override + public Put setDurability(Durability d) { + return (Put) super.setDurability(d); + } + + @Override + public Put setFamilyCellMap(NavigableMap> map) { + return (Put) super.setFamilyCellMap(map); + } + + @Override + @Deprecated + public Put setFamilyMap(NavigableMap> map) { + return (Put) super.setFamilyMap(map); + } + + @Override + public Put setClusterIds(List clusterIds) { + return (Put) super.setClusterIds(clusterIds); + } + + @Override + public Put setCellVisibility(CellVisibility expression) { + return (Put) super.setCellVisibility(expression); + } + + @Override + public Put setACL(String user, Permission perms) { + return (Put) super.setACL(user, perms); + } + + @Override + public Put setACL(Map perms) { + return (Put) super.setACL(perms); + } } diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Query.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Query.java index bbfa94046d4..6706cefef67 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Query.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Query.java @@ -61,9 +61,10 @@ public abstract class Query extends OperationWithAttributes { * Sets the authorizations to be used by this Query * @param authorizations */ - public void setAuthorizations(Authorizations authorizations) { + public Query setAuthorizations(Authorizations authorizations) { this.setAttribute(VisibilityConstants.VISIBILITY_LABELS_ATTR_KEY, ProtobufUtil .toAuthorizations(authorizations).toByteArray()); + return this; } /** @@ -87,21 +88,23 @@ public abstract class Query extends OperationWithAttributes { * @param user User short name * @param perms Permissions for the user */ - public void setACL(String user, Permission perms) { + public Query setACL(String user, Permission perms) { setAttribute(AccessControlConstants.OP_ATTRIBUTE_ACL, ProtobufUtil.toUsersAndPermissions(user, perms).toByteArray()); + return this; } /** * @param perms A map of permissions for a user or users */ - public void setACL(Map perms) { + public Query setACL(Map perms) { ListMultimap permMap = ArrayListMultimap.create(); for (Map.Entry entry : perms.entrySet()) { permMap.put(entry.getKey(), entry.getValue()); } setAttribute(AccessControlConstants.OP_ATTRIBUTE_ACL, ProtobufUtil.toUsersAndPermissions(permMap).toByteArray()); + return this; } /** @@ -116,8 +119,9 @@ public abstract class Query extends OperationWithAttributes { * Sets the consistency level for this operation * @param consistency the consistency level */ - public void setConsistency(Consistency consistency) { + public Query setConsistency(Consistency consistency) { this.consistency = consistency; + return this; } /** @@ -127,8 +131,9 @@ public abstract class Query extends OperationWithAttributes { *
Expert: This is an advanced API exposed. Only use it if you know what you are doing * @param Id */ - public void setReplicaId(int Id) { + public Query setReplicaId(int Id) { this.targetReplicaId = Id; + return this; } /** diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Scan.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Scan.java index d42433d9316..734d36f1786 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Scan.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Scan.java @@ -36,6 +36,8 @@ import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.filter.Filter; import org.apache.hadoop.hbase.filter.IncompatibleFilterException; import org.apache.hadoop.hbase.io.TimeRange; +import org.apache.hadoop.hbase.security.access.Permission; +import org.apache.hadoop.hbase.security.visibility.Authorizations; import org.apache.hadoop.hbase.util.Bytes; /** @@ -378,29 +380,32 @@ public class Scan extends Query { * Set the maximum number of values to return for each call to next() * @param batch the maximum number of values */ - public void setBatch(int batch) { + public Scan setBatch(int batch) { if (this.hasFilter() && this.filter.hasFilterRow()) { throw new IncompatibleFilterException( "Cannot set batch on a scan using a filter" + " that returns true for filter.hasFilterRow"); } this.batch = batch; + return this; } /** * Set the maximum number of values to return per row per Column Family * @param limit the maximum number of values returned / row / CF */ - public void setMaxResultsPerColumnFamily(int limit) { + public Scan setMaxResultsPerColumnFamily(int limit) { this.storeLimit = limit; + return this; } /** * Set offset for the row per Column Family. * @param offset is the number of kvs that will be skipped. */ - public void setRowOffsetPerColumnFamily(int offset) { + public Scan setRowOffsetPerColumnFamily(int offset) { this.storeOffset = offset; + return this; } /** @@ -409,8 +414,9 @@ public class Scan extends Query { * Higher caching values will enable faster scanners but will use more memory. * @param caching the number of rows for caching */ - public void setCaching(int caching) { + public Scan setCaching(int caching) { this.caching = caching; + return this; } /** @@ -427,8 +433,9 @@ public class Scan extends Query { * * @param maxResultSize The maximum result size in bytes. */ - public void setMaxResultSize(long maxResultSize) { + public Scan setMaxResultSize(long maxResultSize) { this.maxResultSize = maxResultSize; + return this; } @Override @@ -565,8 +572,9 @@ public class Scan extends Query { * @param cacheBlocks if false, default settings are overridden and blocks * will not be cached */ - public void setCacheBlocks(boolean cacheBlocks) { + public Scan setCacheBlocks(boolean cacheBlocks) { this.cacheBlocks = cacheBlocks; + return this; } /** @@ -615,8 +623,9 @@ public class Scan extends Query { * - if there's a concurrent split and you have more than 2 column families, some rows may be * missing some column families. */ - public void setLoadColumnFamiliesOnDemand(boolean value) { + public Scan setLoadColumnFamiliesOnDemand(boolean value) { this.loadColumnFamiliesOnDemand = value; + return this; } /** @@ -729,8 +738,9 @@ public class Scan extends Query { * It is an error to specify any column when "raw" is set. * @param raw True/False to enable/disable "raw" mode. */ - public void setRaw(boolean raw) { + public Scan setRaw(boolean raw) { setAttribute(RAW_ATTR, Bytes.toBytes(raw)); + return this; } /** @@ -752,8 +762,9 @@ public class Scan extends Query { * is assumed to be READ_COMMITTED. * @param level IsolationLevel for this scan */ - public void setIsolationLevel(IsolationLevel level) { + public Scan setIsolationLevel(IsolationLevel level) { setAttribute(ISOLATION_LEVEL, level.toBytes()); + return this; } /* * @return The isolation level of this scan. @@ -787,8 +798,9 @@ public class Scan extends Query { * * @param small */ - public void setSmall(boolean small) { + public Scan setSmall(boolean small) { this.small = small; + return this; } /** @@ -798,4 +810,39 @@ public class Scan extends Query { public boolean isSmall() { return small; } + + @Override + public Scan setAttribute(String name, byte[] value) { + return (Scan) super.setAttribute(name, value); + } + + @Override + public Scan setId(String id) { + return (Scan) super.setId(id); + } + + @Override + public Scan setAuthorizations(Authorizations authorizations) { + return (Scan) super.setAuthorizations(authorizations); + } + + @Override + public Scan setACL(Map perms) { + return (Scan) super.setACL(perms); + } + + @Override + public Scan setACL(String user, Permission perms) { + return (Scan) super.setACL(user, perms); + } + + @Override + public Scan setConsistency(Consistency consistency) { + return (Scan) super.setConsistency(consistency); + } + + @Override + public Scan setReplicaId(int Id) { + return (Scan) super.setReplicaId(Id); + } } diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestOperation.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestOperation.java index dd8eb624dca..bec74f58abf 100644 --- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestOperation.java +++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestOperation.java @@ -20,6 +20,7 @@ package org.apache.hadoop.hbase.client; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellUtil; @@ -30,6 +31,7 @@ import org.junit.Assert; import org.junit.Test; import java.io.IOException; +import java.lang.reflect.Method; import java.nio.ByteBuffer; import java.util.Arrays; import java.util.HashMap; @@ -291,7 +293,7 @@ public class TestOperation { } /** - * Test the client Operations' JSON encoding to ensure that produced JSON is + * Test the client Operations' JSON encoding to ensure that produced JSON is * parseable and that the details are present and not corrupted. * @throws IOException */ @@ -352,7 +354,7 @@ public class TestOperation { assertEquals("Qualifier incorrect in Put.toJSON()", Bytes.toStringBinary(QUALIFIER), kvMap.get("qualifier")); - assertEquals("Value length incorrect in Put.toJSON()", + assertEquals("Value length incorrect in Put.toJSON()", VALUE.length, kvMap.get("vlen")); // produce a Delete operation @@ -370,7 +372,7 @@ public class TestOperation { assertNotNull("Family absent in Delete.toJSON()", familyInfo); assertEquals("KeyValue absent in Delete.toJSON()", 1, familyInfo.size()); kvMap = (Map) familyInfo.get(0); - assertEquals("Qualifier incorrect in Delete.toJSON()", + assertEquals("Qualifier incorrect in Delete.toJSON()", Bytes.toStringBinary(QUALIFIER), kvMap.get("qualifier")); } @@ -419,6 +421,50 @@ public class TestOperation { Assert.assertEquals(0, KeyValue.COMPARATOR.compare(c.get(0), new KeyValue(c.get(0)))); } + @Test + @SuppressWarnings("rawtypes") + public void testOperationSubClassMethodsAreBuilderStyle() { + /* All Operation subclasses should have a builder style setup where setXXX/addXXX methods + * can be chainable together: + * . For example: + * Scan scan = new Scan() + * .setFoo(foo) + * .setBar(bar) + * .setBuz(buz) + * + * This test ensures that all methods starting with "set" returns an Operation object + */ + + // TODO: We should ensure all subclasses of Operation is checked. + Class[] classes = new Class[] { + Operation.class, + OperationWithAttributes.class, + Mutation.class, + Query.class, + Delete.class, + Increment.class, + Append.class, + Put.class, + Get.class, + Scan.class}; + + for (Class clazz : classes) { + System.out.println("Checking " + clazz); + Method[] methods = clazz.getDeclaredMethods(); + for (Method method : methods) { + Class ret = method.getReturnType(); + if (method.getName().startsWith("set") || method.getName().startsWith("add")) { + System.out.println(" " + clazz.getSimpleName() + "." + method.getName() + "() : " + + ret.getSimpleName()); + String errorMsg = "All setXXX() methods in " + clazz.getSimpleName() + " should return a " + + clazz.getSimpleName() + " object in builder style. Offending method:" + + method.getName(); + assertTrue(errorMsg, Operation.class.isAssignableFrom(ret) + || Attributes.class.isAssignableFrom(ret)); // for setAttributes() + } + } + } + } } diff --git a/hbase-shell/src/main/ruby/hbase/table.rb b/hbase-shell/src/main/ruby/hbase/table.rb index 2a350c138c0..cc4f2a7cba2 100644 --- a/hbase-shell/src/main/ruby/hbase/table.rb +++ b/hbase-shell/src/main/ruby/hbase/table.rb @@ -238,8 +238,8 @@ EOF def _count_internal(interval = 1000, caching_rows = 10) # We can safely set scanner caching with the first key only filter scan = org.apache.hadoop.hbase.client.Scan.new - scan.cache_blocks = false - scan.caching = caching_rows + scan.setCacheBlocks(false) + scan.setCaching(caching_rows) scan.setFilter(org.apache.hadoop.hbase.filter.FirstKeyOnlyFilter.new) # Run the scanner