<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<title>Source code</title>
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
</head>
<body>
<div class="sourceContainer">
<pre><span class="sourceLineNo">001</span>/*<a name="line.1"></a>
<span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
<span class="sourceLineNo">003</span> * or more contributor license agreements.  See the NOTICE file<a name="line.3"></a>
<span class="sourceLineNo">004</span> * distributed with this work for additional information<a name="line.4"></a>
<span class="sourceLineNo">005</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.5"></a>
<span class="sourceLineNo">006</span> * to you under the Apache License, Version 2.0 (the<a name="line.6"></a>
<span class="sourceLineNo">007</span> * "License"); you may not use this file except in compliance<a name="line.7"></a>
<span class="sourceLineNo">008</span> * with the License.  You may obtain a copy of the License at<a name="line.8"></a>
<span class="sourceLineNo">009</span> *<a name="line.9"></a>
<span class="sourceLineNo">010</span> *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
<span class="sourceLineNo">011</span> *<a name="line.11"></a>
<span class="sourceLineNo">012</span> * Unless required by applicable law or agreed to in writing, software<a name="line.12"></a>
<span class="sourceLineNo">013</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.13"></a>
<span class="sourceLineNo">014</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.14"></a>
<span class="sourceLineNo">015</span> * See the License for the specific language governing permissions and<a name="line.15"></a>
<span class="sourceLineNo">016</span> * limitations under the License.<a name="line.16"></a>
<span class="sourceLineNo">017</span> */<a name="line.17"></a>
<span class="sourceLineNo">018</span>package org.apache.hadoop.hbase;<a name="line.18"></a>
<span class="sourceLineNo">019</span><a name="line.19"></a>
<span class="sourceLineNo">020</span>import static org.apache.hadoop.hbase.HConstants.EMPTY_BYTE_ARRAY;<a name="line.20"></a>
<span class="sourceLineNo">021</span>import static org.apache.hadoop.hbase.Tag.TAG_LENGTH_SIZE;<a name="line.21"></a>
<span class="sourceLineNo">022</span><a name="line.22"></a>
<span class="sourceLineNo">023</span>import java.io.DataOutput;<a name="line.23"></a>
<span class="sourceLineNo">024</span>import java.io.DataOutputStream;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import java.io.IOException;<a name="line.25"></a>
<span class="sourceLineNo">026</span>import java.io.OutputStream;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import java.math.BigDecimal;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import java.nio.ByteBuffer;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import java.util.ArrayList;<a name="line.29"></a>
<span class="sourceLineNo">030</span>import java.util.Iterator;<a name="line.30"></a>
<span class="sourceLineNo">031</span>import java.util.List;<a name="line.31"></a>
<span class="sourceLineNo">032</span>import java.util.Optional;<a name="line.32"></a>
<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.filter.ByteArrayComparable;<a name="line.33"></a>
<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.io.TagCompressionContext;<a name="line.34"></a>
<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.io.util.Dictionary;<a name="line.35"></a>
<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.io.util.StreamUtils;<a name="line.36"></a>
<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.util.ByteBufferUtils;<a name="line.37"></a>
<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.util.ByteRange;<a name="line.38"></a>
<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.39"></a>
<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.util.ClassSize;<a name="line.40"></a>
<span class="sourceLineNo">041</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.41"></a>
<span class="sourceLineNo">042</span><a name="line.42"></a>
<span class="sourceLineNo">043</span>/**<a name="line.43"></a>
<span class="sourceLineNo">044</span> * Utility methods helpful slinging {@link Cell} instances. It has more powerful and rich set of<a name="line.44"></a>
<span class="sourceLineNo">045</span> * APIs than those in {@link CellUtil} for internal usage.<a name="line.45"></a>
<span class="sourceLineNo">046</span> */<a name="line.46"></a>
<span class="sourceLineNo">047</span>@InterfaceAudience.Private<a name="line.47"></a>
<span class="sourceLineNo">048</span>public final class PrivateCellUtil {<a name="line.48"></a>
<span class="sourceLineNo">049</span><a name="line.49"></a>
<span class="sourceLineNo">050</span>  /**<a name="line.50"></a>
<span class="sourceLineNo">051</span>   * Private constructor to keep this class from being instantiated.<a name="line.51"></a>
<span class="sourceLineNo">052</span>   */<a name="line.52"></a>
<span class="sourceLineNo">053</span>  private PrivateCellUtil() {<a name="line.53"></a>
<span class="sourceLineNo">054</span>  }<a name="line.54"></a>
<span class="sourceLineNo">055</span><a name="line.55"></a>
<span class="sourceLineNo">056</span>  /******************* ByteRange *******************************/<a name="line.56"></a>
<span class="sourceLineNo">057</span><a name="line.57"></a>
<span class="sourceLineNo">058</span>  public static ByteRange fillRowRange(Cell cell, ByteRange range) {<a name="line.58"></a>
<span class="sourceLineNo">059</span>    return range.set(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());<a name="line.59"></a>
<span class="sourceLineNo">060</span>  }<a name="line.60"></a>
<span class="sourceLineNo">061</span><a name="line.61"></a>
<span class="sourceLineNo">062</span>  public static ByteRange fillFamilyRange(Cell cell, ByteRange range) {<a name="line.62"></a>
<span class="sourceLineNo">063</span>    return range.set(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());<a name="line.63"></a>
<span class="sourceLineNo">064</span>  }<a name="line.64"></a>
<span class="sourceLineNo">065</span><a name="line.65"></a>
<span class="sourceLineNo">066</span>  public static ByteRange fillQualifierRange(Cell cell, ByteRange range) {<a name="line.66"></a>
<span class="sourceLineNo">067</span>    return range.set(cell.getQualifierArray(), cell.getQualifierOffset(),<a name="line.67"></a>
<span class="sourceLineNo">068</span>      cell.getQualifierLength());<a name="line.68"></a>
<span class="sourceLineNo">069</span>  }<a name="line.69"></a>
<span class="sourceLineNo">070</span><a name="line.70"></a>
<span class="sourceLineNo">071</span>  public static ByteRange fillValueRange(Cell cell, ByteRange range) {<a name="line.71"></a>
<span class="sourceLineNo">072</span>    return range.set(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());<a name="line.72"></a>
<span class="sourceLineNo">073</span>  }<a name="line.73"></a>
<span class="sourceLineNo">074</span><a name="line.74"></a>
<span class="sourceLineNo">075</span>  public static ByteRange fillTagRange(Cell cell, ByteRange range) {<a name="line.75"></a>
<span class="sourceLineNo">076</span>    return range.set(cell.getTagsArray(), cell.getTagsOffset(), cell.getTagsLength());<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>  /********************* misc *************************************/<a name="line.79"></a>
<span class="sourceLineNo">080</span><a name="line.80"></a>
<span class="sourceLineNo">081</span>  public static byte getRowByte(Cell cell, int index) {<a name="line.81"></a>
<span class="sourceLineNo">082</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.82"></a>
<span class="sourceLineNo">083</span>      return ((ByteBufferExtendedCell) cell).getRowByteBuffer()<a name="line.83"></a>
<span class="sourceLineNo">084</span>        .get(((ByteBufferExtendedCell) cell).getRowPosition() + index);<a name="line.84"></a>
<span class="sourceLineNo">085</span>    }<a name="line.85"></a>
<span class="sourceLineNo">086</span>    return cell.getRowArray()[cell.getRowOffset() + index];<a name="line.86"></a>
<span class="sourceLineNo">087</span>  }<a name="line.87"></a>
<span class="sourceLineNo">088</span><a name="line.88"></a>
<span class="sourceLineNo">089</span>  public static byte getQualifierByte(Cell cell, int index) {<a name="line.89"></a>
<span class="sourceLineNo">090</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.90"></a>
<span class="sourceLineNo">091</span>      return ((ByteBufferExtendedCell) cell).getQualifierByteBuffer()<a name="line.91"></a>
<span class="sourceLineNo">092</span>        .get(((ByteBufferExtendedCell) cell).getQualifierPosition() + index);<a name="line.92"></a>
<span class="sourceLineNo">093</span>    }<a name="line.93"></a>
<span class="sourceLineNo">094</span>    return cell.getQualifierArray()[cell.getQualifierOffset() + index];<a name="line.94"></a>
<span class="sourceLineNo">095</span>  }<a name="line.95"></a>
<span class="sourceLineNo">096</span><a name="line.96"></a>
<span class="sourceLineNo">097</span>  public static ByteBuffer getValueBufferShallowCopy(Cell cell) {<a name="line.97"></a>
<span class="sourceLineNo">098</span>    ByteBuffer buffer =<a name="line.98"></a>
<span class="sourceLineNo">099</span>      ByteBuffer.wrap(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());<a name="line.99"></a>
<span class="sourceLineNo">100</span>    return buffer;<a name="line.100"></a>
<span class="sourceLineNo">101</span>  }<a name="line.101"></a>
<span class="sourceLineNo">102</span><a name="line.102"></a>
<span class="sourceLineNo">103</span>  /** Returns A new cell which is having the extra tags also added to it. */<a name="line.103"></a>
<span class="sourceLineNo">104</span>  public static Cell createCell(Cell cell, List&lt;Tag&gt; tags) {<a name="line.104"></a>
<span class="sourceLineNo">105</span>    return createCell(cell, TagUtil.fromList(tags));<a name="line.105"></a>
<span class="sourceLineNo">106</span>  }<a name="line.106"></a>
<span class="sourceLineNo">107</span><a name="line.107"></a>
<span class="sourceLineNo">108</span>  /** Returns A new cell which is having the extra tags also added to it. */<a name="line.108"></a>
<span class="sourceLineNo">109</span>  public static Cell createCell(Cell cell, byte[] tags) {<a name="line.109"></a>
<span class="sourceLineNo">110</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.110"></a>
<span class="sourceLineNo">111</span>      return new TagRewriteByteBufferExtendedCell((ByteBufferExtendedCell) cell, tags);<a name="line.111"></a>
<span class="sourceLineNo">112</span>    }<a name="line.112"></a>
<span class="sourceLineNo">113</span>    return new TagRewriteCell(cell, tags);<a name="line.113"></a>
<span class="sourceLineNo">114</span>  }<a name="line.114"></a>
<span class="sourceLineNo">115</span><a name="line.115"></a>
<span class="sourceLineNo">116</span>  public static Cell createCell(Cell cell, byte[] value, byte[] tags) {<a name="line.116"></a>
<span class="sourceLineNo">117</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.117"></a>
<span class="sourceLineNo">118</span>      return new ValueAndTagRewriteByteBufferExtendedCell((ByteBufferExtendedCell) cell, value,<a name="line.118"></a>
<span class="sourceLineNo">119</span>        tags);<a name="line.119"></a>
<span class="sourceLineNo">120</span>    }<a name="line.120"></a>
<span class="sourceLineNo">121</span>    return new ValueAndTagRewriteCell(cell, value, tags);<a name="line.121"></a>
<span class="sourceLineNo">122</span>  }<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>   * This can be used when a Cell has to change with addition/removal of one or more tags. This is<a name="line.125"></a>
<span class="sourceLineNo">126</span>   * an efficient way to do so in which only the tags bytes part need to recreated and copied. All<a name="line.126"></a>
<span class="sourceLineNo">127</span>   * other parts, refer to the original Cell.<a name="line.127"></a>
<span class="sourceLineNo">128</span>   */<a name="line.128"></a>
<span class="sourceLineNo">129</span>  static class TagRewriteCell implements ExtendedCell {<a name="line.129"></a>
<span class="sourceLineNo">130</span>    protected Cell cell;<a name="line.130"></a>
<span class="sourceLineNo">131</span>    protected byte[] tags;<a name="line.131"></a>
<span class="sourceLineNo">132</span>    private static final int HEAP_SIZE_OVERHEAD = ClassSize.OBJECT + 2 * ClassSize.REFERENCE;<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>     * Construct a TagRewriteCell<a name="line.135"></a>
<span class="sourceLineNo">136</span>     * @param cell The original Cell which it rewrites<a name="line.136"></a>
<span class="sourceLineNo">137</span>     * @param tags the tags bytes. The array suppose to contain the tags bytes alone.<a name="line.137"></a>
<span class="sourceLineNo">138</span>     */<a name="line.138"></a>
<span class="sourceLineNo">139</span>    public TagRewriteCell(Cell cell, byte[] tags) {<a name="line.139"></a>
<span class="sourceLineNo">140</span>      assert cell instanceof ExtendedCell;<a name="line.140"></a>
<span class="sourceLineNo">141</span>      assert tags != null;<a name="line.141"></a>
<span class="sourceLineNo">142</span>      this.cell = cell;<a name="line.142"></a>
<span class="sourceLineNo">143</span>      this.tags = tags;<a name="line.143"></a>
<span class="sourceLineNo">144</span>      // tag offset will be treated as 0 and length this.tags.length<a name="line.144"></a>
<span class="sourceLineNo">145</span>      if (this.cell instanceof TagRewriteCell) {<a name="line.145"></a>
<span class="sourceLineNo">146</span>        // Cleaning the ref so that the byte[] can be GCed<a name="line.146"></a>
<span class="sourceLineNo">147</span>        ((TagRewriteCell) this.cell).tags = null;<a name="line.147"></a>
<span class="sourceLineNo">148</span>      }<a name="line.148"></a>
<span class="sourceLineNo">149</span>    }<a name="line.149"></a>
<span class="sourceLineNo">150</span><a name="line.150"></a>
<span class="sourceLineNo">151</span>    @Override<a name="line.151"></a>
<span class="sourceLineNo">152</span>    public byte[] getRowArray() {<a name="line.152"></a>
<span class="sourceLineNo">153</span>      return cell.getRowArray();<a name="line.153"></a>
<span class="sourceLineNo">154</span>    }<a name="line.154"></a>
<span class="sourceLineNo">155</span><a name="line.155"></a>
<span class="sourceLineNo">156</span>    @Override<a name="line.156"></a>
<span class="sourceLineNo">157</span>    public int getRowOffset() {<a name="line.157"></a>
<span class="sourceLineNo">158</span>      return cell.getRowOffset();<a name="line.158"></a>
<span class="sourceLineNo">159</span>    }<a name="line.159"></a>
<span class="sourceLineNo">160</span><a name="line.160"></a>
<span class="sourceLineNo">161</span>    @Override<a name="line.161"></a>
<span class="sourceLineNo">162</span>    public short getRowLength() {<a name="line.162"></a>
<span class="sourceLineNo">163</span>      return cell.getRowLength();<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 byte[] getFamilyArray() {<a name="line.167"></a>
<span class="sourceLineNo">168</span>      return cell.getFamilyArray();<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 int getFamilyOffset() {<a name="line.172"></a>
<span class="sourceLineNo">173</span>      return cell.getFamilyOffset();<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 byte getFamilyLength() {<a name="line.177"></a>
<span class="sourceLineNo">178</span>      return cell.getFamilyLength();<a name="line.178"></a>
<span class="sourceLineNo">179</span>    }<a name="line.179"></a>
<span class="sourceLineNo">180</span><a name="line.180"></a>
<span class="sourceLineNo">181</span>    @Override<a name="line.181"></a>
<span class="sourceLineNo">182</span>    public byte[] getQualifierArray() {<a name="line.182"></a>
<span class="sourceLineNo">183</span>      return cell.getQualifierArray();<a name="line.183"></a>
<span class="sourceLineNo">184</span>    }<a name="line.184"></a>
<span class="sourceLineNo">185</span><a name="line.185"></a>
<span class="sourceLineNo">186</span>    @Override<a name="line.186"></a>
<span class="sourceLineNo">187</span>    public int getQualifierOffset() {<a name="line.187"></a>
<span class="sourceLineNo">188</span>      return cell.getQualifierOffset();<a name="line.188"></a>
<span class="sourceLineNo">189</span>    }<a name="line.189"></a>
<span class="sourceLineNo">190</span><a name="line.190"></a>
<span class="sourceLineNo">191</span>    @Override<a name="line.191"></a>
<span class="sourceLineNo">192</span>    public int getQualifierLength() {<a name="line.192"></a>
<span class="sourceLineNo">193</span>      return cell.getQualifierLength();<a name="line.193"></a>
<span class="sourceLineNo">194</span>    }<a name="line.194"></a>
<span class="sourceLineNo">195</span><a name="line.195"></a>
<span class="sourceLineNo">196</span>    @Override<a name="line.196"></a>
<span class="sourceLineNo">197</span>    public long getTimestamp() {<a name="line.197"></a>
<span class="sourceLineNo">198</span>      return cell.getTimestamp();<a name="line.198"></a>
<span class="sourceLineNo">199</span>    }<a name="line.199"></a>
<span class="sourceLineNo">200</span><a name="line.200"></a>
<span class="sourceLineNo">201</span>    @Override<a name="line.201"></a>
<span class="sourceLineNo">202</span>    public byte getTypeByte() {<a name="line.202"></a>
<span class="sourceLineNo">203</span>      return cell.getTypeByte();<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>    @Override<a name="line.206"></a>
<span class="sourceLineNo">207</span>    public long getSequenceId() {<a name="line.207"></a>
<span class="sourceLineNo">208</span>      return cell.getSequenceId();<a name="line.208"></a>
<span class="sourceLineNo">209</span>    }<a name="line.209"></a>
<span class="sourceLineNo">210</span><a name="line.210"></a>
<span class="sourceLineNo">211</span>    @Override<a name="line.211"></a>
<span class="sourceLineNo">212</span>    public byte[] getValueArray() {<a name="line.212"></a>
<span class="sourceLineNo">213</span>      return cell.getValueArray();<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>    @Override<a name="line.216"></a>
<span class="sourceLineNo">217</span>    public int getValueOffset() {<a name="line.217"></a>
<span class="sourceLineNo">218</span>      return cell.getValueOffset();<a name="line.218"></a>
<span class="sourceLineNo">219</span>    }<a name="line.219"></a>
<span class="sourceLineNo">220</span><a name="line.220"></a>
<span class="sourceLineNo">221</span>    @Override<a name="line.221"></a>
<span class="sourceLineNo">222</span>    public int getValueLength() {<a name="line.222"></a>
<span class="sourceLineNo">223</span>      return cell.getValueLength();<a name="line.223"></a>
<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
<span class="sourceLineNo">225</span><a name="line.225"></a>
<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
<span class="sourceLineNo">227</span>    public byte[] getTagsArray() {<a name="line.227"></a>
<span class="sourceLineNo">228</span>      return this.tags;<a name="line.228"></a>
<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
<span class="sourceLineNo">230</span><a name="line.230"></a>
<span class="sourceLineNo">231</span>    @Override<a name="line.231"></a>
<span class="sourceLineNo">232</span>    public int getTagsOffset() {<a name="line.232"></a>
<span class="sourceLineNo">233</span>      return 0;<a name="line.233"></a>
<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
<span class="sourceLineNo">235</span><a name="line.235"></a>
<span class="sourceLineNo">236</span>    @Override<a name="line.236"></a>
<span class="sourceLineNo">237</span>    public int getTagsLength() {<a name="line.237"></a>
<span class="sourceLineNo">238</span>      if (null == this.tags) {<a name="line.238"></a>
<span class="sourceLineNo">239</span>        // Nulled out tags array optimization in constructor<a name="line.239"></a>
<span class="sourceLineNo">240</span>        return 0;<a name="line.240"></a>
<span class="sourceLineNo">241</span>      }<a name="line.241"></a>
<span class="sourceLineNo">242</span>      return this.tags.length;<a name="line.242"></a>
<span class="sourceLineNo">243</span>    }<a name="line.243"></a>
<span class="sourceLineNo">244</span><a name="line.244"></a>
<span class="sourceLineNo">245</span>    @Override<a name="line.245"></a>
<span class="sourceLineNo">246</span>    public long heapSize() {<a name="line.246"></a>
<span class="sourceLineNo">247</span>      long sum = HEAP_SIZE_OVERHEAD + cell.heapSize();<a name="line.247"></a>
<span class="sourceLineNo">248</span>      if (this.tags != null) {<a name="line.248"></a>
<span class="sourceLineNo">249</span>        sum += ClassSize.sizeOf(this.tags);<a name="line.249"></a>
<span class="sourceLineNo">250</span>      }<a name="line.250"></a>
<span class="sourceLineNo">251</span>      return sum;<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>    @Override<a name="line.254"></a>
<span class="sourceLineNo">255</span>    public void setTimestamp(long ts) throws IOException {<a name="line.255"></a>
<span class="sourceLineNo">256</span>      // The incoming cell is supposed to be ExtendedCell type.<a name="line.256"></a>
<span class="sourceLineNo">257</span>      PrivateCellUtil.setTimestamp(cell, ts);<a name="line.257"></a>
<span class="sourceLineNo">258</span>    }<a name="line.258"></a>
<span class="sourceLineNo">259</span><a name="line.259"></a>
<span class="sourceLineNo">260</span>    @Override<a name="line.260"></a>
<span class="sourceLineNo">261</span>    public void setTimestamp(byte[] ts) throws IOException {<a name="line.261"></a>
<span class="sourceLineNo">262</span>      // The incoming cell is supposed to be ExtendedCell type.<a name="line.262"></a>
<span class="sourceLineNo">263</span>      PrivateCellUtil.setTimestamp(cell, ts);<a name="line.263"></a>
<span class="sourceLineNo">264</span>    }<a name="line.264"></a>
<span class="sourceLineNo">265</span><a name="line.265"></a>
<span class="sourceLineNo">266</span>    @Override<a name="line.266"></a>
<span class="sourceLineNo">267</span>    public void setSequenceId(long seqId) throws IOException {<a name="line.267"></a>
<span class="sourceLineNo">268</span>      // The incoming cell is supposed to be ExtendedCell type.<a name="line.268"></a>
<span class="sourceLineNo">269</span>      PrivateCellUtil.setSequenceId(cell, seqId);<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 int write(OutputStream out, boolean withTags) throws IOException {<a name="line.273"></a>
<span class="sourceLineNo">274</span>      int len = ((ExtendedCell) this.cell).write(out, false);<a name="line.274"></a>
<span class="sourceLineNo">275</span>      if (withTags &amp;&amp; this.tags != null) {<a name="line.275"></a>
<span class="sourceLineNo">276</span>        // Write the tagsLength 2 bytes<a name="line.276"></a>
<span class="sourceLineNo">277</span>        out.write((byte) (0xff &amp; (this.tags.length &gt;&gt; 8)));<a name="line.277"></a>
<span class="sourceLineNo">278</span>        out.write((byte) (0xff &amp; this.tags.length));<a name="line.278"></a>
<span class="sourceLineNo">279</span>        out.write(this.tags);<a name="line.279"></a>
<span class="sourceLineNo">280</span>        len += KeyValue.TAGS_LENGTH_SIZE + this.tags.length;<a name="line.280"></a>
<span class="sourceLineNo">281</span>      }<a name="line.281"></a>
<span class="sourceLineNo">282</span>      return len;<a name="line.282"></a>
<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
<span class="sourceLineNo">284</span><a name="line.284"></a>
<span class="sourceLineNo">285</span>    @Override<a name="line.285"></a>
<span class="sourceLineNo">286</span>    public int getSerializedSize(boolean withTags) {<a name="line.286"></a>
<span class="sourceLineNo">287</span>      int len = ((ExtendedCell) this.cell).getSerializedSize(false);<a name="line.287"></a>
<span class="sourceLineNo">288</span>      if (withTags &amp;&amp; this.tags != null) {<a name="line.288"></a>
<span class="sourceLineNo">289</span>        len += KeyValue.TAGS_LENGTH_SIZE + this.tags.length;<a name="line.289"></a>
<span class="sourceLineNo">290</span>      }<a name="line.290"></a>
<span class="sourceLineNo">291</span>      return len;<a name="line.291"></a>
<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
<span class="sourceLineNo">293</span><a name="line.293"></a>
<span class="sourceLineNo">294</span>    @Override<a name="line.294"></a>
<span class="sourceLineNo">295</span>    public void write(ByteBuffer buf, int offset) {<a name="line.295"></a>
<span class="sourceLineNo">296</span>      offset = KeyValueUtil.appendTo(this.cell, buf, offset, false);<a name="line.296"></a>
<span class="sourceLineNo">297</span>      int tagsLen = this.tags == null ? 0 : this.tags.length;<a name="line.297"></a>
<span class="sourceLineNo">298</span>      if (tagsLen &gt; 0) {<a name="line.298"></a>
<span class="sourceLineNo">299</span>        offset = ByteBufferUtils.putAsShort(buf, offset, tagsLen);<a name="line.299"></a>
<span class="sourceLineNo">300</span>        ByteBufferUtils.copyFromArrayToBuffer(buf, offset, this.tags, 0, tagsLen);<a name="line.300"></a>
<span class="sourceLineNo">301</span>      }<a name="line.301"></a>
<span class="sourceLineNo">302</span>    }<a name="line.302"></a>
<span class="sourceLineNo">303</span><a name="line.303"></a>
<span class="sourceLineNo">304</span>    @Override<a name="line.304"></a>
<span class="sourceLineNo">305</span>    public ExtendedCell deepClone() {<a name="line.305"></a>
<span class="sourceLineNo">306</span>      Cell clonedBaseCell = ((ExtendedCell) this.cell).deepClone();<a name="line.306"></a>
<span class="sourceLineNo">307</span>      return new TagRewriteCell(clonedBaseCell, this.tags);<a name="line.307"></a>
<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
<span class="sourceLineNo">310</span><a name="line.310"></a>
<span class="sourceLineNo">311</span>  static class TagRewriteByteBufferExtendedCell extends ByteBufferExtendedCell {<a name="line.311"></a>
<span class="sourceLineNo">312</span><a name="line.312"></a>
<span class="sourceLineNo">313</span>    protected ByteBufferExtendedCell cell;<a name="line.313"></a>
<span class="sourceLineNo">314</span>    protected byte[] tags;<a name="line.314"></a>
<span class="sourceLineNo">315</span>    private static final int HEAP_SIZE_OVERHEAD = ClassSize.OBJECT + 2 * ClassSize.REFERENCE;<a name="line.315"></a>
<span class="sourceLineNo">316</span><a name="line.316"></a>
<span class="sourceLineNo">317</span>    /**<a name="line.317"></a>
<span class="sourceLineNo">318</span>     * @param cell The original ByteBufferExtendedCell which it rewrites<a name="line.318"></a>
<span class="sourceLineNo">319</span>     * @param tags the tags bytes. The array suppose to contain the tags bytes alone.<a name="line.319"></a>
<span class="sourceLineNo">320</span>     */<a name="line.320"></a>
<span class="sourceLineNo">321</span>    public TagRewriteByteBufferExtendedCell(ByteBufferExtendedCell cell, byte[] tags) {<a name="line.321"></a>
<span class="sourceLineNo">322</span>      assert tags != null;<a name="line.322"></a>
<span class="sourceLineNo">323</span>      this.cell = cell;<a name="line.323"></a>
<span class="sourceLineNo">324</span>      this.tags = tags;<a name="line.324"></a>
<span class="sourceLineNo">325</span>      // tag offset will be treated as 0 and length this.tags.length<a name="line.325"></a>
<span class="sourceLineNo">326</span>      if (this.cell instanceof TagRewriteByteBufferExtendedCell) {<a name="line.326"></a>
<span class="sourceLineNo">327</span>        // Cleaning the ref so that the byte[] can be GCed<a name="line.327"></a>
<span class="sourceLineNo">328</span>        ((TagRewriteByteBufferExtendedCell) this.cell).tags = null;<a name="line.328"></a>
<span class="sourceLineNo">329</span>      }<a name="line.329"></a>
<span class="sourceLineNo">330</span>    }<a name="line.330"></a>
<span class="sourceLineNo">331</span><a name="line.331"></a>
<span class="sourceLineNo">332</span>    @Override<a name="line.332"></a>
<span class="sourceLineNo">333</span>    public byte[] getRowArray() {<a name="line.333"></a>
<span class="sourceLineNo">334</span>      return this.cell.getRowArray();<a name="line.334"></a>
<span class="sourceLineNo">335</span>    }<a name="line.335"></a>
<span class="sourceLineNo">336</span><a name="line.336"></a>
<span class="sourceLineNo">337</span>    @Override<a name="line.337"></a>
<span class="sourceLineNo">338</span>    public int getRowOffset() {<a name="line.338"></a>
<span class="sourceLineNo">339</span>      return this.cell.getRowOffset();<a name="line.339"></a>
<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
<span class="sourceLineNo">341</span><a name="line.341"></a>
<span class="sourceLineNo">342</span>    @Override<a name="line.342"></a>
<span class="sourceLineNo">343</span>    public short getRowLength() {<a name="line.343"></a>
<span class="sourceLineNo">344</span>      return this.cell.getRowLength();<a name="line.344"></a>
<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
<span class="sourceLineNo">346</span><a name="line.346"></a>
<span class="sourceLineNo">347</span>    @Override<a name="line.347"></a>
<span class="sourceLineNo">348</span>    public byte[] getFamilyArray() {<a name="line.348"></a>
<span class="sourceLineNo">349</span>      return this.cell.getFamilyArray();<a name="line.349"></a>
<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
<span class="sourceLineNo">351</span><a name="line.351"></a>
<span class="sourceLineNo">352</span>    @Override<a name="line.352"></a>
<span class="sourceLineNo">353</span>    public int getFamilyOffset() {<a name="line.353"></a>
<span class="sourceLineNo">354</span>      return this.cell.getFamilyOffset();<a name="line.354"></a>
<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
<span class="sourceLineNo">356</span><a name="line.356"></a>
<span class="sourceLineNo">357</span>    @Override<a name="line.357"></a>
<span class="sourceLineNo">358</span>    public byte getFamilyLength() {<a name="line.358"></a>
<span class="sourceLineNo">359</span>      return this.cell.getFamilyLength();<a name="line.359"></a>
<span class="sourceLineNo">360</span>    }<a name="line.360"></a>
<span class="sourceLineNo">361</span><a name="line.361"></a>
<span class="sourceLineNo">362</span>    @Override<a name="line.362"></a>
<span class="sourceLineNo">363</span>    public byte[] getQualifierArray() {<a name="line.363"></a>
<span class="sourceLineNo">364</span>      return this.cell.getQualifierArray();<a name="line.364"></a>
<span class="sourceLineNo">365</span>    }<a name="line.365"></a>
<span class="sourceLineNo">366</span><a name="line.366"></a>
<span class="sourceLineNo">367</span>    @Override<a name="line.367"></a>
<span class="sourceLineNo">368</span>    public int getQualifierOffset() {<a name="line.368"></a>
<span class="sourceLineNo">369</span>      return this.cell.getQualifierOffset();<a name="line.369"></a>
<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
<span class="sourceLineNo">371</span><a name="line.371"></a>
<span class="sourceLineNo">372</span>    @Override<a name="line.372"></a>
<span class="sourceLineNo">373</span>    public int getQualifierLength() {<a name="line.373"></a>
<span class="sourceLineNo">374</span>      return this.cell.getQualifierLength();<a name="line.374"></a>
<span class="sourceLineNo">375</span>    }<a name="line.375"></a>
<span class="sourceLineNo">376</span><a name="line.376"></a>
<span class="sourceLineNo">377</span>    @Override<a name="line.377"></a>
<span class="sourceLineNo">378</span>    public long getTimestamp() {<a name="line.378"></a>
<span class="sourceLineNo">379</span>      return this.cell.getTimestamp();<a name="line.379"></a>
<span class="sourceLineNo">380</span>    }<a name="line.380"></a>
<span class="sourceLineNo">381</span><a name="line.381"></a>
<span class="sourceLineNo">382</span>    @Override<a name="line.382"></a>
<span class="sourceLineNo">383</span>    public byte getTypeByte() {<a name="line.383"></a>
<span class="sourceLineNo">384</span>      return this.cell.getTypeByte();<a name="line.384"></a>
<span class="sourceLineNo">385</span>    }<a name="line.385"></a>
<span class="sourceLineNo">386</span><a name="line.386"></a>
<span class="sourceLineNo">387</span>    @Override<a name="line.387"></a>
<span class="sourceLineNo">388</span>    public long getSequenceId() {<a name="line.388"></a>
<span class="sourceLineNo">389</span>      return this.cell.getSequenceId();<a name="line.389"></a>
<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
<span class="sourceLineNo">391</span><a name="line.391"></a>
<span class="sourceLineNo">392</span>    @Override<a name="line.392"></a>
<span class="sourceLineNo">393</span>    public byte[] getValueArray() {<a name="line.393"></a>
<span class="sourceLineNo">394</span>      return this.cell.getValueArray();<a name="line.394"></a>
<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
<span class="sourceLineNo">396</span><a name="line.396"></a>
<span class="sourceLineNo">397</span>    @Override<a name="line.397"></a>
<span class="sourceLineNo">398</span>    public int getValueOffset() {<a name="line.398"></a>
<span class="sourceLineNo">399</span>      return this.cell.getValueOffset();<a name="line.399"></a>
<span class="sourceLineNo">400</span>    }<a name="line.400"></a>
<span class="sourceLineNo">401</span><a name="line.401"></a>
<span class="sourceLineNo">402</span>    @Override<a name="line.402"></a>
<span class="sourceLineNo">403</span>    public int getValueLength() {<a name="line.403"></a>
<span class="sourceLineNo">404</span>      return this.cell.getValueLength();<a name="line.404"></a>
<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
<span class="sourceLineNo">406</span><a name="line.406"></a>
<span class="sourceLineNo">407</span>    @Override<a name="line.407"></a>
<span class="sourceLineNo">408</span>    public byte[] getTagsArray() {<a name="line.408"></a>
<span class="sourceLineNo">409</span>      return this.tags;<a name="line.409"></a>
<span class="sourceLineNo">410</span>    }<a name="line.410"></a>
<span class="sourceLineNo">411</span><a name="line.411"></a>
<span class="sourceLineNo">412</span>    @Override<a name="line.412"></a>
<span class="sourceLineNo">413</span>    public int getTagsOffset() {<a name="line.413"></a>
<span class="sourceLineNo">414</span>      return 0;<a name="line.414"></a>
<span class="sourceLineNo">415</span>    }<a name="line.415"></a>
<span class="sourceLineNo">416</span><a name="line.416"></a>
<span class="sourceLineNo">417</span>    @Override<a name="line.417"></a>
<span class="sourceLineNo">418</span>    public int getTagsLength() {<a name="line.418"></a>
<span class="sourceLineNo">419</span>      if (null == this.tags) {<a name="line.419"></a>
<span class="sourceLineNo">420</span>        // Nulled out tags array optimization in constructor<a name="line.420"></a>
<span class="sourceLineNo">421</span>        return 0;<a name="line.421"></a>
<span class="sourceLineNo">422</span>      }<a name="line.422"></a>
<span class="sourceLineNo">423</span>      return this.tags.length;<a name="line.423"></a>
<span class="sourceLineNo">424</span>    }<a name="line.424"></a>
<span class="sourceLineNo">425</span><a name="line.425"></a>
<span class="sourceLineNo">426</span>    @Override<a name="line.426"></a>
<span class="sourceLineNo">427</span>    public void setSequenceId(long seqId) throws IOException {<a name="line.427"></a>
<span class="sourceLineNo">428</span>      PrivateCellUtil.setSequenceId(this.cell, seqId);<a name="line.428"></a>
<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
<span class="sourceLineNo">430</span><a name="line.430"></a>
<span class="sourceLineNo">431</span>    @Override<a name="line.431"></a>
<span class="sourceLineNo">432</span>    public void setTimestamp(long ts) throws IOException {<a name="line.432"></a>
<span class="sourceLineNo">433</span>      PrivateCellUtil.setTimestamp(this.cell, ts);<a name="line.433"></a>
<span class="sourceLineNo">434</span>    }<a name="line.434"></a>
<span class="sourceLineNo">435</span><a name="line.435"></a>
<span class="sourceLineNo">436</span>    @Override<a name="line.436"></a>
<span class="sourceLineNo">437</span>    public void setTimestamp(byte[] ts) throws IOException {<a name="line.437"></a>
<span class="sourceLineNo">438</span>      PrivateCellUtil.setTimestamp(this.cell, ts);<a name="line.438"></a>
<span class="sourceLineNo">439</span>    }<a name="line.439"></a>
<span class="sourceLineNo">440</span><a name="line.440"></a>
<span class="sourceLineNo">441</span>    @Override<a name="line.441"></a>
<span class="sourceLineNo">442</span>    public long heapSize() {<a name="line.442"></a>
<span class="sourceLineNo">443</span>      long sum = HEAP_SIZE_OVERHEAD + cell.heapSize();<a name="line.443"></a>
<span class="sourceLineNo">444</span>      // this.tags is on heap byte[]<a name="line.444"></a>
<span class="sourceLineNo">445</span>      if (this.tags != null) {<a name="line.445"></a>
<span class="sourceLineNo">446</span>        sum += ClassSize.sizeOf(this.tags);<a name="line.446"></a>
<span class="sourceLineNo">447</span>      }<a name="line.447"></a>
<span class="sourceLineNo">448</span>      return sum;<a name="line.448"></a>
<span class="sourceLineNo">449</span>    }<a name="line.449"></a>
<span class="sourceLineNo">450</span><a name="line.450"></a>
<span class="sourceLineNo">451</span>    @Override<a name="line.451"></a>
<span class="sourceLineNo">452</span>    public int write(OutputStream out, boolean withTags) throws IOException {<a name="line.452"></a>
<span class="sourceLineNo">453</span>      int len = ((ExtendedCell) this.cell).write(out, false);<a name="line.453"></a>
<span class="sourceLineNo">454</span>      if (withTags &amp;&amp; this.tags != null) {<a name="line.454"></a>
<span class="sourceLineNo">455</span>        // Write the tagsLength 2 bytes<a name="line.455"></a>
<span class="sourceLineNo">456</span>        out.write((byte) (0xff &amp; (this.tags.length &gt;&gt; 8)));<a name="line.456"></a>
<span class="sourceLineNo">457</span>        out.write((byte) (0xff &amp; this.tags.length));<a name="line.457"></a>
<span class="sourceLineNo">458</span>        out.write(this.tags);<a name="line.458"></a>
<span class="sourceLineNo">459</span>        len += KeyValue.TAGS_LENGTH_SIZE + this.tags.length;<a name="line.459"></a>
<span class="sourceLineNo">460</span>      }<a name="line.460"></a>
<span class="sourceLineNo">461</span>      return len;<a name="line.461"></a>
<span class="sourceLineNo">462</span>    }<a name="line.462"></a>
<span class="sourceLineNo">463</span><a name="line.463"></a>
<span class="sourceLineNo">464</span>    @Override<a name="line.464"></a>
<span class="sourceLineNo">465</span>    public int getSerializedSize(boolean withTags) {<a name="line.465"></a>
<span class="sourceLineNo">466</span>      int len = ((ExtendedCell) this.cell).getSerializedSize(false);<a name="line.466"></a>
<span class="sourceLineNo">467</span>      if (withTags &amp;&amp; this.tags != null) {<a name="line.467"></a>
<span class="sourceLineNo">468</span>        len += KeyValue.TAGS_LENGTH_SIZE + this.tags.length;<a name="line.468"></a>
<span class="sourceLineNo">469</span>      }<a name="line.469"></a>
<span class="sourceLineNo">470</span>      return len;<a name="line.470"></a>
<span class="sourceLineNo">471</span>    }<a name="line.471"></a>
<span class="sourceLineNo">472</span><a name="line.472"></a>
<span class="sourceLineNo">473</span>    @Override<a name="line.473"></a>
<span class="sourceLineNo">474</span>    public void write(ByteBuffer buf, int offset) {<a name="line.474"></a>
<span class="sourceLineNo">475</span>      offset = KeyValueUtil.appendTo(this.cell, buf, offset, false);<a name="line.475"></a>
<span class="sourceLineNo">476</span>      int tagsLen = this.tags == null ? 0 : this.tags.length;<a name="line.476"></a>
<span class="sourceLineNo">477</span>      if (tagsLen &gt; 0) {<a name="line.477"></a>
<span class="sourceLineNo">478</span>        offset = ByteBufferUtils.putAsShort(buf, offset, tagsLen);<a name="line.478"></a>
<span class="sourceLineNo">479</span>        ByteBufferUtils.copyFromArrayToBuffer(buf, offset, this.tags, 0, tagsLen);<a name="line.479"></a>
<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
<span class="sourceLineNo">482</span><a name="line.482"></a>
<span class="sourceLineNo">483</span>    @Override<a name="line.483"></a>
<span class="sourceLineNo">484</span>    public ExtendedCell deepClone() {<a name="line.484"></a>
<span class="sourceLineNo">485</span>      Cell clonedBaseCell = ((ExtendedCell) this.cell).deepClone();<a name="line.485"></a>
<span class="sourceLineNo">486</span>      if (clonedBaseCell instanceof ByteBufferExtendedCell) {<a name="line.486"></a>
<span class="sourceLineNo">487</span>        return new TagRewriteByteBufferExtendedCell((ByteBufferExtendedCell) clonedBaseCell,<a name="line.487"></a>
<span class="sourceLineNo">488</span>          this.tags);<a name="line.488"></a>
<span class="sourceLineNo">489</span>      }<a name="line.489"></a>
<span class="sourceLineNo">490</span>      return new TagRewriteCell(clonedBaseCell, this.tags);<a name="line.490"></a>
<span class="sourceLineNo">491</span>    }<a name="line.491"></a>
<span class="sourceLineNo">492</span><a name="line.492"></a>
<span class="sourceLineNo">493</span>    @Override<a name="line.493"></a>
<span class="sourceLineNo">494</span>    public ByteBuffer getRowByteBuffer() {<a name="line.494"></a>
<span class="sourceLineNo">495</span>      return this.cell.getRowByteBuffer();<a name="line.495"></a>
<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
<span class="sourceLineNo">497</span><a name="line.497"></a>
<span class="sourceLineNo">498</span>    @Override<a name="line.498"></a>
<span class="sourceLineNo">499</span>    public int getRowPosition() {<a name="line.499"></a>
<span class="sourceLineNo">500</span>      return this.cell.getRowPosition();<a name="line.500"></a>
<span class="sourceLineNo">501</span>    }<a name="line.501"></a>
<span class="sourceLineNo">502</span><a name="line.502"></a>
<span class="sourceLineNo">503</span>    @Override<a name="line.503"></a>
<span class="sourceLineNo">504</span>    public ByteBuffer getFamilyByteBuffer() {<a name="line.504"></a>
<span class="sourceLineNo">505</span>      return this.cell.getFamilyByteBuffer();<a name="line.505"></a>
<span class="sourceLineNo">506</span>    }<a name="line.506"></a>
<span class="sourceLineNo">507</span><a name="line.507"></a>
<span class="sourceLineNo">508</span>    @Override<a name="line.508"></a>
<span class="sourceLineNo">509</span>    public int getFamilyPosition() {<a name="line.509"></a>
<span class="sourceLineNo">510</span>      return this.cell.getFamilyPosition();<a name="line.510"></a>
<span class="sourceLineNo">511</span>    }<a name="line.511"></a>
<span class="sourceLineNo">512</span><a name="line.512"></a>
<span class="sourceLineNo">513</span>    @Override<a name="line.513"></a>
<span class="sourceLineNo">514</span>    public ByteBuffer getQualifierByteBuffer() {<a name="line.514"></a>
<span class="sourceLineNo">515</span>      return this.cell.getQualifierByteBuffer();<a name="line.515"></a>
<span class="sourceLineNo">516</span>    }<a name="line.516"></a>
<span class="sourceLineNo">517</span><a name="line.517"></a>
<span class="sourceLineNo">518</span>    @Override<a name="line.518"></a>
<span class="sourceLineNo">519</span>    public int getQualifierPosition() {<a name="line.519"></a>
<span class="sourceLineNo">520</span>      return this.cell.getQualifierPosition();<a name="line.520"></a>
<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
<span class="sourceLineNo">522</span><a name="line.522"></a>
<span class="sourceLineNo">523</span>    @Override<a name="line.523"></a>
<span class="sourceLineNo">524</span>    public ByteBuffer getValueByteBuffer() {<a name="line.524"></a>
<span class="sourceLineNo">525</span>      return this.cell.getValueByteBuffer();<a name="line.525"></a>
<span class="sourceLineNo">526</span>    }<a name="line.526"></a>
<span class="sourceLineNo">527</span><a name="line.527"></a>
<span class="sourceLineNo">528</span>    @Override<a name="line.528"></a>
<span class="sourceLineNo">529</span>    public int getValuePosition() {<a name="line.529"></a>
<span class="sourceLineNo">530</span>      return this.cell.getValuePosition();<a name="line.530"></a>
<span class="sourceLineNo">531</span>    }<a name="line.531"></a>
<span class="sourceLineNo">532</span><a name="line.532"></a>
<span class="sourceLineNo">533</span>    @Override<a name="line.533"></a>
<span class="sourceLineNo">534</span>    public ByteBuffer getTagsByteBuffer() {<a name="line.534"></a>
<span class="sourceLineNo">535</span>      return this.tags == null ? HConstants.EMPTY_BYTE_BUFFER : ByteBuffer.wrap(this.tags);<a name="line.535"></a>
<span class="sourceLineNo">536</span>    }<a name="line.536"></a>
<span class="sourceLineNo">537</span><a name="line.537"></a>
<span class="sourceLineNo">538</span>    @Override<a name="line.538"></a>
<span class="sourceLineNo">539</span>    public int getTagsPosition() {<a name="line.539"></a>
<span class="sourceLineNo">540</span>      return 0;<a name="line.540"></a>
<span class="sourceLineNo">541</span>    }<a name="line.541"></a>
<span class="sourceLineNo">542</span>  }<a name="line.542"></a>
<span class="sourceLineNo">543</span><a name="line.543"></a>
<span class="sourceLineNo">544</span>  static class ValueAndTagRewriteCell extends TagRewriteCell {<a name="line.544"></a>
<span class="sourceLineNo">545</span><a name="line.545"></a>
<span class="sourceLineNo">546</span>    protected byte[] value;<a name="line.546"></a>
<span class="sourceLineNo">547</span><a name="line.547"></a>
<span class="sourceLineNo">548</span>    public ValueAndTagRewriteCell(Cell cell, byte[] value, byte[] tags) {<a name="line.548"></a>
<span class="sourceLineNo">549</span>      super(cell, tags);<a name="line.549"></a>
<span class="sourceLineNo">550</span>      this.value = value;<a name="line.550"></a>
<span class="sourceLineNo">551</span>    }<a name="line.551"></a>
<span class="sourceLineNo">552</span><a name="line.552"></a>
<span class="sourceLineNo">553</span>    @Override<a name="line.553"></a>
<span class="sourceLineNo">554</span>    public byte[] getValueArray() {<a name="line.554"></a>
<span class="sourceLineNo">555</span>      return this.value;<a name="line.555"></a>
<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
<span class="sourceLineNo">557</span><a name="line.557"></a>
<span class="sourceLineNo">558</span>    @Override<a name="line.558"></a>
<span class="sourceLineNo">559</span>    public int getValueOffset() {<a name="line.559"></a>
<span class="sourceLineNo">560</span>      return 0;<a name="line.560"></a>
<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
<span class="sourceLineNo">562</span><a name="line.562"></a>
<span class="sourceLineNo">563</span>    @Override<a name="line.563"></a>
<span class="sourceLineNo">564</span>    public int getValueLength() {<a name="line.564"></a>
<span class="sourceLineNo">565</span>      return this.value == null ? 0 : this.value.length;<a name="line.565"></a>
<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
<span class="sourceLineNo">567</span><a name="line.567"></a>
<span class="sourceLineNo">568</span>    @Override<a name="line.568"></a>
<span class="sourceLineNo">569</span>    public long heapSize() {<a name="line.569"></a>
<span class="sourceLineNo">570</span>      long sum = ClassSize.REFERENCE + super.heapSize();<a name="line.570"></a>
<span class="sourceLineNo">571</span>      if (this.value != null) {<a name="line.571"></a>
<span class="sourceLineNo">572</span>        sum += ClassSize.sizeOf(this.value);<a name="line.572"></a>
<span class="sourceLineNo">573</span>      }<a name="line.573"></a>
<span class="sourceLineNo">574</span>      return sum;<a name="line.574"></a>
<span class="sourceLineNo">575</span>    }<a name="line.575"></a>
<span class="sourceLineNo">576</span><a name="line.576"></a>
<span class="sourceLineNo">577</span>    @Override<a name="line.577"></a>
<span class="sourceLineNo">578</span>    public int write(OutputStream out, boolean withTags) throws IOException {<a name="line.578"></a>
<span class="sourceLineNo">579</span>      return write(out, withTags, this.cell, this.value, this.tags);<a name="line.579"></a>
<span class="sourceLineNo">580</span>    }<a name="line.580"></a>
<span class="sourceLineNo">581</span><a name="line.581"></a>
<span class="sourceLineNo">582</span>    /**<a name="line.582"></a>
<span class="sourceLineNo">583</span>     * Made into a static method so as to reuse the logic within<a name="line.583"></a>
<span class="sourceLineNo">584</span>     * ValueAndTagRewriteByteBufferExtendedCell<a name="line.584"></a>
<span class="sourceLineNo">585</span>     */<a name="line.585"></a>
<span class="sourceLineNo">586</span>    static int write(OutputStream out, boolean withTags, Cell cell, byte[] value, byte[] tags)<a name="line.586"></a>
<span class="sourceLineNo">587</span>      throws IOException {<a name="line.587"></a>
<span class="sourceLineNo">588</span>      int valLen = value == null ? 0 : value.length;<a name="line.588"></a>
<span class="sourceLineNo">589</span>      ByteBufferUtils.putInt(out, KeyValueUtil.keyLength(cell));// Key length<a name="line.589"></a>
<span class="sourceLineNo">590</span>      ByteBufferUtils.putInt(out, valLen);// Value length<a name="line.590"></a>
<span class="sourceLineNo">591</span>      int len = 2 * Bytes.SIZEOF_INT;<a name="line.591"></a>
<span class="sourceLineNo">592</span>      len += writeFlatKey(cell, out);// Key<a name="line.592"></a>
<span class="sourceLineNo">593</span>      if (valLen &gt; 0) {<a name="line.593"></a>
<span class="sourceLineNo">594</span>        out.write(value);// Value<a name="line.594"></a>
<span class="sourceLineNo">595</span>      }<a name="line.595"></a>
<span class="sourceLineNo">596</span>      len += valLen;<a name="line.596"></a>
<span class="sourceLineNo">597</span>      if (withTags &amp;&amp; tags != null) {<a name="line.597"></a>
<span class="sourceLineNo">598</span>        // Write the tagsLength 2 bytes<a name="line.598"></a>
<span class="sourceLineNo">599</span>        out.write((byte) (0xff &amp; (tags.length &gt;&gt; 8)));<a name="line.599"></a>
<span class="sourceLineNo">600</span>        out.write((byte) (0xff &amp; tags.length));<a name="line.600"></a>
<span class="sourceLineNo">601</span>        out.write(tags);<a name="line.601"></a>
<span class="sourceLineNo">602</span>        len += KeyValue.TAGS_LENGTH_SIZE + tags.length;<a name="line.602"></a>
<span class="sourceLineNo">603</span>      }<a name="line.603"></a>
<span class="sourceLineNo">604</span>      return len;<a name="line.604"></a>
<span class="sourceLineNo">605</span>    }<a name="line.605"></a>
<span class="sourceLineNo">606</span><a name="line.606"></a>
<span class="sourceLineNo">607</span>    @Override<a name="line.607"></a>
<span class="sourceLineNo">608</span>    public int getSerializedSize(boolean withTags) {<a name="line.608"></a>
<span class="sourceLineNo">609</span>      return super.getSerializedSize(withTags) - this.cell.getValueLength() + this.value.length;<a name="line.609"></a>
<span class="sourceLineNo">610</span>    }<a name="line.610"></a>
<span class="sourceLineNo">611</span><a name="line.611"></a>
<span class="sourceLineNo">612</span>    @Override<a name="line.612"></a>
<span class="sourceLineNo">613</span>    public void write(ByteBuffer buf, int offset) {<a name="line.613"></a>
<span class="sourceLineNo">614</span>      write(buf, offset, this.cell, this.value, this.tags);<a name="line.614"></a>
<span class="sourceLineNo">615</span>    }<a name="line.615"></a>
<span class="sourceLineNo">616</span><a name="line.616"></a>
<span class="sourceLineNo">617</span>    /**<a name="line.617"></a>
<span class="sourceLineNo">618</span>     * Made into a static method so as to reuse the logic within<a name="line.618"></a>
<span class="sourceLineNo">619</span>     * ValueAndTagRewriteByteBufferExtendedCell<a name="line.619"></a>
<span class="sourceLineNo">620</span>     */<a name="line.620"></a>
<span class="sourceLineNo">621</span>    static void write(ByteBuffer buf, int offset, Cell cell, byte[] value, byte[] tags) {<a name="line.621"></a>
<span class="sourceLineNo">622</span>      offset = ByteBufferUtils.putInt(buf, offset, KeyValueUtil.keyLength(cell));// Key length<a name="line.622"></a>
<span class="sourceLineNo">623</span>      offset = ByteBufferUtils.putInt(buf, offset, value.length);// Value length<a name="line.623"></a>
<span class="sourceLineNo">624</span>      offset = KeyValueUtil.appendKeyTo(cell, buf, offset);<a name="line.624"></a>
<span class="sourceLineNo">625</span>      ByteBufferUtils.copyFromArrayToBuffer(buf, offset, value, 0, value.length);<a name="line.625"></a>
<span class="sourceLineNo">626</span>      offset += value.length;<a name="line.626"></a>
<span class="sourceLineNo">627</span>      int tagsLen = tags == null ? 0 : tags.length;<a name="line.627"></a>
<span class="sourceLineNo">628</span>      if (tagsLen &gt; 0) {<a name="line.628"></a>
<span class="sourceLineNo">629</span>        offset = ByteBufferUtils.putAsShort(buf, offset, tagsLen);<a name="line.629"></a>
<span class="sourceLineNo">630</span>        ByteBufferUtils.copyFromArrayToBuffer(buf, offset, tags, 0, tagsLen);<a name="line.630"></a>
<span class="sourceLineNo">631</span>      }<a name="line.631"></a>
<span class="sourceLineNo">632</span>    }<a name="line.632"></a>
<span class="sourceLineNo">633</span><a name="line.633"></a>
<span class="sourceLineNo">634</span>    @Override<a name="line.634"></a>
<span class="sourceLineNo">635</span>    public ExtendedCell deepClone() {<a name="line.635"></a>
<span class="sourceLineNo">636</span>      Cell clonedBaseCell = ((ExtendedCell) this.cell).deepClone();<a name="line.636"></a>
<span class="sourceLineNo">637</span>      return new ValueAndTagRewriteCell(clonedBaseCell, this.value, this.tags);<a name="line.637"></a>
<span class="sourceLineNo">638</span>    }<a name="line.638"></a>
<span class="sourceLineNo">639</span>  }<a name="line.639"></a>
<span class="sourceLineNo">640</span><a name="line.640"></a>
<span class="sourceLineNo">641</span>  static class ValueAndTagRewriteByteBufferExtendedCell extends TagRewriteByteBufferExtendedCell {<a name="line.641"></a>
<span class="sourceLineNo">642</span><a name="line.642"></a>
<span class="sourceLineNo">643</span>    protected byte[] value;<a name="line.643"></a>
<span class="sourceLineNo">644</span><a name="line.644"></a>
<span class="sourceLineNo">645</span>    public ValueAndTagRewriteByteBufferExtendedCell(ByteBufferExtendedCell cell, byte[] value,<a name="line.645"></a>
<span class="sourceLineNo">646</span>      byte[] tags) {<a name="line.646"></a>
<span class="sourceLineNo">647</span>      super(cell, tags);<a name="line.647"></a>
<span class="sourceLineNo">648</span>      this.value = value;<a name="line.648"></a>
<span class="sourceLineNo">649</span>    }<a name="line.649"></a>
<span class="sourceLineNo">650</span><a name="line.650"></a>
<span class="sourceLineNo">651</span>    @Override<a name="line.651"></a>
<span class="sourceLineNo">652</span>    public byte[] getValueArray() {<a name="line.652"></a>
<span class="sourceLineNo">653</span>      return this.value;<a name="line.653"></a>
<span class="sourceLineNo">654</span>    }<a name="line.654"></a>
<span class="sourceLineNo">655</span><a name="line.655"></a>
<span class="sourceLineNo">656</span>    @Override<a name="line.656"></a>
<span class="sourceLineNo">657</span>    public int getValueOffset() {<a name="line.657"></a>
<span class="sourceLineNo">658</span>      return 0;<a name="line.658"></a>
<span class="sourceLineNo">659</span>    }<a name="line.659"></a>
<span class="sourceLineNo">660</span><a name="line.660"></a>
<span class="sourceLineNo">661</span>    @Override<a name="line.661"></a>
<span class="sourceLineNo">662</span>    public int getValueLength() {<a name="line.662"></a>
<span class="sourceLineNo">663</span>      return this.value == null ? 0 : this.value.length;<a name="line.663"></a>
<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
<span class="sourceLineNo">665</span><a name="line.665"></a>
<span class="sourceLineNo">666</span>    @Override<a name="line.666"></a>
<span class="sourceLineNo">667</span>    public ByteBuffer getValueByteBuffer() {<a name="line.667"></a>
<span class="sourceLineNo">668</span>      return ByteBuffer.wrap(this.value);<a name="line.668"></a>
<span class="sourceLineNo">669</span>    }<a name="line.669"></a>
<span class="sourceLineNo">670</span><a name="line.670"></a>
<span class="sourceLineNo">671</span>    @Override<a name="line.671"></a>
<span class="sourceLineNo">672</span>    public int getValuePosition() {<a name="line.672"></a>
<span class="sourceLineNo">673</span>      return 0;<a name="line.673"></a>
<span class="sourceLineNo">674</span>    }<a name="line.674"></a>
<span class="sourceLineNo">675</span><a name="line.675"></a>
<span class="sourceLineNo">676</span>    @Override<a name="line.676"></a>
<span class="sourceLineNo">677</span>    public long heapSize() {<a name="line.677"></a>
<span class="sourceLineNo">678</span>      long sum = ClassSize.REFERENCE + super.heapSize();<a name="line.678"></a>
<span class="sourceLineNo">679</span>      if (this.value != null) {<a name="line.679"></a>
<span class="sourceLineNo">680</span>        sum += ClassSize.sizeOf(this.value);<a name="line.680"></a>
<span class="sourceLineNo">681</span>      }<a name="line.681"></a>
<span class="sourceLineNo">682</span>      return sum;<a name="line.682"></a>
<span class="sourceLineNo">683</span>    }<a name="line.683"></a>
<span class="sourceLineNo">684</span><a name="line.684"></a>
<span class="sourceLineNo">685</span>    @Override<a name="line.685"></a>
<span class="sourceLineNo">686</span>    public int write(OutputStream out, boolean withTags) throws IOException {<a name="line.686"></a>
<span class="sourceLineNo">687</span>      return ValueAndTagRewriteCell.write(out, withTags, this.cell, this.value, this.tags);<a name="line.687"></a>
<span class="sourceLineNo">688</span>    }<a name="line.688"></a>
<span class="sourceLineNo">689</span><a name="line.689"></a>
<span class="sourceLineNo">690</span>    @Override<a name="line.690"></a>
<span class="sourceLineNo">691</span>    public int getSerializedSize(boolean withTags) {<a name="line.691"></a>
<span class="sourceLineNo">692</span>      return super.getSerializedSize(withTags) - this.cell.getValueLength() + this.value.length;<a name="line.692"></a>
<span class="sourceLineNo">693</span>    }<a name="line.693"></a>
<span class="sourceLineNo">694</span><a name="line.694"></a>
<span class="sourceLineNo">695</span>    @Override<a name="line.695"></a>
<span class="sourceLineNo">696</span>    public void write(ByteBuffer buf, int offset) {<a name="line.696"></a>
<span class="sourceLineNo">697</span>      ValueAndTagRewriteCell.write(buf, offset, this.cell, this.value, this.tags);<a name="line.697"></a>
<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
<span class="sourceLineNo">699</span><a name="line.699"></a>
<span class="sourceLineNo">700</span>    @Override<a name="line.700"></a>
<span class="sourceLineNo">701</span>    public ExtendedCell deepClone() {<a name="line.701"></a>
<span class="sourceLineNo">702</span>      Cell clonedBaseCell = this.cell.deepClone();<a name="line.702"></a>
<span class="sourceLineNo">703</span>      if (clonedBaseCell instanceof ByteBufferExtendedCell) {<a name="line.703"></a>
<span class="sourceLineNo">704</span>        return new ValueAndTagRewriteByteBufferExtendedCell((ByteBufferExtendedCell) clonedBaseCell,<a name="line.704"></a>
<span class="sourceLineNo">705</span>          this.value, this.tags);<a name="line.705"></a>
<span class="sourceLineNo">706</span>      }<a name="line.706"></a>
<span class="sourceLineNo">707</span>      return new ValueAndTagRewriteCell(clonedBaseCell, this.value, this.tags);<a name="line.707"></a>
<span class="sourceLineNo">708</span>    }<a name="line.708"></a>
<span class="sourceLineNo">709</span>  }<a name="line.709"></a>
<span class="sourceLineNo">710</span><a name="line.710"></a>
<span class="sourceLineNo">711</span>  public static boolean matchingRows(final Cell left, final byte[] buf, final int offset,<a name="line.711"></a>
<span class="sourceLineNo">712</span>    final int length) {<a name="line.712"></a>
<span class="sourceLineNo">713</span>    if (left instanceof ByteBufferExtendedCell) {<a name="line.713"></a>
<span class="sourceLineNo">714</span>      return ByteBufferUtils.equals(((ByteBufferExtendedCell) left).getRowByteBuffer(),<a name="line.714"></a>
<span class="sourceLineNo">715</span>        ((ByteBufferExtendedCell) left).getRowPosition(), left.getRowLength(), buf, offset, length);<a name="line.715"></a>
<span class="sourceLineNo">716</span>    }<a name="line.716"></a>
<span class="sourceLineNo">717</span>    return Bytes.equals(left.getRowArray(), left.getRowOffset(), left.getRowLength(), buf, offset,<a name="line.717"></a>
<span class="sourceLineNo">718</span>      length);<a name="line.718"></a>
<span class="sourceLineNo">719</span>  }<a name="line.719"></a>
<span class="sourceLineNo">720</span><a name="line.720"></a>
<span class="sourceLineNo">721</span>  public static boolean matchingFamily(final Cell left, final byte[] buf, final int offset,<a name="line.721"></a>
<span class="sourceLineNo">722</span>    final int length) {<a name="line.722"></a>
<span class="sourceLineNo">723</span>    if (left instanceof ByteBufferExtendedCell) {<a name="line.723"></a>
<span class="sourceLineNo">724</span>      return ByteBufferUtils.equals(((ByteBufferExtendedCell) left).getFamilyByteBuffer(),<a name="line.724"></a>
<span class="sourceLineNo">725</span>        ((ByteBufferExtendedCell) left).getFamilyPosition(), left.getFamilyLength(), buf, offset,<a name="line.725"></a>
<span class="sourceLineNo">726</span>        length);<a name="line.726"></a>
<span class="sourceLineNo">727</span>    }<a name="line.727"></a>
<span class="sourceLineNo">728</span>    return Bytes.equals(left.getFamilyArray(), left.getFamilyOffset(), left.getFamilyLength(), buf,<a name="line.728"></a>
<span class="sourceLineNo">729</span>      offset, length);<a name="line.729"></a>
<span class="sourceLineNo">730</span>  }<a name="line.730"></a>
<span class="sourceLineNo">731</span><a name="line.731"></a>
<span class="sourceLineNo">732</span>  /**<a name="line.732"></a>
<span class="sourceLineNo">733</span>   * Finds if the qualifier part of the cell and the KV serialized byte[] are equal<a name="line.733"></a>
<span class="sourceLineNo">734</span>   * @param left   the cell with which we need to match the qualifier<a name="line.734"></a>
<span class="sourceLineNo">735</span>   * @param buf    the serialized keyvalue format byte[]<a name="line.735"></a>
<span class="sourceLineNo">736</span>   * @param offset the offset of the qualifier in the byte[]<a name="line.736"></a>
<span class="sourceLineNo">737</span>   * @param length the length of the qualifier in the byte[]<a name="line.737"></a>
<span class="sourceLineNo">738</span>   * @return true if the qualifier matches, false otherwise<a name="line.738"></a>
<span class="sourceLineNo">739</span>   */<a name="line.739"></a>
<span class="sourceLineNo">740</span>  public static boolean matchingQualifier(final Cell left, final byte[] buf, final int offset,<a name="line.740"></a>
<span class="sourceLineNo">741</span>    final int length) {<a name="line.741"></a>
<span class="sourceLineNo">742</span>    if (buf == null) {<a name="line.742"></a>
<span class="sourceLineNo">743</span>      return left.getQualifierLength() == 0;<a name="line.743"></a>
<span class="sourceLineNo">744</span>    }<a name="line.744"></a>
<span class="sourceLineNo">745</span>    if (left instanceof ByteBufferExtendedCell) {<a name="line.745"></a>
<span class="sourceLineNo">746</span>      return ByteBufferUtils.equals(((ByteBufferExtendedCell) left).getQualifierByteBuffer(),<a name="line.746"></a>
<span class="sourceLineNo">747</span>        ((ByteBufferExtendedCell) left).getQualifierPosition(), left.getQualifierLength(), buf,<a name="line.747"></a>
<span class="sourceLineNo">748</span>        offset, length);<a name="line.748"></a>
<span class="sourceLineNo">749</span>    }<a name="line.749"></a>
<span class="sourceLineNo">750</span>    return Bytes.equals(left.getQualifierArray(), left.getQualifierOffset(),<a name="line.750"></a>
<span class="sourceLineNo">751</span>      left.getQualifierLength(), buf, offset, length);<a name="line.751"></a>
<span class="sourceLineNo">752</span>  }<a name="line.752"></a>
<span class="sourceLineNo">753</span><a name="line.753"></a>
<span class="sourceLineNo">754</span>  /**<a name="line.754"></a>
<span class="sourceLineNo">755</span>   * Finds if the start of the qualifier part of the Cell matches &lt;code&gt;buf&lt;/code&gt;<a name="line.755"></a>
<span class="sourceLineNo">756</span>   * @param left       the cell with which we need to match the qualifier<a name="line.756"></a>
<span class="sourceLineNo">757</span>   * @param startsWith the serialized keyvalue format byte[]<a name="line.757"></a>
<span class="sourceLineNo">758</span>   * @return true if the qualifier have same staring characters, false otherwise<a name="line.758"></a>
<span class="sourceLineNo">759</span>   */<a name="line.759"></a>
<span class="sourceLineNo">760</span>  public static boolean qualifierStartsWith(final Cell left, final byte[] startsWith) {<a name="line.760"></a>
<span class="sourceLineNo">761</span>    if (startsWith == null || startsWith.length == 0) {<a name="line.761"></a>
<span class="sourceLineNo">762</span>      throw new IllegalArgumentException("Cannot pass an empty startsWith");<a name="line.762"></a>
<span class="sourceLineNo">763</span>    }<a name="line.763"></a>
<span class="sourceLineNo">764</span>    if (left.getQualifierLength() &lt; startsWith.length) {<a name="line.764"></a>
<span class="sourceLineNo">765</span>      return false;<a name="line.765"></a>
<span class="sourceLineNo">766</span>    }<a name="line.766"></a>
<span class="sourceLineNo">767</span>    if (left instanceof ByteBufferExtendedCell) {<a name="line.767"></a>
<span class="sourceLineNo">768</span>      return ByteBufferUtils.equals(((ByteBufferExtendedCell) left).getQualifierByteBuffer(),<a name="line.768"></a>
<span class="sourceLineNo">769</span>        ((ByteBufferExtendedCell) left).getQualifierPosition(), startsWith.length, startsWith, 0,<a name="line.769"></a>
<span class="sourceLineNo">770</span>        startsWith.length);<a name="line.770"></a>
<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
<span class="sourceLineNo">772</span>    return Bytes.equals(left.getQualifierArray(), left.getQualifierOffset(), startsWith.length,<a name="line.772"></a>
<span class="sourceLineNo">773</span>      startsWith, 0, startsWith.length);<a name="line.773"></a>
<span class="sourceLineNo">774</span>  }<a name="line.774"></a>
<span class="sourceLineNo">775</span><a name="line.775"></a>
<span class="sourceLineNo">776</span>  public static boolean matchingColumn(final Cell left, final byte[] fam, final int foffset,<a name="line.776"></a>
<span class="sourceLineNo">777</span>    final int flength, final byte[] qual, final int qoffset, final int qlength) {<a name="line.777"></a>
<span class="sourceLineNo">778</span>    if (!matchingFamily(left, fam, foffset, flength)) {<a name="line.778"></a>
<span class="sourceLineNo">779</span>      return false;<a name="line.779"></a>
<span class="sourceLineNo">780</span>    }<a name="line.780"></a>
<span class="sourceLineNo">781</span>    return matchingQualifier(left, qual, qoffset, qlength);<a name="line.781"></a>
<span class="sourceLineNo">782</span>  }<a name="line.782"></a>
<span class="sourceLineNo">783</span><a name="line.783"></a>
<span class="sourceLineNo">784</span>  public static boolean matchingValue(final Cell left, final Cell right, int lvlength,<a name="line.784"></a>
<span class="sourceLineNo">785</span>    int rvlength) {<a name="line.785"></a>
<span class="sourceLineNo">786</span>    if (left instanceof ByteBufferExtendedCell &amp;&amp; right instanceof ByteBufferExtendedCell) {<a name="line.786"></a>
<span class="sourceLineNo">787</span>      return ByteBufferUtils.equals(((ByteBufferExtendedCell) left).getValueByteBuffer(),<a name="line.787"></a>
<span class="sourceLineNo">788</span>        ((ByteBufferExtendedCell) left).getValuePosition(), lvlength,<a name="line.788"></a>
<span class="sourceLineNo">789</span>        ((ByteBufferExtendedCell) right).getValueByteBuffer(),<a name="line.789"></a>
<span class="sourceLineNo">790</span>        ((ByteBufferExtendedCell) right).getValuePosition(), rvlength);<a name="line.790"></a>
<span class="sourceLineNo">791</span>    }<a name="line.791"></a>
<span class="sourceLineNo">792</span>    if (left instanceof ByteBufferExtendedCell) {<a name="line.792"></a>
<span class="sourceLineNo">793</span>      return ByteBufferUtils.equals(((ByteBufferExtendedCell) left).getValueByteBuffer(),<a name="line.793"></a>
<span class="sourceLineNo">794</span>        ((ByteBufferExtendedCell) left).getValuePosition(), lvlength, right.getValueArray(),<a name="line.794"></a>
<span class="sourceLineNo">795</span>        right.getValueOffset(), rvlength);<a name="line.795"></a>
<span class="sourceLineNo">796</span>    }<a name="line.796"></a>
<span class="sourceLineNo">797</span>    if (right instanceof ByteBufferExtendedCell) {<a name="line.797"></a>
<span class="sourceLineNo">798</span>      return ByteBufferUtils.equals(((ByteBufferExtendedCell) right).getValueByteBuffer(),<a name="line.798"></a>
<span class="sourceLineNo">799</span>        ((ByteBufferExtendedCell) right).getValuePosition(), rvlength, left.getValueArray(),<a name="line.799"></a>
<span class="sourceLineNo">800</span>        left.getValueOffset(), lvlength);<a name="line.800"></a>
<span class="sourceLineNo">801</span>    }<a name="line.801"></a>
<span class="sourceLineNo">802</span>    return Bytes.equals(left.getValueArray(), left.getValueOffset(), lvlength,<a name="line.802"></a>
<span class="sourceLineNo">803</span>      right.getValueArray(), right.getValueOffset(), rvlength);<a name="line.803"></a>
<span class="sourceLineNo">804</span>  }<a name="line.804"></a>
<span class="sourceLineNo">805</span><a name="line.805"></a>
<span class="sourceLineNo">806</span>  public static boolean matchingType(Cell a, Cell b) {<a name="line.806"></a>
<span class="sourceLineNo">807</span>    return a.getTypeByte() == b.getTypeByte();<a name="line.807"></a>
<span class="sourceLineNo">808</span>  }<a name="line.808"></a>
<span class="sourceLineNo">809</span><a name="line.809"></a>
<span class="sourceLineNo">810</span>  public static boolean matchingTags(final Cell left, final Cell right, int llength, int rlength) {<a name="line.810"></a>
<span class="sourceLineNo">811</span>    if (left instanceof ByteBufferExtendedCell &amp;&amp; right instanceof ByteBufferExtendedCell) {<a name="line.811"></a>
<span class="sourceLineNo">812</span>      ByteBufferExtendedCell leftBBCell = (ByteBufferExtendedCell) left;<a name="line.812"></a>
<span class="sourceLineNo">813</span>      ByteBufferExtendedCell rightBBCell = (ByteBufferExtendedCell) right;<a name="line.813"></a>
<span class="sourceLineNo">814</span>      return ByteBufferUtils.equals(leftBBCell.getTagsByteBuffer(), leftBBCell.getTagsPosition(),<a name="line.814"></a>
<span class="sourceLineNo">815</span>        llength, rightBBCell.getTagsByteBuffer(), rightBBCell.getTagsPosition(), rlength);<a name="line.815"></a>
<span class="sourceLineNo">816</span>    }<a name="line.816"></a>
<span class="sourceLineNo">817</span>    if (left instanceof ByteBufferExtendedCell) {<a name="line.817"></a>
<span class="sourceLineNo">818</span>      ByteBufferExtendedCell leftBBCell = (ByteBufferExtendedCell) left;<a name="line.818"></a>
<span class="sourceLineNo">819</span>      return ByteBufferUtils.equals(leftBBCell.getTagsByteBuffer(), leftBBCell.getTagsPosition(),<a name="line.819"></a>
<span class="sourceLineNo">820</span>        llength, right.getTagsArray(), right.getTagsOffset(), rlength);<a name="line.820"></a>
<span class="sourceLineNo">821</span>    }<a name="line.821"></a>
<span class="sourceLineNo">822</span>    if (right instanceof ByteBufferExtendedCell) {<a name="line.822"></a>
<span class="sourceLineNo">823</span>      ByteBufferExtendedCell rightBBCell = (ByteBufferExtendedCell) right;<a name="line.823"></a>
<span class="sourceLineNo">824</span>      return ByteBufferUtils.equals(rightBBCell.getTagsByteBuffer(), rightBBCell.getTagsPosition(),<a name="line.824"></a>
<span class="sourceLineNo">825</span>        rlength, left.getTagsArray(), left.getTagsOffset(), llength);<a name="line.825"></a>
<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
<span class="sourceLineNo">827</span>    return Bytes.equals(left.getTagsArray(), left.getTagsOffset(), llength, right.getTagsArray(),<a name="line.827"></a>
<span class="sourceLineNo">828</span>      right.getTagsOffset(), rlength);<a name="line.828"></a>
<span class="sourceLineNo">829</span>  }<a name="line.829"></a>
<span class="sourceLineNo">830</span><a name="line.830"></a>
<span class="sourceLineNo">831</span>  /**<a name="line.831"></a>
<span class="sourceLineNo">832</span>   * Return true if a delete type, a {@link KeyValue.Type#Delete} or a {KeyValue.Type#DeleteFamily}<a name="line.832"></a>
<span class="sourceLineNo">833</span>   * or a {@link KeyValue.Type#DeleteColumn} KeyValue type.<a name="line.833"></a>
<span class="sourceLineNo">834</span>   */<a name="line.834"></a>
<span class="sourceLineNo">835</span>  public static boolean isDelete(final byte type) {<a name="line.835"></a>
<span class="sourceLineNo">836</span>    return KeyValue.Type.Delete.getCode() &lt;= type &amp;&amp; type &lt;= KeyValue.Type.DeleteFamily.getCode();<a name="line.836"></a>
<span class="sourceLineNo">837</span>  }<a name="line.837"></a>
<span class="sourceLineNo">838</span><a name="line.838"></a>
<span class="sourceLineNo">839</span>  /** Returns True if this cell is a {@link KeyValue.Type#Delete} type. */<a name="line.839"></a>
<span class="sourceLineNo">840</span>  public static boolean isDeleteType(Cell cell) {<a name="line.840"></a>
<span class="sourceLineNo">841</span>    return cell.getTypeByte() == KeyValue.Type.Delete.getCode();<a name="line.841"></a>
<span class="sourceLineNo">842</span>  }<a name="line.842"></a>
<span class="sourceLineNo">843</span><a name="line.843"></a>
<span class="sourceLineNo">844</span>  public static boolean isDeleteFamily(final Cell cell) {<a name="line.844"></a>
<span class="sourceLineNo">845</span>    return cell.getTypeByte() == KeyValue.Type.DeleteFamily.getCode();<a name="line.845"></a>
<span class="sourceLineNo">846</span>  }<a name="line.846"></a>
<span class="sourceLineNo">847</span><a name="line.847"></a>
<span class="sourceLineNo">848</span>  public static boolean isDeleteFamilyVersion(final Cell cell) {<a name="line.848"></a>
<span class="sourceLineNo">849</span>    return cell.getTypeByte() == KeyValue.Type.DeleteFamilyVersion.getCode();<a name="line.849"></a>
<span class="sourceLineNo">850</span>  }<a name="line.850"></a>
<span class="sourceLineNo">851</span><a name="line.851"></a>
<span class="sourceLineNo">852</span>  public static boolean isDeleteColumns(final Cell cell) {<a name="line.852"></a>
<span class="sourceLineNo">853</span>    return cell.getTypeByte() == KeyValue.Type.DeleteColumn.getCode();<a name="line.853"></a>
<span class="sourceLineNo">854</span>  }<a name="line.854"></a>
<span class="sourceLineNo">855</span><a name="line.855"></a>
<span class="sourceLineNo">856</span>  public static boolean isDeleteColumnVersion(final Cell cell) {<a name="line.856"></a>
<span class="sourceLineNo">857</span>    return cell.getTypeByte() == KeyValue.Type.Delete.getCode();<a name="line.857"></a>
<span class="sourceLineNo">858</span>  }<a name="line.858"></a>
<span class="sourceLineNo">859</span><a name="line.859"></a>
<span class="sourceLineNo">860</span>  /** Returns True if this cell is a delete family or column type. */<a name="line.860"></a>
<span class="sourceLineNo">861</span>  public static boolean isDeleteColumnOrFamily(Cell cell) {<a name="line.861"></a>
<span class="sourceLineNo">862</span>    int t = cell.getTypeByte();<a name="line.862"></a>
<span class="sourceLineNo">863</span>    return t == KeyValue.Type.DeleteColumn.getCode() || t == KeyValue.Type.DeleteFamily.getCode();<a name="line.863"></a>
<span class="sourceLineNo">864</span>  }<a name="line.864"></a>
<span class="sourceLineNo">865</span><a name="line.865"></a>
<span class="sourceLineNo">866</span>  public static byte[] cloneTags(Cell cell) {<a name="line.866"></a>
<span class="sourceLineNo">867</span>    byte[] output = new byte[cell.getTagsLength()];<a name="line.867"></a>
<span class="sourceLineNo">868</span>    copyTagsTo(cell, output, 0);<a name="line.868"></a>
<span class="sourceLineNo">869</span>    return output;<a name="line.869"></a>
<span class="sourceLineNo">870</span>  }<a name="line.870"></a>
<span class="sourceLineNo">871</span><a name="line.871"></a>
<span class="sourceLineNo">872</span>  /** Copies the tags info into the tag portion of the cell */<a name="line.872"></a>
<span class="sourceLineNo">873</span>  public static int copyTagsTo(Cell cell, byte[] destination, int destinationOffset) {<a name="line.873"></a>
<span class="sourceLineNo">874</span>    int tlen = cell.getTagsLength();<a name="line.874"></a>
<span class="sourceLineNo">875</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.875"></a>
<span class="sourceLineNo">876</span>      ByteBufferUtils.copyFromBufferToArray(destination,<a name="line.876"></a>
<span class="sourceLineNo">877</span>        ((ByteBufferExtendedCell) cell).getTagsByteBuffer(),<a name="line.877"></a>
<span class="sourceLineNo">878</span>        ((ByteBufferExtendedCell) cell).getTagsPosition(), destinationOffset, tlen);<a name="line.878"></a>
<span class="sourceLineNo">879</span>    } else {<a name="line.879"></a>
<span class="sourceLineNo">880</span>      System.arraycopy(cell.getTagsArray(), cell.getTagsOffset(), destination, destinationOffset,<a name="line.880"></a>
<span class="sourceLineNo">881</span>        tlen);<a name="line.881"></a>
<span class="sourceLineNo">882</span>    }<a name="line.882"></a>
<span class="sourceLineNo">883</span>    return destinationOffset + tlen;<a name="line.883"></a>
<span class="sourceLineNo">884</span>  }<a name="line.884"></a>
<span class="sourceLineNo">885</span><a name="line.885"></a>
<span class="sourceLineNo">886</span>  /** Copies the tags info into the tag portion of the cell */<a name="line.886"></a>
<span class="sourceLineNo">887</span>  public static int copyTagsTo(Cell cell, ByteBuffer destination, int destinationOffset) {<a name="line.887"></a>
<span class="sourceLineNo">888</span>    int tlen = cell.getTagsLength();<a name="line.888"></a>
<span class="sourceLineNo">889</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.889"></a>
<span class="sourceLineNo">890</span>      ByteBufferUtils.copyFromBufferToBuffer(((ByteBufferExtendedCell) cell).getTagsByteBuffer(),<a name="line.890"></a>
<span class="sourceLineNo">891</span>        destination, ((ByteBufferExtendedCell) cell).getTagsPosition(), destinationOffset, tlen);<a name="line.891"></a>
<span class="sourceLineNo">892</span>    } else {<a name="line.892"></a>
<span class="sourceLineNo">893</span>      ByteBufferUtils.copyFromArrayToBuffer(destination, destinationOffset, cell.getTagsArray(),<a name="line.893"></a>
<span class="sourceLineNo">894</span>        cell.getTagsOffset(), tlen);<a name="line.894"></a>
<span class="sourceLineNo">895</span>    }<a name="line.895"></a>
<span class="sourceLineNo">896</span>    return destinationOffset + tlen;<a name="line.896"></a>
<span class="sourceLineNo">897</span>  }<a name="line.897"></a>
<span class="sourceLineNo">898</span><a name="line.898"></a>
<span class="sourceLineNo">899</span>  /**<a name="line.899"></a>
<span class="sourceLineNo">900</span>   * Return tags in the given Cell as a List<a name="line.900"></a>
<span class="sourceLineNo">901</span>   * @param cell The Cell<a name="line.901"></a>
<span class="sourceLineNo">902</span>   * @return Tags in the given Cell as a List<a name="line.902"></a>
<span class="sourceLineNo">903</span>   */<a name="line.903"></a>
<span class="sourceLineNo">904</span>  public static List&lt;Tag&gt; getTags(Cell cell) {<a name="line.904"></a>
<span class="sourceLineNo">905</span>    List&lt;Tag&gt; tags = new ArrayList&lt;&gt;();<a name="line.905"></a>
<span class="sourceLineNo">906</span>    Iterator&lt;Tag&gt; tagsItr = tagsIterator(cell);<a name="line.906"></a>
<span class="sourceLineNo">907</span>    while (tagsItr.hasNext()) {<a name="line.907"></a>
<span class="sourceLineNo">908</span>      tags.add(tagsItr.next());<a name="line.908"></a>
<span class="sourceLineNo">909</span>    }<a name="line.909"></a>
<span class="sourceLineNo">910</span>    return tags;<a name="line.910"></a>
<span class="sourceLineNo">911</span>  }<a name="line.911"></a>
<span class="sourceLineNo">912</span><a name="line.912"></a>
<span class="sourceLineNo">913</span>  /**<a name="line.913"></a>
<span class="sourceLineNo">914</span>   * Retrieve Cell's first tag, matching the passed in type<a name="line.914"></a>
<span class="sourceLineNo">915</span>   * @param cell The Cell<a name="line.915"></a>
<span class="sourceLineNo">916</span>   * @param type Type of the Tag to retrieve<a name="line.916"></a>
<span class="sourceLineNo">917</span>   * @return Optional, empty if there is no tag of the passed in tag type<a name="line.917"></a>
<span class="sourceLineNo">918</span>   */<a name="line.918"></a>
<span class="sourceLineNo">919</span>  public static Optional&lt;Tag&gt; getTag(Cell cell, byte type) {<a name="line.919"></a>
<span class="sourceLineNo">920</span>    boolean bufferBacked = cell instanceof ByteBufferExtendedCell;<a name="line.920"></a>
<span class="sourceLineNo">921</span>    int length = cell.getTagsLength();<a name="line.921"></a>
<span class="sourceLineNo">922</span>    int offset =<a name="line.922"></a>
<span class="sourceLineNo">923</span>      bufferBacked ? ((ByteBufferExtendedCell) cell).getTagsPosition() : cell.getTagsOffset();<a name="line.923"></a>
<span class="sourceLineNo">924</span>    int pos = offset;<a name="line.924"></a>
<span class="sourceLineNo">925</span>    while (pos &lt; offset + length) {<a name="line.925"></a>
<span class="sourceLineNo">926</span>      int tagLen;<a name="line.926"></a>
<span class="sourceLineNo">927</span>      if (bufferBacked) {<a name="line.927"></a>
<span class="sourceLineNo">928</span>        ByteBuffer tagsBuffer = ((ByteBufferExtendedCell) cell).getTagsByteBuffer();<a name="line.928"></a>
<span class="sourceLineNo">929</span>        tagLen = ByteBufferUtils.readAsInt(tagsBuffer, pos, TAG_LENGTH_SIZE);<a name="line.929"></a>
<span class="sourceLineNo">930</span>        if (ByteBufferUtils.toByte(tagsBuffer, pos + TAG_LENGTH_SIZE) == type) {<a name="line.930"></a>
<span class="sourceLineNo">931</span>          return Optional.of(new ByteBufferTag(tagsBuffer, pos, tagLen + TAG_LENGTH_SIZE));<a name="line.931"></a>
<span class="sourceLineNo">932</span>        }<a name="line.932"></a>
<span class="sourceLineNo">933</span>      } else {<a name="line.933"></a>
<span class="sourceLineNo">934</span>        tagLen = Bytes.readAsInt(cell.getTagsArray(), pos, TAG_LENGTH_SIZE);<a name="line.934"></a>
<span class="sourceLineNo">935</span>        if (cell.getTagsArray()[pos + TAG_LENGTH_SIZE] == type) {<a name="line.935"></a>
<span class="sourceLineNo">936</span>          return Optional<a name="line.936"></a>
<span class="sourceLineNo">937</span>            .of(new ArrayBackedTag(cell.getTagsArray(), pos, tagLen + TAG_LENGTH_SIZE));<a name="line.937"></a>
<span class="sourceLineNo">938</span>        }<a name="line.938"></a>
<span class="sourceLineNo">939</span>      }<a name="line.939"></a>
<span class="sourceLineNo">940</span>      pos += TAG_LENGTH_SIZE + tagLen;<a name="line.940"></a>
<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
<span class="sourceLineNo">942</span>    return Optional.empty();<a name="line.942"></a>
<span class="sourceLineNo">943</span>  }<a name="line.943"></a>
<span class="sourceLineNo">944</span><a name="line.944"></a>
<span class="sourceLineNo">945</span>  /**<a name="line.945"></a>
<span class="sourceLineNo">946</span>   * Utility method to iterate through the tags in the given cell.<a name="line.946"></a>
<span class="sourceLineNo">947</span>   * @param cell The Cell over which tags iterator is needed.<a name="line.947"></a>
<span class="sourceLineNo">948</span>   * @return iterator for the tags<a name="line.948"></a>
<span class="sourceLineNo">949</span>   */<a name="line.949"></a>
<span class="sourceLineNo">950</span>  public static Iterator&lt;Tag&gt; tagsIterator(final Cell cell) {<a name="line.950"></a>
<span class="sourceLineNo">951</span>    final int tagsLength = cell.getTagsLength();<a name="line.951"></a>
<span class="sourceLineNo">952</span>    // Save an object allocation where we can<a name="line.952"></a>
<span class="sourceLineNo">953</span>    if (tagsLength == 0) {<a name="line.953"></a>
<span class="sourceLineNo">954</span>      return TagUtil.EMPTY_TAGS_ITR;<a name="line.954"></a>
<span class="sourceLineNo">955</span>    }<a name="line.955"></a>
<span class="sourceLineNo">956</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.956"></a>
<span class="sourceLineNo">957</span>      return tagsIterator(((ByteBufferExtendedCell) cell).getTagsByteBuffer(),<a name="line.957"></a>
<span class="sourceLineNo">958</span>        ((ByteBufferExtendedCell) cell).getTagsPosition(), tagsLength);<a name="line.958"></a>
<span class="sourceLineNo">959</span>    }<a name="line.959"></a>
<span class="sourceLineNo">960</span><a name="line.960"></a>
<span class="sourceLineNo">961</span>    return new Iterator&lt;Tag&gt;() {<a name="line.961"></a>
<span class="sourceLineNo">962</span>      private int offset = cell.getTagsOffset();<a name="line.962"></a>
<span class="sourceLineNo">963</span>      private int pos = offset;<a name="line.963"></a>
<span class="sourceLineNo">964</span>      private int endOffset = offset + cell.getTagsLength() - 1;<a name="line.964"></a>
<span class="sourceLineNo">965</span><a name="line.965"></a>
<span class="sourceLineNo">966</span>      @Override<a name="line.966"></a>
<span class="sourceLineNo">967</span>      public boolean hasNext() {<a name="line.967"></a>
<span class="sourceLineNo">968</span>        return this.pos &lt; endOffset;<a name="line.968"></a>
<span class="sourceLineNo">969</span>      }<a name="line.969"></a>
<span class="sourceLineNo">970</span><a name="line.970"></a>
<span class="sourceLineNo">971</span>      @Override<a name="line.971"></a>
<span class="sourceLineNo">972</span>      public Tag next() {<a name="line.972"></a>
<span class="sourceLineNo">973</span>        if (hasNext()) {<a name="line.973"></a>
<span class="sourceLineNo">974</span>          byte[] tags = cell.getTagsArray();<a name="line.974"></a>
<span class="sourceLineNo">975</span>          int curTagLen = Bytes.readAsInt(tags, this.pos, Tag.TAG_LENGTH_SIZE);<a name="line.975"></a>
<span class="sourceLineNo">976</span>          Tag tag = new ArrayBackedTag(tags, pos, curTagLen + TAG_LENGTH_SIZE);<a name="line.976"></a>
<span class="sourceLineNo">977</span>          this.pos += Bytes.SIZEOF_SHORT + curTagLen;<a name="line.977"></a>
<span class="sourceLineNo">978</span>          return tag;<a name="line.978"></a>
<span class="sourceLineNo">979</span>        }<a name="line.979"></a>
<span class="sourceLineNo">980</span>        return null;<a name="line.980"></a>
<span class="sourceLineNo">981</span>      }<a name="line.981"></a>
<span class="sourceLineNo">982</span><a name="line.982"></a>
<span class="sourceLineNo">983</span>      @Override<a name="line.983"></a>
<span class="sourceLineNo">984</span>      public void remove() {<a name="line.984"></a>
<span class="sourceLineNo">985</span>        throw new UnsupportedOperationException();<a name="line.985"></a>
<span class="sourceLineNo">986</span>      }<a name="line.986"></a>
<span class="sourceLineNo">987</span>    };<a name="line.987"></a>
<span class="sourceLineNo">988</span>  }<a name="line.988"></a>
<span class="sourceLineNo">989</span><a name="line.989"></a>
<span class="sourceLineNo">990</span>  public static Iterator&lt;Tag&gt; tagsIterator(final ByteBuffer tags, final int offset,<a name="line.990"></a>
<span class="sourceLineNo">991</span>    final int length) {<a name="line.991"></a>
<span class="sourceLineNo">992</span>    return new Iterator&lt;Tag&gt;() {<a name="line.992"></a>
<span class="sourceLineNo">993</span>      private int pos = offset;<a name="line.993"></a>
<span class="sourceLineNo">994</span>      private int endOffset = offset + length - 1;<a name="line.994"></a>
<span class="sourceLineNo">995</span><a name="line.995"></a>
<span class="sourceLineNo">996</span>      @Override<a name="line.996"></a>
<span class="sourceLineNo">997</span>      public boolean hasNext() {<a name="line.997"></a>
<span class="sourceLineNo">998</span>        return this.pos &lt; endOffset;<a name="line.998"></a>
<span class="sourceLineNo">999</span>      }<a name="line.999"></a>
<span class="sourceLineNo">1000</span><a name="line.1000"></a>
<span class="sourceLineNo">1001</span>      @Override<a name="line.1001"></a>
<span class="sourceLineNo">1002</span>      public Tag next() {<a name="line.1002"></a>
<span class="sourceLineNo">1003</span>        if (hasNext()) {<a name="line.1003"></a>
<span class="sourceLineNo">1004</span>          int curTagLen = ByteBufferUtils.readAsInt(tags, this.pos, Tag.TAG_LENGTH_SIZE);<a name="line.1004"></a>
<span class="sourceLineNo">1005</span>          Tag tag = new ByteBufferTag(tags, pos, curTagLen + Tag.TAG_LENGTH_SIZE);<a name="line.1005"></a>
<span class="sourceLineNo">1006</span>          this.pos += Bytes.SIZEOF_SHORT + curTagLen;<a name="line.1006"></a>
<span class="sourceLineNo">1007</span>          return tag;<a name="line.1007"></a>
<span class="sourceLineNo">1008</span>        }<a name="line.1008"></a>
<span class="sourceLineNo">1009</span>        return null;<a name="line.1009"></a>
<span class="sourceLineNo">1010</span>      }<a name="line.1010"></a>
<span class="sourceLineNo">1011</span><a name="line.1011"></a>
<span class="sourceLineNo">1012</span>      @Override<a name="line.1012"></a>
<span class="sourceLineNo">1013</span>      public void remove() {<a name="line.1013"></a>
<span class="sourceLineNo">1014</span>        throw new UnsupportedOperationException();<a name="line.1014"></a>
<span class="sourceLineNo">1015</span>      }<a name="line.1015"></a>
<span class="sourceLineNo">1016</span>    };<a name="line.1016"></a>
<span class="sourceLineNo">1017</span>  }<a name="line.1017"></a>
<span class="sourceLineNo">1018</span><a name="line.1018"></a>
<span class="sourceLineNo">1019</span>  /**<a name="line.1019"></a>
<span class="sourceLineNo">1020</span>   * Returns true if the first range start1...end1 overlaps with the second range start2...end2,<a name="line.1020"></a>
<span class="sourceLineNo">1021</span>   * assuming the byte arrays represent row keys<a name="line.1021"></a>
<span class="sourceLineNo">1022</span>   */<a name="line.1022"></a>
<span class="sourceLineNo">1023</span>  public static boolean overlappingKeys(final byte[] start1, final byte[] end1, final byte[] start2,<a name="line.1023"></a>
<span class="sourceLineNo">1024</span>    final byte[] end2) {<a name="line.1024"></a>
<span class="sourceLineNo">1025</span>    return (end2.length == 0 || start1.length == 0 || Bytes.compareTo(start1, end2) &lt; 0)<a name="line.1025"></a>
<span class="sourceLineNo">1026</span>      &amp;&amp; (end1.length == 0 || start2.length == 0 || Bytes.compareTo(start2, end1) &lt; 0);<a name="line.1026"></a>
<span class="sourceLineNo">1027</span>  }<a name="line.1027"></a>
<span class="sourceLineNo">1028</span><a name="line.1028"></a>
<span class="sourceLineNo">1029</span>  /** Write rowkey excluding the common part. */<a name="line.1029"></a>
<span class="sourceLineNo">1030</span>  public static void writeRowKeyExcludingCommon(Cell cell, short rLen, int commonPrefix,<a name="line.1030"></a>
<span class="sourceLineNo">1031</span>    DataOutputStream out) throws IOException {<a name="line.1031"></a>
<span class="sourceLineNo">1032</span>    if (commonPrefix == 0) {<a name="line.1032"></a>
<span class="sourceLineNo">1033</span>      out.writeShort(rLen);<a name="line.1033"></a>
<span class="sourceLineNo">1034</span>    } else if (commonPrefix == 1) {<a name="line.1034"></a>
<span class="sourceLineNo">1035</span>      out.writeByte((byte) rLen);<a name="line.1035"></a>
<span class="sourceLineNo">1036</span>      commonPrefix--;<a name="line.1036"></a>
<span class="sourceLineNo">1037</span>    } else {<a name="line.1037"></a>
<span class="sourceLineNo">1038</span>      commonPrefix -= KeyValue.ROW_LENGTH_SIZE;<a name="line.1038"></a>
<span class="sourceLineNo">1039</span>    }<a name="line.1039"></a>
<span class="sourceLineNo">1040</span>    if (rLen &gt; commonPrefix) {<a name="line.1040"></a>
<span class="sourceLineNo">1041</span>      writeRowSkippingBytes(out, cell, rLen, commonPrefix);<a name="line.1041"></a>
<span class="sourceLineNo">1042</span>    }<a name="line.1042"></a>
<span class="sourceLineNo">1043</span>  }<a name="line.1043"></a>
<span class="sourceLineNo">1044</span><a name="line.1044"></a>
<span class="sourceLineNo">1045</span>  /**<a name="line.1045"></a>
<span class="sourceLineNo">1046</span>   * Writes the row from the given cell to the output stream excluding the common prefix<a name="line.1046"></a>
<span class="sourceLineNo">1047</span>   * @param out     The dataoutputstream to which the data has to be written<a name="line.1047"></a>
<span class="sourceLineNo">1048</span>   * @param cell    The cell whose contents has to be written<a name="line.1048"></a>
<span class="sourceLineNo">1049</span>   * @param rlength the row length<a name="line.1049"></a>
<span class="sourceLineNo">1050</span>   */<a name="line.1050"></a>
<span class="sourceLineNo">1051</span>  public static void writeRowSkippingBytes(DataOutputStream out, Cell cell, short rlength,<a name="line.1051"></a>
<span class="sourceLineNo">1052</span>    int commonPrefix) throws IOException {<a name="line.1052"></a>
<span class="sourceLineNo">1053</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.1053"></a>
<span class="sourceLineNo">1054</span>      ByteBufferUtils.copyBufferToStream((DataOutput) out,<a name="line.1054"></a>
<span class="sourceLineNo">1055</span>        ((ByteBufferExtendedCell) cell).getRowByteBuffer(),<a name="line.1055"></a>
<span class="sourceLineNo">1056</span>        ((ByteBufferExtendedCell) cell).getRowPosition() + commonPrefix, rlength - commonPrefix);<a name="line.1056"></a>
<span class="sourceLineNo">1057</span>    } else {<a name="line.1057"></a>
<span class="sourceLineNo">1058</span>      out.write(cell.getRowArray(), cell.getRowOffset() + commonPrefix, rlength - commonPrefix);<a name="line.1058"></a>
<span class="sourceLineNo">1059</span>    }<a name="line.1059"></a>
<span class="sourceLineNo">1060</span>  }<a name="line.1060"></a>
<span class="sourceLineNo">1061</span><a name="line.1061"></a>
<span class="sourceLineNo">1062</span>  /**<a name="line.1062"></a>
<span class="sourceLineNo">1063</span>   * Find length of common prefix in keys of the cells, considering key as byte[] if serialized in<a name="line.1063"></a>
<span class="sourceLineNo">1064</span>   * {@link KeyValue}. The key format is &amp;lt;2 bytes rk len&amp;gt;&amp;lt;rk&amp;gt;&amp;lt;1 byte cf<a name="line.1064"></a>
<span class="sourceLineNo">1065</span>   * len&amp;gt;&amp;lt;cf&amp;gt;&amp;lt;qualifier&amp;gt;&amp;lt;8 bytes timestamp&amp;gt;&amp;lt;1 byte type&amp;gt;<a name="line.1065"></a>
<span class="sourceLineNo">1066</span>   * @param c1                the cell<a name="line.1066"></a>
<span class="sourceLineNo">1067</span>   * @param c2                the cell<a name="line.1067"></a>
<span class="sourceLineNo">1068</span>   * @param bypassFamilyCheck when true assume the family bytes same in both cells. Pass it as true<a name="line.1068"></a>
<span class="sourceLineNo">1069</span>   *                          when dealing with Cells in same CF so as to avoid some checks<a name="line.1069"></a>
<span class="sourceLineNo">1070</span>   * @param withTsType        when true check timestamp and type bytes also.<a name="line.1070"></a>
<span class="sourceLineNo">1071</span>   * @return length of common prefix<a name="line.1071"></a>
<span class="sourceLineNo">1072</span>   */<a name="line.1072"></a>
<span class="sourceLineNo">1073</span>  public static int findCommonPrefixInFlatKey(Cell c1, Cell c2, boolean bypassFamilyCheck,<a name="line.1073"></a>
<span class="sourceLineNo">1074</span>    boolean withTsType) {<a name="line.1074"></a>
<span class="sourceLineNo">1075</span>    // Compare the 2 bytes in RK length part<a name="line.1075"></a>
<span class="sourceLineNo">1076</span>    short rLen1 = c1.getRowLength();<a name="line.1076"></a>
<span class="sourceLineNo">1077</span>    short rLen2 = c2.getRowLength();<a name="line.1077"></a>
<span class="sourceLineNo">1078</span>    int commonPrefix = KeyValue.ROW_LENGTH_SIZE;<a name="line.1078"></a>
<span class="sourceLineNo">1079</span>    if (rLen1 != rLen2) {<a name="line.1079"></a>
<span class="sourceLineNo">1080</span>      // early out when the RK length itself is not matching<a name="line.1080"></a>
<span class="sourceLineNo">1081</span>      return ByteBufferUtils.findCommonPrefix(Bytes.toBytes(rLen1), 0, KeyValue.ROW_LENGTH_SIZE,<a name="line.1081"></a>
<span class="sourceLineNo">1082</span>        Bytes.toBytes(rLen2), 0, KeyValue.ROW_LENGTH_SIZE);<a name="line.1082"></a>
<span class="sourceLineNo">1083</span>    }<a name="line.1083"></a>
<span class="sourceLineNo">1084</span>    // Compare the RKs<a name="line.1084"></a>
<span class="sourceLineNo">1085</span>    int rkCommonPrefix = 0;<a name="line.1085"></a>
<span class="sourceLineNo">1086</span>    if (c1 instanceof ByteBufferExtendedCell &amp;&amp; c2 instanceof ByteBufferExtendedCell) {<a name="line.1086"></a>
<span class="sourceLineNo">1087</span>      rkCommonPrefix =<a name="line.1087"></a>
<span class="sourceLineNo">1088</span>        ByteBufferUtils.findCommonPrefix(((ByteBufferExtendedCell) c1).getRowByteBuffer(),<a name="line.1088"></a>
<span class="sourceLineNo">1089</span>          ((ByteBufferExtendedCell) c1).getRowPosition(), rLen1,<a name="line.1089"></a>
<span class="sourceLineNo">1090</span>          ((ByteBufferExtendedCell) c2).getRowByteBuffer(),<a name="line.1090"></a>
<span class="sourceLineNo">1091</span>          ((ByteBufferExtendedCell) c2).getRowPosition(), rLen2);<a name="line.1091"></a>
<span class="sourceLineNo">1092</span>    } else {<a name="line.1092"></a>
<span class="sourceLineNo">1093</span>      // There cannot be a case where one cell is BBCell and other is KeyValue. This flow comes<a name="line.1093"></a>
<span class="sourceLineNo">1094</span>      // either<a name="line.1094"></a>
<span class="sourceLineNo">1095</span>      // in flush or compactions. In flushes both cells are KV and in case of compaction it will be<a name="line.1095"></a>
<span class="sourceLineNo">1096</span>      // either<a name="line.1096"></a>
<span class="sourceLineNo">1097</span>      // KV or BBCell<a name="line.1097"></a>
<span class="sourceLineNo">1098</span>      rkCommonPrefix = ByteBufferUtils.findCommonPrefix(c1.getRowArray(), c1.getRowOffset(), rLen1,<a name="line.1098"></a>
<span class="sourceLineNo">1099</span>        c2.getRowArray(), c2.getRowOffset(), rLen2);<a name="line.1099"></a>
<span class="sourceLineNo">1100</span>    }<a name="line.1100"></a>
<span class="sourceLineNo">1101</span>    commonPrefix += rkCommonPrefix;<a name="line.1101"></a>
<span class="sourceLineNo">1102</span>    if (rkCommonPrefix != rLen1) {<a name="line.1102"></a>
<span class="sourceLineNo">1103</span>      // Early out when RK is not fully matching.<a name="line.1103"></a>
<span class="sourceLineNo">1104</span>      return commonPrefix;<a name="line.1104"></a>
<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
<span class="sourceLineNo">1106</span>    // Compare 1 byte CF length part<a name="line.1106"></a>
<span class="sourceLineNo">1107</span>    byte fLen1 = c1.getFamilyLength();<a name="line.1107"></a>
<span class="sourceLineNo">1108</span>    if (bypassFamilyCheck) {<a name="line.1108"></a>
<span class="sourceLineNo">1109</span>      // This flag will be true when caller is sure that the family will be same for both the cells<a name="line.1109"></a>
<span class="sourceLineNo">1110</span>      // Just make commonPrefix to increment by the family part<a name="line.1110"></a>
<span class="sourceLineNo">1111</span>      commonPrefix += KeyValue.FAMILY_LENGTH_SIZE + fLen1;<a name="line.1111"></a>
<span class="sourceLineNo">1112</span>    } else {<a name="line.1112"></a>
<span class="sourceLineNo">1113</span>      byte fLen2 = c2.getFamilyLength();<a name="line.1113"></a>
<span class="sourceLineNo">1114</span>      if (fLen1 != fLen2) {<a name="line.1114"></a>
<span class="sourceLineNo">1115</span>        // early out when the CF length itself is not matching<a name="line.1115"></a>
<span class="sourceLineNo">1116</span>        return commonPrefix;<a name="line.1116"></a>
<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
<span class="sourceLineNo">1118</span>      // CF lengths are same so there is one more byte common in key part<a name="line.1118"></a>
<span class="sourceLineNo">1119</span>      commonPrefix += KeyValue.FAMILY_LENGTH_SIZE;<a name="line.1119"></a>
<span class="sourceLineNo">1120</span>      // Compare the CF names<a name="line.1120"></a>
<span class="sourceLineNo">1121</span>      int fCommonPrefix;<a name="line.1121"></a>
<span class="sourceLineNo">1122</span>      if (c1 instanceof ByteBufferExtendedCell &amp;&amp; c2 instanceof ByteBufferExtendedCell) {<a name="line.1122"></a>
<span class="sourceLineNo">1123</span>        fCommonPrefix =<a name="line.1123"></a>
<span class="sourceLineNo">1124</span>          ByteBufferUtils.findCommonPrefix(((ByteBufferExtendedCell) c1).getFamilyByteBuffer(),<a name="line.1124"></a>
<span class="sourceLineNo">1125</span>            ((ByteBufferExtendedCell) c1).getFamilyPosition(), fLen1,<a name="line.1125"></a>
<span class="sourceLineNo">1126</span>            ((ByteBufferExtendedCell) c2).getFamilyByteBuffer(),<a name="line.1126"></a>
<span class="sourceLineNo">1127</span>            ((ByteBufferExtendedCell) c2).getFamilyPosition(), fLen2);<a name="line.1127"></a>
<span class="sourceLineNo">1128</span>      } else {<a name="line.1128"></a>
<span class="sourceLineNo">1129</span>        fCommonPrefix = ByteBufferUtils.findCommonPrefix(c1.getFamilyArray(), c1.getFamilyOffset(),<a name="line.1129"></a>
<span class="sourceLineNo">1130</span>          fLen1, c2.getFamilyArray(), c2.getFamilyOffset(), fLen2);<a name="line.1130"></a>
<span class="sourceLineNo">1131</span>      }<a name="line.1131"></a>
<span class="sourceLineNo">1132</span>      commonPrefix += fCommonPrefix;<a name="line.1132"></a>
<span class="sourceLineNo">1133</span>      if (fCommonPrefix != fLen1) {<a name="line.1133"></a>
<span class="sourceLineNo">1134</span>        return commonPrefix;<a name="line.1134"></a>
<span class="sourceLineNo">1135</span>      }<a name="line.1135"></a>
<span class="sourceLineNo">1136</span>    }<a name="line.1136"></a>
<span class="sourceLineNo">1137</span>    // Compare the Qualifiers<a name="line.1137"></a>
<span class="sourceLineNo">1138</span>    int qLen1 = c1.getQualifierLength();<a name="line.1138"></a>
<span class="sourceLineNo">1139</span>    int qLen2 = c2.getQualifierLength();<a name="line.1139"></a>
<span class="sourceLineNo">1140</span>    int qCommon;<a name="line.1140"></a>
<span class="sourceLineNo">1141</span>    if (c1 instanceof ByteBufferExtendedCell &amp;&amp; c2 instanceof ByteBufferExtendedCell) {<a name="line.1141"></a>
<span class="sourceLineNo">1142</span>      qCommon =<a name="line.1142"></a>
<span class="sourceLineNo">1143</span>        ByteBufferUtils.findCommonPrefix(((ByteBufferExtendedCell) c1).getQualifierByteBuffer(),<a name="line.1143"></a>
<span class="sourceLineNo">1144</span>          ((ByteBufferExtendedCell) c1).getQualifierPosition(), qLen1,<a name="line.1144"></a>
<span class="sourceLineNo">1145</span>          ((ByteBufferExtendedCell) c2).getQualifierByteBuffer(),<a name="line.1145"></a>
<span class="sourceLineNo">1146</span>          ((ByteBufferExtendedCell) c2).getQualifierPosition(), qLen2);<a name="line.1146"></a>
<span class="sourceLineNo">1147</span>    } else {<a name="line.1147"></a>
<span class="sourceLineNo">1148</span>      qCommon = ByteBufferUtils.findCommonPrefix(c1.getQualifierArray(), c1.getQualifierOffset(),<a name="line.1148"></a>
<span class="sourceLineNo">1149</span>        qLen1, c2.getQualifierArray(), c2.getQualifierOffset(), qLen2);<a name="line.1149"></a>
<span class="sourceLineNo">1150</span>    }<a name="line.1150"></a>
<span class="sourceLineNo">1151</span>    commonPrefix += qCommon;<a name="line.1151"></a>
<span class="sourceLineNo">1152</span>    if (!withTsType || Math.max(qLen1, qLen2) != qCommon) {<a name="line.1152"></a>
<span class="sourceLineNo">1153</span>      return commonPrefix;<a name="line.1153"></a>
<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
<span class="sourceLineNo">1155</span>    // Compare the timestamp parts<a name="line.1155"></a>
<span class="sourceLineNo">1156</span>    int tsCommonPrefix = ByteBufferUtils.findCommonPrefix(Bytes.toBytes(c1.getTimestamp()), 0,<a name="line.1156"></a>
<span class="sourceLineNo">1157</span>      KeyValue.TIMESTAMP_SIZE, Bytes.toBytes(c2.getTimestamp()), 0, KeyValue.TIMESTAMP_SIZE);<a name="line.1157"></a>
<span class="sourceLineNo">1158</span>    commonPrefix += tsCommonPrefix;<a name="line.1158"></a>
<span class="sourceLineNo">1159</span>    if (tsCommonPrefix != KeyValue.TIMESTAMP_SIZE) {<a name="line.1159"></a>
<span class="sourceLineNo">1160</span>      return commonPrefix;<a name="line.1160"></a>
<span class="sourceLineNo">1161</span>    }<a name="line.1161"></a>
<span class="sourceLineNo">1162</span>    // Compare the type<a name="line.1162"></a>
<span class="sourceLineNo">1163</span>    if (c1.getTypeByte() == c2.getTypeByte()) {<a name="line.1163"></a>
<span class="sourceLineNo">1164</span>      commonPrefix += KeyValue.TYPE_SIZE;<a name="line.1164"></a>
<span class="sourceLineNo">1165</span>    }<a name="line.1165"></a>
<span class="sourceLineNo">1166</span>    return commonPrefix;<a name="line.1166"></a>
<span class="sourceLineNo">1167</span>  }<a name="line.1167"></a>
<span class="sourceLineNo">1168</span><a name="line.1168"></a>
<span class="sourceLineNo">1169</span>  /**<a name="line.1169"></a>
<span class="sourceLineNo">1170</span>   * Used to compare two cells based on the column hint provided. This is specifically used when we<a name="line.1170"></a>
<span class="sourceLineNo">1171</span>   * need to optimize the seeks based on the next indexed key. This is an advanced usage API<a name="line.1171"></a>
<span class="sourceLineNo">1172</span>   * specifically needed for some optimizations.<a name="line.1172"></a>
<span class="sourceLineNo">1173</span>   * @param nextIndexedCell the next indexed cell<a name="line.1173"></a>
<span class="sourceLineNo">1174</span>   * @param currentCell     the cell to be compared<a name="line.1174"></a>
<span class="sourceLineNo">1175</span>   * @param foff            the family offset of the currentCell<a name="line.1175"></a>
<span class="sourceLineNo">1176</span>   * @param flen            the family length of the currentCell<a name="line.1176"></a>
<span class="sourceLineNo">1177</span>   * @param colHint         the column hint provided - could be null<a name="line.1177"></a>
<span class="sourceLineNo">1178</span>   * @param coff            the offset of the column hint if provided, if not offset of the<a name="line.1178"></a>
<span class="sourceLineNo">1179</span>   *                        currentCell's qualifier<a name="line.1179"></a>
<span class="sourceLineNo">1180</span>   * @param clen            the length of the column hint if provided, if not length of the<a name="line.1180"></a>
<span class="sourceLineNo">1181</span>   *                        currentCell's qualifier<a name="line.1181"></a>
<span class="sourceLineNo">1182</span>   * @param ts              the timestamp to be seeked<a name="line.1182"></a>
<span class="sourceLineNo">1183</span>   * @param type            the type to be seeked<a name="line.1183"></a>
<span class="sourceLineNo">1184</span>   * @return an int based on the given column hint TODO : To be moved out of here because this is a<a name="line.1184"></a>
<span class="sourceLineNo">1185</span>   *         special API used in scan optimization.<a name="line.1185"></a>
<span class="sourceLineNo">1186</span>   */<a name="line.1186"></a>
<span class="sourceLineNo">1187</span>  // compare a key against row/fam/qual/ts/type<a name="line.1187"></a>
<span class="sourceLineNo">1188</span>  public static final int compareKeyBasedOnColHint(CellComparator comparator, Cell nextIndexedCell,<a name="line.1188"></a>
<span class="sourceLineNo">1189</span>    Cell currentCell, int foff, int flen, byte[] colHint, int coff, int clen, long ts, byte type) {<a name="line.1189"></a>
<span class="sourceLineNo">1190</span>    int compare = comparator.compareRows(nextIndexedCell, currentCell);<a name="line.1190"></a>
<span class="sourceLineNo">1191</span>    if (compare != 0) {<a name="line.1191"></a>
<span class="sourceLineNo">1192</span>      return compare;<a name="line.1192"></a>
<span class="sourceLineNo">1193</span>    }<a name="line.1193"></a>
<span class="sourceLineNo">1194</span>    // If the column is not specified, the "minimum" key type appears the<a name="line.1194"></a>
<span class="sourceLineNo">1195</span>    // latest in the sorted order, regardless of the timestamp. This is used<a name="line.1195"></a>
<span class="sourceLineNo">1196</span>    // for specifying the last key/value in a given row, because there is no<a name="line.1196"></a>
<span class="sourceLineNo">1197</span>    // "lexicographically last column" (it would be infinitely long). The<a name="line.1197"></a>
<span class="sourceLineNo">1198</span>    // "maximum" key type does not need this behavior.<a name="line.1198"></a>
<span class="sourceLineNo">1199</span>    if (<a name="line.1199"></a>
<span class="sourceLineNo">1200</span>      nextIndexedCell.getFamilyLength() + nextIndexedCell.getQualifierLength() == 0<a name="line.1200"></a>
<span class="sourceLineNo">1201</span>        &amp;&amp; nextIndexedCell.getTypeByte() == KeyValue.Type.Minimum.getCode()<a name="line.1201"></a>
<span class="sourceLineNo">1202</span>    ) {<a name="line.1202"></a>
<span class="sourceLineNo">1203</span>      // left is "bigger", i.e. it appears later in the sorted order<a name="line.1203"></a>
<span class="sourceLineNo">1204</span>      return 1;<a name="line.1204"></a>
<span class="sourceLineNo">1205</span>    }<a name="line.1205"></a>
<span class="sourceLineNo">1206</span>    if (flen + clen == 0 &amp;&amp; type == KeyValue.Type.Minimum.getCode()) {<a name="line.1206"></a>
<span class="sourceLineNo">1207</span>      return -1;<a name="line.1207"></a>
<span class="sourceLineNo">1208</span>    }<a name="line.1208"></a>
<span class="sourceLineNo">1209</span><a name="line.1209"></a>
<span class="sourceLineNo">1210</span>    compare = comparator.compareFamilies(nextIndexedCell, currentCell);<a name="line.1210"></a>
<span class="sourceLineNo">1211</span>    if (compare != 0) {<a name="line.1211"></a>
<span class="sourceLineNo">1212</span>      return compare;<a name="line.1212"></a>
<span class="sourceLineNo">1213</span>    }<a name="line.1213"></a>
<span class="sourceLineNo">1214</span>    if (colHint == null) {<a name="line.1214"></a>
<span class="sourceLineNo">1215</span>      compare = comparator.compareQualifiers(nextIndexedCell, currentCell);<a name="line.1215"></a>
<span class="sourceLineNo">1216</span>    } else {<a name="line.1216"></a>
<span class="sourceLineNo">1217</span>      compare = CellUtil.compareQualifiers(nextIndexedCell, colHint, coff, clen);<a name="line.1217"></a>
<span class="sourceLineNo">1218</span>    }<a name="line.1218"></a>
<span class="sourceLineNo">1219</span>    if (compare != 0) {<a name="line.1219"></a>
<span class="sourceLineNo">1220</span>      return compare;<a name="line.1220"></a>
<span class="sourceLineNo">1221</span>    }<a name="line.1221"></a>
<span class="sourceLineNo">1222</span>    // Next compare timestamps.<a name="line.1222"></a>
<span class="sourceLineNo">1223</span>    compare = comparator.compareTimestamps(nextIndexedCell.getTimestamp(), ts);<a name="line.1223"></a>
<span class="sourceLineNo">1224</span>    if (compare != 0) {<a name="line.1224"></a>
<span class="sourceLineNo">1225</span>      return compare;<a name="line.1225"></a>
<span class="sourceLineNo">1226</span>    }<a name="line.1226"></a>
<span class="sourceLineNo">1227</span><a name="line.1227"></a>
<span class="sourceLineNo">1228</span>    // Compare types. Let the delete types sort ahead of puts; i.e. types<a name="line.1228"></a>
<span class="sourceLineNo">1229</span>    // of higher numbers sort before those of lesser numbers. Maximum (255)<a name="line.1229"></a>
<span class="sourceLineNo">1230</span>    // appears ahead of everything, and minimum (0) appears after<a name="line.1230"></a>
<span class="sourceLineNo">1231</span>    // everything.<a name="line.1231"></a>
<span class="sourceLineNo">1232</span>    return (0xff &amp; type) - (0xff &amp; nextIndexedCell.getTypeByte());<a name="line.1232"></a>
<span class="sourceLineNo">1233</span>  }<a name="line.1233"></a>
<span class="sourceLineNo">1234</span><a name="line.1234"></a>
<span class="sourceLineNo">1235</span>  /**<a name="line.1235"></a>
<span class="sourceLineNo">1236</span>   * Compares only the key portion of a cell. It does not include the sequence id/mvcc of the cell<a name="line.1236"></a>
<span class="sourceLineNo">1237</span>   * @return an int greater than 0 if left &amp;gt; than right lesser than 0 if left &amp;lt; than right<a name="line.1237"></a>
<span class="sourceLineNo">1238</span>   *         equal to 0 if left is equal to right<a name="line.1238"></a>
<span class="sourceLineNo">1239</span>   */<a name="line.1239"></a>
<span class="sourceLineNo">1240</span>  public static final int compareKeyIgnoresMvcc(CellComparator comparator, Cell left, Cell right) {<a name="line.1240"></a>
<span class="sourceLineNo">1241</span>    return ((CellComparatorImpl) comparator).compare(left, right, true);<a name="line.1241"></a>
<span class="sourceLineNo">1242</span>  }<a name="line.1242"></a>
<span class="sourceLineNo">1243</span><a name="line.1243"></a>
<span class="sourceLineNo">1244</span>  /**<a name="line.1244"></a>
<span class="sourceLineNo">1245</span>   * Compare cell's row against given comparator<a name="line.1245"></a>
<span class="sourceLineNo">1246</span>   * @param cell       the cell to use for comparison<a name="line.1246"></a>
<span class="sourceLineNo">1247</span>   * @param comparator the {@link CellComparator} to use for comparison<a name="line.1247"></a>
<span class="sourceLineNo">1248</span>   * @return result comparing cell's row<a name="line.1248"></a>
<span class="sourceLineNo">1249</span>   */<a name="line.1249"></a>
<span class="sourceLineNo">1250</span>  public static int compareRow(Cell cell, ByteArrayComparable comparator) {<a name="line.1250"></a>
<span class="sourceLineNo">1251</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.1251"></a>
<span class="sourceLineNo">1252</span>      return comparator.compareTo(((ByteBufferExtendedCell) cell).getRowByteBuffer(),<a name="line.1252"></a>
<span class="sourceLineNo">1253</span>        ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength());<a name="line.1253"></a>
<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
<span class="sourceLineNo">1255</span>    return comparator.compareTo(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());<a name="line.1255"></a>
<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
<span class="sourceLineNo">1257</span><a name="line.1257"></a>
<span class="sourceLineNo">1258</span>  /**<a name="line.1258"></a>
<span class="sourceLineNo">1259</span>   * Compare cell's column family against given comparator<a name="line.1259"></a>
<span class="sourceLineNo">1260</span>   * @param cell       the cell to use for comparison<a name="line.1260"></a>
<span class="sourceLineNo">1261</span>   * @param comparator the {@link CellComparator} to use for comparison<a name="line.1261"></a>
<span class="sourceLineNo">1262</span>   * @return result comparing cell's column family<a name="line.1262"></a>
<span class="sourceLineNo">1263</span>   */<a name="line.1263"></a>
<span class="sourceLineNo">1264</span>  public static int compareFamily(Cell cell, ByteArrayComparable comparator) {<a name="line.1264"></a>
<span class="sourceLineNo">1265</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.1265"></a>
<span class="sourceLineNo">1266</span>      return comparator.compareTo(((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),<a name="line.1266"></a>
<span class="sourceLineNo">1267</span>        ((ByteBufferExtendedCell) cell).getFamilyPosition(), cell.getFamilyLength());<a name="line.1267"></a>
<span class="sourceLineNo">1268</span>    }<a name="line.1268"></a>
<span class="sourceLineNo">1269</span>    return comparator.compareTo(cell.getFamilyArray(), cell.getFamilyOffset(),<a name="line.1269"></a>
<span class="sourceLineNo">1270</span>      cell.getFamilyLength());<a name="line.1270"></a>
<span class="sourceLineNo">1271</span>  }<a name="line.1271"></a>
<span class="sourceLineNo">1272</span><a name="line.1272"></a>
<span class="sourceLineNo">1273</span>  /**<a name="line.1273"></a>
<span class="sourceLineNo">1274</span>   * Compare cell's qualifier against given comparator<a name="line.1274"></a>
<span class="sourceLineNo">1275</span>   * @param cell       the cell to use for comparison<a name="line.1275"></a>
<span class="sourceLineNo">1276</span>   * @param comparator the {@link CellComparator} to use for comparison<a name="line.1276"></a>
<span class="sourceLineNo">1277</span>   * @return result comparing cell's qualifier<a name="line.1277"></a>
<span class="sourceLineNo">1278</span>   */<a name="line.1278"></a>
<span class="sourceLineNo">1279</span>  public static int compareQualifier(Cell cell, ByteArrayComparable comparator) {<a name="line.1279"></a>
<span class="sourceLineNo">1280</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.1280"></a>
<span class="sourceLineNo">1281</span>      return comparator.compareTo(((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),<a name="line.1281"></a>
<span class="sourceLineNo">1282</span>        ((ByteBufferExtendedCell) cell).getQualifierPosition(), cell.getQualifierLength());<a name="line.1282"></a>
<span class="sourceLineNo">1283</span>    }<a name="line.1283"></a>
<span class="sourceLineNo">1284</span>    return comparator.compareTo(cell.getQualifierArray(), cell.getQualifierOffset(),<a name="line.1284"></a>
<span class="sourceLineNo">1285</span>      cell.getQualifierLength());<a name="line.1285"></a>
<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
<span class="sourceLineNo">1287</span><a name="line.1287"></a>
<span class="sourceLineNo">1288</span>  public static Cell.Type toType(byte type) {<a name="line.1288"></a>
<span class="sourceLineNo">1289</span>    KeyValue.Type codeToType = KeyValue.Type.codeToType(type);<a name="line.1289"></a>
<span class="sourceLineNo">1290</span>    switch (codeToType) {<a name="line.1290"></a>
<span class="sourceLineNo">1291</span>      case Put:<a name="line.1291"></a>
<span class="sourceLineNo">1292</span>        return Cell.Type.Put;<a name="line.1292"></a>
<span class="sourceLineNo">1293</span>      case Delete:<a name="line.1293"></a>
<span class="sourceLineNo">1294</span>        return Cell.Type.Delete;<a name="line.1294"></a>
<span class="sourceLineNo">1295</span>      case DeleteColumn:<a name="line.1295"></a>
<span class="sourceLineNo">1296</span>        return Cell.Type.DeleteColumn;<a name="line.1296"></a>
<span class="sourceLineNo">1297</span>      case DeleteFamily:<a name="line.1297"></a>
<span class="sourceLineNo">1298</span>        return Cell.Type.DeleteFamily;<a name="line.1298"></a>
<span class="sourceLineNo">1299</span>      case DeleteFamilyVersion:<a name="line.1299"></a>
<span class="sourceLineNo">1300</span>        return Cell.Type.DeleteFamilyVersion;<a name="line.1300"></a>
<span class="sourceLineNo">1301</span>      default:<a name="line.1301"></a>
<span class="sourceLineNo">1302</span>        throw new UnsupportedOperationException("Invalid type of cell " + type);<a name="line.1302"></a>
<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
<span class="sourceLineNo">1305</span><a name="line.1305"></a>
<span class="sourceLineNo">1306</span>  public static KeyValue.Type toTypeByte(Cell.Type type) {<a name="line.1306"></a>
<span class="sourceLineNo">1307</span>    switch (type) {<a name="line.1307"></a>
<span class="sourceLineNo">1308</span>      case Put:<a name="line.1308"></a>
<span class="sourceLineNo">1309</span>        return KeyValue.Type.Put;<a name="line.1309"></a>
<span class="sourceLineNo">1310</span>      case Delete:<a name="line.1310"></a>
<span class="sourceLineNo">1311</span>        return KeyValue.Type.Delete;<a name="line.1311"></a>
<span class="sourceLineNo">1312</span>      case DeleteColumn:<a name="line.1312"></a>
<span class="sourceLineNo">1313</span>        return KeyValue.Type.DeleteColumn;<a name="line.1313"></a>
<span class="sourceLineNo">1314</span>      case DeleteFamilyVersion:<a name="line.1314"></a>
<span class="sourceLineNo">1315</span>        return KeyValue.Type.DeleteFamilyVersion;<a name="line.1315"></a>
<span class="sourceLineNo">1316</span>      case DeleteFamily:<a name="line.1316"></a>
<span class="sourceLineNo">1317</span>        return KeyValue.Type.DeleteFamily;<a name="line.1317"></a>
<span class="sourceLineNo">1318</span>      default:<a name="line.1318"></a>
<span class="sourceLineNo">1319</span>        throw new UnsupportedOperationException("Unsupported data type:" + type);<a name="line.1319"></a>
<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
<span class="sourceLineNo">1322</span><a name="line.1322"></a>
<span class="sourceLineNo">1323</span>  /**<a name="line.1323"></a>
<span class="sourceLineNo">1324</span>   * Compare cell's value against given comparator<a name="line.1324"></a>
<span class="sourceLineNo">1325</span>   * @param cell       the cell to use for comparison<a name="line.1325"></a>
<span class="sourceLineNo">1326</span>   * @param comparator the {@link CellComparator} to use for comparison<a name="line.1326"></a>
<span class="sourceLineNo">1327</span>   * @return result comparing cell's value<a name="line.1327"></a>
<span class="sourceLineNo">1328</span>   */<a name="line.1328"></a>
<span class="sourceLineNo">1329</span>  public static int compareValue(Cell cell, ByteArrayComparable comparator) {<a name="line.1329"></a>
<span class="sourceLineNo">1330</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.1330"></a>
<span class="sourceLineNo">1331</span>      return comparator.compareTo(((ByteBufferExtendedCell) cell).getValueByteBuffer(),<a name="line.1331"></a>
<span class="sourceLineNo">1332</span>        ((ByteBufferExtendedCell) cell).getValuePosition(), cell.getValueLength());<a name="line.1332"></a>
<span class="sourceLineNo">1333</span>    }<a name="line.1333"></a>
<span class="sourceLineNo">1334</span>    return comparator.compareTo(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());<a name="line.1334"></a>
<span class="sourceLineNo">1335</span>  }<a name="line.1335"></a>
<span class="sourceLineNo">1336</span><a name="line.1336"></a>
<span class="sourceLineNo">1337</span>  /**<a name="line.1337"></a>
<span class="sourceLineNo">1338</span>   * These cells are used in reseeks/seeks to improve the read performance. They are not real cells<a name="line.1338"></a>
<span class="sourceLineNo">1339</span>   * that are returned back to the clients<a name="line.1339"></a>
<span class="sourceLineNo">1340</span>   */<a name="line.1340"></a>
<span class="sourceLineNo">1341</span>  private static abstract class EmptyCell implements ExtendedCell {<a name="line.1341"></a>
<span class="sourceLineNo">1342</span><a name="line.1342"></a>
<span class="sourceLineNo">1343</span>    @Override<a name="line.1343"></a>
<span class="sourceLineNo">1344</span>    public void setSequenceId(long seqId) {<a name="line.1344"></a>
<span class="sourceLineNo">1345</span>      // Fake cells don't need seqId, so leaving it as a noop.<a name="line.1345"></a>
<span class="sourceLineNo">1346</span>    }<a name="line.1346"></a>
<span class="sourceLineNo">1347</span><a name="line.1347"></a>
<span class="sourceLineNo">1348</span>    @Override<a name="line.1348"></a>
<span class="sourceLineNo">1349</span>    public void setTimestamp(long ts) {<a name="line.1349"></a>
<span class="sourceLineNo">1350</span>      // Fake cells can't be changed timestamp, so leaving it as a noop.<a name="line.1350"></a>
<span class="sourceLineNo">1351</span>    }<a name="line.1351"></a>
<span class="sourceLineNo">1352</span><a name="line.1352"></a>
<span class="sourceLineNo">1353</span>    @Override<a name="line.1353"></a>
<span class="sourceLineNo">1354</span>    public void setTimestamp(byte[] ts) {<a name="line.1354"></a>
<span class="sourceLineNo">1355</span>      // Fake cells can't be changed timestamp, so leaving it as a noop.<a name="line.1355"></a>
<span class="sourceLineNo">1356</span>    }<a name="line.1356"></a>
<span class="sourceLineNo">1357</span><a name="line.1357"></a>
<span class="sourceLineNo">1358</span>    @Override<a name="line.1358"></a>
<span class="sourceLineNo">1359</span>    public byte[] getRowArray() {<a name="line.1359"></a>
<span class="sourceLineNo">1360</span>      return EMPTY_BYTE_ARRAY;<a name="line.1360"></a>
<span class="sourceLineNo">1361</span>    }<a name="line.1361"></a>
<span class="sourceLineNo">1362</span><a name="line.1362"></a>
<span class="sourceLineNo">1363</span>    @Override<a name="line.1363"></a>
<span class="sourceLineNo">1364</span>    public int getRowOffset() {<a name="line.1364"></a>
<span class="sourceLineNo">1365</span>      return 0;<a name="line.1365"></a>
<span class="sourceLineNo">1366</span>    }<a name="line.1366"></a>
<span class="sourceLineNo">1367</span><a name="line.1367"></a>
<span class="sourceLineNo">1368</span>    @Override<a name="line.1368"></a>
<span class="sourceLineNo">1369</span>    public short getRowLength() {<a name="line.1369"></a>
<span class="sourceLineNo">1370</span>      return 0;<a name="line.1370"></a>
<span class="sourceLineNo">1371</span>    }<a name="line.1371"></a>
<span class="sourceLineNo">1372</span><a name="line.1372"></a>
<span class="sourceLineNo">1373</span>    @Override<a name="line.1373"></a>
<span class="sourceLineNo">1374</span>    public byte[] getFamilyArray() {<a name="line.1374"></a>
<span class="sourceLineNo">1375</span>      return EMPTY_BYTE_ARRAY;<a name="line.1375"></a>
<span class="sourceLineNo">1376</span>    }<a name="line.1376"></a>
<span class="sourceLineNo">1377</span><a name="line.1377"></a>
<span class="sourceLineNo">1378</span>    @Override<a name="line.1378"></a>
<span class="sourceLineNo">1379</span>    public int getFamilyOffset() {<a name="line.1379"></a>
<span class="sourceLineNo">1380</span>      return 0;<a name="line.1380"></a>
<span class="sourceLineNo">1381</span>    }<a name="line.1381"></a>
<span class="sourceLineNo">1382</span><a name="line.1382"></a>
<span class="sourceLineNo">1383</span>    @Override<a name="line.1383"></a>
<span class="sourceLineNo">1384</span>    public byte getFamilyLength() {<a name="line.1384"></a>
<span class="sourceLineNo">1385</span>      return 0;<a name="line.1385"></a>
<span class="sourceLineNo">1386</span>    }<a name="line.1386"></a>
<span class="sourceLineNo">1387</span><a name="line.1387"></a>
<span class="sourceLineNo">1388</span>    @Override<a name="line.1388"></a>
<span class="sourceLineNo">1389</span>    public byte[] getQualifierArray() {<a name="line.1389"></a>
<span class="sourceLineNo">1390</span>      return EMPTY_BYTE_ARRAY;<a name="line.1390"></a>
<span class="sourceLineNo">1391</span>    }<a name="line.1391"></a>
<span class="sourceLineNo">1392</span><a name="line.1392"></a>
<span class="sourceLineNo">1393</span>    @Override<a name="line.1393"></a>
<span class="sourceLineNo">1394</span>    public int getQualifierOffset() {<a name="line.1394"></a>
<span class="sourceLineNo">1395</span>      return 0;<a name="line.1395"></a>
<span class="sourceLineNo">1396</span>    }<a name="line.1396"></a>
<span class="sourceLineNo">1397</span><a name="line.1397"></a>
<span class="sourceLineNo">1398</span>    @Override<a name="line.1398"></a>
<span class="sourceLineNo">1399</span>    public int getQualifierLength() {<a name="line.1399"></a>
<span class="sourceLineNo">1400</span>      return 0;<a name="line.1400"></a>
<span class="sourceLineNo">1401</span>    }<a name="line.1401"></a>
<span class="sourceLineNo">1402</span><a name="line.1402"></a>
<span class="sourceLineNo">1403</span>    @Override<a name="line.1403"></a>
<span class="sourceLineNo">1404</span>    public long getSequenceId() {<a name="line.1404"></a>
<span class="sourceLineNo">1405</span>      return 0;<a name="line.1405"></a>
<span class="sourceLineNo">1406</span>    }<a name="line.1406"></a>
<span class="sourceLineNo">1407</span><a name="line.1407"></a>
<span class="sourceLineNo">1408</span>    @Override<a name="line.1408"></a>
<span class="sourceLineNo">1409</span>    public byte[] getValueArray() {<a name="line.1409"></a>
<span class="sourceLineNo">1410</span>      return EMPTY_BYTE_ARRAY;<a name="line.1410"></a>
<span class="sourceLineNo">1411</span>    }<a name="line.1411"></a>
<span class="sourceLineNo">1412</span><a name="line.1412"></a>
<span class="sourceLineNo">1413</span>    @Override<a name="line.1413"></a>
<span class="sourceLineNo">1414</span>    public int getValueOffset() {<a name="line.1414"></a>
<span class="sourceLineNo">1415</span>      return 0;<a name="line.1415"></a>
<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
<span class="sourceLineNo">1417</span><a name="line.1417"></a>
<span class="sourceLineNo">1418</span>    @Override<a name="line.1418"></a>
<span class="sourceLineNo">1419</span>    public int getValueLength() {<a name="line.1419"></a>
<span class="sourceLineNo">1420</span>      return 0;<a name="line.1420"></a>
<span class="sourceLineNo">1421</span>    }<a name="line.1421"></a>
<span class="sourceLineNo">1422</span><a name="line.1422"></a>
<span class="sourceLineNo">1423</span>    @Override<a name="line.1423"></a>
<span class="sourceLineNo">1424</span>    public byte[] getTagsArray() {<a name="line.1424"></a>
<span class="sourceLineNo">1425</span>      return EMPTY_BYTE_ARRAY;<a name="line.1425"></a>
<span class="sourceLineNo">1426</span>    }<a name="line.1426"></a>
<span class="sourceLineNo">1427</span><a name="line.1427"></a>
<span class="sourceLineNo">1428</span>    @Override<a name="line.1428"></a>
<span class="sourceLineNo">1429</span>    public int getTagsOffset() {<a name="line.1429"></a>
<span class="sourceLineNo">1430</span>      return 0;<a name="line.1430"></a>
<span class="sourceLineNo">1431</span>    }<a name="line.1431"></a>
<span class="sourceLineNo">1432</span><a name="line.1432"></a>
<span class="sourceLineNo">1433</span>    @Override<a name="line.1433"></a>
<span class="sourceLineNo">1434</span>    public int getTagsLength() {<a name="line.1434"></a>
<span class="sourceLineNo">1435</span>      return 0;<a name="line.1435"></a>
<span class="sourceLineNo">1436</span>    }<a name="line.1436"></a>
<span class="sourceLineNo">1437</span>  }<a name="line.1437"></a>
<span class="sourceLineNo">1438</span><a name="line.1438"></a>
<span class="sourceLineNo">1439</span>  /**<a name="line.1439"></a>
<span class="sourceLineNo">1440</span>   * These cells are used in reseeks/seeks to improve the read performance. They are not real cells<a name="line.1440"></a>
<span class="sourceLineNo">1441</span>   * that are returned back to the clients<a name="line.1441"></a>
<span class="sourceLineNo">1442</span>   */<a name="line.1442"></a>
<span class="sourceLineNo">1443</span>  private static abstract class EmptyByteBufferExtendedCell extends ByteBufferExtendedCell {<a name="line.1443"></a>
<span class="sourceLineNo">1444</span><a name="line.1444"></a>
<span class="sourceLineNo">1445</span>    @Override<a name="line.1445"></a>
<span class="sourceLineNo">1446</span>    public void setSequenceId(long seqId) {<a name="line.1446"></a>
<span class="sourceLineNo">1447</span>      // Fake cells don't need seqId, so leaving it as a noop.<a name="line.1447"></a>
<span class="sourceLineNo">1448</span>    }<a name="line.1448"></a>
<span class="sourceLineNo">1449</span><a name="line.1449"></a>
<span class="sourceLineNo">1450</span>    @Override<a name="line.1450"></a>
<span class="sourceLineNo">1451</span>    public void setTimestamp(long ts) {<a name="line.1451"></a>
<span class="sourceLineNo">1452</span>      // Fake cells can't be changed timestamp, so leaving it as a noop.<a name="line.1452"></a>
<span class="sourceLineNo">1453</span>    }<a name="line.1453"></a>
<span class="sourceLineNo">1454</span><a name="line.1454"></a>
<span class="sourceLineNo">1455</span>    @Override<a name="line.1455"></a>
<span class="sourceLineNo">1456</span>    public void setTimestamp(byte[] ts) {<a name="line.1456"></a>
<span class="sourceLineNo">1457</span>      // Fake cells can't be changed timestamp, so leaving it as a noop.<a name="line.1457"></a>
<span class="sourceLineNo">1458</span>    }<a name="line.1458"></a>
<span class="sourceLineNo">1459</span><a name="line.1459"></a>
<span class="sourceLineNo">1460</span>    @Override<a name="line.1460"></a>
<span class="sourceLineNo">1461</span>    public byte[] getRowArray() {<a name="line.1461"></a>
<span class="sourceLineNo">1462</span>      return CellUtil.cloneRow(this);<a name="line.1462"></a>
<span class="sourceLineNo">1463</span>    }<a name="line.1463"></a>
<span class="sourceLineNo">1464</span><a name="line.1464"></a>
<span class="sourceLineNo">1465</span>    @Override<a name="line.1465"></a>
<span class="sourceLineNo">1466</span>    public int getRowOffset() {<a name="line.1466"></a>
<span class="sourceLineNo">1467</span>      return 0;<a name="line.1467"></a>
<span class="sourceLineNo">1468</span>    }<a name="line.1468"></a>
<span class="sourceLineNo">1469</span><a name="line.1469"></a>
<span class="sourceLineNo">1470</span>    @Override<a name="line.1470"></a>
<span class="sourceLineNo">1471</span>    public short getRowLength() {<a name="line.1471"></a>
<span class="sourceLineNo">1472</span>      return 0;<a name="line.1472"></a>
<span class="sourceLineNo">1473</span>    }<a name="line.1473"></a>
<span class="sourceLineNo">1474</span><a name="line.1474"></a>
<span class="sourceLineNo">1475</span>    @Override<a name="line.1475"></a>
<span class="sourceLineNo">1476</span>    public byte[] getFamilyArray() {<a name="line.1476"></a>
<span class="sourceLineNo">1477</span>      return CellUtil.cloneFamily(this);<a name="line.1477"></a>
<span class="sourceLineNo">1478</span>    }<a name="line.1478"></a>
<span class="sourceLineNo">1479</span><a name="line.1479"></a>
<span class="sourceLineNo">1480</span>    @Override<a name="line.1480"></a>
<span class="sourceLineNo">1481</span>    public int getFamilyOffset() {<a name="line.1481"></a>
<span class="sourceLineNo">1482</span>      return 0;<a name="line.1482"></a>
<span class="sourceLineNo">1483</span>    }<a name="line.1483"></a>
<span class="sourceLineNo">1484</span><a name="line.1484"></a>
<span class="sourceLineNo">1485</span>    @Override<a name="line.1485"></a>
<span class="sourceLineNo">1486</span>    public byte getFamilyLength() {<a name="line.1486"></a>
<span class="sourceLineNo">1487</span>      return 0;<a name="line.1487"></a>
<span class="sourceLineNo">1488</span>    }<a name="line.1488"></a>
<span class="sourceLineNo">1489</span><a name="line.1489"></a>
<span class="sourceLineNo">1490</span>    @Override<a name="line.1490"></a>
<span class="sourceLineNo">1491</span>    public byte[] getQualifierArray() {<a name="line.1491"></a>
<span class="sourceLineNo">1492</span>      return CellUtil.cloneQualifier(this);<a name="line.1492"></a>
<span class="sourceLineNo">1493</span>    }<a name="line.1493"></a>
<span class="sourceLineNo">1494</span><a name="line.1494"></a>
<span class="sourceLineNo">1495</span>    @Override<a name="line.1495"></a>
<span class="sourceLineNo">1496</span>    public int getQualifierOffset() {<a name="line.1496"></a>
<span class="sourceLineNo">1497</span>      return 0;<a name="line.1497"></a>
<span class="sourceLineNo">1498</span>    }<a name="line.1498"></a>
<span class="sourceLineNo">1499</span><a name="line.1499"></a>
<span class="sourceLineNo">1500</span>    @Override<a name="line.1500"></a>
<span class="sourceLineNo">1501</span>    public int getQualifierLength() {<a name="line.1501"></a>
<span class="sourceLineNo">1502</span>      return 0;<a name="line.1502"></a>
<span class="sourceLineNo">1503</span>    }<a name="line.1503"></a>
<span class="sourceLineNo">1504</span><a name="line.1504"></a>
<span class="sourceLineNo">1505</span>    @Override<a name="line.1505"></a>
<span class="sourceLineNo">1506</span>    public long getSequenceId() {<a name="line.1506"></a>
<span class="sourceLineNo">1507</span>      return 0;<a name="line.1507"></a>
<span class="sourceLineNo">1508</span>    }<a name="line.1508"></a>
<span class="sourceLineNo">1509</span><a name="line.1509"></a>
<span class="sourceLineNo">1510</span>    @Override<a name="line.1510"></a>
<span class="sourceLineNo">1511</span>    public byte[] getValueArray() {<a name="line.1511"></a>
<span class="sourceLineNo">1512</span>      return CellUtil.cloneValue(this);<a name="line.1512"></a>
<span class="sourceLineNo">1513</span>    }<a name="line.1513"></a>
<span class="sourceLineNo">1514</span><a name="line.1514"></a>
<span class="sourceLineNo">1515</span>    @Override<a name="line.1515"></a>
<span class="sourceLineNo">1516</span>    public int getValueOffset() {<a name="line.1516"></a>
<span class="sourceLineNo">1517</span>      return 0;<a name="line.1517"></a>
<span class="sourceLineNo">1518</span>    }<a name="line.1518"></a>
<span class="sourceLineNo">1519</span><a name="line.1519"></a>
<span class="sourceLineNo">1520</span>    @Override<a name="line.1520"></a>
<span class="sourceLineNo">1521</span>    public int getValueLength() {<a name="line.1521"></a>
<span class="sourceLineNo">1522</span>      return 0;<a name="line.1522"></a>
<span class="sourceLineNo">1523</span>    }<a name="line.1523"></a>
<span class="sourceLineNo">1524</span><a name="line.1524"></a>
<span class="sourceLineNo">1525</span>    @Override<a name="line.1525"></a>
<span class="sourceLineNo">1526</span>    public byte[] getTagsArray() {<a name="line.1526"></a>
<span class="sourceLineNo">1527</span>      return PrivateCellUtil.cloneTags(this);<a name="line.1527"></a>
<span class="sourceLineNo">1528</span>    }<a name="line.1528"></a>
<span class="sourceLineNo">1529</span><a name="line.1529"></a>
<span class="sourceLineNo">1530</span>    @Override<a name="line.1530"></a>
<span class="sourceLineNo">1531</span>    public int getTagsOffset() {<a name="line.1531"></a>
<span class="sourceLineNo">1532</span>      return 0;<a name="line.1532"></a>
<span class="sourceLineNo">1533</span>    }<a name="line.1533"></a>
<span class="sourceLineNo">1534</span><a name="line.1534"></a>
<span class="sourceLineNo">1535</span>    @Override<a name="line.1535"></a>
<span class="sourceLineNo">1536</span>    public int getTagsLength() {<a name="line.1536"></a>
<span class="sourceLineNo">1537</span>      return 0;<a name="line.1537"></a>
<span class="sourceLineNo">1538</span>    }<a name="line.1538"></a>
<span class="sourceLineNo">1539</span><a name="line.1539"></a>
<span class="sourceLineNo">1540</span>    @Override<a name="line.1540"></a>
<span class="sourceLineNo">1541</span>    public ByteBuffer getRowByteBuffer() {<a name="line.1541"></a>
<span class="sourceLineNo">1542</span>      return HConstants.EMPTY_BYTE_BUFFER;<a name="line.1542"></a>
<span class="sourceLineNo">1543</span>    }<a name="line.1543"></a>
<span class="sourceLineNo">1544</span><a name="line.1544"></a>
<span class="sourceLineNo">1545</span>    @Override<a name="line.1545"></a>
<span class="sourceLineNo">1546</span>    public int getRowPosition() {<a name="line.1546"></a>
<span class="sourceLineNo">1547</span>      return 0;<a name="line.1547"></a>
<span class="sourceLineNo">1548</span>    }<a name="line.1548"></a>
<span class="sourceLineNo">1549</span><a name="line.1549"></a>
<span class="sourceLineNo">1550</span>    @Override<a name="line.1550"></a>
<span class="sourceLineNo">1551</span>    public ByteBuffer getFamilyByteBuffer() {<a name="line.1551"></a>
<span class="sourceLineNo">1552</span>      return HConstants.EMPTY_BYTE_BUFFER;<a name="line.1552"></a>
<span class="sourceLineNo">1553</span>    }<a name="line.1553"></a>
<span class="sourceLineNo">1554</span><a name="line.1554"></a>
<span class="sourceLineNo">1555</span>    @Override<a name="line.1555"></a>
<span class="sourceLineNo">1556</span>    public int getFamilyPosition() {<a name="line.1556"></a>
<span class="sourceLineNo">1557</span>      return 0;<a name="line.1557"></a>
<span class="sourceLineNo">1558</span>    }<a name="line.1558"></a>
<span class="sourceLineNo">1559</span><a name="line.1559"></a>
<span class="sourceLineNo">1560</span>    @Override<a name="line.1560"></a>
<span class="sourceLineNo">1561</span>    public ByteBuffer getQualifierByteBuffer() {<a name="line.1561"></a>
<span class="sourceLineNo">1562</span>      return HConstants.EMPTY_BYTE_BUFFER;<a name="line.1562"></a>
<span class="sourceLineNo">1563</span>    }<a name="line.1563"></a>
<span class="sourceLineNo">1564</span><a name="line.1564"></a>
<span class="sourceLineNo">1565</span>    @Override<a name="line.1565"></a>
<span class="sourceLineNo">1566</span>    public int getQualifierPosition() {<a name="line.1566"></a>
<span class="sourceLineNo">1567</span>      return 0;<a name="line.1567"></a>
<span class="sourceLineNo">1568</span>    }<a name="line.1568"></a>
<span class="sourceLineNo">1569</span><a name="line.1569"></a>
<span class="sourceLineNo">1570</span>    @Override<a name="line.1570"></a>
<span class="sourceLineNo">1571</span>    public ByteBuffer getTagsByteBuffer() {<a name="line.1571"></a>
<span class="sourceLineNo">1572</span>      return HConstants.EMPTY_BYTE_BUFFER;<a name="line.1572"></a>
<span class="sourceLineNo">1573</span>    }<a name="line.1573"></a>
<span class="sourceLineNo">1574</span><a name="line.1574"></a>
<span class="sourceLineNo">1575</span>    @Override<a name="line.1575"></a>
<span class="sourceLineNo">1576</span>    public int getTagsPosition() {<a name="line.1576"></a>
<span class="sourceLineNo">1577</span>      return 0;<a name="line.1577"></a>
<span class="sourceLineNo">1578</span>    }<a name="line.1578"></a>
<span class="sourceLineNo">1579</span><a name="line.1579"></a>
<span class="sourceLineNo">1580</span>    @Override<a name="line.1580"></a>
<span class="sourceLineNo">1581</span>    public ByteBuffer getValueByteBuffer() {<a name="line.1581"></a>
<span class="sourceLineNo">1582</span>      return HConstants.EMPTY_BYTE_BUFFER;<a name="line.1582"></a>
<span class="sourceLineNo">1583</span>    }<a name="line.1583"></a>
<span class="sourceLineNo">1584</span><a name="line.1584"></a>
<span class="sourceLineNo">1585</span>    @Override<a name="line.1585"></a>
<span class="sourceLineNo">1586</span>    public int getValuePosition() {<a name="line.1586"></a>
<span class="sourceLineNo">1587</span>      return 0;<a name="line.1587"></a>
<span class="sourceLineNo">1588</span>    }<a name="line.1588"></a>
<span class="sourceLineNo">1589</span>  }<a name="line.1589"></a>
<span class="sourceLineNo">1590</span><a name="line.1590"></a>
<span class="sourceLineNo">1591</span>  private static class FirstOnRowCell extends EmptyCell {<a name="line.1591"></a>
<span class="sourceLineNo">1592</span>    // @formatter:off<a name="line.1592"></a>
<span class="sourceLineNo">1593</span>    private static final int FIXED_HEAPSIZE =<a name="line.1593"></a>
<span class="sourceLineNo">1594</span>        ClassSize.OBJECT // object<a name="line.1594"></a>
<span class="sourceLineNo">1595</span>      + ClassSize.REFERENCE // row array<a name="line.1595"></a>
<span class="sourceLineNo">1596</span>      + Bytes.SIZEOF_INT // row offset<a name="line.1596"></a>
<span class="sourceLineNo">1597</span>      + Bytes.SIZEOF_SHORT;  // row length<a name="line.1597"></a>
<span class="sourceLineNo">1598</span>    // @formatter:on<a name="line.1598"></a>
<span class="sourceLineNo">1599</span>    private final byte[] rowArray;<a name="line.1599"></a>
<span class="sourceLineNo">1600</span>    private final int roffset;<a name="line.1600"></a>
<span class="sourceLineNo">1601</span>    private final short rlength;<a name="line.1601"></a>
<span class="sourceLineNo">1602</span><a name="line.1602"></a>
<span class="sourceLineNo">1603</span>    public FirstOnRowCell(final byte[] row, int roffset, short rlength) {<a name="line.1603"></a>
<span class="sourceLineNo">1604</span>      this.rowArray = row;<a name="line.1604"></a>
<span class="sourceLineNo">1605</span>      this.roffset = roffset;<a name="line.1605"></a>
<span class="sourceLineNo">1606</span>      this.rlength = rlength;<a name="line.1606"></a>
<span class="sourceLineNo">1607</span>    }<a name="line.1607"></a>
<span class="sourceLineNo">1608</span><a name="line.1608"></a>
<span class="sourceLineNo">1609</span>    @Override<a name="line.1609"></a>
<span class="sourceLineNo">1610</span>    public long heapSize() {<a name="line.1610"></a>
<span class="sourceLineNo">1611</span>      return ClassSize.align(FIXED_HEAPSIZE)<a name="line.1611"></a>
<span class="sourceLineNo">1612</span>        // array overhead<a name="line.1612"></a>
<span class="sourceLineNo">1613</span>        + (rlength == 0 ? ClassSize.sizeOfByteArray(rlength) : rlength);<a name="line.1613"></a>
<span class="sourceLineNo">1614</span>    }<a name="line.1614"></a>
<span class="sourceLineNo">1615</span><a name="line.1615"></a>
<span class="sourceLineNo">1616</span>    @Override<a name="line.1616"></a>
<span class="sourceLineNo">1617</span>    public byte[] getRowArray() {<a name="line.1617"></a>
<span class="sourceLineNo">1618</span>      return this.rowArray;<a name="line.1618"></a>
<span class="sourceLineNo">1619</span>    }<a name="line.1619"></a>
<span class="sourceLineNo">1620</span><a name="line.1620"></a>
<span class="sourceLineNo">1621</span>    @Override<a name="line.1621"></a>
<span class="sourceLineNo">1622</span>    public int getRowOffset() {<a name="line.1622"></a>
<span class="sourceLineNo">1623</span>      return this.roffset;<a name="line.1623"></a>
<span class="sourceLineNo">1624</span>    }<a name="line.1624"></a>
<span class="sourceLineNo">1625</span><a name="line.1625"></a>
<span class="sourceLineNo">1626</span>    @Override<a name="line.1626"></a>
<span class="sourceLineNo">1627</span>    public short getRowLength() {<a name="line.1627"></a>
<span class="sourceLineNo">1628</span>      return this.rlength;<a name="line.1628"></a>
<span class="sourceLineNo">1629</span>    }<a name="line.1629"></a>
<span class="sourceLineNo">1630</span><a name="line.1630"></a>
<span class="sourceLineNo">1631</span>    @Override<a name="line.1631"></a>
<span class="sourceLineNo">1632</span>    public long getTimestamp() {<a name="line.1632"></a>
<span class="sourceLineNo">1633</span>      return HConstants.LATEST_TIMESTAMP;<a name="line.1633"></a>
<span class="sourceLineNo">1634</span>    }<a name="line.1634"></a>
<span class="sourceLineNo">1635</span><a name="line.1635"></a>
<span class="sourceLineNo">1636</span>    @Override<a name="line.1636"></a>
<span class="sourceLineNo">1637</span>    public byte getTypeByte() {<a name="line.1637"></a>
<span class="sourceLineNo">1638</span>      return KeyValue.Type.Maximum.getCode();<a name="line.1638"></a>
<span class="sourceLineNo">1639</span>    }<a name="line.1639"></a>
<span class="sourceLineNo">1640</span><a name="line.1640"></a>
<span class="sourceLineNo">1641</span>    @Override<a name="line.1641"></a>
<span class="sourceLineNo">1642</span>    public Type getType() {<a name="line.1642"></a>
<span class="sourceLineNo">1643</span>      throw new UnsupportedOperationException();<a name="line.1643"></a>
<span class="sourceLineNo">1644</span>    }<a name="line.1644"></a>
<span class="sourceLineNo">1645</span>  }<a name="line.1645"></a>
<span class="sourceLineNo">1646</span><a name="line.1646"></a>
<span class="sourceLineNo">1647</span>  private static class FirstOnRowByteBufferExtendedCell extends EmptyByteBufferExtendedCell {<a name="line.1647"></a>
<span class="sourceLineNo">1648</span>    // @formatter:off<a name="line.1648"></a>
<span class="sourceLineNo">1649</span>    private static final int FIXED_OVERHEAD =<a name="line.1649"></a>
<span class="sourceLineNo">1650</span>        ClassSize.OBJECT // object<a name="line.1650"></a>
<span class="sourceLineNo">1651</span>        + ClassSize.REFERENCE // row buffer<a name="line.1651"></a>
<span class="sourceLineNo">1652</span>        + Bytes.SIZEOF_INT // row offset<a name="line.1652"></a>
<span class="sourceLineNo">1653</span>        + Bytes.SIZEOF_SHORT; // row length<a name="line.1653"></a>
<span class="sourceLineNo">1654</span>    // @formatter:on<a name="line.1654"></a>
<span class="sourceLineNo">1655</span>    private final ByteBuffer rowBuff;<a name="line.1655"></a>
<span class="sourceLineNo">1656</span>    private final int roffset;<a name="line.1656"></a>
<span class="sourceLineNo">1657</span>    private final short rlength;<a name="line.1657"></a>
<span class="sourceLineNo">1658</span><a name="line.1658"></a>
<span class="sourceLineNo">1659</span>    public FirstOnRowByteBufferExtendedCell(final ByteBuffer row, int roffset, short rlength) {<a name="line.1659"></a>
<span class="sourceLineNo">1660</span>      this.rowBuff = row;<a name="line.1660"></a>
<span class="sourceLineNo">1661</span>      this.roffset = roffset;<a name="line.1661"></a>
<span class="sourceLineNo">1662</span>      this.rlength = rlength;<a name="line.1662"></a>
<span class="sourceLineNo">1663</span>    }<a name="line.1663"></a>
<span class="sourceLineNo">1664</span><a name="line.1664"></a>
<span class="sourceLineNo">1665</span>    @Override<a name="line.1665"></a>
<span class="sourceLineNo">1666</span>    public long heapSize() {<a name="line.1666"></a>
<span class="sourceLineNo">1667</span>      if (this.rowBuff.hasArray()) {<a name="line.1667"></a>
<span class="sourceLineNo">1668</span>        return ClassSize.align(FIXED_OVERHEAD + rlength);<a name="line.1668"></a>
<span class="sourceLineNo">1669</span>      }<a name="line.1669"></a>
<span class="sourceLineNo">1670</span>      return ClassSize.align(FIXED_OVERHEAD);<a name="line.1670"></a>
<span class="sourceLineNo">1671</span>    }<a name="line.1671"></a>
<span class="sourceLineNo">1672</span><a name="line.1672"></a>
<span class="sourceLineNo">1673</span>    @Override<a name="line.1673"></a>
<span class="sourceLineNo">1674</span>    public ByteBuffer getRowByteBuffer() {<a name="line.1674"></a>
<span class="sourceLineNo">1675</span>      return this.rowBuff;<a name="line.1675"></a>
<span class="sourceLineNo">1676</span>    }<a name="line.1676"></a>
<span class="sourceLineNo">1677</span><a name="line.1677"></a>
<span class="sourceLineNo">1678</span>    @Override<a name="line.1678"></a>
<span class="sourceLineNo">1679</span>    public int getRowPosition() {<a name="line.1679"></a>
<span class="sourceLineNo">1680</span>      return this.roffset;<a name="line.1680"></a>
<span class="sourceLineNo">1681</span>    }<a name="line.1681"></a>
<span class="sourceLineNo">1682</span><a name="line.1682"></a>
<span class="sourceLineNo">1683</span>    @Override<a name="line.1683"></a>
<span class="sourceLineNo">1684</span>    public short getRowLength() {<a name="line.1684"></a>
<span class="sourceLineNo">1685</span>      return this.rlength;<a name="line.1685"></a>
<span class="sourceLineNo">1686</span>    }<a name="line.1686"></a>
<span class="sourceLineNo">1687</span><a name="line.1687"></a>
<span class="sourceLineNo">1688</span>    @Override<a name="line.1688"></a>
<span class="sourceLineNo">1689</span>    public long getTimestamp() {<a name="line.1689"></a>
<span class="sourceLineNo">1690</span>      return HConstants.LATEST_TIMESTAMP;<a name="line.1690"></a>
<span class="sourceLineNo">1691</span>    }<a name="line.1691"></a>
<span class="sourceLineNo">1692</span><a name="line.1692"></a>
<span class="sourceLineNo">1693</span>    @Override<a name="line.1693"></a>
<span class="sourceLineNo">1694</span>    public byte getTypeByte() {<a name="line.1694"></a>
<span class="sourceLineNo">1695</span>      return KeyValue.Type.Maximum.getCode();<a name="line.1695"></a>
<span class="sourceLineNo">1696</span>    }<a name="line.1696"></a>
<span class="sourceLineNo">1697</span><a name="line.1697"></a>
<span class="sourceLineNo">1698</span>    @Override<a name="line.1698"></a>
<span class="sourceLineNo">1699</span>    public Type getType() {<a name="line.1699"></a>
<span class="sourceLineNo">1700</span>      throw new UnsupportedOperationException();<a name="line.1700"></a>
<span class="sourceLineNo">1701</span>    }<a name="line.1701"></a>
<span class="sourceLineNo">1702</span>  }<a name="line.1702"></a>
<span class="sourceLineNo">1703</span><a name="line.1703"></a>
<span class="sourceLineNo">1704</span>  private static class LastOnRowByteBufferExtendedCell extends EmptyByteBufferExtendedCell {<a name="line.1704"></a>
<span class="sourceLineNo">1705</span>    // @formatter:off<a name="line.1705"></a>
<span class="sourceLineNo">1706</span>    private static final int FIXED_OVERHEAD = ClassSize.OBJECT // object<a name="line.1706"></a>
<span class="sourceLineNo">1707</span>      + ClassSize.REFERENCE // rowBuff<a name="line.1707"></a>
<span class="sourceLineNo">1708</span>      + Bytes.SIZEOF_INT // roffset<a name="line.1708"></a>
<span class="sourceLineNo">1709</span>      + Bytes.SIZEOF_SHORT; // rlength<a name="line.1709"></a>
<span class="sourceLineNo">1710</span>    // @formatter:on<a name="line.1710"></a>
<span class="sourceLineNo">1711</span>    private final ByteBuffer rowBuff;<a name="line.1711"></a>
<span class="sourceLineNo">1712</span>    private final int roffset;<a name="line.1712"></a>
<span class="sourceLineNo">1713</span>    private final short rlength;<a name="line.1713"></a>
<span class="sourceLineNo">1714</span><a name="line.1714"></a>
<span class="sourceLineNo">1715</span>    public LastOnRowByteBufferExtendedCell(final ByteBuffer row, int roffset, short rlength) {<a name="line.1715"></a>
<span class="sourceLineNo">1716</span>      this.rowBuff = row;<a name="line.1716"></a>
<span class="sourceLineNo">1717</span>      this.roffset = roffset;<a name="line.1717"></a>
<span class="sourceLineNo">1718</span>      this.rlength = rlength;<a name="line.1718"></a>
<span class="sourceLineNo">1719</span>    }<a name="line.1719"></a>
<span class="sourceLineNo">1720</span><a name="line.1720"></a>
<span class="sourceLineNo">1721</span>    @Override<a name="line.1721"></a>
<span class="sourceLineNo">1722</span>    public long heapSize() {<a name="line.1722"></a>
<span class="sourceLineNo">1723</span>      if (this.rowBuff.hasArray()) {<a name="line.1723"></a>
<span class="sourceLineNo">1724</span>        return ClassSize.align(FIXED_OVERHEAD + rlength);<a name="line.1724"></a>
<span class="sourceLineNo">1725</span>      }<a name="line.1725"></a>
<span class="sourceLineNo">1726</span>      return ClassSize.align(FIXED_OVERHEAD);<a name="line.1726"></a>
<span class="sourceLineNo">1727</span>    }<a name="line.1727"></a>
<span class="sourceLineNo">1728</span><a name="line.1728"></a>
<span class="sourceLineNo">1729</span>    @Override<a name="line.1729"></a>
<span class="sourceLineNo">1730</span>    public ByteBuffer getRowByteBuffer() {<a name="line.1730"></a>
<span class="sourceLineNo">1731</span>      return this.rowBuff;<a name="line.1731"></a>
<span class="sourceLineNo">1732</span>    }<a name="line.1732"></a>
<span class="sourceLineNo">1733</span><a name="line.1733"></a>
<span class="sourceLineNo">1734</span>    @Override<a name="line.1734"></a>
<span class="sourceLineNo">1735</span>    public int getRowPosition() {<a name="line.1735"></a>
<span class="sourceLineNo">1736</span>      return this.roffset;<a name="line.1736"></a>
<span class="sourceLineNo">1737</span>    }<a name="line.1737"></a>
<span class="sourceLineNo">1738</span><a name="line.1738"></a>
<span class="sourceLineNo">1739</span>    @Override<a name="line.1739"></a>
<span class="sourceLineNo">1740</span>    public short getRowLength() {<a name="line.1740"></a>
<span class="sourceLineNo">1741</span>      return this.rlength;<a name="line.1741"></a>
<span class="sourceLineNo">1742</span>    }<a name="line.1742"></a>
<span class="sourceLineNo">1743</span><a name="line.1743"></a>
<span class="sourceLineNo">1744</span>    @Override<a name="line.1744"></a>
<span class="sourceLineNo">1745</span>    public long getTimestamp() {<a name="line.1745"></a>
<span class="sourceLineNo">1746</span>      return PrivateConstants.OLDEST_TIMESTAMP;<a name="line.1746"></a>
<span class="sourceLineNo">1747</span>    }<a name="line.1747"></a>
<span class="sourceLineNo">1748</span><a name="line.1748"></a>
<span class="sourceLineNo">1749</span>    @Override<a name="line.1749"></a>
<span class="sourceLineNo">1750</span>    public byte getTypeByte() {<a name="line.1750"></a>
<span class="sourceLineNo">1751</span>      return KeyValue.Type.Minimum.getCode();<a name="line.1751"></a>
<span class="sourceLineNo">1752</span>    }<a name="line.1752"></a>
<span class="sourceLineNo">1753</span><a name="line.1753"></a>
<span class="sourceLineNo">1754</span>    @Override<a name="line.1754"></a>
<span class="sourceLineNo">1755</span>    public Type getType() {<a name="line.1755"></a>
<span class="sourceLineNo">1756</span>      throw new UnsupportedOperationException();<a name="line.1756"></a>
<span class="sourceLineNo">1757</span>    }<a name="line.1757"></a>
<span class="sourceLineNo">1758</span>  }<a name="line.1758"></a>
<span class="sourceLineNo">1759</span><a name="line.1759"></a>
<span class="sourceLineNo">1760</span>  private static class FirstOnRowColByteBufferExtendedCell<a name="line.1760"></a>
<span class="sourceLineNo">1761</span>    extends FirstOnRowByteBufferExtendedCell {<a name="line.1761"></a>
<span class="sourceLineNo">1762</span>    // @formatter:off<a name="line.1762"></a>
<span class="sourceLineNo">1763</span>    private static final int FIXED_OVERHEAD = FirstOnRowByteBufferExtendedCell.FIXED_OVERHEAD<a name="line.1763"></a>
<span class="sourceLineNo">1764</span>      + ClassSize.REFERENCE * 2 // family buffer and column buffer<a name="line.1764"></a>
<span class="sourceLineNo">1765</span>      + Bytes.SIZEOF_INT * 3 // famOffset, colOffset, colLength<a name="line.1765"></a>
<span class="sourceLineNo">1766</span>      + Bytes.SIZEOF_BYTE; // famLength<a name="line.1766"></a>
<span class="sourceLineNo">1767</span>    // @formatter:on<a name="line.1767"></a>
<span class="sourceLineNo">1768</span>    private final ByteBuffer famBuff;<a name="line.1768"></a>
<span class="sourceLineNo">1769</span>    private final int famOffset;<a name="line.1769"></a>
<span class="sourceLineNo">1770</span>    private final byte famLength;<a name="line.1770"></a>
<span class="sourceLineNo">1771</span>    private final ByteBuffer colBuff;<a name="line.1771"></a>
<span class="sourceLineNo">1772</span>    private final int colOffset;<a name="line.1772"></a>
<span class="sourceLineNo">1773</span>    private final int colLength;<a name="line.1773"></a>
<span class="sourceLineNo">1774</span><a name="line.1774"></a>
<span class="sourceLineNo">1775</span>    public FirstOnRowColByteBufferExtendedCell(final ByteBuffer row, int roffset, short rlength,<a name="line.1775"></a>
<span class="sourceLineNo">1776</span>      final ByteBuffer famBuff, final int famOffset, final byte famLength, final ByteBuffer col,<a name="line.1776"></a>
<span class="sourceLineNo">1777</span>      final int colOffset, final int colLength) {<a name="line.1777"></a>
<span class="sourceLineNo">1778</span>      super(row, roffset, rlength);<a name="line.1778"></a>
<span class="sourceLineNo">1779</span>      this.famBuff = famBuff;<a name="line.1779"></a>
<span class="sourceLineNo">1780</span>      this.famOffset = famOffset;<a name="line.1780"></a>
<span class="sourceLineNo">1781</span>      this.famLength = famLength;<a name="line.1781"></a>
<span class="sourceLineNo">1782</span>      this.colBuff = col;<a name="line.1782"></a>
<span class="sourceLineNo">1783</span>      this.colOffset = colOffset;<a name="line.1783"></a>
<span class="sourceLineNo">1784</span>      this.colLength = colLength;<a name="line.1784"></a>
<span class="sourceLineNo">1785</span>    }<a name="line.1785"></a>
<span class="sourceLineNo">1786</span><a name="line.1786"></a>
<span class="sourceLineNo">1787</span>    @Override<a name="line.1787"></a>
<span class="sourceLineNo">1788</span>    public long heapSize() {<a name="line.1788"></a>
<span class="sourceLineNo">1789</span>      if (famBuff.hasArray() &amp;&amp; colBuff.hasArray()) {<a name="line.1789"></a>
<span class="sourceLineNo">1790</span>        return ClassSize.align(FIXED_OVERHEAD + famLength + colLength);<a name="line.1790"></a>
<span class="sourceLineNo">1791</span>      } else if (famBuff.hasArray()) {<a name="line.1791"></a>
<span class="sourceLineNo">1792</span>        return ClassSize.align(FIXED_OVERHEAD + famLength);<a name="line.1792"></a>
<span class="sourceLineNo">1793</span>      } else if (colBuff.hasArray()) {<a name="line.1793"></a>
<span class="sourceLineNo">1794</span>        return ClassSize.align(FIXED_OVERHEAD + colLength);<a name="line.1794"></a>
<span class="sourceLineNo">1795</span>      } else {<a name="line.1795"></a>
<span class="sourceLineNo">1796</span>        return ClassSize.align(FIXED_OVERHEAD);<a name="line.1796"></a>
<span class="sourceLineNo">1797</span>      }<a name="line.1797"></a>
<span class="sourceLineNo">1798</span>    }<a name="line.1798"></a>
<span class="sourceLineNo">1799</span><a name="line.1799"></a>
<span class="sourceLineNo">1800</span>    @Override<a name="line.1800"></a>
<span class="sourceLineNo">1801</span>    public ByteBuffer getFamilyByteBuffer() {<a name="line.1801"></a>
<span class="sourceLineNo">1802</span>      return this.famBuff;<a name="line.1802"></a>
<span class="sourceLineNo">1803</span>    }<a name="line.1803"></a>
<span class="sourceLineNo">1804</span><a name="line.1804"></a>
<span class="sourceLineNo">1805</span>    @Override<a name="line.1805"></a>
<span class="sourceLineNo">1806</span>    public int getFamilyPosition() {<a name="line.1806"></a>
<span class="sourceLineNo">1807</span>      return this.famOffset;<a name="line.1807"></a>
<span class="sourceLineNo">1808</span>    }<a name="line.1808"></a>
<span class="sourceLineNo">1809</span><a name="line.1809"></a>
<span class="sourceLineNo">1810</span>    @Override<a name="line.1810"></a>
<span class="sourceLineNo">1811</span>    public byte getFamilyLength() {<a name="line.1811"></a>
<span class="sourceLineNo">1812</span>      return famLength;<a name="line.1812"></a>
<span class="sourceLineNo">1813</span>    }<a name="line.1813"></a>
<span class="sourceLineNo">1814</span><a name="line.1814"></a>
<span class="sourceLineNo">1815</span>    @Override<a name="line.1815"></a>
<span class="sourceLineNo">1816</span>    public ByteBuffer getQualifierByteBuffer() {<a name="line.1816"></a>
<span class="sourceLineNo">1817</span>      return this.colBuff;<a name="line.1817"></a>
<span class="sourceLineNo">1818</span>    }<a name="line.1818"></a>
<span class="sourceLineNo">1819</span><a name="line.1819"></a>
<span class="sourceLineNo">1820</span>    @Override<a name="line.1820"></a>
<span class="sourceLineNo">1821</span>    public int getQualifierPosition() {<a name="line.1821"></a>
<span class="sourceLineNo">1822</span>      return this.colOffset;<a name="line.1822"></a>
<span class="sourceLineNo">1823</span>    }<a name="line.1823"></a>
<span class="sourceLineNo">1824</span><a name="line.1824"></a>
<span class="sourceLineNo">1825</span>    @Override<a name="line.1825"></a>
<span class="sourceLineNo">1826</span>    public int getQualifierLength() {<a name="line.1826"></a>
<span class="sourceLineNo">1827</span>      return this.colLength;<a name="line.1827"></a>
<span class="sourceLineNo">1828</span>    }<a name="line.1828"></a>
<span class="sourceLineNo">1829</span>  }<a name="line.1829"></a>
<span class="sourceLineNo">1830</span><a name="line.1830"></a>
<span class="sourceLineNo">1831</span>  private static class FirstOnRowColCell extends FirstOnRowCell {<a name="line.1831"></a>
<span class="sourceLineNo">1832</span>    // @formatter:off<a name="line.1832"></a>
<span class="sourceLineNo">1833</span>    private static final long FIXED_HEAPSIZE = (long) FirstOnRowCell.FIXED_HEAPSIZE<a name="line.1833"></a>
<span class="sourceLineNo">1834</span>      + Bytes.SIZEOF_BYTE // flength<a name="line.1834"></a>
<span class="sourceLineNo">1835</span>      + Bytes.SIZEOF_INT * 3 // foffset, qoffset, qlength<a name="line.1835"></a>
<span class="sourceLineNo">1836</span>      + ClassSize.REFERENCE * 2; // fArray, qArray<a name="line.1836"></a>
<span class="sourceLineNo">1837</span>    // @formatter:on<a name="line.1837"></a>
<span class="sourceLineNo">1838</span>    private final byte[] fArray;<a name="line.1838"></a>
<span class="sourceLineNo">1839</span>    private final int foffset;<a name="line.1839"></a>
<span class="sourceLineNo">1840</span>    private final byte flength;<a name="line.1840"></a>
<span class="sourceLineNo">1841</span>    private final byte[] qArray;<a name="line.1841"></a>
<span class="sourceLineNo">1842</span>    private final int qoffset;<a name="line.1842"></a>
<span class="sourceLineNo">1843</span>    private final int qlength;<a name="line.1843"></a>
<span class="sourceLineNo">1844</span><a name="line.1844"></a>
<span class="sourceLineNo">1845</span>    public FirstOnRowColCell(byte[] rArray, int roffset, short rlength, byte[] fArray, int foffset,<a name="line.1845"></a>
<span class="sourceLineNo">1846</span>      byte flength, byte[] qArray, int qoffset, int qlength) {<a name="line.1846"></a>
<span class="sourceLineNo">1847</span>      super(rArray, roffset, rlength);<a name="line.1847"></a>
<span class="sourceLineNo">1848</span>      this.fArray = fArray;<a name="line.1848"></a>
<span class="sourceLineNo">1849</span>      this.foffset = foffset;<a name="line.1849"></a>
<span class="sourceLineNo">1850</span>      this.flength = flength;<a name="line.1850"></a>
<span class="sourceLineNo">1851</span>      this.qArray = qArray;<a name="line.1851"></a>
<span class="sourceLineNo">1852</span>      this.qoffset = qoffset;<a name="line.1852"></a>
<span class="sourceLineNo">1853</span>      this.qlength = qlength;<a name="line.1853"></a>
<span class="sourceLineNo">1854</span>    }<a name="line.1854"></a>
<span class="sourceLineNo">1855</span><a name="line.1855"></a>
<span class="sourceLineNo">1856</span>    @Override<a name="line.1856"></a>
<span class="sourceLineNo">1857</span>    public long heapSize() {<a name="line.1857"></a>
<span class="sourceLineNo">1858</span>      return ClassSize.align(FIXED_HEAPSIZE)<a name="line.1858"></a>
<span class="sourceLineNo">1859</span>        // array overhead<a name="line.1859"></a>
<span class="sourceLineNo">1860</span>        + (flength == 0 ? ClassSize.sizeOfByteArray(flength) : flength)<a name="line.1860"></a>
<span class="sourceLineNo">1861</span>        + (qlength == 0 ? ClassSize.sizeOfByteArray(qlength) : qlength);<a name="line.1861"></a>
<span class="sourceLineNo">1862</span>    }<a name="line.1862"></a>
<span class="sourceLineNo">1863</span><a name="line.1863"></a>
<span class="sourceLineNo">1864</span>    @Override<a name="line.1864"></a>
<span class="sourceLineNo">1865</span>    public byte[] getFamilyArray() {<a name="line.1865"></a>
<span class="sourceLineNo">1866</span>      return this.fArray;<a name="line.1866"></a>
<span class="sourceLineNo">1867</span>    }<a name="line.1867"></a>
<span class="sourceLineNo">1868</span><a name="line.1868"></a>
<span class="sourceLineNo">1869</span>    @Override<a name="line.1869"></a>
<span class="sourceLineNo">1870</span>    public int getFamilyOffset() {<a name="line.1870"></a>
<span class="sourceLineNo">1871</span>      return this.foffset;<a name="line.1871"></a>
<span class="sourceLineNo">1872</span>    }<a name="line.1872"></a>
<span class="sourceLineNo">1873</span><a name="line.1873"></a>
<span class="sourceLineNo">1874</span>    @Override<a name="line.1874"></a>
<span class="sourceLineNo">1875</span>    public byte getFamilyLength() {<a name="line.1875"></a>
<span class="sourceLineNo">1876</span>      return this.flength;<a name="line.1876"></a>
<span class="sourceLineNo">1877</span>    }<a name="line.1877"></a>
<span class="sourceLineNo">1878</span><a name="line.1878"></a>
<span class="sourceLineNo">1879</span>    @Override<a name="line.1879"></a>
<span class="sourceLineNo">1880</span>    public byte[] getQualifierArray() {<a name="line.1880"></a>
<span class="sourceLineNo">1881</span>      return this.qArray;<a name="line.1881"></a>
<span class="sourceLineNo">1882</span>    }<a name="line.1882"></a>
<span class="sourceLineNo">1883</span><a name="line.1883"></a>
<span class="sourceLineNo">1884</span>    @Override<a name="line.1884"></a>
<span class="sourceLineNo">1885</span>    public int getQualifierOffset() {<a name="line.1885"></a>
<span class="sourceLineNo">1886</span>      return this.qoffset;<a name="line.1886"></a>
<span class="sourceLineNo">1887</span>    }<a name="line.1887"></a>
<span class="sourceLineNo">1888</span><a name="line.1888"></a>
<span class="sourceLineNo">1889</span>    @Override<a name="line.1889"></a>
<span class="sourceLineNo">1890</span>    public int getQualifierLength() {<a name="line.1890"></a>
<span class="sourceLineNo">1891</span>      return this.qlength;<a name="line.1891"></a>
<span class="sourceLineNo">1892</span>    }<a name="line.1892"></a>
<span class="sourceLineNo">1893</span>  }<a name="line.1893"></a>
<span class="sourceLineNo">1894</span><a name="line.1894"></a>
<span class="sourceLineNo">1895</span>  private static class FirstOnRowColTSCell extends FirstOnRowColCell {<a name="line.1895"></a>
<span class="sourceLineNo">1896</span>    // @formatter:off<a name="line.1896"></a>
<span class="sourceLineNo">1897</span>    private static final long FIXED_HEAPSIZE = FirstOnRowColCell.FIXED_HEAPSIZE<a name="line.1897"></a>
<span class="sourceLineNo">1898</span>      + Bytes.SIZEOF_LONG; // ts<a name="line.1898"></a>
<span class="sourceLineNo">1899</span>    private long ts;<a name="line.1899"></a>
<span class="sourceLineNo">1900</span>    // @formatter:on<a name="line.1900"></a>
<span class="sourceLineNo">1901</span><a name="line.1901"></a>
<span class="sourceLineNo">1902</span>    public FirstOnRowColTSCell(byte[] rArray, int roffset, short rlength, byte[] fArray,<a name="line.1902"></a>
<span class="sourceLineNo">1903</span>      int foffset, byte flength, byte[] qArray, int qoffset, int qlength, long ts) {<a name="line.1903"></a>
<span class="sourceLineNo">1904</span>      super(rArray, roffset, rlength, fArray, foffset, flength, qArray, qoffset, qlength);<a name="line.1904"></a>
<span class="sourceLineNo">1905</span>      this.ts = ts;<a name="line.1905"></a>
<span class="sourceLineNo">1906</span>    }<a name="line.1906"></a>
<span class="sourceLineNo">1907</span><a name="line.1907"></a>
<span class="sourceLineNo">1908</span>    @Override<a name="line.1908"></a>
<span class="sourceLineNo">1909</span>    public long getTimestamp() {<a name="line.1909"></a>
<span class="sourceLineNo">1910</span>      return this.ts;<a name="line.1910"></a>
<span class="sourceLineNo">1911</span>    }<a name="line.1911"></a>
<span class="sourceLineNo">1912</span><a name="line.1912"></a>
<span class="sourceLineNo">1913</span>    @Override<a name="line.1913"></a>
<span class="sourceLineNo">1914</span>    public long heapSize() {<a name="line.1914"></a>
<span class="sourceLineNo">1915</span>      return ClassSize.align(FIXED_HEAPSIZE);<a name="line.1915"></a>
<span class="sourceLineNo">1916</span>    }<a name="line.1916"></a>
<span class="sourceLineNo">1917</span>  }<a name="line.1917"></a>
<span class="sourceLineNo">1918</span><a name="line.1918"></a>
<span class="sourceLineNo">1919</span>  private static class FirstOnRowColTSByteBufferExtendedCell<a name="line.1919"></a>
<span class="sourceLineNo">1920</span>    extends FirstOnRowColByteBufferExtendedCell {<a name="line.1920"></a>
<span class="sourceLineNo">1921</span>    // @formatter:off<a name="line.1921"></a>
<span class="sourceLineNo">1922</span>    private static final int FIXED_OVERHEAD = FirstOnRowColByteBufferExtendedCell.FIXED_OVERHEAD<a name="line.1922"></a>
<span class="sourceLineNo">1923</span>      + Bytes.SIZEOF_LONG; // ts<a name="line.1923"></a>
<span class="sourceLineNo">1924</span>    private long ts;<a name="line.1924"></a>
<span class="sourceLineNo">1925</span>    // @formatter:on<a name="line.1925"></a>
<span class="sourceLineNo">1926</span><a name="line.1926"></a>
<span class="sourceLineNo">1927</span>    public FirstOnRowColTSByteBufferExtendedCell(ByteBuffer rBuffer, int roffset, short rlength,<a name="line.1927"></a>
<span class="sourceLineNo">1928</span>      ByteBuffer fBuffer, int foffset, byte flength, ByteBuffer qBuffer, int qoffset, int qlength,<a name="line.1928"></a>
<span class="sourceLineNo">1929</span>      long ts) {<a name="line.1929"></a>
<span class="sourceLineNo">1930</span>      super(rBuffer, roffset, rlength, fBuffer, foffset, flength, qBuffer, qoffset, qlength);<a name="line.1930"></a>
<span class="sourceLineNo">1931</span>      this.ts = ts;<a name="line.1931"></a>
<span class="sourceLineNo">1932</span>    }<a name="line.1932"></a>
<span class="sourceLineNo">1933</span><a name="line.1933"></a>
<span class="sourceLineNo">1934</span>    @Override<a name="line.1934"></a>
<span class="sourceLineNo">1935</span>    public long getTimestamp() {<a name="line.1935"></a>
<span class="sourceLineNo">1936</span>      return this.ts;<a name="line.1936"></a>
<span class="sourceLineNo">1937</span>    }<a name="line.1937"></a>
<span class="sourceLineNo">1938</span><a name="line.1938"></a>
<span class="sourceLineNo">1939</span>    @Override<a name="line.1939"></a>
<span class="sourceLineNo">1940</span>    public long heapSize() {<a name="line.1940"></a>
<span class="sourceLineNo">1941</span>      return ClassSize.align(FIXED_OVERHEAD + super.heapSize());<a name="line.1941"></a>
<span class="sourceLineNo">1942</span>    }<a name="line.1942"></a>
<span class="sourceLineNo">1943</span>  }<a name="line.1943"></a>
<span class="sourceLineNo">1944</span><a name="line.1944"></a>
<span class="sourceLineNo">1945</span>  private static class LastOnRowCell extends EmptyCell {<a name="line.1945"></a>
<span class="sourceLineNo">1946</span>    // @formatter:off<a name="line.1946"></a>
<span class="sourceLineNo">1947</span>    private static final int FIXED_OVERHEAD = ClassSize.OBJECT // object<a name="line.1947"></a>
<span class="sourceLineNo">1948</span>      + ClassSize.REFERENCE // row array<a name="line.1948"></a>
<span class="sourceLineNo">1949</span>      + Bytes.SIZEOF_INT // row offset<a name="line.1949"></a>
<span class="sourceLineNo">1950</span>      + Bytes.SIZEOF_SHORT; // row length<a name="line.1950"></a>
<span class="sourceLineNo">1951</span>    // @formatter:on<a name="line.1951"></a>
<span class="sourceLineNo">1952</span>    private final byte[] rowArray;<a name="line.1952"></a>
<span class="sourceLineNo">1953</span>    private final int roffset;<a name="line.1953"></a>
<span class="sourceLineNo">1954</span>    private final short rlength;<a name="line.1954"></a>
<span class="sourceLineNo">1955</span><a name="line.1955"></a>
<span class="sourceLineNo">1956</span>    public LastOnRowCell(byte[] row, int roffset, short rlength) {<a name="line.1956"></a>
<span class="sourceLineNo">1957</span>      this.rowArray = row;<a name="line.1957"></a>
<span class="sourceLineNo">1958</span>      this.roffset = roffset;<a name="line.1958"></a>
<span class="sourceLineNo">1959</span>      this.rlength = rlength;<a name="line.1959"></a>
<span class="sourceLineNo">1960</span>    }<a name="line.1960"></a>
<span class="sourceLineNo">1961</span><a name="line.1961"></a>
<span class="sourceLineNo">1962</span>    @Override<a name="line.1962"></a>
<span class="sourceLineNo">1963</span>    public long heapSize() {<a name="line.1963"></a>
<span class="sourceLineNo">1964</span>      return ClassSize.align(FIXED_OVERHEAD)<a name="line.1964"></a>
<span class="sourceLineNo">1965</span>        // array overhead<a name="line.1965"></a>
<span class="sourceLineNo">1966</span>        + (rlength == 0 ? ClassSize.sizeOfByteArray(rlength) : rlength);<a name="line.1966"></a>
<span class="sourceLineNo">1967</span>    }<a name="line.1967"></a>
<span class="sourceLineNo">1968</span><a name="line.1968"></a>
<span class="sourceLineNo">1969</span>    @Override<a name="line.1969"></a>
<span class="sourceLineNo">1970</span>    public byte[] getRowArray() {<a name="line.1970"></a>
<span class="sourceLineNo">1971</span>      return this.rowArray;<a name="line.1971"></a>
<span class="sourceLineNo">1972</span>    }<a name="line.1972"></a>
<span class="sourceLineNo">1973</span><a name="line.1973"></a>
<span class="sourceLineNo">1974</span>    @Override<a name="line.1974"></a>
<span class="sourceLineNo">1975</span>    public int getRowOffset() {<a name="line.1975"></a>
<span class="sourceLineNo">1976</span>      return this.roffset;<a name="line.1976"></a>
<span class="sourceLineNo">1977</span>    }<a name="line.1977"></a>
<span class="sourceLineNo">1978</span><a name="line.1978"></a>
<span class="sourceLineNo">1979</span>    @Override<a name="line.1979"></a>
<span class="sourceLineNo">1980</span>    public short getRowLength() {<a name="line.1980"></a>
<span class="sourceLineNo">1981</span>      return this.rlength;<a name="line.1981"></a>
<span class="sourceLineNo">1982</span>    }<a name="line.1982"></a>
<span class="sourceLineNo">1983</span><a name="line.1983"></a>
<span class="sourceLineNo">1984</span>    @Override<a name="line.1984"></a>
<span class="sourceLineNo">1985</span>    public long getTimestamp() {<a name="line.1985"></a>
<span class="sourceLineNo">1986</span>      return PrivateConstants.OLDEST_TIMESTAMP;<a name="line.1986"></a>
<span class="sourceLineNo">1987</span>    }<a name="line.1987"></a>
<span class="sourceLineNo">1988</span><a name="line.1988"></a>
<span class="sourceLineNo">1989</span>    @Override<a name="line.1989"></a>
<span class="sourceLineNo">1990</span>    public byte getTypeByte() {<a name="line.1990"></a>
<span class="sourceLineNo">1991</span>      return KeyValue.Type.Minimum.getCode();<a name="line.1991"></a>
<span class="sourceLineNo">1992</span>    }<a name="line.1992"></a>
<span class="sourceLineNo">1993</span><a name="line.1993"></a>
<span class="sourceLineNo">1994</span>    @Override<a name="line.1994"></a>
<span class="sourceLineNo">1995</span>    public Type getType() {<a name="line.1995"></a>
<span class="sourceLineNo">1996</span>      throw new UnsupportedOperationException();<a name="line.1996"></a>
<span class="sourceLineNo">1997</span>    }<a name="line.1997"></a>
<span class="sourceLineNo">1998</span>  }<a name="line.1998"></a>
<span class="sourceLineNo">1999</span><a name="line.1999"></a>
<span class="sourceLineNo">2000</span>  private static class LastOnRowColCell extends LastOnRowCell {<a name="line.2000"></a>
<span class="sourceLineNo">2001</span>    // @formatter:off<a name="line.2001"></a>
<span class="sourceLineNo">2002</span>    private static final long FIXED_OVERHEAD = (long) LastOnRowCell.FIXED_OVERHEAD<a name="line.2002"></a>
<span class="sourceLineNo">2003</span>      + ClassSize.REFERENCE * 2 // fArray and qArray<a name="line.2003"></a>
<span class="sourceLineNo">2004</span>      + Bytes.SIZEOF_INT * 3 // foffset, qoffset, qlength<a name="line.2004"></a>
<span class="sourceLineNo">2005</span>      + Bytes.SIZEOF_BYTE; // flength<a name="line.2005"></a>
<span class="sourceLineNo">2006</span>    // @formatter:on<a name="line.2006"></a>
<span class="sourceLineNo">2007</span>    private final byte[] fArray;<a name="line.2007"></a>
<span class="sourceLineNo">2008</span>    private final int foffset;<a name="line.2008"></a>
<span class="sourceLineNo">2009</span>    private final byte flength;<a name="line.2009"></a>
<span class="sourceLineNo">2010</span>    private final byte[] qArray;<a name="line.2010"></a>
<span class="sourceLineNo">2011</span>    private final int qoffset;<a name="line.2011"></a>
<span class="sourceLineNo">2012</span>    private final int qlength;<a name="line.2012"></a>
<span class="sourceLineNo">2013</span><a name="line.2013"></a>
<span class="sourceLineNo">2014</span>    public LastOnRowColCell(byte[] rArray, int roffset, short rlength, byte[] fArray, int foffset,<a name="line.2014"></a>
<span class="sourceLineNo">2015</span>      byte flength, byte[] qArray, int qoffset, int qlength) {<a name="line.2015"></a>
<span class="sourceLineNo">2016</span>      super(rArray, roffset, rlength);<a name="line.2016"></a>
<span class="sourceLineNo">2017</span>      this.fArray = fArray;<a name="line.2017"></a>
<span class="sourceLineNo">2018</span>      this.foffset = foffset;<a name="line.2018"></a>
<span class="sourceLineNo">2019</span>      this.flength = flength;<a name="line.2019"></a>
<span class="sourceLineNo">2020</span>      this.qArray = qArray;<a name="line.2020"></a>
<span class="sourceLineNo">2021</span>      this.qoffset = qoffset;<a name="line.2021"></a>
<span class="sourceLineNo">2022</span>      this.qlength = qlength;<a name="line.2022"></a>
<span class="sourceLineNo">2023</span>    }<a name="line.2023"></a>
<span class="sourceLineNo">2024</span><a name="line.2024"></a>
<span class="sourceLineNo">2025</span>    @Override<a name="line.2025"></a>
<span class="sourceLineNo">2026</span>    public long heapSize() {<a name="line.2026"></a>
<span class="sourceLineNo">2027</span>      return ClassSize.align(FIXED_OVERHEAD)<a name="line.2027"></a>
<span class="sourceLineNo">2028</span>        // array overhead<a name="line.2028"></a>
<span class="sourceLineNo">2029</span>        + (flength == 0 ? ClassSize.sizeOfByteArray(flength) : flength)<a name="line.2029"></a>
<span class="sourceLineNo">2030</span>        + (qlength == 0 ? ClassSize.sizeOfByteArray(qlength) : qlength);<a name="line.2030"></a>
<span class="sourceLineNo">2031</span>    }<a name="line.2031"></a>
<span class="sourceLineNo">2032</span><a name="line.2032"></a>
<span class="sourceLineNo">2033</span>    @Override<a name="line.2033"></a>
<span class="sourceLineNo">2034</span>    public byte[] getFamilyArray() {<a name="line.2034"></a>
<span class="sourceLineNo">2035</span>      return this.fArray;<a name="line.2035"></a>
<span class="sourceLineNo">2036</span>    }<a name="line.2036"></a>
<span class="sourceLineNo">2037</span><a name="line.2037"></a>
<span class="sourceLineNo">2038</span>    @Override<a name="line.2038"></a>
<span class="sourceLineNo">2039</span>    public int getFamilyOffset() {<a name="line.2039"></a>
<span class="sourceLineNo">2040</span>      return this.foffset;<a name="line.2040"></a>
<span class="sourceLineNo">2041</span>    }<a name="line.2041"></a>
<span class="sourceLineNo">2042</span><a name="line.2042"></a>
<span class="sourceLineNo">2043</span>    @Override<a name="line.2043"></a>
<span class="sourceLineNo">2044</span>    public byte getFamilyLength() {<a name="line.2044"></a>
<span class="sourceLineNo">2045</span>      return this.flength;<a name="line.2045"></a>
<span class="sourceLineNo">2046</span>    }<a name="line.2046"></a>
<span class="sourceLineNo">2047</span><a name="line.2047"></a>
<span class="sourceLineNo">2048</span>    @Override<a name="line.2048"></a>
<span class="sourceLineNo">2049</span>    public byte[] getQualifierArray() {<a name="line.2049"></a>
<span class="sourceLineNo">2050</span>      return this.qArray;<a name="line.2050"></a>
<span class="sourceLineNo">2051</span>    }<a name="line.2051"></a>
<span class="sourceLineNo">2052</span><a name="line.2052"></a>
<span class="sourceLineNo">2053</span>    @Override<a name="line.2053"></a>
<span class="sourceLineNo">2054</span>    public int getQualifierOffset() {<a name="line.2054"></a>
<span class="sourceLineNo">2055</span>      return this.qoffset;<a name="line.2055"></a>
<span class="sourceLineNo">2056</span>    }<a name="line.2056"></a>
<span class="sourceLineNo">2057</span><a name="line.2057"></a>
<span class="sourceLineNo">2058</span>    @Override<a name="line.2058"></a>
<span class="sourceLineNo">2059</span>    public int getQualifierLength() {<a name="line.2059"></a>
<span class="sourceLineNo">2060</span>      return this.qlength;<a name="line.2060"></a>
<span class="sourceLineNo">2061</span>    }<a name="line.2061"></a>
<span class="sourceLineNo">2062</span>  }<a name="line.2062"></a>
<span class="sourceLineNo">2063</span><a name="line.2063"></a>
<span class="sourceLineNo">2064</span>  private static class LastOnRowColByteBufferExtendedCell extends LastOnRowByteBufferExtendedCell {<a name="line.2064"></a>
<span class="sourceLineNo">2065</span>    // @formatter:off<a name="line.2065"></a>
<span class="sourceLineNo">2066</span>    private static final int FIXED_OVERHEAD = LastOnRowByteBufferExtendedCell.FIXED_OVERHEAD<a name="line.2066"></a>
<span class="sourceLineNo">2067</span>      + ClassSize.REFERENCE * 2 // fBuffer and qBuffer<a name="line.2067"></a>
<span class="sourceLineNo">2068</span>      + Bytes.SIZEOF_INT * 3 // foffset, qoffset, qlength<a name="line.2068"></a>
<span class="sourceLineNo">2069</span>      + Bytes.SIZEOF_BYTE; // flength<a name="line.2069"></a>
<span class="sourceLineNo">2070</span>    // @formatter:on<a name="line.2070"></a>
<span class="sourceLineNo">2071</span>    private final ByteBuffer fBuffer;<a name="line.2071"></a>
<span class="sourceLineNo">2072</span>    private final int foffset;<a name="line.2072"></a>
<span class="sourceLineNo">2073</span>    private final byte flength;<a name="line.2073"></a>
<span class="sourceLineNo">2074</span>    private final ByteBuffer qBuffer;<a name="line.2074"></a>
<span class="sourceLineNo">2075</span>    private final int qoffset;<a name="line.2075"></a>
<span class="sourceLineNo">2076</span>    private final int qlength;<a name="line.2076"></a>
<span class="sourceLineNo">2077</span><a name="line.2077"></a>
<span class="sourceLineNo">2078</span>    public LastOnRowColByteBufferExtendedCell(ByteBuffer rBuffer, int roffset, short rlength,<a name="line.2078"></a>
<span class="sourceLineNo">2079</span>      ByteBuffer fBuffer, int foffset, byte flength, ByteBuffer qBuffer, int qoffset, int qlength) {<a name="line.2079"></a>
<span class="sourceLineNo">2080</span>      super(rBuffer, roffset, rlength);<a name="line.2080"></a>
<span class="sourceLineNo">2081</span>      this.fBuffer = fBuffer;<a name="line.2081"></a>
<span class="sourceLineNo">2082</span>      this.foffset = foffset;<a name="line.2082"></a>
<span class="sourceLineNo">2083</span>      this.flength = flength;<a name="line.2083"></a>
<span class="sourceLineNo">2084</span>      this.qBuffer = qBuffer;<a name="line.2084"></a>
<span class="sourceLineNo">2085</span>      this.qoffset = qoffset;<a name="line.2085"></a>
<span class="sourceLineNo">2086</span>      this.qlength = qlength;<a name="line.2086"></a>
<span class="sourceLineNo">2087</span>    }<a name="line.2087"></a>
<span class="sourceLineNo">2088</span><a name="line.2088"></a>
<span class="sourceLineNo">2089</span>    @Override<a name="line.2089"></a>
<span class="sourceLineNo">2090</span>    public long heapSize() {<a name="line.2090"></a>
<span class="sourceLineNo">2091</span>      if (fBuffer.hasArray() &amp;&amp; qBuffer.hasArray()) {<a name="line.2091"></a>
<span class="sourceLineNo">2092</span>        return ClassSize.align(FIXED_OVERHEAD + flength + qlength);<a name="line.2092"></a>
<span class="sourceLineNo">2093</span>      } else if (fBuffer.hasArray()) {<a name="line.2093"></a>
<span class="sourceLineNo">2094</span>        return ClassSize.align(FIXED_OVERHEAD + flength);<a name="line.2094"></a>
<span class="sourceLineNo">2095</span>      } else if (qBuffer.hasArray()) {<a name="line.2095"></a>
<span class="sourceLineNo">2096</span>        return ClassSize.align(FIXED_OVERHEAD + qlength);<a name="line.2096"></a>
<span class="sourceLineNo">2097</span>      } else {<a name="line.2097"></a>
<span class="sourceLineNo">2098</span>        return ClassSize.align(FIXED_OVERHEAD);<a name="line.2098"></a>
<span class="sourceLineNo">2099</span>      }<a name="line.2099"></a>
<span class="sourceLineNo">2100</span>    }<a name="line.2100"></a>
<span class="sourceLineNo">2101</span><a name="line.2101"></a>
<span class="sourceLineNo">2102</span>    @Override<a name="line.2102"></a>
<span class="sourceLineNo">2103</span>    public ByteBuffer getFamilyByteBuffer() {<a name="line.2103"></a>
<span class="sourceLineNo">2104</span>      return this.fBuffer;<a name="line.2104"></a>
<span class="sourceLineNo">2105</span>    }<a name="line.2105"></a>
<span class="sourceLineNo">2106</span><a name="line.2106"></a>
<span class="sourceLineNo">2107</span>    @Override<a name="line.2107"></a>
<span class="sourceLineNo">2108</span>    public int getFamilyPosition() {<a name="line.2108"></a>
<span class="sourceLineNo">2109</span>      return this.foffset;<a name="line.2109"></a>
<span class="sourceLineNo">2110</span>    }<a name="line.2110"></a>
<span class="sourceLineNo">2111</span><a name="line.2111"></a>
<span class="sourceLineNo">2112</span>    @Override<a name="line.2112"></a>
<span class="sourceLineNo">2113</span>    public byte getFamilyLength() {<a name="line.2113"></a>
<span class="sourceLineNo">2114</span>      return this.flength;<a name="line.2114"></a>
<span class="sourceLineNo">2115</span>    }<a name="line.2115"></a>
<span class="sourceLineNo">2116</span><a name="line.2116"></a>
<span class="sourceLineNo">2117</span>    @Override<a name="line.2117"></a>
<span class="sourceLineNo">2118</span>    public ByteBuffer getQualifierByteBuffer() {<a name="line.2118"></a>
<span class="sourceLineNo">2119</span>      return this.qBuffer;<a name="line.2119"></a>
<span class="sourceLineNo">2120</span>    }<a name="line.2120"></a>
<span class="sourceLineNo">2121</span><a name="line.2121"></a>
<span class="sourceLineNo">2122</span>    @Override<a name="line.2122"></a>
<span class="sourceLineNo">2123</span>    public int getQualifierPosition() {<a name="line.2123"></a>
<span class="sourceLineNo">2124</span>      return this.qoffset;<a name="line.2124"></a>
<span class="sourceLineNo">2125</span>    }<a name="line.2125"></a>
<span class="sourceLineNo">2126</span><a name="line.2126"></a>
<span class="sourceLineNo">2127</span>    @Override<a name="line.2127"></a>
<span class="sourceLineNo">2128</span>    public int getQualifierLength() {<a name="line.2128"></a>
<span class="sourceLineNo">2129</span>      return this.qlength;<a name="line.2129"></a>
<span class="sourceLineNo">2130</span>    }<a name="line.2130"></a>
<span class="sourceLineNo">2131</span>  }<a name="line.2131"></a>
<span class="sourceLineNo">2132</span><a name="line.2132"></a>
<span class="sourceLineNo">2133</span>  private static class FirstOnRowDeleteFamilyCell extends EmptyCell {<a name="line.2133"></a>
<span class="sourceLineNo">2134</span>    // @formatter:off<a name="line.2134"></a>
<span class="sourceLineNo">2135</span>    private static final int FIXED_OVERHEAD = ClassSize.OBJECT // object<a name="line.2135"></a>
<span class="sourceLineNo">2136</span>      + ClassSize.REFERENCE * 2 // fBuffer and qBuffer<a name="line.2136"></a>
<span class="sourceLineNo">2137</span>      + Bytes.SIZEOF_INT * 3 // foffset, qoffset, qlength<a name="line.2137"></a>
<span class="sourceLineNo">2138</span>      + Bytes.SIZEOF_BYTE; // flength<a name="line.2138"></a>
<span class="sourceLineNo">2139</span>    // @formatter:on<a name="line.2139"></a>
<span class="sourceLineNo">2140</span>    private final byte[] row;<a name="line.2140"></a>
<span class="sourceLineNo">2141</span>    private final byte[] fam;<a name="line.2141"></a>
<span class="sourceLineNo">2142</span><a name="line.2142"></a>
<span class="sourceLineNo">2143</span>    public FirstOnRowDeleteFamilyCell(byte[] row, byte[] fam) {<a name="line.2143"></a>
<span class="sourceLineNo">2144</span>      this.row = row;<a name="line.2144"></a>
<span class="sourceLineNo">2145</span>      this.fam = fam;<a name="line.2145"></a>
<span class="sourceLineNo">2146</span>    }<a name="line.2146"></a>
<span class="sourceLineNo">2147</span><a name="line.2147"></a>
<span class="sourceLineNo">2148</span>    @Override<a name="line.2148"></a>
<span class="sourceLineNo">2149</span>    public long heapSize() {<a name="line.2149"></a>
<span class="sourceLineNo">2150</span>      return ClassSize.align(FIXED_OVERHEAD)<a name="line.2150"></a>
<span class="sourceLineNo">2151</span>        // array overhead<a name="line.2151"></a>
<span class="sourceLineNo">2152</span>        + (getRowLength() == 0 ? ClassSize.sizeOfByteArray(getRowLength()) : getRowLength())<a name="line.2152"></a>
<span class="sourceLineNo">2153</span>        + (getFamilyLength() == 0<a name="line.2153"></a>
<span class="sourceLineNo">2154</span>          ? ClassSize.sizeOfByteArray(getFamilyLength())<a name="line.2154"></a>
<span class="sourceLineNo">2155</span>          : getFamilyLength());<a name="line.2155"></a>
<span class="sourceLineNo">2156</span>    }<a name="line.2156"></a>
<span class="sourceLineNo">2157</span><a name="line.2157"></a>
<span class="sourceLineNo">2158</span>    @Override<a name="line.2158"></a>
<span class="sourceLineNo">2159</span>    public byte[] getRowArray() {<a name="line.2159"></a>
<span class="sourceLineNo">2160</span>      return this.row;<a name="line.2160"></a>
<span class="sourceLineNo">2161</span>    }<a name="line.2161"></a>
<span class="sourceLineNo">2162</span><a name="line.2162"></a>
<span class="sourceLineNo">2163</span>    @Override<a name="line.2163"></a>
<span class="sourceLineNo">2164</span>    public short getRowLength() {<a name="line.2164"></a>
<span class="sourceLineNo">2165</span>      return (short) this.row.length;<a name="line.2165"></a>
<span class="sourceLineNo">2166</span>    }<a name="line.2166"></a>
<span class="sourceLineNo">2167</span><a name="line.2167"></a>
<span class="sourceLineNo">2168</span>    @Override<a name="line.2168"></a>
<span class="sourceLineNo">2169</span>    public byte[] getFamilyArray() {<a name="line.2169"></a>
<span class="sourceLineNo">2170</span>      return this.fam;<a name="line.2170"></a>
<span class="sourceLineNo">2171</span>    }<a name="line.2171"></a>
<span class="sourceLineNo">2172</span><a name="line.2172"></a>
<span class="sourceLineNo">2173</span>    @Override<a name="line.2173"></a>
<span class="sourceLineNo">2174</span>    public byte getFamilyLength() {<a name="line.2174"></a>
<span class="sourceLineNo">2175</span>      return (byte) this.fam.length;<a name="line.2175"></a>
<span class="sourceLineNo">2176</span>    }<a name="line.2176"></a>
<span class="sourceLineNo">2177</span><a name="line.2177"></a>
<span class="sourceLineNo">2178</span>    @Override<a name="line.2178"></a>
<span class="sourceLineNo">2179</span>    public long getTimestamp() {<a name="line.2179"></a>
<span class="sourceLineNo">2180</span>      return HConstants.LATEST_TIMESTAMP;<a name="line.2180"></a>
<span class="sourceLineNo">2181</span>    }<a name="line.2181"></a>
<span class="sourceLineNo">2182</span><a name="line.2182"></a>
<span class="sourceLineNo">2183</span>    @Override<a name="line.2183"></a>
<span class="sourceLineNo">2184</span>    public byte getTypeByte() {<a name="line.2184"></a>
<span class="sourceLineNo">2185</span>      return KeyValue.Type.DeleteFamily.getCode();<a name="line.2185"></a>
<span class="sourceLineNo">2186</span>    }<a name="line.2186"></a>
<span class="sourceLineNo">2187</span><a name="line.2187"></a>
<span class="sourceLineNo">2188</span>    @Override<a name="line.2188"></a>
<span class="sourceLineNo">2189</span>    public Type getType() {<a name="line.2189"></a>
<span class="sourceLineNo">2190</span>      return Type.DeleteFamily;<a name="line.2190"></a>
<span class="sourceLineNo">2191</span>    }<a name="line.2191"></a>
<span class="sourceLineNo">2192</span>  }<a name="line.2192"></a>
<span class="sourceLineNo">2193</span><a name="line.2193"></a>
<span class="sourceLineNo">2194</span>  /**<a name="line.2194"></a>
<span class="sourceLineNo">2195</span>   * Writes the Cell's key part as it would have serialized in a KeyValue. The format is &amp;lt;2 bytes<a name="line.2195"></a>
<span class="sourceLineNo">2196</span>   * rk len&amp;gt;&amp;lt;rk&amp;gt;&amp;lt;1 byte cf len&amp;gt;&amp;lt;cf&amp;gt;&amp;lt;qualifier&amp;gt;&amp;lt;8 bytes<a name="line.2196"></a>
<span class="sourceLineNo">2197</span>   * timestamp&amp;gt;&amp;lt;1 byte type&amp;gt;<a name="line.2197"></a>
<span class="sourceLineNo">2198</span>   */<a name="line.2198"></a>
<span class="sourceLineNo">2199</span>  public static void writeFlatKey(Cell cell, DataOutput out) throws IOException {<a name="line.2199"></a>
<span class="sourceLineNo">2200</span>    short rowLen = cell.getRowLength();<a name="line.2200"></a>
<span class="sourceLineNo">2201</span>    byte fLen = cell.getFamilyLength();<a name="line.2201"></a>
<span class="sourceLineNo">2202</span>    int qLen = cell.getQualifierLength();<a name="line.2202"></a>
<span class="sourceLineNo">2203</span>    // Using just one if/else loop instead of every time checking before writing every<a name="line.2203"></a>
<span class="sourceLineNo">2204</span>    // component of cell<a name="line.2204"></a>
<span class="sourceLineNo">2205</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2205"></a>
<span class="sourceLineNo">2206</span>      out.writeShort(rowLen);<a name="line.2206"></a>
<span class="sourceLineNo">2207</span>      ByteBufferUtils.copyBufferToStream(out, ((ByteBufferExtendedCell) cell).getRowByteBuffer(),<a name="line.2207"></a>
<span class="sourceLineNo">2208</span>        ((ByteBufferExtendedCell) cell).getRowPosition(), rowLen);<a name="line.2208"></a>
<span class="sourceLineNo">2209</span>      out.writeByte(fLen);<a name="line.2209"></a>
<span class="sourceLineNo">2210</span>      ByteBufferUtils.copyBufferToStream(out, ((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),<a name="line.2210"></a>
<span class="sourceLineNo">2211</span>        ((ByteBufferExtendedCell) cell).getFamilyPosition(), fLen);<a name="line.2211"></a>
<span class="sourceLineNo">2212</span>      ByteBufferUtils.copyBufferToStream(out,<a name="line.2212"></a>
<span class="sourceLineNo">2213</span>        ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),<a name="line.2213"></a>
<span class="sourceLineNo">2214</span>        ((ByteBufferExtendedCell) cell).getQualifierPosition(), qLen);<a name="line.2214"></a>
<span class="sourceLineNo">2215</span>    } else {<a name="line.2215"></a>
<span class="sourceLineNo">2216</span>      out.writeShort(rowLen);<a name="line.2216"></a>
<span class="sourceLineNo">2217</span>      out.write(cell.getRowArray(), cell.getRowOffset(), rowLen);<a name="line.2217"></a>
<span class="sourceLineNo">2218</span>      out.writeByte(fLen);<a name="line.2218"></a>
<span class="sourceLineNo">2219</span>      out.write(cell.getFamilyArray(), cell.getFamilyOffset(), fLen);<a name="line.2219"></a>
<span class="sourceLineNo">2220</span>      out.write(cell.getQualifierArray(), cell.getQualifierOffset(), qLen);<a name="line.2220"></a>
<span class="sourceLineNo">2221</span>    }<a name="line.2221"></a>
<span class="sourceLineNo">2222</span>    out.writeLong(cell.getTimestamp());<a name="line.2222"></a>
<span class="sourceLineNo">2223</span>    out.writeByte(cell.getTypeByte());<a name="line.2223"></a>
<span class="sourceLineNo">2224</span>  }<a name="line.2224"></a>
<span class="sourceLineNo">2225</span><a name="line.2225"></a>
<span class="sourceLineNo">2226</span>  /**<a name="line.2226"></a>
<span class="sourceLineNo">2227</span>   * Deep clones the given cell if the cell supports deep cloning<a name="line.2227"></a>
<span class="sourceLineNo">2228</span>   * @param cell the cell to be cloned<a name="line.2228"></a>
<span class="sourceLineNo">2229</span>   * @return the cloned cell<a name="line.2229"></a>
<span class="sourceLineNo">2230</span>   */<a name="line.2230"></a>
<span class="sourceLineNo">2231</span>  public static Cell deepClone(Cell cell) throws CloneNotSupportedException {<a name="line.2231"></a>
<span class="sourceLineNo">2232</span>    if (cell instanceof ExtendedCell) {<a name="line.2232"></a>
<span class="sourceLineNo">2233</span>      return ((ExtendedCell) cell).deepClone();<a name="line.2233"></a>
<span class="sourceLineNo">2234</span>    }<a name="line.2234"></a>
<span class="sourceLineNo">2235</span>    throw new CloneNotSupportedException();<a name="line.2235"></a>
<span class="sourceLineNo">2236</span>  }<a name="line.2236"></a>
<span class="sourceLineNo">2237</span><a name="line.2237"></a>
<span class="sourceLineNo">2238</span>  /**<a name="line.2238"></a>
<span class="sourceLineNo">2239</span>   * Writes the cell to the given OutputStream<a name="line.2239"></a>
<span class="sourceLineNo">2240</span>   * @param cell     the cell to be written<a name="line.2240"></a>
<span class="sourceLineNo">2241</span>   * @param out      the outputstream<a name="line.2241"></a>
<span class="sourceLineNo">2242</span>   * @param withTags if tags are to be written or not<a name="line.2242"></a>
<span class="sourceLineNo">2243</span>   * @return the total bytes written<a name="line.2243"></a>
<span class="sourceLineNo">2244</span>   */<a name="line.2244"></a>
<span class="sourceLineNo">2245</span>  public static int writeCell(Cell cell, OutputStream out, boolean withTags) throws IOException {<a name="line.2245"></a>
<span class="sourceLineNo">2246</span>    if (cell instanceof ExtendedCell) {<a name="line.2246"></a>
<span class="sourceLineNo">2247</span>      return ((ExtendedCell) cell).write(out, withTags);<a name="line.2247"></a>
<span class="sourceLineNo">2248</span>    } else {<a name="line.2248"></a>
<span class="sourceLineNo">2249</span>      ByteBufferUtils.putInt(out, estimatedSerializedSizeOfKey(cell));<a name="line.2249"></a>
<span class="sourceLineNo">2250</span>      ByteBufferUtils.putInt(out, cell.getValueLength());<a name="line.2250"></a>
<span class="sourceLineNo">2251</span>      writeFlatKey(cell, out);<a name="line.2251"></a>
<span class="sourceLineNo">2252</span>      writeValue(out, cell, cell.getValueLength());<a name="line.2252"></a>
<span class="sourceLineNo">2253</span>      int tagsLength = cell.getTagsLength();<a name="line.2253"></a>
<span class="sourceLineNo">2254</span>      if (withTags) {<a name="line.2254"></a>
<span class="sourceLineNo">2255</span>        byte[] len = new byte[Bytes.SIZEOF_SHORT];<a name="line.2255"></a>
<span class="sourceLineNo">2256</span>        Bytes.putAsShort(len, 0, tagsLength);<a name="line.2256"></a>
<span class="sourceLineNo">2257</span>        out.write(len);<a name="line.2257"></a>
<span class="sourceLineNo">2258</span>        if (tagsLength &gt; 0) {<a name="line.2258"></a>
<span class="sourceLineNo">2259</span>          writeTags(out, cell, tagsLength);<a name="line.2259"></a>
<span class="sourceLineNo">2260</span>        }<a name="line.2260"></a>
<span class="sourceLineNo">2261</span>      }<a name="line.2261"></a>
<span class="sourceLineNo">2262</span>      int lenWritten =<a name="line.2262"></a>
<span class="sourceLineNo">2263</span>        (2 * Bytes.SIZEOF_INT) + estimatedSerializedSizeOfKey(cell) + cell.getValueLength();<a name="line.2263"></a>
<span class="sourceLineNo">2264</span>      if (withTags) {<a name="line.2264"></a>
<span class="sourceLineNo">2265</span>        lenWritten += Bytes.SIZEOF_SHORT + tagsLength;<a name="line.2265"></a>
<span class="sourceLineNo">2266</span>      }<a name="line.2266"></a>
<span class="sourceLineNo">2267</span>      return lenWritten;<a name="line.2267"></a>
<span class="sourceLineNo">2268</span>    }<a name="line.2268"></a>
<span class="sourceLineNo">2269</span>  }<a name="line.2269"></a>
<span class="sourceLineNo">2270</span><a name="line.2270"></a>
<span class="sourceLineNo">2271</span>  /**<a name="line.2271"></a>
<span class="sourceLineNo">2272</span>   * Writes a cell to the buffer at the given offset<a name="line.2272"></a>
<span class="sourceLineNo">2273</span>   * @param cell   the cell to be written<a name="line.2273"></a>
<span class="sourceLineNo">2274</span>   * @param buf    the buffer to which the cell has to be wrriten<a name="line.2274"></a>
<span class="sourceLineNo">2275</span>   * @param offset the offset at which the cell should be written<a name="line.2275"></a>
<span class="sourceLineNo">2276</span>   */<a name="line.2276"></a>
<span class="sourceLineNo">2277</span>  public static void writeCellToBuffer(Cell cell, ByteBuffer buf, int offset) {<a name="line.2277"></a>
<span class="sourceLineNo">2278</span>    if (cell instanceof ExtendedCell) {<a name="line.2278"></a>
<span class="sourceLineNo">2279</span>      ((ExtendedCell) cell).write(buf, offset);<a name="line.2279"></a>
<span class="sourceLineNo">2280</span>    } else {<a name="line.2280"></a>
<span class="sourceLineNo">2281</span>      // Using the KVUtil<a name="line.2281"></a>
<span class="sourceLineNo">2282</span>      byte[] bytes = KeyValueUtil.copyToNewByteArray(cell);<a name="line.2282"></a>
<span class="sourceLineNo">2283</span>      ByteBufferUtils.copyFromArrayToBuffer(buf, offset, bytes, 0, bytes.length);<a name="line.2283"></a>
<span class="sourceLineNo">2284</span>    }<a name="line.2284"></a>
<span class="sourceLineNo">2285</span>  }<a name="line.2285"></a>
<span class="sourceLineNo">2286</span><a name="line.2286"></a>
<span class="sourceLineNo">2287</span>  public static int writeFlatKey(Cell cell, OutputStream out) throws IOException {<a name="line.2287"></a>
<span class="sourceLineNo">2288</span>    short rowLen = cell.getRowLength();<a name="line.2288"></a>
<span class="sourceLineNo">2289</span>    byte fLen = cell.getFamilyLength();<a name="line.2289"></a>
<span class="sourceLineNo">2290</span>    int qLen = cell.getQualifierLength();<a name="line.2290"></a>
<span class="sourceLineNo">2291</span>    // Using just one if/else loop instead of every time checking before writing every<a name="line.2291"></a>
<span class="sourceLineNo">2292</span>    // component of cell<a name="line.2292"></a>
<span class="sourceLineNo">2293</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2293"></a>
<span class="sourceLineNo">2294</span>      StreamUtils.writeShort(out, rowLen);<a name="line.2294"></a>
<span class="sourceLineNo">2295</span>      ByteBufferUtils.copyBufferToStream(out, ((ByteBufferExtendedCell) cell).getRowByteBuffer(),<a name="line.2295"></a>
<span class="sourceLineNo">2296</span>        ((ByteBufferExtendedCell) cell).getRowPosition(), rowLen);<a name="line.2296"></a>
<span class="sourceLineNo">2297</span>      out.write(fLen);<a name="line.2297"></a>
<span class="sourceLineNo">2298</span>      ByteBufferUtils.copyBufferToStream(out, ((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),<a name="line.2298"></a>
<span class="sourceLineNo">2299</span>        ((ByteBufferExtendedCell) cell).getFamilyPosition(), fLen);<a name="line.2299"></a>
<span class="sourceLineNo">2300</span>      ByteBufferUtils.copyBufferToStream(out,<a name="line.2300"></a>
<span class="sourceLineNo">2301</span>        ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),<a name="line.2301"></a>
<span class="sourceLineNo">2302</span>        ((ByteBufferExtendedCell) cell).getQualifierPosition(), qLen);<a name="line.2302"></a>
<span class="sourceLineNo">2303</span>    } else {<a name="line.2303"></a>
<span class="sourceLineNo">2304</span>      StreamUtils.writeShort(out, rowLen);<a name="line.2304"></a>
<span class="sourceLineNo">2305</span>      out.write(cell.getRowArray(), cell.getRowOffset(), rowLen);<a name="line.2305"></a>
<span class="sourceLineNo">2306</span>      out.write(fLen);<a name="line.2306"></a>
<span class="sourceLineNo">2307</span>      out.write(cell.getFamilyArray(), cell.getFamilyOffset(), fLen);<a name="line.2307"></a>
<span class="sourceLineNo">2308</span>      out.write(cell.getQualifierArray(), cell.getQualifierOffset(), qLen);<a name="line.2308"></a>
<span class="sourceLineNo">2309</span>    }<a name="line.2309"></a>
<span class="sourceLineNo">2310</span>    StreamUtils.writeLong(out, cell.getTimestamp());<a name="line.2310"></a>
<span class="sourceLineNo">2311</span>    out.write(cell.getTypeByte());<a name="line.2311"></a>
<span class="sourceLineNo">2312</span>    return Bytes.SIZEOF_SHORT + rowLen + Bytes.SIZEOF_BYTE + fLen + qLen + Bytes.SIZEOF_LONG<a name="line.2312"></a>
<span class="sourceLineNo">2313</span>      + Bytes.SIZEOF_BYTE;<a name="line.2313"></a>
<span class="sourceLineNo">2314</span>  }<a name="line.2314"></a>
<span class="sourceLineNo">2315</span><a name="line.2315"></a>
<span class="sourceLineNo">2316</span>  /**<a name="line.2316"></a>
<span class="sourceLineNo">2317</span>   * Sets the given seqId to the cell. Marked as audience Private as of 1.2.0. Setting a Cell<a name="line.2317"></a>
<span class="sourceLineNo">2318</span>   * sequenceid is an internal implementation detail not for general public use.<a name="line.2318"></a>
<span class="sourceLineNo">2319</span>   * @throws IOException when the passed cell is not of type {@link ExtendedCell}<a name="line.2319"></a>
<span class="sourceLineNo">2320</span>   */<a name="line.2320"></a>
<span class="sourceLineNo">2321</span>  public static void setSequenceId(Cell cell, long seqId) throws IOException {<a name="line.2321"></a>
<span class="sourceLineNo">2322</span>    if (cell instanceof ExtendedCell) {<a name="line.2322"></a>
<span class="sourceLineNo">2323</span>      ((ExtendedCell) cell).setSequenceId(seqId);<a name="line.2323"></a>
<span class="sourceLineNo">2324</span>    } else {<a name="line.2324"></a>
<span class="sourceLineNo">2325</span>      throw new IOException(<a name="line.2325"></a>
<span class="sourceLineNo">2326</span>        new UnsupportedOperationException("Cell is not of type " + ExtendedCell.class.getName()));<a name="line.2326"></a>
<span class="sourceLineNo">2327</span>    }<a name="line.2327"></a>
<span class="sourceLineNo">2328</span>  }<a name="line.2328"></a>
<span class="sourceLineNo">2329</span><a name="line.2329"></a>
<span class="sourceLineNo">2330</span>  /**<a name="line.2330"></a>
<span class="sourceLineNo">2331</span>   * Sets the given timestamp to the cell.<a name="line.2331"></a>
<span class="sourceLineNo">2332</span>   * @throws IOException when the passed cell is not of type {@link ExtendedCell}<a name="line.2332"></a>
<span class="sourceLineNo">2333</span>   */<a name="line.2333"></a>
<span class="sourceLineNo">2334</span>  public static void setTimestamp(Cell cell, long ts) throws IOException {<a name="line.2334"></a>
<span class="sourceLineNo">2335</span>    if (cell instanceof ExtendedCell) {<a name="line.2335"></a>
<span class="sourceLineNo">2336</span>      ((ExtendedCell) cell).setTimestamp(ts);<a name="line.2336"></a>
<span class="sourceLineNo">2337</span>    } else {<a name="line.2337"></a>
<span class="sourceLineNo">2338</span>      throw new IOException(<a name="line.2338"></a>
<span class="sourceLineNo">2339</span>        new UnsupportedOperationException("Cell is not of type " + ExtendedCell.class.getName()));<a name="line.2339"></a>
<span class="sourceLineNo">2340</span>    }<a name="line.2340"></a>
<span class="sourceLineNo">2341</span>  }<a name="line.2341"></a>
<span class="sourceLineNo">2342</span><a name="line.2342"></a>
<span class="sourceLineNo">2343</span>  /**<a name="line.2343"></a>
<span class="sourceLineNo">2344</span>   * Sets the given timestamp to the cell.<a name="line.2344"></a>
<span class="sourceLineNo">2345</span>   * @throws IOException when the passed cell is not of type {@link ExtendedCell}<a name="line.2345"></a>
<span class="sourceLineNo">2346</span>   */<a name="line.2346"></a>
<span class="sourceLineNo">2347</span>  public static void setTimestamp(Cell cell, byte[] ts) throws IOException {<a name="line.2347"></a>
<span class="sourceLineNo">2348</span>    if (cell instanceof ExtendedCell) {<a name="line.2348"></a>
<span class="sourceLineNo">2349</span>      ((ExtendedCell) cell).setTimestamp(ts);<a name="line.2349"></a>
<span class="sourceLineNo">2350</span>    } else {<a name="line.2350"></a>
<span class="sourceLineNo">2351</span>      throw new IOException(<a name="line.2351"></a>
<span class="sourceLineNo">2352</span>        new UnsupportedOperationException("Cell is not of type " + ExtendedCell.class.getName()));<a name="line.2352"></a>
<span class="sourceLineNo">2353</span>    }<a name="line.2353"></a>
<span class="sourceLineNo">2354</span>  }<a name="line.2354"></a>
<span class="sourceLineNo">2355</span><a name="line.2355"></a>
<span class="sourceLineNo">2356</span>  /**<a name="line.2356"></a>
<span class="sourceLineNo">2357</span>   * Sets the given timestamp to the cell iff current timestamp is<a name="line.2357"></a>
<span class="sourceLineNo">2358</span>   * {@link HConstants#LATEST_TIMESTAMP}.<a name="line.2358"></a>
<span class="sourceLineNo">2359</span>   * @return True if cell timestamp is modified.<a name="line.2359"></a>
<span class="sourceLineNo">2360</span>   * @throws IOException when the passed cell is not of type {@link ExtendedCell}<a name="line.2360"></a>
<span class="sourceLineNo">2361</span>   */<a name="line.2361"></a>
<span class="sourceLineNo">2362</span>  public static boolean updateLatestStamp(Cell cell, long ts) throws IOException {<a name="line.2362"></a>
<span class="sourceLineNo">2363</span>    if (cell.getTimestamp() == HConstants.LATEST_TIMESTAMP) {<a name="line.2363"></a>
<span class="sourceLineNo">2364</span>      setTimestamp(cell, ts);<a name="line.2364"></a>
<span class="sourceLineNo">2365</span>      return true;<a name="line.2365"></a>
<span class="sourceLineNo">2366</span>    }<a name="line.2366"></a>
<span class="sourceLineNo">2367</span>    return false;<a name="line.2367"></a>
<span class="sourceLineNo">2368</span>  }<a name="line.2368"></a>
<span class="sourceLineNo">2369</span><a name="line.2369"></a>
<span class="sourceLineNo">2370</span>  /**<a name="line.2370"></a>
<span class="sourceLineNo">2371</span>   * Sets the given timestamp to the cell iff current timestamp is<a name="line.2371"></a>
<span class="sourceLineNo">2372</span>   * {@link HConstants#LATEST_TIMESTAMP}.<a name="line.2372"></a>
<span class="sourceLineNo">2373</span>   * @return True if cell timestamp is modified.<a name="line.2373"></a>
<span class="sourceLineNo">2374</span>   * @throws IOException when the passed cell is not of type {@link ExtendedCell}<a name="line.2374"></a>
<span class="sourceLineNo">2375</span>   */<a name="line.2375"></a>
<span class="sourceLineNo">2376</span>  public static boolean updateLatestStamp(Cell cell, byte[] ts) throws IOException {<a name="line.2376"></a>
<span class="sourceLineNo">2377</span>    if (cell.getTimestamp() == HConstants.LATEST_TIMESTAMP) {<a name="line.2377"></a>
<span class="sourceLineNo">2378</span>      setTimestamp(cell, ts);<a name="line.2378"></a>
<span class="sourceLineNo">2379</span>      return true;<a name="line.2379"></a>
<span class="sourceLineNo">2380</span>    }<a name="line.2380"></a>
<span class="sourceLineNo">2381</span>    return false;<a name="line.2381"></a>
<span class="sourceLineNo">2382</span>  }<a name="line.2382"></a>
<span class="sourceLineNo">2383</span><a name="line.2383"></a>
<span class="sourceLineNo">2384</span>  /**<a name="line.2384"></a>
<span class="sourceLineNo">2385</span>   * Writes the row from the given cell to the output stream<a name="line.2385"></a>
<span class="sourceLineNo">2386</span>   * @param out     The outputstream to which the data has to be written<a name="line.2386"></a>
<span class="sourceLineNo">2387</span>   * @param cell    The cell whose contents has to be written<a name="line.2387"></a>
<span class="sourceLineNo">2388</span>   * @param rlength the row length<a name="line.2388"></a>
<span class="sourceLineNo">2389</span>   */<a name="line.2389"></a>
<span class="sourceLineNo">2390</span>  public static void writeRow(OutputStream out, Cell cell, short rlength) throws IOException {<a name="line.2390"></a>
<span class="sourceLineNo">2391</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2391"></a>
<span class="sourceLineNo">2392</span>      ByteBufferUtils.copyBufferToStream(out, ((ByteBufferExtendedCell) cell).getRowByteBuffer(),<a name="line.2392"></a>
<span class="sourceLineNo">2393</span>        ((ByteBufferExtendedCell) cell).getRowPosition(), rlength);<a name="line.2393"></a>
<span class="sourceLineNo">2394</span>    } else {<a name="line.2394"></a>
<span class="sourceLineNo">2395</span>      out.write(cell.getRowArray(), cell.getRowOffset(), rlength);<a name="line.2395"></a>
<span class="sourceLineNo">2396</span>    }<a name="line.2396"></a>
<span class="sourceLineNo">2397</span>  }<a name="line.2397"></a>
<span class="sourceLineNo">2398</span><a name="line.2398"></a>
<span class="sourceLineNo">2399</span>  /**<a name="line.2399"></a>
<span class="sourceLineNo">2400</span>   * Writes the family from the given cell to the output stream<a name="line.2400"></a>
<span class="sourceLineNo">2401</span>   * @param out     The outputstream to which the data has to be written<a name="line.2401"></a>
<span class="sourceLineNo">2402</span>   * @param cell    The cell whose contents has to be written<a name="line.2402"></a>
<span class="sourceLineNo">2403</span>   * @param flength the family length<a name="line.2403"></a>
<span class="sourceLineNo">2404</span>   */<a name="line.2404"></a>
<span class="sourceLineNo">2405</span>  public static void writeFamily(OutputStream out, Cell cell, byte flength) throws IOException {<a name="line.2405"></a>
<span class="sourceLineNo">2406</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2406"></a>
<span class="sourceLineNo">2407</span>      ByteBufferUtils.copyBufferToStream(out, ((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),<a name="line.2407"></a>
<span class="sourceLineNo">2408</span>        ((ByteBufferExtendedCell) cell).getFamilyPosition(), flength);<a name="line.2408"></a>
<span class="sourceLineNo">2409</span>    } else {<a name="line.2409"></a>
<span class="sourceLineNo">2410</span>      out.write(cell.getFamilyArray(), cell.getFamilyOffset(), flength);<a name="line.2410"></a>
<span class="sourceLineNo">2411</span>    }<a name="line.2411"></a>
<span class="sourceLineNo">2412</span>  }<a name="line.2412"></a>
<span class="sourceLineNo">2413</span><a name="line.2413"></a>
<span class="sourceLineNo">2414</span>  /**<a name="line.2414"></a>
<span class="sourceLineNo">2415</span>   * Writes the qualifier from the given cell to the output stream<a name="line.2415"></a>
<span class="sourceLineNo">2416</span>   * @param out     The outputstream to which the data has to be written<a name="line.2416"></a>
<span class="sourceLineNo">2417</span>   * @param cell    The cell whose contents has to be written<a name="line.2417"></a>
<span class="sourceLineNo">2418</span>   * @param qlength the qualifier length<a name="line.2418"></a>
<span class="sourceLineNo">2419</span>   */<a name="line.2419"></a>
<span class="sourceLineNo">2420</span>  public static void writeQualifier(OutputStream out, Cell cell, int qlength) throws IOException {<a name="line.2420"></a>
<span class="sourceLineNo">2421</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2421"></a>
<span class="sourceLineNo">2422</span>      ByteBufferUtils.copyBufferToStream(out,<a name="line.2422"></a>
<span class="sourceLineNo">2423</span>        ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),<a name="line.2423"></a>
<span class="sourceLineNo">2424</span>        ((ByteBufferExtendedCell) cell).getQualifierPosition(), qlength);<a name="line.2424"></a>
<span class="sourceLineNo">2425</span>    } else {<a name="line.2425"></a>
<span class="sourceLineNo">2426</span>      out.write(cell.getQualifierArray(), cell.getQualifierOffset(), qlength);<a name="line.2426"></a>
<span class="sourceLineNo">2427</span>    }<a name="line.2427"></a>
<span class="sourceLineNo">2428</span>  }<a name="line.2428"></a>
<span class="sourceLineNo">2429</span><a name="line.2429"></a>
<span class="sourceLineNo">2430</span>  /**<a name="line.2430"></a>
<span class="sourceLineNo">2431</span>   * Writes the qualifier from the given cell to the output stream excluding the common prefix<a name="line.2431"></a>
<span class="sourceLineNo">2432</span>   * @param out     The dataoutputstream to which the data has to be written<a name="line.2432"></a>
<span class="sourceLineNo">2433</span>   * @param cell    The cell whose contents has to be written<a name="line.2433"></a>
<span class="sourceLineNo">2434</span>   * @param qlength the qualifier length<a name="line.2434"></a>
<span class="sourceLineNo">2435</span>   */<a name="line.2435"></a>
<span class="sourceLineNo">2436</span>  public static void writeQualifierSkippingBytes(DataOutputStream out, Cell cell, int qlength,<a name="line.2436"></a>
<span class="sourceLineNo">2437</span>    int commonPrefix) throws IOException {<a name="line.2437"></a>
<span class="sourceLineNo">2438</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2438"></a>
<span class="sourceLineNo">2439</span>      ByteBufferUtils.copyBufferToStream((DataOutput) out,<a name="line.2439"></a>
<span class="sourceLineNo">2440</span>        ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),<a name="line.2440"></a>
<span class="sourceLineNo">2441</span>        ((ByteBufferExtendedCell) cell).getQualifierPosition() + commonPrefix,<a name="line.2441"></a>
<span class="sourceLineNo">2442</span>        qlength - commonPrefix);<a name="line.2442"></a>
<span class="sourceLineNo">2443</span>    } else {<a name="line.2443"></a>
<span class="sourceLineNo">2444</span>      out.write(cell.getQualifierArray(), cell.getQualifierOffset() + commonPrefix,<a name="line.2444"></a>
<span class="sourceLineNo">2445</span>        qlength - commonPrefix);<a name="line.2445"></a>
<span class="sourceLineNo">2446</span>    }<a name="line.2446"></a>
<span class="sourceLineNo">2447</span>  }<a name="line.2447"></a>
<span class="sourceLineNo">2448</span><a name="line.2448"></a>
<span class="sourceLineNo">2449</span>  /**<a name="line.2449"></a>
<span class="sourceLineNo">2450</span>   * Writes the value from the given cell to the output stream<a name="line.2450"></a>
<span class="sourceLineNo">2451</span>   * @param out     The outputstream to which the data has to be written<a name="line.2451"></a>
<span class="sourceLineNo">2452</span>   * @param cell    The cell whose contents has to be written<a name="line.2452"></a>
<span class="sourceLineNo">2453</span>   * @param vlength the value length<a name="line.2453"></a>
<span class="sourceLineNo">2454</span>   */<a name="line.2454"></a>
<span class="sourceLineNo">2455</span>  public static void writeValue(OutputStream out, Cell cell, int vlength) throws IOException {<a name="line.2455"></a>
<span class="sourceLineNo">2456</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2456"></a>
<span class="sourceLineNo">2457</span>      ByteBufferUtils.copyBufferToStream(out, ((ByteBufferExtendedCell) cell).getValueByteBuffer(),<a name="line.2457"></a>
<span class="sourceLineNo">2458</span>        ((ByteBufferExtendedCell) cell).getValuePosition(), vlength);<a name="line.2458"></a>
<span class="sourceLineNo">2459</span>    } else {<a name="line.2459"></a>
<span class="sourceLineNo">2460</span>      out.write(cell.getValueArray(), cell.getValueOffset(), vlength);<a name="line.2460"></a>
<span class="sourceLineNo">2461</span>    }<a name="line.2461"></a>
<span class="sourceLineNo">2462</span>  }<a name="line.2462"></a>
<span class="sourceLineNo">2463</span><a name="line.2463"></a>
<span class="sourceLineNo">2464</span>  /**<a name="line.2464"></a>
<span class="sourceLineNo">2465</span>   * Writes the tag from the given cell to the output stream<a name="line.2465"></a>
<span class="sourceLineNo">2466</span>   * @param out        The outputstream to which the data has to be written<a name="line.2466"></a>
<span class="sourceLineNo">2467</span>   * @param cell       The cell whose contents has to be written<a name="line.2467"></a>
<span class="sourceLineNo">2468</span>   * @param tagsLength the tag length<a name="line.2468"></a>
<span class="sourceLineNo">2469</span>   */<a name="line.2469"></a>
<span class="sourceLineNo">2470</span>  public static void writeTags(OutputStream out, Cell cell, int tagsLength) throws IOException {<a name="line.2470"></a>
<span class="sourceLineNo">2471</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2471"></a>
<span class="sourceLineNo">2472</span>      ByteBufferUtils.copyBufferToStream(out, ((ByteBufferExtendedCell) cell).getTagsByteBuffer(),<a name="line.2472"></a>
<span class="sourceLineNo">2473</span>        ((ByteBufferExtendedCell) cell).getTagsPosition(), tagsLength);<a name="line.2473"></a>
<span class="sourceLineNo">2474</span>    } else {<a name="line.2474"></a>
<span class="sourceLineNo">2475</span>      out.write(cell.getTagsArray(), cell.getTagsOffset(), tagsLength);<a name="line.2475"></a>
<span class="sourceLineNo">2476</span>    }<a name="line.2476"></a>
<span class="sourceLineNo">2477</span>  }<a name="line.2477"></a>
<span class="sourceLineNo">2478</span><a name="line.2478"></a>
<span class="sourceLineNo">2479</span>  /**<a name="line.2479"></a>
<span class="sourceLineNo">2480</span>   * special case for Cell.equals<a name="line.2480"></a>
<span class="sourceLineNo">2481</span>   */<a name="line.2481"></a>
<span class="sourceLineNo">2482</span>  public static boolean equalsIgnoreMvccVersion(Cell a, Cell b) {<a name="line.2482"></a>
<span class="sourceLineNo">2483</span>    // row<a name="line.2483"></a>
<span class="sourceLineNo">2484</span>    boolean res = CellUtil.matchingRows(a, b);<a name="line.2484"></a>
<span class="sourceLineNo">2485</span>    if (!res) return res;<a name="line.2485"></a>
<span class="sourceLineNo">2486</span><a name="line.2486"></a>
<span class="sourceLineNo">2487</span>    // family<a name="line.2487"></a>
<span class="sourceLineNo">2488</span>    res = CellUtil.matchingColumn(a, b);<a name="line.2488"></a>
<span class="sourceLineNo">2489</span>    if (!res) return res;<a name="line.2489"></a>
<span class="sourceLineNo">2490</span><a name="line.2490"></a>
<span class="sourceLineNo">2491</span>    // timestamp: later sorts first<a name="line.2491"></a>
<span class="sourceLineNo">2492</span>    if (!CellUtil.matchingTimestamp(a, b)) return false;<a name="line.2492"></a>
<span class="sourceLineNo">2493</span><a name="line.2493"></a>
<span class="sourceLineNo">2494</span>    // type<a name="line.2494"></a>
<span class="sourceLineNo">2495</span>    int c = (0xff &amp; b.getTypeByte()) - (0xff &amp; a.getTypeByte());<a name="line.2495"></a>
<span class="sourceLineNo">2496</span>    if (c != 0) return false;<a name="line.2496"></a>
<span class="sourceLineNo">2497</span>    else return true;<a name="line.2497"></a>
<span class="sourceLineNo">2498</span>  }<a name="line.2498"></a>
<span class="sourceLineNo">2499</span><a name="line.2499"></a>
<span class="sourceLineNo">2500</span>  /**<a name="line.2500"></a>
<span class="sourceLineNo">2501</span>   * Converts the rowkey bytes of the given cell into an int value<a name="line.2501"></a>
<span class="sourceLineNo">2502</span>   * @return rowkey as int<a name="line.2502"></a>
<span class="sourceLineNo">2503</span>   */<a name="line.2503"></a>
<span class="sourceLineNo">2504</span>  public static int getRowAsInt(Cell cell) {<a name="line.2504"></a>
<span class="sourceLineNo">2505</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2505"></a>
<span class="sourceLineNo">2506</span>      return ByteBufferUtils.toInt(((ByteBufferExtendedCell) cell).getRowByteBuffer(),<a name="line.2506"></a>
<span class="sourceLineNo">2507</span>        ((ByteBufferExtendedCell) cell).getRowPosition());<a name="line.2507"></a>
<span class="sourceLineNo">2508</span>    }<a name="line.2508"></a>
<span class="sourceLineNo">2509</span>    return Bytes.toInt(cell.getRowArray(), cell.getRowOffset());<a name="line.2509"></a>
<span class="sourceLineNo">2510</span>  }<a name="line.2510"></a>
<span class="sourceLineNo">2511</span><a name="line.2511"></a>
<span class="sourceLineNo">2512</span>  /**<a name="line.2512"></a>
<span class="sourceLineNo">2513</span>   * Converts the value bytes of the given cell into a long value<a name="line.2513"></a>
<span class="sourceLineNo">2514</span>   * @return value as long<a name="line.2514"></a>
<span class="sourceLineNo">2515</span>   */<a name="line.2515"></a>
<span class="sourceLineNo">2516</span>  public static long getValueAsLong(Cell cell) {<a name="line.2516"></a>
<span class="sourceLineNo">2517</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2517"></a>
<span class="sourceLineNo">2518</span>      return ByteBufferUtils.toLong(((ByteBufferExtendedCell) cell).getValueByteBuffer(),<a name="line.2518"></a>
<span class="sourceLineNo">2519</span>        ((ByteBufferExtendedCell) cell).getValuePosition());<a name="line.2519"></a>
<span class="sourceLineNo">2520</span>    }<a name="line.2520"></a>
<span class="sourceLineNo">2521</span>    return Bytes.toLong(cell.getValueArray(), cell.getValueOffset());<a name="line.2521"></a>
<span class="sourceLineNo">2522</span>  }<a name="line.2522"></a>
<span class="sourceLineNo">2523</span><a name="line.2523"></a>
<span class="sourceLineNo">2524</span>  /**<a name="line.2524"></a>
<span class="sourceLineNo">2525</span>   * Converts the value bytes of the given cell into a int value<a name="line.2525"></a>
<span class="sourceLineNo">2526</span>   * @return value as int<a name="line.2526"></a>
<span class="sourceLineNo">2527</span>   */<a name="line.2527"></a>
<span class="sourceLineNo">2528</span>  public static int getValueAsInt(Cell cell) {<a name="line.2528"></a>
<span class="sourceLineNo">2529</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2529"></a>
<span class="sourceLineNo">2530</span>      return ByteBufferUtils.toInt(((ByteBufferExtendedCell) cell).getValueByteBuffer(),<a name="line.2530"></a>
<span class="sourceLineNo">2531</span>        ((ByteBufferExtendedCell) cell).getValuePosition());<a name="line.2531"></a>
<span class="sourceLineNo">2532</span>    }<a name="line.2532"></a>
<span class="sourceLineNo">2533</span>    return Bytes.toInt(cell.getValueArray(), cell.getValueOffset());<a name="line.2533"></a>
<span class="sourceLineNo">2534</span>  }<a name="line.2534"></a>
<span class="sourceLineNo">2535</span><a name="line.2535"></a>
<span class="sourceLineNo">2536</span>  /**<a name="line.2536"></a>
<span class="sourceLineNo">2537</span>   * Converts the value bytes of the given cell into a double value<a name="line.2537"></a>
<span class="sourceLineNo">2538</span>   * @return value as double<a name="line.2538"></a>
<span class="sourceLineNo">2539</span>   */<a name="line.2539"></a>
<span class="sourceLineNo">2540</span>  public static double getValueAsDouble(Cell cell) {<a name="line.2540"></a>
<span class="sourceLineNo">2541</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2541"></a>
<span class="sourceLineNo">2542</span>      return ByteBufferUtils.toDouble(((ByteBufferExtendedCell) cell).getValueByteBuffer(),<a name="line.2542"></a>
<span class="sourceLineNo">2543</span>        ((ByteBufferExtendedCell) cell).getValuePosition());<a name="line.2543"></a>
<span class="sourceLineNo">2544</span>    }<a name="line.2544"></a>
<span class="sourceLineNo">2545</span>    return Bytes.toDouble(cell.getValueArray(), cell.getValueOffset());<a name="line.2545"></a>
<span class="sourceLineNo">2546</span>  }<a name="line.2546"></a>
<span class="sourceLineNo">2547</span><a name="line.2547"></a>
<span class="sourceLineNo">2548</span>  /**<a name="line.2548"></a>
<span class="sourceLineNo">2549</span>   * Converts the value bytes of the given cell into a BigDecimal<a name="line.2549"></a>
<span class="sourceLineNo">2550</span>   * @return value as BigDecimal<a name="line.2550"></a>
<span class="sourceLineNo">2551</span>   */<a name="line.2551"></a>
<span class="sourceLineNo">2552</span>  public static BigDecimal getValueAsBigDecimal(Cell cell) {<a name="line.2552"></a>
<span class="sourceLineNo">2553</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2553"></a>
<span class="sourceLineNo">2554</span>      return ByteBufferUtils.toBigDecimal(((ByteBufferExtendedCell) cell).getValueByteBuffer(),<a name="line.2554"></a>
<span class="sourceLineNo">2555</span>        ((ByteBufferExtendedCell) cell).getValuePosition(), cell.getValueLength());<a name="line.2555"></a>
<span class="sourceLineNo">2556</span>    }<a name="line.2556"></a>
<span class="sourceLineNo">2557</span>    return Bytes.toBigDecimal(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());<a name="line.2557"></a>
<span class="sourceLineNo">2558</span>  }<a name="line.2558"></a>
<span class="sourceLineNo">2559</span><a name="line.2559"></a>
<span class="sourceLineNo">2560</span>  /**<a name="line.2560"></a>
<span class="sourceLineNo">2561</span>   * Compresses the tags to the given outputstream using the TagcompressionContext<a name="line.2561"></a>
<span class="sourceLineNo">2562</span>   * @param out                   the outputstream to which the compression should happen<a name="line.2562"></a>
<span class="sourceLineNo">2563</span>   * @param cell                  the cell which has tags<a name="line.2563"></a>
<span class="sourceLineNo">2564</span>   * @param tagCompressionContext the TagCompressionContext<a name="line.2564"></a>
<span class="sourceLineNo">2565</span>   * @throws IOException can throw IOException if the compression encounters issue<a name="line.2565"></a>
<span class="sourceLineNo">2566</span>   */<a name="line.2566"></a>
<span class="sourceLineNo">2567</span>  public static void compressTags(OutputStream out, Cell cell,<a name="line.2567"></a>
<span class="sourceLineNo">2568</span>    TagCompressionContext tagCompressionContext) throws IOException {<a name="line.2568"></a>
<span class="sourceLineNo">2569</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2569"></a>
<span class="sourceLineNo">2570</span>      tagCompressionContext.compressTags(out, ((ByteBufferExtendedCell) cell).getTagsByteBuffer(),<a name="line.2570"></a>
<span class="sourceLineNo">2571</span>        ((ByteBufferExtendedCell) cell).getTagsPosition(), cell.getTagsLength());<a name="line.2571"></a>
<span class="sourceLineNo">2572</span>    } else {<a name="line.2572"></a>
<span class="sourceLineNo">2573</span>      tagCompressionContext.compressTags(out, cell.getTagsArray(), cell.getTagsOffset(),<a name="line.2573"></a>
<span class="sourceLineNo">2574</span>        cell.getTagsLength());<a name="line.2574"></a>
<span class="sourceLineNo">2575</span>    }<a name="line.2575"></a>
<span class="sourceLineNo">2576</span>  }<a name="line.2576"></a>
<span class="sourceLineNo">2577</span><a name="line.2577"></a>
<span class="sourceLineNo">2578</span>  public static void compressRow(OutputStream out, Cell cell, Dictionary dict) throws IOException {<a name="line.2578"></a>
<span class="sourceLineNo">2579</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2579"></a>
<span class="sourceLineNo">2580</span>      Dictionary.write(out, ((ByteBufferExtendedCell) cell).getRowByteBuffer(),<a name="line.2580"></a>
<span class="sourceLineNo">2581</span>        ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength(), dict);<a name="line.2581"></a>
<span class="sourceLineNo">2582</span>    } else {<a name="line.2582"></a>
<span class="sourceLineNo">2583</span>      Dictionary.write(out, cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(), dict);<a name="line.2583"></a>
<span class="sourceLineNo">2584</span>    }<a name="line.2584"></a>
<span class="sourceLineNo">2585</span>  }<a name="line.2585"></a>
<span class="sourceLineNo">2586</span><a name="line.2586"></a>
<span class="sourceLineNo">2587</span>  public static void compressFamily(OutputStream out, Cell cell, Dictionary dict)<a name="line.2587"></a>
<span class="sourceLineNo">2588</span>    throws IOException {<a name="line.2588"></a>
<span class="sourceLineNo">2589</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2589"></a>
<span class="sourceLineNo">2590</span>      Dictionary.write(out, ((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),<a name="line.2590"></a>
<span class="sourceLineNo">2591</span>        ((ByteBufferExtendedCell) cell).getFamilyPosition(), cell.getFamilyLength(), dict);<a name="line.2591"></a>
<span class="sourceLineNo">2592</span>    } else {<a name="line.2592"></a>
<span class="sourceLineNo">2593</span>      Dictionary.write(out, cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength(),<a name="line.2593"></a>
<span class="sourceLineNo">2594</span>        dict);<a name="line.2594"></a>
<span class="sourceLineNo">2595</span>    }<a name="line.2595"></a>
<span class="sourceLineNo">2596</span>  }<a name="line.2596"></a>
<span class="sourceLineNo">2597</span><a name="line.2597"></a>
<span class="sourceLineNo">2598</span>  public static void compressQualifier(OutputStream out, Cell cell, Dictionary dict)<a name="line.2598"></a>
<span class="sourceLineNo">2599</span>    throws IOException {<a name="line.2599"></a>
<span class="sourceLineNo">2600</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2600"></a>
<span class="sourceLineNo">2601</span>      Dictionary.write(out, ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),<a name="line.2601"></a>
<span class="sourceLineNo">2602</span>        ((ByteBufferExtendedCell) cell).getQualifierPosition(), cell.getQualifierLength(), dict);<a name="line.2602"></a>
<span class="sourceLineNo">2603</span>    } else {<a name="line.2603"></a>
<span class="sourceLineNo">2604</span>      Dictionary.write(out, cell.getQualifierArray(), cell.getQualifierOffset(),<a name="line.2604"></a>
<span class="sourceLineNo">2605</span>        cell.getQualifierLength(), dict);<a name="line.2605"></a>
<span class="sourceLineNo">2606</span>    }<a name="line.2606"></a>
<span class="sourceLineNo">2607</span>  }<a name="line.2607"></a>
<span class="sourceLineNo">2608</span><a name="line.2608"></a>
<span class="sourceLineNo">2609</span>  /**<a name="line.2609"></a>
<span class="sourceLineNo">2610</span>   * Used when a cell needs to be compared with a key byte[] such as cases of finding the index from<a name="line.2610"></a>
<span class="sourceLineNo">2611</span>   * the index block, bloom keys from the bloom blocks This byte[] is expected to be serialized in<a name="line.2611"></a>
<span class="sourceLineNo">2612</span>   * the KeyValue serialization format If the KeyValue (Cell's) serialization format changes this<a name="line.2612"></a>
<span class="sourceLineNo">2613</span>   * method cannot be used.<a name="line.2613"></a>
<span class="sourceLineNo">2614</span>   * @param comparator the {@link CellComparator} to use for comparison<a name="line.2614"></a>
<span class="sourceLineNo">2615</span>   * @param left       the cell to be compared<a name="line.2615"></a>
<span class="sourceLineNo">2616</span>   * @param key        the serialized key part of a KeyValue<a name="line.2616"></a>
<span class="sourceLineNo">2617</span>   * @param offset     the offset in the key byte[]<a name="line.2617"></a>
<span class="sourceLineNo">2618</span>   * @param length     the length of the key byte[]<a name="line.2618"></a>
<span class="sourceLineNo">2619</span>   * @return an int greater than 0 if left is greater than right lesser than 0 if left is lesser<a name="line.2619"></a>
<span class="sourceLineNo">2620</span>   *         than right equal to 0 if left is equal to right<a name="line.2620"></a>
<span class="sourceLineNo">2621</span>   */<a name="line.2621"></a>
<span class="sourceLineNo">2622</span>  public static final int compare(CellComparator comparator, Cell left, byte[] key, int offset,<a name="line.2622"></a>
<span class="sourceLineNo">2623</span>    int length) {<a name="line.2623"></a>
<span class="sourceLineNo">2624</span>    // row<a name="line.2624"></a>
<span class="sourceLineNo">2625</span>    short rrowlength = Bytes.toShort(key, offset);<a name="line.2625"></a>
<span class="sourceLineNo">2626</span>    int c = comparator.compareRows(left, key, offset + Bytes.SIZEOF_SHORT, rrowlength);<a name="line.2626"></a>
<span class="sourceLineNo">2627</span>    if (c != 0) return c;<a name="line.2627"></a>
<span class="sourceLineNo">2628</span><a name="line.2628"></a>
<span class="sourceLineNo">2629</span>    // Compare the rest of the two KVs without making any assumptions about<a name="line.2629"></a>
<span class="sourceLineNo">2630</span>    // the common prefix. This function will not compare rows anyway, so we<a name="line.2630"></a>
<span class="sourceLineNo">2631</span>    // don't need to tell it that the common prefix includes the row.<a name="line.2631"></a>
<span class="sourceLineNo">2632</span>    return compareWithoutRow(comparator, left, key, offset, length, rrowlength);<a name="line.2632"></a>
<span class="sourceLineNo">2633</span>  }<a name="line.2633"></a>
<span class="sourceLineNo">2634</span><a name="line.2634"></a>
<span class="sourceLineNo">2635</span>  /**<a name="line.2635"></a>
<span class="sourceLineNo">2636</span>   * Compare columnFamily, qualifier, timestamp, and key type (everything except the row). This<a name="line.2636"></a>
<span class="sourceLineNo">2637</span>   * method is used both in the normal comparator and the "same-prefix" comparator. Note that we are<a name="line.2637"></a>
<span class="sourceLineNo">2638</span>   * assuming that row portions of both KVs have already been parsed and found identical, and we<a name="line.2638"></a>
<span class="sourceLineNo">2639</span>   * don't validate that assumption here.<a name="line.2639"></a>
<span class="sourceLineNo">2640</span>   * @param comparator the {@link CellComparator} to use for comparison<a name="line.2640"></a>
<span class="sourceLineNo">2641</span>   * @param left       the cell to be compared<a name="line.2641"></a>
<span class="sourceLineNo">2642</span>   * @param right      the serialized key part of a key-value<a name="line.2642"></a>
<span class="sourceLineNo">2643</span>   * @param roffset    the offset in the key byte[]<a name="line.2643"></a>
<span class="sourceLineNo">2644</span>   * @param rlength    the length of the key byte[]<a name="line.2644"></a>
<span class="sourceLineNo">2645</span>   * @param rowlength  the row length<a name="line.2645"></a>
<span class="sourceLineNo">2646</span>   * @return greater than 0 if left cell is bigger, less than 0 if right cell is bigger, 0 if both<a name="line.2646"></a>
<span class="sourceLineNo">2647</span>   *         cells are equal<a name="line.2647"></a>
<span class="sourceLineNo">2648</span>   */<a name="line.2648"></a>
<span class="sourceLineNo">2649</span>  static final int compareWithoutRow(CellComparator comparator, Cell left, byte[] right,<a name="line.2649"></a>
<span class="sourceLineNo">2650</span>    int roffset, int rlength, short rowlength) {<a name="line.2650"></a>
<span class="sourceLineNo">2651</span>    /***<a name="line.2651"></a>
<span class="sourceLineNo">2652</span>     * KeyValue Format and commonLength:<a name="line.2652"></a>
<span class="sourceLineNo">2653</span>     * |_keyLen_|_valLen_|_rowLen_|_rowKey_|_famiLen_|_fami_|_Quali_|....<a name="line.2653"></a>
<span class="sourceLineNo">2654</span>     * ------------------|-------commonLength--------|--------------<a name="line.2654"></a>
<span class="sourceLineNo">2655</span>     */<a name="line.2655"></a>
<span class="sourceLineNo">2656</span>    int commonLength = KeyValue.ROW_LENGTH_SIZE + KeyValue.FAMILY_LENGTH_SIZE + rowlength;<a name="line.2656"></a>
<span class="sourceLineNo">2657</span><a name="line.2657"></a>
<span class="sourceLineNo">2658</span>    // commonLength + TIMESTAMP_TYPE_SIZE<a name="line.2658"></a>
<span class="sourceLineNo">2659</span>    int commonLengthWithTSAndType = KeyValue.TIMESTAMP_TYPE_SIZE + commonLength;<a name="line.2659"></a>
<span class="sourceLineNo">2660</span>    // ColumnFamily + Qualifier length.<a name="line.2660"></a>
<span class="sourceLineNo">2661</span>    int lcolumnlength = left.getFamilyLength() + left.getQualifierLength();<a name="line.2661"></a>
<span class="sourceLineNo">2662</span>    int rcolumnlength = rlength - commonLengthWithTSAndType;<a name="line.2662"></a>
<span class="sourceLineNo">2663</span><a name="line.2663"></a>
<span class="sourceLineNo">2664</span>    byte ltype = left.getTypeByte();<a name="line.2664"></a>
<span class="sourceLineNo">2665</span>    byte rtype = right[roffset + (rlength - 1)];<a name="line.2665"></a>
<span class="sourceLineNo">2666</span><a name="line.2666"></a>
<span class="sourceLineNo">2667</span>    // If the column is not specified, the "minimum" key type appears the<a name="line.2667"></a>
<span class="sourceLineNo">2668</span>    // latest in the sorted order, regardless of the timestamp. This is used<a name="line.2668"></a>
<span class="sourceLineNo">2669</span>    // for specifying the last key/value in a given row, because there is no<a name="line.2669"></a>
<span class="sourceLineNo">2670</span>    // "lexicographically last column" (it would be infinitely long). The<a name="line.2670"></a>
<span class="sourceLineNo">2671</span>    // "maximum" key type does not need this behavior.<a name="line.2671"></a>
<span class="sourceLineNo">2672</span>    if (lcolumnlength == 0 &amp;&amp; ltype == KeyValue.Type.Minimum.getCode()) {<a name="line.2672"></a>
<span class="sourceLineNo">2673</span>      // left is "bigger", i.e. it appears later in the sorted order<a name="line.2673"></a>
<span class="sourceLineNo">2674</span>      return 1;<a name="line.2674"></a>
<span class="sourceLineNo">2675</span>    }<a name="line.2675"></a>
<span class="sourceLineNo">2676</span>    if (rcolumnlength == 0 &amp;&amp; rtype == KeyValue.Type.Minimum.getCode()) {<a name="line.2676"></a>
<span class="sourceLineNo">2677</span>      return -1;<a name="line.2677"></a>
<span class="sourceLineNo">2678</span>    }<a name="line.2678"></a>
<span class="sourceLineNo">2679</span><a name="line.2679"></a>
<span class="sourceLineNo">2680</span>    int rfamilyoffset = commonLength + roffset;<a name="line.2680"></a>
<span class="sourceLineNo">2681</span><a name="line.2681"></a>
<span class="sourceLineNo">2682</span>    // Column family length.<a name="line.2682"></a>
<span class="sourceLineNo">2683</span>    int lfamilylength = left.getFamilyLength();<a name="line.2683"></a>
<span class="sourceLineNo">2684</span>    int rfamilylength = right[rfamilyoffset - 1];<a name="line.2684"></a>
<span class="sourceLineNo">2685</span>    // If left family size is not equal to right family size, we need not<a name="line.2685"></a>
<span class="sourceLineNo">2686</span>    // compare the qualifiers.<a name="line.2686"></a>
<span class="sourceLineNo">2687</span>    boolean sameFamilySize = (lfamilylength == rfamilylength);<a name="line.2687"></a>
<span class="sourceLineNo">2688</span>    if (!sameFamilySize) {<a name="line.2688"></a>
<span class="sourceLineNo">2689</span>      // comparing column family is enough.<a name="line.2689"></a>
<span class="sourceLineNo">2690</span>      return CellUtil.compareFamilies(left, right, rfamilyoffset, rfamilylength);<a name="line.2690"></a>
<span class="sourceLineNo">2691</span>    }<a name="line.2691"></a>
<span class="sourceLineNo">2692</span>    // Compare family &amp; qualifier together.<a name="line.2692"></a>
<span class="sourceLineNo">2693</span>    // Families are same. Compare on qualifiers.<a name="line.2693"></a>
<span class="sourceLineNo">2694</span>    int comparison = CellUtil.compareColumns(left, right, rfamilyoffset, rfamilylength,<a name="line.2694"></a>
<span class="sourceLineNo">2695</span>      rfamilyoffset + rfamilylength, (rcolumnlength - rfamilylength));<a name="line.2695"></a>
<span class="sourceLineNo">2696</span>    if (comparison != 0) {<a name="line.2696"></a>
<span class="sourceLineNo">2697</span>      return comparison;<a name="line.2697"></a>
<span class="sourceLineNo">2698</span>    }<a name="line.2698"></a>
<span class="sourceLineNo">2699</span><a name="line.2699"></a>
<span class="sourceLineNo">2700</span>    // //<a name="line.2700"></a>
<span class="sourceLineNo">2701</span>    // Next compare timestamps.<a name="line.2701"></a>
<span class="sourceLineNo">2702</span>    long rtimestamp = Bytes.toLong(right, roffset + (rlength - KeyValue.TIMESTAMP_TYPE_SIZE));<a name="line.2702"></a>
<span class="sourceLineNo">2703</span>    int compare = comparator.compareTimestamps(left.getTimestamp(), rtimestamp);<a name="line.2703"></a>
<span class="sourceLineNo">2704</span>    if (compare != 0) {<a name="line.2704"></a>
<span class="sourceLineNo">2705</span>      return compare;<a name="line.2705"></a>
<span class="sourceLineNo">2706</span>    }<a name="line.2706"></a>
<span class="sourceLineNo">2707</span><a name="line.2707"></a>
<span class="sourceLineNo">2708</span>    // Compare types. Let the delete types sort ahead of puts; i.e. types<a name="line.2708"></a>
<span class="sourceLineNo">2709</span>    // of higher numbers sort before those of lesser numbers. Maximum (255)<a name="line.2709"></a>
<span class="sourceLineNo">2710</span>    // appears ahead of everything, and minimum (0) appears after<a name="line.2710"></a>
<span class="sourceLineNo">2711</span>    // everything.<a name="line.2711"></a>
<span class="sourceLineNo">2712</span>    return (0xff &amp; rtype) - (0xff &amp; ltype);<a name="line.2712"></a>
<span class="sourceLineNo">2713</span>  }<a name="line.2713"></a>
<span class="sourceLineNo">2714</span><a name="line.2714"></a>
<span class="sourceLineNo">2715</span>  /**<a name="line.2715"></a>
<span class="sourceLineNo">2716</span>   * Return a new cell is located following input cell. If both of type and timestamp are minimum,<a name="line.2716"></a>
<span class="sourceLineNo">2717</span>   * the input cell will be returned directly.<a name="line.2717"></a>
<span class="sourceLineNo">2718</span>   */<a name="line.2718"></a>
<span class="sourceLineNo">2719</span>  public static Cell createNextOnRowCol(Cell cell) {<a name="line.2719"></a>
<span class="sourceLineNo">2720</span>    long ts = cell.getTimestamp();<a name="line.2720"></a>
<span class="sourceLineNo">2721</span>    byte type = cell.getTypeByte();<a name="line.2721"></a>
<span class="sourceLineNo">2722</span>    if (type != KeyValue.Type.Minimum.getCode()) {<a name="line.2722"></a>
<span class="sourceLineNo">2723</span>      type = KeyValue.Type.values()[KeyValue.Type.codeToType(type).ordinal() - 1].getCode();<a name="line.2723"></a>
<span class="sourceLineNo">2724</span>    } else if (ts != PrivateConstants.OLDEST_TIMESTAMP) {<a name="line.2724"></a>
<span class="sourceLineNo">2725</span>      ts = ts - 1;<a name="line.2725"></a>
<span class="sourceLineNo">2726</span>      type = KeyValue.Type.Maximum.getCode();<a name="line.2726"></a>
<span class="sourceLineNo">2727</span>    } else {<a name="line.2727"></a>
<span class="sourceLineNo">2728</span>      return cell;<a name="line.2728"></a>
<span class="sourceLineNo">2729</span>    }<a name="line.2729"></a>
<span class="sourceLineNo">2730</span>    return createNextOnRowCol(cell, ts, type);<a name="line.2730"></a>
<span class="sourceLineNo">2731</span>  }<a name="line.2731"></a>
<span class="sourceLineNo">2732</span><a name="line.2732"></a>
<span class="sourceLineNo">2733</span>  static Cell createNextOnRowCol(Cell cell, long ts, byte type) {<a name="line.2733"></a>
<span class="sourceLineNo">2734</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2734"></a>
<span class="sourceLineNo">2735</span>      return new LastOnRowColByteBufferExtendedCell(<a name="line.2735"></a>
<span class="sourceLineNo">2736</span>        ((ByteBufferExtendedCell) cell).getRowByteBuffer(),<a name="line.2736"></a>
<span class="sourceLineNo">2737</span>        ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength(),<a name="line.2737"></a>
<span class="sourceLineNo">2738</span>        ((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),<a name="line.2738"></a>
<span class="sourceLineNo">2739</span>        ((ByteBufferExtendedCell) cell).getFamilyPosition(), cell.getFamilyLength(),<a name="line.2739"></a>
<span class="sourceLineNo">2740</span>        ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),<a name="line.2740"></a>
<span class="sourceLineNo">2741</span>        ((ByteBufferExtendedCell) cell).getQualifierPosition(), cell.getQualifierLength()) {<a name="line.2741"></a>
<span class="sourceLineNo">2742</span>        @Override<a name="line.2742"></a>
<span class="sourceLineNo">2743</span>        public long getTimestamp() {<a name="line.2743"></a>
<span class="sourceLineNo">2744</span>          return ts;<a name="line.2744"></a>
<span class="sourceLineNo">2745</span>        }<a name="line.2745"></a>
<span class="sourceLineNo">2746</span><a name="line.2746"></a>
<span class="sourceLineNo">2747</span>        @Override<a name="line.2747"></a>
<span class="sourceLineNo">2748</span>        public byte getTypeByte() {<a name="line.2748"></a>
<span class="sourceLineNo">2749</span>          return type;<a name="line.2749"></a>
<span class="sourceLineNo">2750</span>        }<a name="line.2750"></a>
<span class="sourceLineNo">2751</span>      };<a name="line.2751"></a>
<span class="sourceLineNo">2752</span>    }<a name="line.2752"></a>
<span class="sourceLineNo">2753</span>    return new LastOnRowColCell(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(),<a name="line.2753"></a>
<span class="sourceLineNo">2754</span>      cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength(),<a name="line.2754"></a>
<span class="sourceLineNo">2755</span>      cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()) {<a name="line.2755"></a>
<span class="sourceLineNo">2756</span>      @Override<a name="line.2756"></a>
<span class="sourceLineNo">2757</span>      public long getTimestamp() {<a name="line.2757"></a>
<span class="sourceLineNo">2758</span>        return ts;<a name="line.2758"></a>
<span class="sourceLineNo">2759</span>      }<a name="line.2759"></a>
<span class="sourceLineNo">2760</span><a name="line.2760"></a>
<span class="sourceLineNo">2761</span>      @Override<a name="line.2761"></a>
<span class="sourceLineNo">2762</span>      public byte getTypeByte() {<a name="line.2762"></a>
<span class="sourceLineNo">2763</span>        return type;<a name="line.2763"></a>
<span class="sourceLineNo">2764</span>      }<a name="line.2764"></a>
<span class="sourceLineNo">2765</span>    };<a name="line.2765"></a>
<span class="sourceLineNo">2766</span>  }<a name="line.2766"></a>
<span class="sourceLineNo">2767</span><a name="line.2767"></a>
<span class="sourceLineNo">2768</span>  /**<a name="line.2768"></a>
<span class="sourceLineNo">2769</span>   * Estimate based on keyvalue's serialization format in the RPC layer. Note that there is an extra<a name="line.2769"></a>
<span class="sourceLineNo">2770</span>   * SIZEOF_INT added to the size here that indicates the actual length of the cell for cases where<a name="line.2770"></a>
<span class="sourceLineNo">2771</span>   * cell's are serialized in a contiguous format (For eg in RPCs).<a name="line.2771"></a>
<span class="sourceLineNo">2772</span>   * @return Estimate of the &lt;code&gt;cell&lt;/code&gt; size in bytes plus an extra SIZEOF_INT indicating the<a name="line.2772"></a>
<span class="sourceLineNo">2773</span>   *         actual cell length.<a name="line.2773"></a>
<span class="sourceLineNo">2774</span>   */<a name="line.2774"></a>
<span class="sourceLineNo">2775</span>  public static int estimatedSerializedSizeOf(final Cell cell) {<a name="line.2775"></a>
<span class="sourceLineNo">2776</span>    return cell.getSerializedSize() + Bytes.SIZEOF_INT;<a name="line.2776"></a>
<span class="sourceLineNo">2777</span>  }<a name="line.2777"></a>
<span class="sourceLineNo">2778</span><a name="line.2778"></a>
<span class="sourceLineNo">2779</span>  /**<a name="line.2779"></a>
<span class="sourceLineNo">2780</span>   * Calculates the serialized key size. We always serialize in the KeyValue's serialization format.<a name="line.2780"></a>
<span class="sourceLineNo">2781</span>   * @param cell the cell for which the key size has to be calculated.<a name="line.2781"></a>
<span class="sourceLineNo">2782</span>   * @return the key size<a name="line.2782"></a>
<span class="sourceLineNo">2783</span>   */<a name="line.2783"></a>
<span class="sourceLineNo">2784</span>  public static int estimatedSerializedSizeOfKey(final Cell cell) {<a name="line.2784"></a>
<span class="sourceLineNo">2785</span>    if (cell instanceof KeyValue) return ((KeyValue) cell).getKeyLength();<a name="line.2785"></a>
<span class="sourceLineNo">2786</span>    return cell.getRowLength() + cell.getFamilyLength() + cell.getQualifierLength()<a name="line.2786"></a>
<span class="sourceLineNo">2787</span>      + KeyValue.KEY_INFRASTRUCTURE_SIZE;<a name="line.2787"></a>
<span class="sourceLineNo">2788</span>  }<a name="line.2788"></a>
<span class="sourceLineNo">2789</span><a name="line.2789"></a>
<span class="sourceLineNo">2790</span>  /**<a name="line.2790"></a>
<span class="sourceLineNo">2791</span>   * This method exists just to encapsulate how we serialize keys. To be replaced by a factory that<a name="line.2791"></a>
<span class="sourceLineNo">2792</span>   * we query to figure what the Cell implementation is and then, what serialization engine to use<a name="line.2792"></a>
<span class="sourceLineNo">2793</span>   * and further, how to serialize the key for inclusion in hfile index. TODO.<a name="line.2793"></a>
<span class="sourceLineNo">2794</span>   * @return The key portion of the Cell serialized in the old-school KeyValue way or null if passed<a name="line.2794"></a>
<span class="sourceLineNo">2795</span>   *         a null &lt;code&gt;cell&lt;/code&gt;<a name="line.2795"></a>
<span class="sourceLineNo">2796</span>   */<a name="line.2796"></a>
<span class="sourceLineNo">2797</span>  public static byte[] getCellKeySerializedAsKeyValueKey(final Cell cell) {<a name="line.2797"></a>
<span class="sourceLineNo">2798</span>    if (cell == null) return null;<a name="line.2798"></a>
<span class="sourceLineNo">2799</span>    byte[] b = new byte[KeyValueUtil.keyLength(cell)];<a name="line.2799"></a>
<span class="sourceLineNo">2800</span>    KeyValueUtil.appendKeyTo(cell, b, 0);<a name="line.2800"></a>
<span class="sourceLineNo">2801</span>    return b;<a name="line.2801"></a>
<span class="sourceLineNo">2802</span>  }<a name="line.2802"></a>
<span class="sourceLineNo">2803</span><a name="line.2803"></a>
<span class="sourceLineNo">2804</span>  /**<a name="line.2804"></a>
<span class="sourceLineNo">2805</span>   * Create a Cell that is smaller than all other possible Cells for the given Cell's row.<a name="line.2805"></a>
<span class="sourceLineNo">2806</span>   * @return First possible Cell on passed Cell's row.<a name="line.2806"></a>
<span class="sourceLineNo">2807</span>   */<a name="line.2807"></a>
<span class="sourceLineNo">2808</span>  public static Cell createFirstOnRow(final Cell cell) {<a name="line.2808"></a>
<span class="sourceLineNo">2809</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2809"></a>
<span class="sourceLineNo">2810</span>      return new FirstOnRowByteBufferExtendedCell(<a name="line.2810"></a>
<span class="sourceLineNo">2811</span>        ((ByteBufferExtendedCell) cell).getRowByteBuffer(),<a name="line.2811"></a>
<span class="sourceLineNo">2812</span>        ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength());<a name="line.2812"></a>
<span class="sourceLineNo">2813</span>    }<a name="line.2813"></a>
<span class="sourceLineNo">2814</span>    return new FirstOnRowCell(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());<a name="line.2814"></a>
<span class="sourceLineNo">2815</span>  }<a name="line.2815"></a>
<span class="sourceLineNo">2816</span><a name="line.2816"></a>
<span class="sourceLineNo">2817</span>  public static Cell createFirstOnRow(final byte[] row, int roffset, short rlength) {<a name="line.2817"></a>
<span class="sourceLineNo">2818</span>    return new FirstOnRowCell(row, roffset, rlength);<a name="line.2818"></a>
<span class="sourceLineNo">2819</span>  }<a name="line.2819"></a>
<span class="sourceLineNo">2820</span><a name="line.2820"></a>
<span class="sourceLineNo">2821</span>  public static Cell createFirstOnRow(final byte[] row, final byte[] family, final byte[] col) {<a name="line.2821"></a>
<span class="sourceLineNo">2822</span>    return createFirstOnRow(row, 0, (short) row.length, family, 0, (byte) family.length, col, 0,<a name="line.2822"></a>
<span class="sourceLineNo">2823</span>      col.length);<a name="line.2823"></a>
<span class="sourceLineNo">2824</span>  }<a name="line.2824"></a>
<span class="sourceLineNo">2825</span><a name="line.2825"></a>
<span class="sourceLineNo">2826</span>  public static Cell createFirstOnRow(final byte[] row, int roffset, short rlength,<a name="line.2826"></a>
<span class="sourceLineNo">2827</span>    final byte[] family, int foffset, byte flength, final byte[] col, int coffset, int clength) {<a name="line.2827"></a>
<span class="sourceLineNo">2828</span>    return new FirstOnRowColCell(row, roffset, rlength, family, foffset, flength, col, coffset,<a name="line.2828"></a>
<span class="sourceLineNo">2829</span>      clength);<a name="line.2829"></a>
<span class="sourceLineNo">2830</span>  }<a name="line.2830"></a>
<span class="sourceLineNo">2831</span><a name="line.2831"></a>
<span class="sourceLineNo">2832</span>  public static Cell createFirstOnRow(final byte[] row) {<a name="line.2832"></a>
<span class="sourceLineNo">2833</span>    return createFirstOnRow(row, 0, (short) row.length);<a name="line.2833"></a>
<span class="sourceLineNo">2834</span>  }<a name="line.2834"></a>
<span class="sourceLineNo">2835</span><a name="line.2835"></a>
<span class="sourceLineNo">2836</span>  public static Cell createFirstOnRowFamily(Cell cell, byte[] fArray, int foff, int flen) {<a name="line.2836"></a>
<span class="sourceLineNo">2837</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2837"></a>
<span class="sourceLineNo">2838</span>      return new FirstOnRowColByteBufferExtendedCell(<a name="line.2838"></a>
<span class="sourceLineNo">2839</span>        ((ByteBufferExtendedCell) cell).getRowByteBuffer(),<a name="line.2839"></a>
<span class="sourceLineNo">2840</span>        ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength(),<a name="line.2840"></a>
<span class="sourceLineNo">2841</span>        ByteBuffer.wrap(fArray), foff, (byte) flen, HConstants.EMPTY_BYTE_BUFFER, 0, 0);<a name="line.2841"></a>
<span class="sourceLineNo">2842</span>    }<a name="line.2842"></a>
<span class="sourceLineNo">2843</span>    return new FirstOnRowColCell(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(),<a name="line.2843"></a>
<span class="sourceLineNo">2844</span>      fArray, foff, (byte) flen, HConstants.EMPTY_BYTE_ARRAY, 0, 0);<a name="line.2844"></a>
<span class="sourceLineNo">2845</span>  }<a name="line.2845"></a>
<span class="sourceLineNo">2846</span><a name="line.2846"></a>
<span class="sourceLineNo">2847</span>  public static Cell createFirstOnRowCol(final Cell cell) {<a name="line.2847"></a>
<span class="sourceLineNo">2848</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2848"></a>
<span class="sourceLineNo">2849</span>      return new FirstOnRowColByteBufferExtendedCell(<a name="line.2849"></a>
<span class="sourceLineNo">2850</span>        ((ByteBufferExtendedCell) cell).getRowByteBuffer(),<a name="line.2850"></a>
<span class="sourceLineNo">2851</span>        ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength(),<a name="line.2851"></a>
<span class="sourceLineNo">2852</span>        HConstants.EMPTY_BYTE_BUFFER, 0, (byte) 0,<a name="line.2852"></a>
<span class="sourceLineNo">2853</span>        ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),<a name="line.2853"></a>
<span class="sourceLineNo">2854</span>        ((ByteBufferExtendedCell) cell).getQualifierPosition(), cell.getQualifierLength());<a name="line.2854"></a>
<span class="sourceLineNo">2855</span>    }<a name="line.2855"></a>
<span class="sourceLineNo">2856</span>    return new FirstOnRowColCell(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(),<a name="line.2856"></a>
<span class="sourceLineNo">2857</span>      HConstants.EMPTY_BYTE_ARRAY, 0, (byte) 0, cell.getQualifierArray(), cell.getQualifierOffset(),<a name="line.2857"></a>
<span class="sourceLineNo">2858</span>      cell.getQualifierLength());<a name="line.2858"></a>
<span class="sourceLineNo">2859</span>  }<a name="line.2859"></a>
<span class="sourceLineNo">2860</span><a name="line.2860"></a>
<span class="sourceLineNo">2861</span>  public static Cell createFirstOnNextRow(final Cell cell) {<a name="line.2861"></a>
<span class="sourceLineNo">2862</span>    byte[] nextRow = new byte[cell.getRowLength() + 1];<a name="line.2862"></a>
<span class="sourceLineNo">2863</span>    CellUtil.copyRowTo(cell, nextRow, 0);<a name="line.2863"></a>
<span class="sourceLineNo">2864</span>    nextRow[nextRow.length - 1] = 0;// maybe not necessary<a name="line.2864"></a>
<span class="sourceLineNo">2865</span>    return new FirstOnRowCell(nextRow, 0, (short) nextRow.length);<a name="line.2865"></a>
<span class="sourceLineNo">2866</span>  }<a name="line.2866"></a>
<span class="sourceLineNo">2867</span><a name="line.2867"></a>
<span class="sourceLineNo">2868</span>  /**<a name="line.2868"></a>
<span class="sourceLineNo">2869</span>   * Create a Cell that is smaller than all other possible Cells for the given Cell's rk:cf and<a name="line.2869"></a>
<span class="sourceLineNo">2870</span>   * passed qualifier.<a name="line.2870"></a>
<span class="sourceLineNo">2871</span>   * @return Last possible Cell on passed Cell's rk:cf and passed qualifier.<a name="line.2871"></a>
<span class="sourceLineNo">2872</span>   */<a name="line.2872"></a>
<span class="sourceLineNo">2873</span>  public static Cell createFirstOnRowCol(final Cell cell, byte[] qArray, int qoffest, int qlength) {<a name="line.2873"></a>
<span class="sourceLineNo">2874</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2874"></a>
<span class="sourceLineNo">2875</span>      return new FirstOnRowColByteBufferExtendedCell(<a name="line.2875"></a>
<span class="sourceLineNo">2876</span>        ((ByteBufferExtendedCell) cell).getRowByteBuffer(),<a name="line.2876"></a>
<span class="sourceLineNo">2877</span>        ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength(),<a name="line.2877"></a>
<span class="sourceLineNo">2878</span>        ((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),<a name="line.2878"></a>
<span class="sourceLineNo">2879</span>        ((ByteBufferExtendedCell) cell).getFamilyPosition(), cell.getFamilyLength(),<a name="line.2879"></a>
<span class="sourceLineNo">2880</span>        ByteBuffer.wrap(qArray), qoffest, qlength);<a name="line.2880"></a>
<span class="sourceLineNo">2881</span>    }<a name="line.2881"></a>
<span class="sourceLineNo">2882</span>    return new FirstOnRowColCell(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(),<a name="line.2882"></a>
<span class="sourceLineNo">2883</span>      cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength(), qArray, qoffest,<a name="line.2883"></a>
<span class="sourceLineNo">2884</span>      qlength);<a name="line.2884"></a>
<span class="sourceLineNo">2885</span>  }<a name="line.2885"></a>
<span class="sourceLineNo">2886</span><a name="line.2886"></a>
<span class="sourceLineNo">2887</span>  /**<a name="line.2887"></a>
<span class="sourceLineNo">2888</span>   * Creates the first cell with the row/family/qualifier of this cell and the given timestamp. Uses<a name="line.2888"></a>
<span class="sourceLineNo">2889</span>   * the "maximum" type that guarantees that the new cell is the lowest possible for this<a name="line.2889"></a>
<span class="sourceLineNo">2890</span>   * combination of row, family, qualifier, and timestamp. This cell's own timestamp is ignored.<a name="line.2890"></a>
<span class="sourceLineNo">2891</span>   * @param cell - cell<a name="line.2891"></a>
<span class="sourceLineNo">2892</span>   */<a name="line.2892"></a>
<span class="sourceLineNo">2893</span>  public static Cell createFirstOnRowColTS(Cell cell, long ts) {<a name="line.2893"></a>
<span class="sourceLineNo">2894</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2894"></a>
<span class="sourceLineNo">2895</span>      return new FirstOnRowColTSByteBufferExtendedCell(<a name="line.2895"></a>
<span class="sourceLineNo">2896</span>        ((ByteBufferExtendedCell) cell).getRowByteBuffer(),<a name="line.2896"></a>
<span class="sourceLineNo">2897</span>        ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength(),<a name="line.2897"></a>
<span class="sourceLineNo">2898</span>        ((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),<a name="line.2898"></a>
<span class="sourceLineNo">2899</span>        ((ByteBufferExtendedCell) cell).getFamilyPosition(), cell.getFamilyLength(),<a name="line.2899"></a>
<span class="sourceLineNo">2900</span>        ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),<a name="line.2900"></a>
<span class="sourceLineNo">2901</span>        ((ByteBufferExtendedCell) cell).getQualifierPosition(), cell.getQualifierLength(), ts);<a name="line.2901"></a>
<span class="sourceLineNo">2902</span>    }<a name="line.2902"></a>
<span class="sourceLineNo">2903</span>    return new FirstOnRowColTSCell(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(),<a name="line.2903"></a>
<span class="sourceLineNo">2904</span>      cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength(),<a name="line.2904"></a>
<span class="sourceLineNo">2905</span>      cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength(), ts);<a name="line.2905"></a>
<span class="sourceLineNo">2906</span>  }<a name="line.2906"></a>
<span class="sourceLineNo">2907</span><a name="line.2907"></a>
<span class="sourceLineNo">2908</span>  /**<a name="line.2908"></a>
<span class="sourceLineNo">2909</span>   * Create a Cell that is larger than all other possible Cells for the given Cell's row.<a name="line.2909"></a>
<span class="sourceLineNo">2910</span>   * @return Last possible Cell on passed Cell's row.<a name="line.2910"></a>
<span class="sourceLineNo">2911</span>   */<a name="line.2911"></a>
<span class="sourceLineNo">2912</span>  public static Cell createLastOnRow(final Cell cell) {<a name="line.2912"></a>
<span class="sourceLineNo">2913</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2913"></a>
<span class="sourceLineNo">2914</span>      return new LastOnRowByteBufferExtendedCell(((ByteBufferExtendedCell) cell).getRowByteBuffer(),<a name="line.2914"></a>
<span class="sourceLineNo">2915</span>        ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength());<a name="line.2915"></a>
<span class="sourceLineNo">2916</span>    }<a name="line.2916"></a>
<span class="sourceLineNo">2917</span>    return new LastOnRowCell(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());<a name="line.2917"></a>
<span class="sourceLineNo">2918</span>  }<a name="line.2918"></a>
<span class="sourceLineNo">2919</span><a name="line.2919"></a>
<span class="sourceLineNo">2920</span>  public static Cell createLastOnRow(final byte[] row) {<a name="line.2920"></a>
<span class="sourceLineNo">2921</span>    return new LastOnRowCell(row, 0, (short) row.length);<a name="line.2921"></a>
<span class="sourceLineNo">2922</span>  }<a name="line.2922"></a>
<span class="sourceLineNo">2923</span><a name="line.2923"></a>
<span class="sourceLineNo">2924</span>  /**<a name="line.2924"></a>
<span class="sourceLineNo">2925</span>   * Create a Cell that is larger than all other possible Cells for the given Cell's rk:cf:q. Used<a name="line.2925"></a>
<span class="sourceLineNo">2926</span>   * in creating "fake keys" for the multi-column Bloom filter optimization to skip the row/column<a name="line.2926"></a>
<span class="sourceLineNo">2927</span>   * we already know is not in the file.<a name="line.2927"></a>
<span class="sourceLineNo">2928</span>   * @return Last possible Cell on passed Cell's rk:cf:q.<a name="line.2928"></a>
<span class="sourceLineNo">2929</span>   */<a name="line.2929"></a>
<span class="sourceLineNo">2930</span>  public static Cell createLastOnRowCol(final Cell cell) {<a name="line.2930"></a>
<span class="sourceLineNo">2931</span>    if (cell instanceof ByteBufferExtendedCell) {<a name="line.2931"></a>
<span class="sourceLineNo">2932</span>      return new LastOnRowColByteBufferExtendedCell(<a name="line.2932"></a>
<span class="sourceLineNo">2933</span>        ((ByteBufferExtendedCell) cell).getRowByteBuffer(),<a name="line.2933"></a>
<span class="sourceLineNo">2934</span>        ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength(),<a name="line.2934"></a>
<span class="sourceLineNo">2935</span>        ((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),<a name="line.2935"></a>
<span class="sourceLineNo">2936</span>        ((ByteBufferExtendedCell) cell).getFamilyPosition(), cell.getFamilyLength(),<a name="line.2936"></a>
<span class="sourceLineNo">2937</span>        ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),<a name="line.2937"></a>
<span class="sourceLineNo">2938</span>        ((ByteBufferExtendedCell) cell).getQualifierPosition(), cell.getQualifierLength());<a name="line.2938"></a>
<span class="sourceLineNo">2939</span>    }<a name="line.2939"></a>
<span class="sourceLineNo">2940</span>    return new LastOnRowColCell(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(),<a name="line.2940"></a>
<span class="sourceLineNo">2941</span>      cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength(),<a name="line.2941"></a>
<span class="sourceLineNo">2942</span>      cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());<a name="line.2942"></a>
<span class="sourceLineNo">2943</span>  }<a name="line.2943"></a>
<span class="sourceLineNo">2944</span><a name="line.2944"></a>
<span class="sourceLineNo">2945</span>  /**<a name="line.2945"></a>
<span class="sourceLineNo">2946</span>   * Create a Delete Family Cell for the specified row and family that would be smaller than all<a name="line.2946"></a>
<span class="sourceLineNo">2947</span>   * other possible Delete Family KeyValues that have the same row and family. Used for seeking.<a name="line.2947"></a>
<span class="sourceLineNo">2948</span>   * @param row - row key (arbitrary byte array)<a name="line.2948"></a>
<span class="sourceLineNo">2949</span>   * @param fam - family name<a name="line.2949"></a>
<span class="sourceLineNo">2950</span>   * @return First Delete Family possible key on passed &lt;code&gt;row&lt;/code&gt;.<a name="line.2950"></a>
<span class="sourceLineNo">2951</span>   */<a name="line.2951"></a>
<span class="sourceLineNo">2952</span>  public static Cell createFirstDeleteFamilyCellOnRow(final byte[] row, final byte[] fam) {<a name="line.2952"></a>
<span class="sourceLineNo">2953</span>    return new FirstOnRowDeleteFamilyCell(row, fam);<a name="line.2953"></a>
<span class="sourceLineNo">2954</span>  }<a name="line.2954"></a>
<span class="sourceLineNo">2955</span>}<a name="line.2955"></a>




























































</pre>
</div>
</body>
</html>
