http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2aec596e/apidocs/src-html/org/apache/hadoop/hbase/filter/DependentColumnFilter.html ---------------------------------------------------------------------- diff --git a/apidocs/src-html/org/apache/hadoop/hbase/filter/DependentColumnFilter.html b/apidocs/src-html/org/apache/hadoop/hbase/filter/DependentColumnFilter.html index 8b561ba..da02cae 100644 --- a/apidocs/src-html/org/apache/hadoop/hbase/filter/DependentColumnFilter.html +++ b/apidocs/src-html/org/apache/hadoop/hbase/filter/DependentColumnFilter.html @@ -29,273 +29,265 @@ <span class="sourceLineNo">021</span>import java.io.IOException;<a name="line.21"></a> <span class="sourceLineNo">022</span>import java.util.ArrayList;<a name="line.22"></a> <span class="sourceLineNo">023</span>import java.util.HashSet;<a name="line.23"></a> -<span class="sourceLineNo">024</span>import java.util.Iterator;<a name="line.24"></a> -<span class="sourceLineNo">025</span>import java.util.List;<a name="line.25"></a> -<span class="sourceLineNo">026</span>import java.util.Set;<a name="line.26"></a> -<span class="sourceLineNo">027</span><a name="line.27"></a> -<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.Cell;<a name="line.28"></a> -<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.29"></a> -<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.classification.InterfaceAudience;<a name="line.30"></a> -<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.exceptions.DeserializationException;<a name="line.31"></a> -<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.32"></a> -<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.FilterProtos;<a name="line.33"></a> -<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.34"></a> -<span class="sourceLineNo">035</span><a name="line.35"></a> -<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.shaded.com.google.common.base.Preconditions;<a name="line.36"></a> -<span class="sourceLineNo">037</span><a name="line.37"></a> -<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.shaded.com.google.protobuf.InvalidProtocolBufferException;<a name="line.38"></a> -<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.shaded.com.google.protobuf.UnsafeByteOperations;<a name="line.39"></a> -<span class="sourceLineNo">040</span><a name="line.40"></a> -<span class="sourceLineNo">041</span>/**<a name="line.41"></a> -<span class="sourceLineNo">042</span> * A filter for adding inter-column timestamp matching<a name="line.42"></a> -<span class="sourceLineNo">043</span> * Only cells with a correspondingly timestamped entry in<a name="line.43"></a> -<span class="sourceLineNo">044</span> * the target column will be retained<a name="line.44"></a> -<span class="sourceLineNo">045</span> * Not compatible with Scan.setBatch as operations need <a name="line.45"></a> -<span class="sourceLineNo">046</span> * full rows for correct filtering <a name="line.46"></a> -<span class="sourceLineNo">047</span> */<a name="line.47"></a> -<span class="sourceLineNo">048</span>@InterfaceAudience.Public<a name="line.48"></a> -<span class="sourceLineNo">049</span>public class DependentColumnFilter extends CompareFilter {<a name="line.49"></a> -<span class="sourceLineNo">050</span><a name="line.50"></a> -<span class="sourceLineNo">051</span> protected byte[] columnFamily;<a name="line.51"></a> -<span class="sourceLineNo">052</span> protected byte[] columnQualifier;<a name="line.52"></a> -<span class="sourceLineNo">053</span> protected boolean dropDependentColumn;<a name="line.53"></a> -<span class="sourceLineNo">054</span><a name="line.54"></a> -<span class="sourceLineNo">055</span> protected Set<Long> stampSet = new HashSet<>();<a name="line.55"></a> -<span class="sourceLineNo">056</span> <a name="line.56"></a> -<span class="sourceLineNo">057</span> /**<a name="line.57"></a> -<span class="sourceLineNo">058</span> * Build a dependent column filter with value checking<a name="line.58"></a> -<span class="sourceLineNo">059</span> * dependent column varies will be compared using the supplied<a name="line.59"></a> -<span class="sourceLineNo">060</span> * compareOp and comparator, for usage of which<a name="line.60"></a> -<span class="sourceLineNo">061</span> * refer to {@link CompareFilter}<a name="line.61"></a> -<span class="sourceLineNo">062</span> * <a name="line.62"></a> -<span class="sourceLineNo">063</span> * @param family dependent column family<a name="line.63"></a> -<span class="sourceLineNo">064</span> * @param qualifier dependent column qualifier<a name="line.64"></a> -<span class="sourceLineNo">065</span> * @param dropDependentColumn whether the column should be discarded after<a name="line.65"></a> -<span class="sourceLineNo">066</span> * @param valueCompareOp comparison op <a name="line.66"></a> -<span class="sourceLineNo">067</span> * @param valueComparator comparator<a name="line.67"></a> -<span class="sourceLineNo">068</span> */<a name="line.68"></a> -<span class="sourceLineNo">069</span> public DependentColumnFilter(final byte [] family, final byte[] qualifier,<a name="line.69"></a> -<span class="sourceLineNo">070</span> final boolean dropDependentColumn, final CompareOp valueCompareOp,<a name="line.70"></a> -<span class="sourceLineNo">071</span> final ByteArrayComparable valueComparator) {<a name="line.71"></a> -<span class="sourceLineNo">072</span> // set up the comparator <a name="line.72"></a> -<span class="sourceLineNo">073</span> super(valueCompareOp, valueComparator);<a name="line.73"></a> -<span class="sourceLineNo">074</span> this.columnFamily = family;<a name="line.74"></a> -<span class="sourceLineNo">075</span> this.columnQualifier = qualifier;<a name="line.75"></a> -<span class="sourceLineNo">076</span> this.dropDependentColumn = dropDependentColumn;<a name="line.76"></a> -<span class="sourceLineNo">077</span> }<a name="line.77"></a> -<span class="sourceLineNo">078</span> <a name="line.78"></a> -<span class="sourceLineNo">079</span> /**<a name="line.79"></a> -<span class="sourceLineNo">080</span> * Constructor for DependentColumn filter.<a name="line.80"></a> -<span class="sourceLineNo">081</span> * Cells where a Cell from target column<a name="line.81"></a> -<span class="sourceLineNo">082</span> * with the same timestamp do not exist will be dropped.<a name="line.82"></a> -<span class="sourceLineNo">083</span> *<a name="line.83"></a> -<span class="sourceLineNo">084</span> * @param family name of target column family<a name="line.84"></a> -<span class="sourceLineNo">085</span> * @param qualifier name of column qualifier<a name="line.85"></a> -<span class="sourceLineNo">086</span> */<a name="line.86"></a> -<span class="sourceLineNo">087</span> public DependentColumnFilter(final byte [] family, final byte [] qualifier) {<a name="line.87"></a> -<span class="sourceLineNo">088</span> this(family, qualifier, false);<a name="line.88"></a> -<span class="sourceLineNo">089</span> }<a name="line.89"></a> -<span class="sourceLineNo">090</span> <a name="line.90"></a> -<span class="sourceLineNo">091</span> /**<a name="line.91"></a> -<span class="sourceLineNo">092</span> * Constructor for DependentColumn filter.<a name="line.92"></a> -<span class="sourceLineNo">093</span> * Cells where a Cell from target column<a name="line.93"></a> -<span class="sourceLineNo">094</span> * with the same timestamp do not exist will be dropped.<a name="line.94"></a> -<span class="sourceLineNo">095</span> *<a name="line.95"></a> -<span class="sourceLineNo">096</span> * @param family name of dependent column family<a name="line.96"></a> -<span class="sourceLineNo">097</span> * @param qualifier name of dependent qualifier<a name="line.97"></a> -<span class="sourceLineNo">098</span> * @param dropDependentColumn whether the dependent columns Cells should be discarded<a name="line.98"></a> -<span class="sourceLineNo">099</span> */<a name="line.99"></a> -<span class="sourceLineNo">100</span> public DependentColumnFilter(final byte [] family, final byte [] qualifier,<a name="line.100"></a> -<span class="sourceLineNo">101</span> final boolean dropDependentColumn) {<a name="line.101"></a> -<span class="sourceLineNo">102</span> this(family, qualifier, dropDependentColumn, CompareOp.NO_OP, null);<a name="line.102"></a> -<span class="sourceLineNo">103</span> }<a name="line.103"></a> -<span class="sourceLineNo">104</span><a name="line.104"></a> -<span class="sourceLineNo">105</span> /**<a name="line.105"></a> -<span class="sourceLineNo">106</span> * @return the column family<a name="line.106"></a> -<span class="sourceLineNo">107</span> */<a name="line.107"></a> -<span class="sourceLineNo">108</span> public byte[] getFamily() {<a name="line.108"></a> -<span class="sourceLineNo">109</span> return this.columnFamily;<a name="line.109"></a> -<span class="sourceLineNo">110</span> }<a name="line.110"></a> -<span class="sourceLineNo">111</span><a name="line.111"></a> -<span class="sourceLineNo">112</span> /**<a name="line.112"></a> -<span class="sourceLineNo">113</span> * @return the column qualifier<a name="line.113"></a> -<span class="sourceLineNo">114</span> */<a name="line.114"></a> -<span class="sourceLineNo">115</span> public byte[] getQualifier() {<a name="line.115"></a> -<span class="sourceLineNo">116</span> return this.columnQualifier;<a name="line.116"></a> -<span class="sourceLineNo">117</span> }<a name="line.117"></a> -<span class="sourceLineNo">118</span><a name="line.118"></a> -<span class="sourceLineNo">119</span> /**<a name="line.119"></a> -<span class="sourceLineNo">120</span> * @return true if we should drop the dependent column, false otherwise<a name="line.120"></a> -<span class="sourceLineNo">121</span> */<a name="line.121"></a> -<span class="sourceLineNo">122</span> public boolean dropDependentColumn() {<a name="line.122"></a> -<span class="sourceLineNo">123</span> return this.dropDependentColumn;<a name="line.123"></a> -<span class="sourceLineNo">124</span> }<a name="line.124"></a> -<span class="sourceLineNo">125</span><a name="line.125"></a> -<span class="sourceLineNo">126</span> public boolean getDropDependentColumn() {<a name="line.126"></a> -<span class="sourceLineNo">127</span> return this.dropDependentColumn;<a name="line.127"></a> -<span class="sourceLineNo">128</span> }<a name="line.128"></a> -<span class="sourceLineNo">129</span><a name="line.129"></a> -<span class="sourceLineNo">130</span> @Override<a name="line.130"></a> -<span class="sourceLineNo">131</span> public boolean filterAllRemaining() {<a name="line.131"></a> -<span class="sourceLineNo">132</span> return false;<a name="line.132"></a> -<span class="sourceLineNo">133</span> }<a name="line.133"></a> -<span class="sourceLineNo">134</span><a name="line.134"></a> -<span class="sourceLineNo">135</span> @Override<a name="line.135"></a> -<span class="sourceLineNo">136</span> public ReturnCode filterKeyValue(Cell c) {<a name="line.136"></a> -<span class="sourceLineNo">137</span> // Check if the column and qualifier match<a name="line.137"></a> -<span class="sourceLineNo">138</span> if (!CellUtil.matchingColumn(c, this.columnFamily, this.columnQualifier)) {<a name="line.138"></a> -<span class="sourceLineNo">139</span> // include non-matches for the time being, they'll be discarded afterwards<a name="line.139"></a> -<span class="sourceLineNo">140</span> return ReturnCode.INCLUDE;<a name="line.140"></a> -<span class="sourceLineNo">141</span> }<a name="line.141"></a> -<span class="sourceLineNo">142</span> // If it doesn't pass the op, skip it<a name="line.142"></a> -<span class="sourceLineNo">143</span> if (comparator != null<a name="line.143"></a> -<span class="sourceLineNo">144</span> && compareValue(compareOp, comparator, c))<a name="line.144"></a> -<span class="sourceLineNo">145</span> return ReturnCode.SKIP;<a name="line.145"></a> -<span class="sourceLineNo">146</span> <a name="line.146"></a> -<span class="sourceLineNo">147</span> stampSet.add(c.getTimestamp());<a name="line.147"></a> -<span class="sourceLineNo">148</span> if(dropDependentColumn) {<a name="line.148"></a> -<span class="sourceLineNo">149</span> return ReturnCode.SKIP;<a name="line.149"></a> -<span class="sourceLineNo">150</span> }<a name="line.150"></a> -<span class="sourceLineNo">151</span> return ReturnCode.INCLUDE;<a name="line.151"></a> -<span class="sourceLineNo">152</span> }<a name="line.152"></a> -<span class="sourceLineNo">153</span><a name="line.153"></a> -<span class="sourceLineNo">154</span> @Override<a name="line.154"></a> -<span class="sourceLineNo">155</span> public void filterRowCells(List<Cell> kvs) {<a name="line.155"></a> -<span class="sourceLineNo">156</span> Iterator<? extends Cell> it = kvs.iterator();<a name="line.156"></a> -<span class="sourceLineNo">157</span> Cell kv;<a name="line.157"></a> -<span class="sourceLineNo">158</span> while(it.hasNext()) {<a name="line.158"></a> -<span class="sourceLineNo">159</span> kv = it.next();<a name="line.159"></a> -<span class="sourceLineNo">160</span> if(!stampSet.contains(kv.getTimestamp())) {<a name="line.160"></a> -<span class="sourceLineNo">161</span> it.remove();<a name="line.161"></a> -<span class="sourceLineNo">162</span> }<a name="line.162"></a> -<span class="sourceLineNo">163</span> }<a name="line.163"></a> -<span class="sourceLineNo">164</span> }<a name="line.164"></a> -<span class="sourceLineNo">165</span><a name="line.165"></a> -<span class="sourceLineNo">166</span> @Override<a name="line.166"></a> -<span class="sourceLineNo">167</span> public boolean hasFilterRow() {<a name="line.167"></a> -<span class="sourceLineNo">168</span> return true;<a name="line.168"></a> -<span class="sourceLineNo">169</span> }<a name="line.169"></a> -<span class="sourceLineNo">170</span> <a name="line.170"></a> -<span class="sourceLineNo">171</span> @Override<a name="line.171"></a> -<span class="sourceLineNo">172</span> public boolean filterRow() {<a name="line.172"></a> -<span class="sourceLineNo">173</span> return false;<a name="line.173"></a> -<span class="sourceLineNo">174</span> }<a name="line.174"></a> -<span class="sourceLineNo">175</span><a name="line.175"></a> -<span class="sourceLineNo">176</span> @Override<a name="line.176"></a> -<span class="sourceLineNo">177</span> public boolean filterRowKey(byte[] buffer, int offset, int length) {<a name="line.177"></a> -<span class="sourceLineNo">178</span> return false;<a name="line.178"></a> -<span class="sourceLineNo">179</span> }<a name="line.179"></a> -<span class="sourceLineNo">180</span> @Override<a name="line.180"></a> -<span class="sourceLineNo">181</span> public void reset() {<a name="line.181"></a> -<span class="sourceLineNo">182</span> stampSet.clear(); <a name="line.182"></a> -<span class="sourceLineNo">183</span> }<a name="line.183"></a> -<span class="sourceLineNo">184</span><a name="line.184"></a> -<span class="sourceLineNo">185</span> public static Filter createFilterFromArguments(ArrayList<byte []> filterArguments) {<a name="line.185"></a> -<span class="sourceLineNo">186</span> Preconditions.checkArgument(filterArguments.size() == 2 ||<a name="line.186"></a> -<span class="sourceLineNo">187</span> filterArguments.size() == 3 ||<a name="line.187"></a> -<span class="sourceLineNo">188</span> filterArguments.size() == 5,<a name="line.188"></a> -<span class="sourceLineNo">189</span> "Expected 2, 3 or 5 but got: %s", filterArguments.size());<a name="line.189"></a> -<span class="sourceLineNo">190</span> if (filterArguments.size() == 2) {<a name="line.190"></a> -<span class="sourceLineNo">191</span> byte [] family = ParseFilter.removeQuotesFromByteArray(filterArguments.get(0));<a name="line.191"></a> -<span class="sourceLineNo">192</span> byte [] qualifier = ParseFilter.removeQuotesFromByteArray(filterArguments.get(1));<a name="line.192"></a> -<span class="sourceLineNo">193</span> return new DependentColumnFilter(family, qualifier);<a name="line.193"></a> -<span class="sourceLineNo">194</span><a name="line.194"></a> -<span class="sourceLineNo">195</span> } else if (filterArguments.size() == 3) {<a name="line.195"></a> -<span class="sourceLineNo">196</span> byte [] family = ParseFilter.removeQuotesFromByteArray(filterArguments.get(0));<a name="line.196"></a> -<span class="sourceLineNo">197</span> byte [] qualifier = ParseFilter.removeQuotesFromByteArray(filterArguments.get(1));<a name="line.197"></a> -<span class="sourceLineNo">198</span> boolean dropDependentColumn = ParseFilter.convertByteArrayToBoolean(filterArguments.get(2));<a name="line.198"></a> -<span class="sourceLineNo">199</span> return new DependentColumnFilter(family, qualifier, dropDependentColumn);<a name="line.199"></a> -<span class="sourceLineNo">200</span><a name="line.200"></a> -<span class="sourceLineNo">201</span> } else if (filterArguments.size() == 5) {<a name="line.201"></a> -<span class="sourceLineNo">202</span> byte [] family = ParseFilter.removeQuotesFromByteArray(filterArguments.get(0));<a name="line.202"></a> -<span class="sourceLineNo">203</span> byte [] qualifier = ParseFilter.removeQuotesFromByteArray(filterArguments.get(1));<a name="line.203"></a> -<span class="sourceLineNo">204</span> boolean dropDependentColumn = ParseFilter.convertByteArrayToBoolean(filterArguments.get(2));<a name="line.204"></a> -<span class="sourceLineNo">205</span> CompareOp compareOp = ParseFilter.createCompareOp(filterArguments.get(3));<a name="line.205"></a> -<span class="sourceLineNo">206</span> ByteArrayComparable comparator = ParseFilter.createComparator(<a name="line.206"></a> -<span class="sourceLineNo">207</span> ParseFilter.removeQuotesFromByteArray(filterArguments.get(4)));<a name="line.207"></a> -<span class="sourceLineNo">208</span> return new DependentColumnFilter(family, qualifier, dropDependentColumn,<a name="line.208"></a> -<span class="sourceLineNo">209</span> compareOp, comparator);<a name="line.209"></a> -<span class="sourceLineNo">210</span> } else {<a name="line.210"></a> -<span class="sourceLineNo">211</span> throw new IllegalArgumentException("Expected 2, 3 or 5 but got: " + filterArguments.size());<a name="line.211"></a> -<span class="sourceLineNo">212</span> }<a name="line.212"></a> -<span class="sourceLineNo">213</span> }<a name="line.213"></a> -<span class="sourceLineNo">214</span><a name="line.214"></a> -<span class="sourceLineNo">215</span> /**<a name="line.215"></a> -<span class="sourceLineNo">216</span> * @return The filter serialized using pb<a name="line.216"></a> -<span class="sourceLineNo">217</span> */<a name="line.217"></a> -<span class="sourceLineNo">218</span> public byte [] toByteArray() {<a name="line.218"></a> -<span class="sourceLineNo">219</span> FilterProtos.DependentColumnFilter.Builder builder =<a name="line.219"></a> -<span class="sourceLineNo">220</span> FilterProtos.DependentColumnFilter.newBuilder();<a name="line.220"></a> -<span class="sourceLineNo">221</span> builder.setCompareFilter(super.convert());<a name="line.221"></a> -<span class="sourceLineNo">222</span> if (this.columnFamily != null) {<a name="line.222"></a> -<span class="sourceLineNo">223</span> builder.setColumnFamily(UnsafeByteOperations.unsafeWrap(this.columnFamily));<a name="line.223"></a> -<span class="sourceLineNo">224</span> }<a name="line.224"></a> -<span class="sourceLineNo">225</span> if (this.columnQualifier != null) {<a name="line.225"></a> -<span class="sourceLineNo">226</span> builder.setColumnQualifier(UnsafeByteOperations.unsafeWrap(this.columnQualifier));<a name="line.226"></a> -<span class="sourceLineNo">227</span> }<a name="line.227"></a> -<span class="sourceLineNo">228</span> builder.setDropDependentColumn(this.dropDependentColumn);<a name="line.228"></a> -<span class="sourceLineNo">229</span> return builder.build().toByteArray();<a name="line.229"></a> -<span class="sourceLineNo">230</span> }<a name="line.230"></a> -<span class="sourceLineNo">231</span><a name="line.231"></a> -<span class="sourceLineNo">232</span> /**<a name="line.232"></a> -<span class="sourceLineNo">233</span> * @param pbBytes A pb serialized {@link DependentColumnFilter} instance<a name="line.233"></a> -<span class="sourceLineNo">234</span> * @return An instance of {@link DependentColumnFilter} made from <code>bytes</code><a name="line.234"></a> -<span class="sourceLineNo">235</span> * @throws DeserializationException<a name="line.235"></a> -<span class="sourceLineNo">236</span> * @see #toByteArray<a name="line.236"></a> -<span class="sourceLineNo">237</span> */<a name="line.237"></a> -<span class="sourceLineNo">238</span> public static DependentColumnFilter parseFrom(final byte [] pbBytes)<a name="line.238"></a> -<span class="sourceLineNo">239</span> throws DeserializationException {<a name="line.239"></a> -<span class="sourceLineNo">240</span> FilterProtos.DependentColumnFilter proto;<a name="line.240"></a> +<span class="sourceLineNo">024</span>import java.util.List;<a name="line.24"></a> +<span class="sourceLineNo">025</span>import java.util.Set;<a name="line.25"></a> +<span class="sourceLineNo">026</span><a name="line.26"></a> +<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.Cell;<a name="line.27"></a> +<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.28"></a> +<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.classification.InterfaceAudience;<a name="line.29"></a> +<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.exceptions.DeserializationException;<a name="line.30"></a> +<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.31"></a> +<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.FilterProtos;<a name="line.32"></a> +<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.33"></a> +<span class="sourceLineNo">034</span><a name="line.34"></a> +<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.shaded.com.google.common.base.Preconditions;<a name="line.35"></a> +<span class="sourceLineNo">036</span><a name="line.36"></a> +<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.shaded.com.google.protobuf.InvalidProtocolBufferException;<a name="line.37"></a> +<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.shaded.com.google.protobuf.UnsafeByteOperations;<a name="line.38"></a> +<span class="sourceLineNo">039</span><a name="line.39"></a> +<span class="sourceLineNo">040</span>/**<a name="line.40"></a> +<span class="sourceLineNo">041</span> * A filter for adding inter-column timestamp matching<a name="line.41"></a> +<span class="sourceLineNo">042</span> * Only cells with a correspondingly timestamped entry in<a name="line.42"></a> +<span class="sourceLineNo">043</span> * the target column will be retained<a name="line.43"></a> +<span class="sourceLineNo">044</span> * Not compatible with Scan.setBatch as operations need <a name="line.44"></a> +<span class="sourceLineNo">045</span> * full rows for correct filtering <a name="line.45"></a> +<span class="sourceLineNo">046</span> */<a name="line.46"></a> +<span class="sourceLineNo">047</span>@InterfaceAudience.Public<a name="line.47"></a> +<span class="sourceLineNo">048</span>public class DependentColumnFilter extends CompareFilter {<a name="line.48"></a> +<span class="sourceLineNo">049</span><a name="line.49"></a> +<span class="sourceLineNo">050</span> protected byte[] columnFamily;<a name="line.50"></a> +<span class="sourceLineNo">051</span> protected byte[] columnQualifier;<a name="line.51"></a> +<span class="sourceLineNo">052</span> protected boolean dropDependentColumn;<a name="line.52"></a> +<span class="sourceLineNo">053</span><a name="line.53"></a> +<span class="sourceLineNo">054</span> protected Set<Long> stampSet = new HashSet<>();<a name="line.54"></a> +<span class="sourceLineNo">055</span> <a name="line.55"></a> +<span class="sourceLineNo">056</span> /**<a name="line.56"></a> +<span class="sourceLineNo">057</span> * Build a dependent column filter with value checking<a name="line.57"></a> +<span class="sourceLineNo">058</span> * dependent column varies will be compared using the supplied<a name="line.58"></a> +<span class="sourceLineNo">059</span> * compareOp and comparator, for usage of which<a name="line.59"></a> +<span class="sourceLineNo">060</span> * refer to {@link CompareFilter}<a name="line.60"></a> +<span class="sourceLineNo">061</span> * <a name="line.61"></a> +<span class="sourceLineNo">062</span> * @param family dependent column family<a name="line.62"></a> +<span class="sourceLineNo">063</span> * @param qualifier dependent column qualifier<a name="line.63"></a> +<span class="sourceLineNo">064</span> * @param dropDependentColumn whether the column should be discarded after<a name="line.64"></a> +<span class="sourceLineNo">065</span> * @param valueCompareOp comparison op <a name="line.65"></a> +<span class="sourceLineNo">066</span> * @param valueComparator comparator<a name="line.66"></a> +<span class="sourceLineNo">067</span> */<a name="line.67"></a> +<span class="sourceLineNo">068</span> public DependentColumnFilter(final byte [] family, final byte[] qualifier,<a name="line.68"></a> +<span class="sourceLineNo">069</span> final boolean dropDependentColumn, final CompareOp valueCompareOp,<a name="line.69"></a> +<span class="sourceLineNo">070</span> final ByteArrayComparable valueComparator) {<a name="line.70"></a> +<span class="sourceLineNo">071</span> // set up the comparator <a name="line.71"></a> +<span class="sourceLineNo">072</span> super(valueCompareOp, valueComparator);<a name="line.72"></a> +<span class="sourceLineNo">073</span> this.columnFamily = family;<a name="line.73"></a> +<span class="sourceLineNo">074</span> this.columnQualifier = qualifier;<a name="line.74"></a> +<span class="sourceLineNo">075</span> this.dropDependentColumn = dropDependentColumn;<a name="line.75"></a> +<span class="sourceLineNo">076</span> }<a name="line.76"></a> +<span class="sourceLineNo">077</span> <a name="line.77"></a> +<span class="sourceLineNo">078</span> /**<a name="line.78"></a> +<span class="sourceLineNo">079</span> * Constructor for DependentColumn filter.<a name="line.79"></a> +<span class="sourceLineNo">080</span> * Cells where a Cell from target column<a name="line.80"></a> +<span class="sourceLineNo">081</span> * with the same timestamp do not exist will be dropped.<a name="line.81"></a> +<span class="sourceLineNo">082</span> *<a name="line.82"></a> +<span class="sourceLineNo">083</span> * @param family name of target column family<a name="line.83"></a> +<span class="sourceLineNo">084</span> * @param qualifier name of column qualifier<a name="line.84"></a> +<span class="sourceLineNo">085</span> */<a name="line.85"></a> +<span class="sourceLineNo">086</span> public DependentColumnFilter(final byte [] family, final byte [] qualifier) {<a name="line.86"></a> +<span class="sourceLineNo">087</span> this(family, qualifier, false);<a name="line.87"></a> +<span class="sourceLineNo">088</span> }<a name="line.88"></a> +<span class="sourceLineNo">089</span> <a name="line.89"></a> +<span class="sourceLineNo">090</span> /**<a name="line.90"></a> +<span class="sourceLineNo">091</span> * Constructor for DependentColumn filter.<a name="line.91"></a> +<span class="sourceLineNo">092</span> * Cells where a Cell from target column<a name="line.92"></a> +<span class="sourceLineNo">093</span> * with the same timestamp do not exist will be dropped.<a name="line.93"></a> +<span class="sourceLineNo">094</span> *<a name="line.94"></a> +<span class="sourceLineNo">095</span> * @param family name of dependent column family<a name="line.95"></a> +<span class="sourceLineNo">096</span> * @param qualifier name of dependent qualifier<a name="line.96"></a> +<span class="sourceLineNo">097</span> * @param dropDependentColumn whether the dependent columns Cells should be discarded<a name="line.97"></a> +<span class="sourceLineNo">098</span> */<a name="line.98"></a> +<span class="sourceLineNo">099</span> public DependentColumnFilter(final byte [] family, final byte [] qualifier,<a name="line.99"></a> +<span class="sourceLineNo">100</span> final boolean dropDependentColumn) {<a name="line.100"></a> +<span class="sourceLineNo">101</span> this(family, qualifier, dropDependentColumn, CompareOp.NO_OP, null);<a name="line.101"></a> +<span class="sourceLineNo">102</span> }<a name="line.102"></a> +<span class="sourceLineNo">103</span><a name="line.103"></a> +<span class="sourceLineNo">104</span> /**<a name="line.104"></a> +<span class="sourceLineNo">105</span> * @return the column family<a name="line.105"></a> +<span class="sourceLineNo">106</span> */<a name="line.106"></a> +<span class="sourceLineNo">107</span> public byte[] getFamily() {<a name="line.107"></a> +<span class="sourceLineNo">108</span> return this.columnFamily;<a name="line.108"></a> +<span class="sourceLineNo">109</span> }<a name="line.109"></a> +<span class="sourceLineNo">110</span><a name="line.110"></a> +<span class="sourceLineNo">111</span> /**<a name="line.111"></a> +<span class="sourceLineNo">112</span> * @return the column qualifier<a name="line.112"></a> +<span class="sourceLineNo">113</span> */<a name="line.113"></a> +<span class="sourceLineNo">114</span> public byte[] getQualifier() {<a name="line.114"></a> +<span class="sourceLineNo">115</span> return this.columnQualifier;<a name="line.115"></a> +<span class="sourceLineNo">116</span> }<a name="line.116"></a> +<span class="sourceLineNo">117</span><a name="line.117"></a> +<span class="sourceLineNo">118</span> /**<a name="line.118"></a> +<span class="sourceLineNo">119</span> * @return true if we should drop the dependent column, false otherwise<a name="line.119"></a> +<span class="sourceLineNo">120</span> */<a name="line.120"></a> +<span class="sourceLineNo">121</span> public boolean dropDependentColumn() {<a name="line.121"></a> +<span class="sourceLineNo">122</span> return this.dropDependentColumn;<a name="line.122"></a> +<span class="sourceLineNo">123</span> }<a name="line.123"></a> +<span class="sourceLineNo">124</span><a name="line.124"></a> +<span class="sourceLineNo">125</span> public boolean getDropDependentColumn() {<a name="line.125"></a> +<span class="sourceLineNo">126</span> return this.dropDependentColumn;<a name="line.126"></a> +<span class="sourceLineNo">127</span> }<a name="line.127"></a> +<span class="sourceLineNo">128</span><a name="line.128"></a> +<span class="sourceLineNo">129</span> @Override<a name="line.129"></a> +<span class="sourceLineNo">130</span> public boolean filterAllRemaining() {<a name="line.130"></a> +<span class="sourceLineNo">131</span> return false;<a name="line.131"></a> +<span class="sourceLineNo">132</span> }<a name="line.132"></a> +<span class="sourceLineNo">133</span><a name="line.133"></a> +<span class="sourceLineNo">134</span> @Override<a name="line.134"></a> +<span class="sourceLineNo">135</span> public ReturnCode filterKeyValue(Cell c) {<a name="line.135"></a> +<span class="sourceLineNo">136</span> // Check if the column and qualifier match<a name="line.136"></a> +<span class="sourceLineNo">137</span> if (!CellUtil.matchingColumn(c, this.columnFamily, this.columnQualifier)) {<a name="line.137"></a> +<span class="sourceLineNo">138</span> // include non-matches for the time being, they'll be discarded afterwards<a name="line.138"></a> +<span class="sourceLineNo">139</span> return ReturnCode.INCLUDE;<a name="line.139"></a> +<span class="sourceLineNo">140</span> }<a name="line.140"></a> +<span class="sourceLineNo">141</span> // If it doesn't pass the op, skip it<a name="line.141"></a> +<span class="sourceLineNo">142</span> if (comparator != null<a name="line.142"></a> +<span class="sourceLineNo">143</span> && compareValue(compareOp, comparator, c))<a name="line.143"></a> +<span class="sourceLineNo">144</span> return ReturnCode.SKIP;<a name="line.144"></a> +<span class="sourceLineNo">145</span> <a name="line.145"></a> +<span class="sourceLineNo">146</span> stampSet.add(c.getTimestamp());<a name="line.146"></a> +<span class="sourceLineNo">147</span> if(dropDependentColumn) {<a name="line.147"></a> +<span class="sourceLineNo">148</span> return ReturnCode.SKIP;<a name="line.148"></a> +<span class="sourceLineNo">149</span> }<a name="line.149"></a> +<span class="sourceLineNo">150</span> return ReturnCode.INCLUDE;<a name="line.150"></a> +<span class="sourceLineNo">151</span> }<a name="line.151"></a> +<span class="sourceLineNo">152</span><a name="line.152"></a> +<span class="sourceLineNo">153</span> @Override<a name="line.153"></a> +<span class="sourceLineNo">154</span> public void filterRowCells(List<Cell> kvs) {<a name="line.154"></a> +<span class="sourceLineNo">155</span> kvs.removeIf(kv -> !stampSet.contains(kv.getTimestamp()));<a name="line.155"></a> +<span class="sourceLineNo">156</span> }<a name="line.156"></a> +<span class="sourceLineNo">157</span><a name="line.157"></a> +<span class="sourceLineNo">158</span> @Override<a name="line.158"></a> +<span class="sourceLineNo">159</span> public boolean hasFilterRow() {<a name="line.159"></a> +<span class="sourceLineNo">160</span> return true;<a name="line.160"></a> +<span class="sourceLineNo">161</span> }<a name="line.161"></a> +<span class="sourceLineNo">162</span> <a name="line.162"></a> +<span class="sourceLineNo">163</span> @Override<a name="line.163"></a> +<span class="sourceLineNo">164</span> public boolean filterRow() {<a name="line.164"></a> +<span class="sourceLineNo">165</span> return false;<a name="line.165"></a> +<span class="sourceLineNo">166</span> }<a name="line.166"></a> +<span class="sourceLineNo">167</span><a name="line.167"></a> +<span class="sourceLineNo">168</span> @Override<a name="line.168"></a> +<span class="sourceLineNo">169</span> public boolean filterRowKey(byte[] buffer, int offset, int length) {<a name="line.169"></a> +<span class="sourceLineNo">170</span> return false;<a name="line.170"></a> +<span class="sourceLineNo">171</span> }<a name="line.171"></a> +<span class="sourceLineNo">172</span> @Override<a name="line.172"></a> +<span class="sourceLineNo">173</span> public void reset() {<a name="line.173"></a> +<span class="sourceLineNo">174</span> stampSet.clear(); <a name="line.174"></a> +<span class="sourceLineNo">175</span> }<a name="line.175"></a> +<span class="sourceLineNo">176</span><a name="line.176"></a> +<span class="sourceLineNo">177</span> public static Filter createFilterFromArguments(ArrayList<byte []> filterArguments) {<a name="line.177"></a> +<span class="sourceLineNo">178</span> Preconditions.checkArgument(filterArguments.size() == 2 ||<a name="line.178"></a> +<span class="sourceLineNo">179</span> filterArguments.size() == 3 ||<a name="line.179"></a> +<span class="sourceLineNo">180</span> filterArguments.size() == 5,<a name="line.180"></a> +<span class="sourceLineNo">181</span> "Expected 2, 3 or 5 but got: %s", filterArguments.size());<a name="line.181"></a> +<span class="sourceLineNo">182</span> if (filterArguments.size() == 2) {<a name="line.182"></a> +<span class="sourceLineNo">183</span> byte [] family = ParseFilter.removeQuotesFromByteArray(filterArguments.get(0));<a name="line.183"></a> +<span class="sourceLineNo">184</span> byte [] qualifier = ParseFilter.removeQuotesFromByteArray(filterArguments.get(1));<a name="line.184"></a> +<span class="sourceLineNo">185</span> return new DependentColumnFilter(family, qualifier);<a name="line.185"></a> +<span class="sourceLineNo">186</span><a name="line.186"></a> +<span class="sourceLineNo">187</span> } else if (filterArguments.size() == 3) {<a name="line.187"></a> +<span class="sourceLineNo">188</span> byte [] family = ParseFilter.removeQuotesFromByteArray(filterArguments.get(0));<a name="line.188"></a> +<span class="sourceLineNo">189</span> byte [] qualifier = ParseFilter.removeQuotesFromByteArray(filterArguments.get(1));<a name="line.189"></a> +<span class="sourceLineNo">190</span> boolean dropDependentColumn = ParseFilter.convertByteArrayToBoolean(filterArguments.get(2));<a name="line.190"></a> +<span class="sourceLineNo">191</span> return new DependentColumnFilter(family, qualifier, dropDependentColumn);<a name="line.191"></a> +<span class="sourceLineNo">192</span><a name="line.192"></a> +<span class="sourceLineNo">193</span> } else if (filterArguments.size() == 5) {<a name="line.193"></a> +<span class="sourceLineNo">194</span> byte [] family = ParseFilter.removeQuotesFromByteArray(filterArguments.get(0));<a name="line.194"></a> +<span class="sourceLineNo">195</span> byte [] qualifier = ParseFilter.removeQuotesFromByteArray(filterArguments.get(1));<a name="line.195"></a> +<span class="sourceLineNo">196</span> boolean dropDependentColumn = ParseFilter.convertByteArrayToBoolean(filterArguments.get(2));<a name="line.196"></a> +<span class="sourceLineNo">197</span> CompareOp compareOp = ParseFilter.createCompareOp(filterArguments.get(3));<a name="line.197"></a> +<span class="sourceLineNo">198</span> ByteArrayComparable comparator = ParseFilter.createComparator(<a name="line.198"></a> +<span class="sourceLineNo">199</span> ParseFilter.removeQuotesFromByteArray(filterArguments.get(4)));<a name="line.199"></a> +<span class="sourceLineNo">200</span> return new DependentColumnFilter(family, qualifier, dropDependentColumn,<a name="line.200"></a> +<span class="sourceLineNo">201</span> compareOp, comparator);<a name="line.201"></a> +<span class="sourceLineNo">202</span> } else {<a name="line.202"></a> +<span class="sourceLineNo">203</span> throw new IllegalArgumentException("Expected 2, 3 or 5 but got: " + filterArguments.size());<a name="line.203"></a> +<span class="sourceLineNo">204</span> }<a name="line.204"></a> +<span class="sourceLineNo">205</span> }<a name="line.205"></a> +<span class="sourceLineNo">206</span><a name="line.206"></a> +<span class="sourceLineNo">207</span> /**<a name="line.207"></a> +<span class="sourceLineNo">208</span> * @return The filter serialized using pb<a name="line.208"></a> +<span class="sourceLineNo">209</span> */<a name="line.209"></a> +<span class="sourceLineNo">210</span> public byte [] toByteArray() {<a name="line.210"></a> +<span class="sourceLineNo">211</span> FilterProtos.DependentColumnFilter.Builder builder =<a name="line.211"></a> +<span class="sourceLineNo">212</span> FilterProtos.DependentColumnFilter.newBuilder();<a name="line.212"></a> +<span class="sourceLineNo">213</span> builder.setCompareFilter(super.convert());<a name="line.213"></a> +<span class="sourceLineNo">214</span> if (this.columnFamily != null) {<a name="line.214"></a> +<span class="sourceLineNo">215</span> builder.setColumnFamily(UnsafeByteOperations.unsafeWrap(this.columnFamily));<a name="line.215"></a> +<span class="sourceLineNo">216</span> }<a name="line.216"></a> +<span class="sourceLineNo">217</span> if (this.columnQualifier != null) {<a name="line.217"></a> +<span class="sourceLineNo">218</span> builder.setColumnQualifier(UnsafeByteOperations.unsafeWrap(this.columnQualifier));<a name="line.218"></a> +<span class="sourceLineNo">219</span> }<a name="line.219"></a> +<span class="sourceLineNo">220</span> builder.setDropDependentColumn(this.dropDependentColumn);<a name="line.220"></a> +<span class="sourceLineNo">221</span> return builder.build().toByteArray();<a name="line.221"></a> +<span class="sourceLineNo">222</span> }<a name="line.222"></a> +<span class="sourceLineNo">223</span><a name="line.223"></a> +<span class="sourceLineNo">224</span> /**<a name="line.224"></a> +<span class="sourceLineNo">225</span> * @param pbBytes A pb serialized {@link DependentColumnFilter} instance<a name="line.225"></a> +<span class="sourceLineNo">226</span> * @return An instance of {@link DependentColumnFilter} made from <code>bytes</code><a name="line.226"></a> +<span class="sourceLineNo">227</span> * @throws DeserializationException<a name="line.227"></a> +<span class="sourceLineNo">228</span> * @see #toByteArray<a name="line.228"></a> +<span class="sourceLineNo">229</span> */<a name="line.229"></a> +<span class="sourceLineNo">230</span> public static DependentColumnFilter parseFrom(final byte [] pbBytes)<a name="line.230"></a> +<span class="sourceLineNo">231</span> throws DeserializationException {<a name="line.231"></a> +<span class="sourceLineNo">232</span> FilterProtos.DependentColumnFilter proto;<a name="line.232"></a> +<span class="sourceLineNo">233</span> try {<a name="line.233"></a> +<span class="sourceLineNo">234</span> proto = FilterProtos.DependentColumnFilter.parseFrom(pbBytes);<a name="line.234"></a> +<span class="sourceLineNo">235</span> } catch (InvalidProtocolBufferException e) {<a name="line.235"></a> +<span class="sourceLineNo">236</span> throw new DeserializationException(e);<a name="line.236"></a> +<span class="sourceLineNo">237</span> }<a name="line.237"></a> +<span class="sourceLineNo">238</span> final CompareOp valueCompareOp =<a name="line.238"></a> +<span class="sourceLineNo">239</span> CompareOp.valueOf(proto.getCompareFilter().getCompareOp().name());<a name="line.239"></a> +<span class="sourceLineNo">240</span> ByteArrayComparable valueComparator = null;<a name="line.240"></a> <span class="sourceLineNo">241</span> try {<a name="line.241"></a> -<span class="sourceLineNo">242</span> proto = FilterProtos.DependentColumnFilter.parseFrom(pbBytes);<a name="line.242"></a> -<span class="sourceLineNo">243</span> } catch (InvalidProtocolBufferException e) {<a name="line.243"></a> -<span class="sourceLineNo">244</span> throw new DeserializationException(e);<a name="line.244"></a> -<span class="sourceLineNo">245</span> }<a name="line.245"></a> -<span class="sourceLineNo">246</span> final CompareOp valueCompareOp =<a name="line.246"></a> -<span class="sourceLineNo">247</span> CompareOp.valueOf(proto.getCompareFilter().getCompareOp().name());<a name="line.247"></a> -<span class="sourceLineNo">248</span> ByteArrayComparable valueComparator = null;<a name="line.248"></a> -<span class="sourceLineNo">249</span> try {<a name="line.249"></a> -<span class="sourceLineNo">250</span> if (proto.getCompareFilter().hasComparator()) {<a name="line.250"></a> -<span class="sourceLineNo">251</span> valueComparator = ProtobufUtil.toComparator(proto.getCompareFilter().getComparator());<a name="line.251"></a> -<span class="sourceLineNo">252</span> }<a name="line.252"></a> -<span class="sourceLineNo">253</span> } catch (IOException ioe) {<a name="line.253"></a> -<span class="sourceLineNo">254</span> throw new DeserializationException(ioe);<a name="line.254"></a> -<span class="sourceLineNo">255</span> }<a name="line.255"></a> -<span class="sourceLineNo">256</span> return new DependentColumnFilter(<a name="line.256"></a> -<span class="sourceLineNo">257</span> proto.hasColumnFamily()?proto.getColumnFamily().toByteArray():null,<a name="line.257"></a> -<span class="sourceLineNo">258</span> proto.hasColumnQualifier()?proto.getColumnQualifier().toByteArray():null,<a name="line.258"></a> -<span class="sourceLineNo">259</span> proto.getDropDependentColumn(), valueCompareOp, valueComparator);<a name="line.259"></a> -<span class="sourceLineNo">260</span> }<a name="line.260"></a> -<span class="sourceLineNo">261</span><a name="line.261"></a> -<span class="sourceLineNo">262</span> /**<a name="line.262"></a> -<span class="sourceLineNo">263</span> * @param o<a name="line.263"></a> -<span class="sourceLineNo">264</span> * @return true if and only if the fields of the filter that are serialized<a name="line.264"></a> -<span class="sourceLineNo">265</span> * are equal to the corresponding fields in other. Used for testing.<a name="line.265"></a> -<span class="sourceLineNo">266</span> */<a name="line.266"></a> -<span class="sourceLineNo">267</span> @edu.umd.cs.findbugs.annotations.SuppressWarnings(<a name="line.267"></a> -<span class="sourceLineNo">268</span> value="RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE")<a name="line.268"></a> -<span class="sourceLineNo">269</span> boolean areSerializedFieldsEqual(Filter o) {<a name="line.269"></a> -<span class="sourceLineNo">270</span> if (o == this) return true;<a name="line.270"></a> -<span class="sourceLineNo">271</span> if (!(o instanceof DependentColumnFilter)) return false;<a name="line.271"></a> -<span class="sourceLineNo">272</span><a name="line.272"></a> -<span class="sourceLineNo">273</span> DependentColumnFilter other = (DependentColumnFilter)o;<a name="line.273"></a> -<span class="sourceLineNo">274</span> return other != null && super.areSerializedFieldsEqual(other)<a name="line.274"></a> -<span class="sourceLineNo">275</span> && Bytes.equals(this.getFamily(), other.getFamily())<a name="line.275"></a> -<span class="sourceLineNo">276</span> && Bytes.equals(this.getQualifier(), other.getQualifier())<a name="line.276"></a> -<span class="sourceLineNo">277</span> && this.dropDependentColumn() == other.dropDependentColumn();<a name="line.277"></a> -<span class="sourceLineNo">278</span> }<a name="line.278"></a> -<span class="sourceLineNo">279</span><a name="line.279"></a> -<span class="sourceLineNo">280</span> @Override<a name="line.280"></a> -<span class="sourceLineNo">281</span> public String toString() {<a name="line.281"></a> -<span class="sourceLineNo">282</span> return String.format("%s (%s, %s, %s, %s, %s)",<a name="line.282"></a> -<span class="sourceLineNo">283</span> this.getClass().getSimpleName(),<a name="line.283"></a> -<span class="sourceLineNo">284</span> Bytes.toStringBinary(this.columnFamily),<a name="line.284"></a> -<span class="sourceLineNo">285</span> Bytes.toStringBinary(this.columnQualifier),<a name="line.285"></a> -<span class="sourceLineNo">286</span> this.dropDependentColumn,<a name="line.286"></a> -<span class="sourceLineNo">287</span> this.compareOp.name(),<a name="line.287"></a> -<span class="sourceLineNo">288</span> this.comparator != null ? Bytes.toStringBinary(this.comparator.getValue()) : "null");<a name="line.288"></a> -<span class="sourceLineNo">289</span> }<a name="line.289"></a> -<span class="sourceLineNo">290</span>}<a name="line.290"></a> +<span class="sourceLineNo">242</span> if (proto.getCompareFilter().hasComparator()) {<a name="line.242"></a> +<span class="sourceLineNo">243</span> valueComparator = ProtobufUtil.toComparator(proto.getCompareFilter().getComparator());<a name="line.243"></a> +<span class="sourceLineNo">244</span> }<a name="line.244"></a> +<span class="sourceLineNo">245</span> } catch (IOException ioe) {<a name="line.245"></a> +<span class="sourceLineNo">246</span> throw new DeserializationException(ioe);<a name="line.246"></a> +<span class="sourceLineNo">247</span> }<a name="line.247"></a> +<span class="sourceLineNo">248</span> return new DependentColumnFilter(<a name="line.248"></a> +<span class="sourceLineNo">249</span> proto.hasColumnFamily()?proto.getColumnFamily().toByteArray():null,<a name="line.249"></a> +<span class="sourceLineNo">250</span> proto.hasColumnQualifier()?proto.getColumnQualifier().toByteArray():null,<a name="line.250"></a> +<span class="sourceLineNo">251</span> proto.getDropDependentColumn(), valueCompareOp, valueComparator);<a name="line.251"></a> +<span class="sourceLineNo">252</span> }<a name="line.252"></a> +<span class="sourceLineNo">253</span><a name="line.253"></a> +<span class="sourceLineNo">254</span> /**<a name="line.254"></a> +<span class="sourceLineNo">255</span> * @param o<a name="line.255"></a> +<span class="sourceLineNo">256</span> * @return true if and only if the fields of the filter that are serialized<a name="line.256"></a> +<span class="sourceLineNo">257</span> * are equal to the corresponding fields in other. Used for testing.<a name="line.257"></a> +<span class="sourceLineNo">258</span> */<a name="line.258"></a> +<span class="sourceLineNo">259</span> @edu.umd.cs.findbugs.annotations.SuppressWarnings(<a name="line.259"></a> +<span class="sourceLineNo">260</span> value="RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE")<a name="line.260"></a> +<span class="sourceLineNo">261</span> boolean areSerializedFieldsEqual(Filter o) {<a name="line.261"></a> +<span class="sourceLineNo">262</span> if (o == this) return true;<a name="line.262"></a> +<span class="sourceLineNo">263</span> if (!(o instanceof DependentColumnFilter)) return false;<a name="line.263"></a> +<span class="sourceLineNo">264</span><a name="line.264"></a> +<span class="sourceLineNo">265</span> DependentColumnFilter other = (DependentColumnFilter)o;<a name="line.265"></a> +<span class="sourceLineNo">266</span> return other != null && super.areSerializedFieldsEqual(other)<a name="line.266"></a> +<span class="sourceLineNo">267</span> && Bytes.equals(this.getFamily(), other.getFamily())<a name="line.267"></a> +<span class="sourceLineNo">268</span> && Bytes.equals(this.getQualifier(), other.getQualifier())<a name="line.268"></a> +<span class="sourceLineNo">269</span> && this.dropDependentColumn() == other.dropDependentColumn();<a name="line.269"></a> +<span class="sourceLineNo">270</span> }<a name="line.270"></a> +<span class="sourceLineNo">271</span><a name="line.271"></a> +<span class="sourceLineNo">272</span> @Override<a name="line.272"></a> +<span class="sourceLineNo">273</span> public String toString() {<a name="line.273"></a> +<span class="sourceLineNo">274</span> return String.format("%s (%s, %s, %s, %s, %s)",<a name="line.274"></a> +<span class="sourceLineNo">275</span> this.getClass().getSimpleName(),<a name="line.275"></a> +<span class="sourceLineNo">276</span> Bytes.toStringBinary(this.columnFamily),<a name="line.276"></a> +<span class="sourceLineNo">277</span> Bytes.toStringBinary(this.columnQualifier),<a name="line.277"></a> +<span class="sourceLineNo">278</span> this.dropDependentColumn,<a name="line.278"></a> +<span class="sourceLineNo">279</span> this.compareOp.name(),<a name="line.279"></a> +<span class="sourceLineNo">280</span> this.comparator != null ? Bytes.toStringBinary(this.comparator.getValue()) : "null");<a name="line.280"></a> +<span class="sourceLineNo">281</span> }<a name="line.281"></a> +<span class="sourceLineNo">282</span>}<a name="line.282"></a>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2aec596e/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/Import.html ---------------------------------------------------------------------- diff --git a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/Import.html b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/Import.html index 34804f6..98d5be0 100644 --- a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/Import.html +++ b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/Import.html @@ -362,7 +362,7 @@ <span class="sourceLineNo">354</span> */<a name="line.354"></a> <span class="sourceLineNo">355</span> if (CellUtil.isDeleteFamily(kv)) {<a name="line.355"></a> <span class="sourceLineNo">356</span> Delete deleteFamily = new Delete(key.get());<a name="line.356"></a> -<span class="sourceLineNo">357</span> deleteFamily.addDeleteMarker(kv);<a name="line.357"></a> +<span class="sourceLineNo">357</span> deleteFamily.add(kv);<a name="line.357"></a> <span class="sourceLineNo">358</span> if (durability != null) {<a name="line.358"></a> <span class="sourceLineNo">359</span> deleteFamily.setDurability(durability);<a name="line.359"></a> <span class="sourceLineNo">360</span> }<a name="line.360"></a> @@ -372,7 +372,7 @@ <span class="sourceLineNo">364</span> if (delete == null) {<a name="line.364"></a> <span class="sourceLineNo">365</span> delete = new Delete(key.get());<a name="line.365"></a> <span class="sourceLineNo">366</span> }<a name="line.366"></a> -<span class="sourceLineNo">367</span> delete.addDeleteMarker(kv);<a name="line.367"></a> +<span class="sourceLineNo">367</span> delete.add(kv);<a name="line.367"></a> <span class="sourceLineNo">368</span> } else {<a name="line.368"></a> <span class="sourceLineNo">369</span> if (put == null) {<a name="line.369"></a> <span class="sourceLineNo">370</span> put = new Put(key.get());<a name="line.370"></a> http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2aec596e/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/WALPlayer.html ---------------------------------------------------------------------- diff --git a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/WALPlayer.html b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/WALPlayer.html index 1d3134a..7ec977c 100644 --- a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/WALPlayer.html +++ b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/WALPlayer.html @@ -190,7 +190,7 @@ <span class="sourceLineNo">182</span> }<a name="line.182"></a> <span class="sourceLineNo">183</span> }<a name="line.183"></a> <span class="sourceLineNo">184</span> if (CellUtil.isDelete(cell)) {<a name="line.184"></a> -<span class="sourceLineNo">185</span> del.addDeleteMarker(cell);<a name="line.185"></a> +<span class="sourceLineNo">185</span> del.add(cell);<a name="line.185"></a> <span class="sourceLineNo">186</span> } else {<a name="line.186"></a> <span class="sourceLineNo">187</span> put.add(cell);<a name="line.187"></a> <span class="sourceLineNo">188</span> }<a name="line.188"></a> http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2aec596e/book.html ---------------------------------------------------------------------- diff --git a/book.html b/book.html index 4c13d51..212e336 100644 --- a/book.html +++ b/book.html @@ -30781,10 +30781,8 @@ serialization/deserialization.</p> <p>In hbase-2.0.0, we introduced a new module, <code>hbase-protocol-shaded</code> inside which we contained all to do with protobuf and its subsequent relocation/shading. This module is in essence a copy of much of the old -<code>hbase-protocol</code> but with an extra shading/relocation step (see the <code>README.txt</code> -and the <code>poms.xml</code> in this module for more on how to trigger this -effect and how it all works). Core was moved to depend on this new -module.</p> +<code>hbase-protocol</code> but with an extra shading/relocation step. +Core was moved to depend on this new module.</p> </div> <div class="paragraph"> <p>That said, a complication arises around Coprocessor Endpoints (CPEPs). @@ -30813,9 +30811,7 @@ HBase needs to be able to deal with both </div> <div class="paragraph"> <p>The <code>hbase-protocol-shaded</code> module hosts all -protobufs used by HBase core as well as the internal shaded version of -protobufs that hbase depends on. hbase-client and hbase-server, etc., -depend on this module.</p> +protobufs used by HBase core.</p> </div> <div class="paragraph"> <p>But for the vestigial CPEP references to the (non-shaded) content of @@ -31599,7 +31595,7 @@ JIRA and add a version number to the name of the new patch.</p> <div class="sect2"> <h3 id="_editing_the_hbase_website"><a class="anchor" href="#_editing_the_hbase_website"></a>A.2. Editing the HBase Website</h3> <div class="paragraph"> -<p>The source for the HBase website is in the HBase source, in the <em>src/main/site/</em> directory. +<p>The source for the HBase website is in the HBase source, in the <em>src/site/</em> directory. Within this directory, source for the individual pages is in the <em>xdocs/</em> directory, and images referenced in those pages are in the <em>resources/images/</em> directory. This directory also stores images used in the HBase Reference Guide.</p> @@ -31813,7 +31809,7 @@ include\::path/to/app.rb[] </div> </div> <div class="paragraph"> -<p>(put the image in the src/main/site/resources/images directory)</p> +<p>(put the image in the src/site/resources/images directory)</p> </div></div></td> </tr> <tr> @@ -32104,7 +32100,7 @@ Inline images cannot have titles. They are generally small images like GUI butto </div> </div> <div class="paragraph"> -<p>When doing a local build, save the image to the <em>src/main/site/resources/images/</em> directory. +<p>When doing a local build, save the image to the <em>src/site/resources/images/</em> directory. When you link to the image, do not include the directory portion of the path. The image will be copied to the appropriate target location during the build of the output.</p> </div> @@ -35009,7 +35005,7 @@ The server will return cellblocks compressed using this same compressor as long <div id="footer"> <div id="footer-text"> Version 3.0.0-SNAPSHOT<br> -Last updated 2017-08-02 14:32:39 UTC +Last updated 2017-07-18 21:29:11 UTC </div> </div> </body> http://git-wip-us.apache.org/repos/asf/hbase-site/blob/2aec596e/bulk-loads.html ---------------------------------------------------------------------- diff --git a/bulk-loads.html b/bulk-loads.html index af289a9..c917dc3 100644 --- a/bulk-loads.html +++ b/bulk-loads.html @@ -7,7 +7,7 @@ <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - <meta name="Date-Revision-yyyymmdd" content="20170802" /> + <meta name="Date-Revision-yyyymmdd" content="20170809" /> <meta http-equiv="Content-Language" content="en" /> <title>Apache HBase – Bulk Loads in Apache HBase (TM) @@ -311,7 +311,7 @@ under the License. --> <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved. - <li id="publishDate" class="pull-right">Last Published: 2017-08-02</li> + <li id="publishDate" class="pull-right">Last Published: 2017-08-09</li> </p> </div>