| <!DOCTYPE HTML> |
| <html lang="en"> |
| <head> |
| <!-- Generated by javadoc (17) --> |
| <title>Source code</title> |
| <meta name="viewport" content="width=device-width, initial-scale=1"> |
| <meta name="description" content="source: package: org.apache.hadoop.hbase, class: PrivateCellUtil, class: LastOnRowByteBufferExtendedCell"> |
| <meta name="generator" content="javadoc/SourceToHTMLConverter"> |
| <link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style"> |
| </head> |
| <body class="source-page"> |
| <main role="main"> |
| <div class="source-container"> |
| <pre><span class="source-line-no">001</span><span id="line-1">/*</span> |
| <span class="source-line-no">002</span><span id="line-2"> * Licensed to the Apache Software Foundation (ASF) under one</span> |
| <span class="source-line-no">003</span><span id="line-3"> * or more contributor license agreements. See the NOTICE file</span> |
| <span class="source-line-no">004</span><span id="line-4"> * distributed with this work for additional information</span> |
| <span class="source-line-no">005</span><span id="line-5"> * regarding copyright ownership. The ASF licenses this file</span> |
| <span class="source-line-no">006</span><span id="line-6"> * to you under the Apache License, Version 2.0 (the</span> |
| <span class="source-line-no">007</span><span id="line-7"> * "License"); you may not use this file except in compliance</span> |
| <span class="source-line-no">008</span><span id="line-8"> * with the License. You may obtain a copy of the License at</span> |
| <span class="source-line-no">009</span><span id="line-9"> *</span> |
| <span class="source-line-no">010</span><span id="line-10"> * http://www.apache.org/licenses/LICENSE-2.0</span> |
| <span class="source-line-no">011</span><span id="line-11"> *</span> |
| <span class="source-line-no">012</span><span id="line-12"> * Unless required by applicable law or agreed to in writing, software</span> |
| <span class="source-line-no">013</span><span id="line-13"> * distributed under the License is distributed on an "AS IS" BASIS,</span> |
| <span class="source-line-no">014</span><span id="line-14"> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span> |
| <span class="source-line-no">015</span><span id="line-15"> * See the License for the specific language governing permissions and</span> |
| <span class="source-line-no">016</span><span id="line-16"> * limitations under the License.</span> |
| <span class="source-line-no">017</span><span id="line-17"> */</span> |
| <span class="source-line-no">018</span><span id="line-18">package org.apache.hadoop.hbase;</span> |
| <span class="source-line-no">019</span><span id="line-19"></span> |
| <span class="source-line-no">020</span><span id="line-20">import static org.apache.hadoop.hbase.HConstants.EMPTY_BYTE_ARRAY;</span> |
| <span class="source-line-no">021</span><span id="line-21">import static org.apache.hadoop.hbase.Tag.TAG_LENGTH_SIZE;</span> |
| <span class="source-line-no">022</span><span id="line-22"></span> |
| <span class="source-line-no">023</span><span id="line-23">import java.io.DataOutput;</span> |
| <span class="source-line-no">024</span><span id="line-24">import java.io.DataOutputStream;</span> |
| <span class="source-line-no">025</span><span id="line-25">import java.io.IOException;</span> |
| <span class="source-line-no">026</span><span id="line-26">import java.io.OutputStream;</span> |
| <span class="source-line-no">027</span><span id="line-27">import java.math.BigDecimal;</span> |
| <span class="source-line-no">028</span><span id="line-28">import java.nio.ByteBuffer;</span> |
| <span class="source-line-no">029</span><span id="line-29">import java.util.ArrayList;</span> |
| <span class="source-line-no">030</span><span id="line-30">import java.util.Iterator;</span> |
| <span class="source-line-no">031</span><span id="line-31">import java.util.List;</span> |
| <span class="source-line-no">032</span><span id="line-32">import java.util.Optional;</span> |
| <span class="source-line-no">033</span><span id="line-33">import org.apache.hadoop.hbase.filter.ByteArrayComparable;</span> |
| <span class="source-line-no">034</span><span id="line-34">import org.apache.hadoop.hbase.io.TagCompressionContext;</span> |
| <span class="source-line-no">035</span><span id="line-35">import org.apache.hadoop.hbase.io.util.Dictionary;</span> |
| <span class="source-line-no">036</span><span id="line-36">import org.apache.hadoop.hbase.io.util.StreamUtils;</span> |
| <span class="source-line-no">037</span><span id="line-37">import org.apache.hadoop.hbase.util.ByteBufferUtils;</span> |
| <span class="source-line-no">038</span><span id="line-38">import org.apache.hadoop.hbase.util.ByteRange;</span> |
| <span class="source-line-no">039</span><span id="line-39">import org.apache.hadoop.hbase.util.Bytes;</span> |
| <span class="source-line-no">040</span><span id="line-40">import org.apache.hadoop.hbase.util.ClassSize;</span> |
| <span class="source-line-no">041</span><span id="line-41">import org.apache.yetus.audience.InterfaceAudience;</span> |
| <span class="source-line-no">042</span><span id="line-42"></span> |
| <span class="source-line-no">043</span><span id="line-43">/**</span> |
| <span class="source-line-no">044</span><span id="line-44"> * Utility methods helpful slinging {@link Cell} instances. It has more powerful and rich set of</span> |
| <span class="source-line-no">045</span><span id="line-45"> * APIs than those in {@link CellUtil} for internal usage.</span> |
| <span class="source-line-no">046</span><span id="line-46"> */</span> |
| <span class="source-line-no">047</span><span id="line-47">@InterfaceAudience.Private</span> |
| <span class="source-line-no">048</span><span id="line-48">public final class PrivateCellUtil {</span> |
| <span class="source-line-no">049</span><span id="line-49"></span> |
| <span class="source-line-no">050</span><span id="line-50"> /**</span> |
| <span class="source-line-no">051</span><span id="line-51"> * Private constructor to keep this class from being instantiated.</span> |
| <span class="source-line-no">052</span><span id="line-52"> */</span> |
| <span class="source-line-no">053</span><span id="line-53"> private PrivateCellUtil() {</span> |
| <span class="source-line-no">054</span><span id="line-54"> }</span> |
| <span class="source-line-no">055</span><span id="line-55"></span> |
| <span class="source-line-no">056</span><span id="line-56"> /******************* ByteRange *******************************/</span> |
| <span class="source-line-no">057</span><span id="line-57"></span> |
| <span class="source-line-no">058</span><span id="line-58"> public static ByteRange fillRowRange(Cell cell, ByteRange range) {</span> |
| <span class="source-line-no">059</span><span id="line-59"> return range.set(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());</span> |
| <span class="source-line-no">060</span><span id="line-60"> }</span> |
| <span class="source-line-no">061</span><span id="line-61"></span> |
| <span class="source-line-no">062</span><span id="line-62"> public static ByteRange fillFamilyRange(Cell cell, ByteRange range) {</span> |
| <span class="source-line-no">063</span><span id="line-63"> return range.set(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());</span> |
| <span class="source-line-no">064</span><span id="line-64"> }</span> |
| <span class="source-line-no">065</span><span id="line-65"></span> |
| <span class="source-line-no">066</span><span id="line-66"> public static ByteRange fillQualifierRange(Cell cell, ByteRange range) {</span> |
| <span class="source-line-no">067</span><span id="line-67"> return range.set(cell.getQualifierArray(), cell.getQualifierOffset(),</span> |
| <span class="source-line-no">068</span><span id="line-68"> cell.getQualifierLength());</span> |
| <span class="source-line-no">069</span><span id="line-69"> }</span> |
| <span class="source-line-no">070</span><span id="line-70"></span> |
| <span class="source-line-no">071</span><span id="line-71"> public static ByteRange fillValueRange(Cell cell, ByteRange range) {</span> |
| <span class="source-line-no">072</span><span id="line-72"> return range.set(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());</span> |
| <span class="source-line-no">073</span><span id="line-73"> }</span> |
| <span class="source-line-no">074</span><span id="line-74"></span> |
| <span class="source-line-no">075</span><span id="line-75"> public static ByteRange fillTagRange(Cell cell, ByteRange range) {</span> |
| <span class="source-line-no">076</span><span id="line-76"> return range.set(cell.getTagsArray(), cell.getTagsOffset(), cell.getTagsLength());</span> |
| <span class="source-line-no">077</span><span id="line-77"> }</span> |
| <span class="source-line-no">078</span><span id="line-78"></span> |
| <span class="source-line-no">079</span><span id="line-79"> /********************* misc *************************************/</span> |
| <span class="source-line-no">080</span><span id="line-80"></span> |
| <span class="source-line-no">081</span><span id="line-81"> public static byte getRowByte(Cell cell, int index) {</span> |
| <span class="source-line-no">082</span><span id="line-82"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">083</span><span id="line-83"> return ((ByteBufferExtendedCell) cell).getRowByteBuffer()</span> |
| <span class="source-line-no">084</span><span id="line-84"> .get(((ByteBufferExtendedCell) cell).getRowPosition() + index);</span> |
| <span class="source-line-no">085</span><span id="line-85"> }</span> |
| <span class="source-line-no">086</span><span id="line-86"> return cell.getRowArray()[cell.getRowOffset() + index];</span> |
| <span class="source-line-no">087</span><span id="line-87"> }</span> |
| <span class="source-line-no">088</span><span id="line-88"></span> |
| <span class="source-line-no">089</span><span id="line-89"> public static byte getQualifierByte(Cell cell, int index) {</span> |
| <span class="source-line-no">090</span><span id="line-90"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">091</span><span id="line-91"> return ((ByteBufferExtendedCell) cell).getQualifierByteBuffer()</span> |
| <span class="source-line-no">092</span><span id="line-92"> .get(((ByteBufferExtendedCell) cell).getQualifierPosition() + index);</span> |
| <span class="source-line-no">093</span><span id="line-93"> }</span> |
| <span class="source-line-no">094</span><span id="line-94"> return cell.getQualifierArray()[cell.getQualifierOffset() + index];</span> |
| <span class="source-line-no">095</span><span id="line-95"> }</span> |
| <span class="source-line-no">096</span><span id="line-96"></span> |
| <span class="source-line-no">097</span><span id="line-97"> public static ByteBuffer getValueBufferShallowCopy(Cell cell) {</span> |
| <span class="source-line-no">098</span><span id="line-98"> ByteBuffer buffer =</span> |
| <span class="source-line-no">099</span><span id="line-99"> ByteBuffer.wrap(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());</span> |
| <span class="source-line-no">100</span><span id="line-100"> return buffer;</span> |
| <span class="source-line-no">101</span><span id="line-101"> }</span> |
| <span class="source-line-no">102</span><span id="line-102"></span> |
| <span class="source-line-no">103</span><span id="line-103"> /** Returns A new cell which is having the extra tags also added to it. */</span> |
| <span class="source-line-no">104</span><span id="line-104"> public static ExtendedCell createCell(ExtendedCell cell, List<Tag> tags) {</span> |
| <span class="source-line-no">105</span><span id="line-105"> return createCell(cell, TagUtil.fromList(tags));</span> |
| <span class="source-line-no">106</span><span id="line-106"> }</span> |
| <span class="source-line-no">107</span><span id="line-107"></span> |
| <span class="source-line-no">108</span><span id="line-108"> /** Returns A new cell which is having the extra tags also added to it. */</span> |
| <span class="source-line-no">109</span><span id="line-109"> public static ExtendedCell createCell(ExtendedCell cell, byte[] tags) {</span> |
| <span class="source-line-no">110</span><span id="line-110"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">111</span><span id="line-111"> return new TagRewriteByteBufferExtendedCell((ByteBufferExtendedCell) cell, tags);</span> |
| <span class="source-line-no">112</span><span id="line-112"> }</span> |
| <span class="source-line-no">113</span><span id="line-113"> return new TagRewriteCell(cell, tags);</span> |
| <span class="source-line-no">114</span><span id="line-114"> }</span> |
| <span class="source-line-no">115</span><span id="line-115"></span> |
| <span class="source-line-no">116</span><span id="line-116"> public static ExtendedCell createCell(ExtendedCell cell, byte[] value, byte[] tags) {</span> |
| <span class="source-line-no">117</span><span id="line-117"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">118</span><span id="line-118"> return new ValueAndTagRewriteByteBufferExtendedCell((ByteBufferExtendedCell) cell, value,</span> |
| <span class="source-line-no">119</span><span id="line-119"> tags);</span> |
| <span class="source-line-no">120</span><span id="line-120"> }</span> |
| <span class="source-line-no">121</span><span id="line-121"> return new ValueAndTagRewriteCell(cell, value, tags);</span> |
| <span class="source-line-no">122</span><span id="line-122"> }</span> |
| <span class="source-line-no">123</span><span id="line-123"></span> |
| <span class="source-line-no">124</span><span id="line-124"> /**</span> |
| <span class="source-line-no">125</span><span id="line-125"> * This can be used when a Cell has to change with addition/removal of one or more tags. This is</span> |
| <span class="source-line-no">126</span><span id="line-126"> * an efficient way to do so in which only the tags bytes part need to recreated and copied. All</span> |
| <span class="source-line-no">127</span><span id="line-127"> * other parts, refer to the original Cell.</span> |
| <span class="source-line-no">128</span><span id="line-128"> */</span> |
| <span class="source-line-no">129</span><span id="line-129"> static class TagRewriteCell implements ExtendedCell {</span> |
| <span class="source-line-no">130</span><span id="line-130"> protected ExtendedCell cell;</span> |
| <span class="source-line-no">131</span><span id="line-131"> protected byte[] tags;</span> |
| <span class="source-line-no">132</span><span id="line-132"> private static final int HEAP_SIZE_OVERHEAD = ClassSize.OBJECT + 2 * ClassSize.REFERENCE;</span> |
| <span class="source-line-no">133</span><span id="line-133"></span> |
| <span class="source-line-no">134</span><span id="line-134"> /**</span> |
| <span class="source-line-no">135</span><span id="line-135"> * Construct a TagRewriteCell</span> |
| <span class="source-line-no">136</span><span id="line-136"> * @param cell The original Cell which it rewrites</span> |
| <span class="source-line-no">137</span><span id="line-137"> * @param tags the tags bytes. The array suppose to contain the tags bytes alone.</span> |
| <span class="source-line-no">138</span><span id="line-138"> */</span> |
| <span class="source-line-no">139</span><span id="line-139"> public TagRewriteCell(ExtendedCell cell, byte[] tags) {</span> |
| <span class="source-line-no">140</span><span id="line-140"> assert tags != null;</span> |
| <span class="source-line-no">141</span><span id="line-141"> this.cell = cell;</span> |
| <span class="source-line-no">142</span><span id="line-142"> this.tags = tags;</span> |
| <span class="source-line-no">143</span><span id="line-143"> // tag offset will be treated as 0 and length this.tags.length</span> |
| <span class="source-line-no">144</span><span id="line-144"> if (this.cell instanceof TagRewriteCell) {</span> |
| <span class="source-line-no">145</span><span id="line-145"> // Cleaning the ref so that the byte[] can be GCed</span> |
| <span class="source-line-no">146</span><span id="line-146"> ((TagRewriteCell) this.cell).tags = null;</span> |
| <span class="source-line-no">147</span><span id="line-147"> }</span> |
| <span class="source-line-no">148</span><span id="line-148"> }</span> |
| <span class="source-line-no">149</span><span id="line-149"></span> |
| <span class="source-line-no">150</span><span id="line-150"> @Override</span> |
| <span class="source-line-no">151</span><span id="line-151"> public byte[] getRowArray() {</span> |
| <span class="source-line-no">152</span><span id="line-152"> return cell.getRowArray();</span> |
| <span class="source-line-no">153</span><span id="line-153"> }</span> |
| <span class="source-line-no">154</span><span id="line-154"></span> |
| <span class="source-line-no">155</span><span id="line-155"> @Override</span> |
| <span class="source-line-no">156</span><span id="line-156"> public int getRowOffset() {</span> |
| <span class="source-line-no">157</span><span id="line-157"> return cell.getRowOffset();</span> |
| <span class="source-line-no">158</span><span id="line-158"> }</span> |
| <span class="source-line-no">159</span><span id="line-159"></span> |
| <span class="source-line-no">160</span><span id="line-160"> @Override</span> |
| <span class="source-line-no">161</span><span id="line-161"> public short getRowLength() {</span> |
| <span class="source-line-no">162</span><span id="line-162"> return cell.getRowLength();</span> |
| <span class="source-line-no">163</span><span id="line-163"> }</span> |
| <span class="source-line-no">164</span><span id="line-164"></span> |
| <span class="source-line-no">165</span><span id="line-165"> @Override</span> |
| <span class="source-line-no">166</span><span id="line-166"> public byte[] getFamilyArray() {</span> |
| <span class="source-line-no">167</span><span id="line-167"> return cell.getFamilyArray();</span> |
| <span class="source-line-no">168</span><span id="line-168"> }</span> |
| <span class="source-line-no">169</span><span id="line-169"></span> |
| <span class="source-line-no">170</span><span id="line-170"> @Override</span> |
| <span class="source-line-no">171</span><span id="line-171"> public int getFamilyOffset() {</span> |
| <span class="source-line-no">172</span><span id="line-172"> return cell.getFamilyOffset();</span> |
| <span class="source-line-no">173</span><span id="line-173"> }</span> |
| <span class="source-line-no">174</span><span id="line-174"></span> |
| <span class="source-line-no">175</span><span id="line-175"> @Override</span> |
| <span class="source-line-no">176</span><span id="line-176"> public byte getFamilyLength() {</span> |
| <span class="source-line-no">177</span><span id="line-177"> return cell.getFamilyLength();</span> |
| <span class="source-line-no">178</span><span id="line-178"> }</span> |
| <span class="source-line-no">179</span><span id="line-179"></span> |
| <span class="source-line-no">180</span><span id="line-180"> @Override</span> |
| <span class="source-line-no">181</span><span id="line-181"> public byte[] getQualifierArray() {</span> |
| <span class="source-line-no">182</span><span id="line-182"> return cell.getQualifierArray();</span> |
| <span class="source-line-no">183</span><span id="line-183"> }</span> |
| <span class="source-line-no">184</span><span id="line-184"></span> |
| <span class="source-line-no">185</span><span id="line-185"> @Override</span> |
| <span class="source-line-no">186</span><span id="line-186"> public int getQualifierOffset() {</span> |
| <span class="source-line-no">187</span><span id="line-187"> return cell.getQualifierOffset();</span> |
| <span class="source-line-no">188</span><span id="line-188"> }</span> |
| <span class="source-line-no">189</span><span id="line-189"></span> |
| <span class="source-line-no">190</span><span id="line-190"> @Override</span> |
| <span class="source-line-no">191</span><span id="line-191"> public int getQualifierLength() {</span> |
| <span class="source-line-no">192</span><span id="line-192"> return cell.getQualifierLength();</span> |
| <span class="source-line-no">193</span><span id="line-193"> }</span> |
| <span class="source-line-no">194</span><span id="line-194"></span> |
| <span class="source-line-no">195</span><span id="line-195"> @Override</span> |
| <span class="source-line-no">196</span><span id="line-196"> public long getTimestamp() {</span> |
| <span class="source-line-no">197</span><span id="line-197"> return cell.getTimestamp();</span> |
| <span class="source-line-no">198</span><span id="line-198"> }</span> |
| <span class="source-line-no">199</span><span id="line-199"></span> |
| <span class="source-line-no">200</span><span id="line-200"> @Override</span> |
| <span class="source-line-no">201</span><span id="line-201"> public byte getTypeByte() {</span> |
| <span class="source-line-no">202</span><span id="line-202"> return cell.getTypeByte();</span> |
| <span class="source-line-no">203</span><span id="line-203"> }</span> |
| <span class="source-line-no">204</span><span id="line-204"></span> |
| <span class="source-line-no">205</span><span id="line-205"> @Override</span> |
| <span class="source-line-no">206</span><span id="line-206"> public long getSequenceId() {</span> |
| <span class="source-line-no">207</span><span id="line-207"> return cell.getSequenceId();</span> |
| <span class="source-line-no">208</span><span id="line-208"> }</span> |
| <span class="source-line-no">209</span><span id="line-209"></span> |
| <span class="source-line-no">210</span><span id="line-210"> @Override</span> |
| <span class="source-line-no">211</span><span id="line-211"> public byte[] getValueArray() {</span> |
| <span class="source-line-no">212</span><span id="line-212"> return cell.getValueArray();</span> |
| <span class="source-line-no">213</span><span id="line-213"> }</span> |
| <span class="source-line-no">214</span><span id="line-214"></span> |
| <span class="source-line-no">215</span><span id="line-215"> @Override</span> |
| <span class="source-line-no">216</span><span id="line-216"> public int getValueOffset() {</span> |
| <span class="source-line-no">217</span><span id="line-217"> return cell.getValueOffset();</span> |
| <span class="source-line-no">218</span><span id="line-218"> }</span> |
| <span class="source-line-no">219</span><span id="line-219"></span> |
| <span class="source-line-no">220</span><span id="line-220"> @Override</span> |
| <span class="source-line-no">221</span><span id="line-221"> public int getValueLength() {</span> |
| <span class="source-line-no">222</span><span id="line-222"> return cell.getValueLength();</span> |
| <span class="source-line-no">223</span><span id="line-223"> }</span> |
| <span class="source-line-no">224</span><span id="line-224"></span> |
| <span class="source-line-no">225</span><span id="line-225"> @Override</span> |
| <span class="source-line-no">226</span><span id="line-226"> public byte[] getTagsArray() {</span> |
| <span class="source-line-no">227</span><span id="line-227"> return this.tags;</span> |
| <span class="source-line-no">228</span><span id="line-228"> }</span> |
| <span class="source-line-no">229</span><span id="line-229"></span> |
| <span class="source-line-no">230</span><span id="line-230"> @Override</span> |
| <span class="source-line-no">231</span><span id="line-231"> public int getTagsOffset() {</span> |
| <span class="source-line-no">232</span><span id="line-232"> return 0;</span> |
| <span class="source-line-no">233</span><span id="line-233"> }</span> |
| <span class="source-line-no">234</span><span id="line-234"></span> |
| <span class="source-line-no">235</span><span id="line-235"> @Override</span> |
| <span class="source-line-no">236</span><span id="line-236"> public int getTagsLength() {</span> |
| <span class="source-line-no">237</span><span id="line-237"> if (null == this.tags) {</span> |
| <span class="source-line-no">238</span><span id="line-238"> // Nulled out tags array optimization in constructor</span> |
| <span class="source-line-no">239</span><span id="line-239"> return 0;</span> |
| <span class="source-line-no">240</span><span id="line-240"> }</span> |
| <span class="source-line-no">241</span><span id="line-241"> return this.tags.length;</span> |
| <span class="source-line-no">242</span><span id="line-242"> }</span> |
| <span class="source-line-no">243</span><span id="line-243"></span> |
| <span class="source-line-no">244</span><span id="line-244"> @Override</span> |
| <span class="source-line-no">245</span><span id="line-245"> public long heapSize() {</span> |
| <span class="source-line-no">246</span><span id="line-246"> long sum = HEAP_SIZE_OVERHEAD + cell.heapSize();</span> |
| <span class="source-line-no">247</span><span id="line-247"> if (this.tags != null) {</span> |
| <span class="source-line-no">248</span><span id="line-248"> sum += ClassSize.sizeOf(this.tags);</span> |
| <span class="source-line-no">249</span><span id="line-249"> }</span> |
| <span class="source-line-no">250</span><span id="line-250"> return sum;</span> |
| <span class="source-line-no">251</span><span id="line-251"> }</span> |
| <span class="source-line-no">252</span><span id="line-252"></span> |
| <span class="source-line-no">253</span><span id="line-253"> @Override</span> |
| <span class="source-line-no">254</span><span id="line-254"> public void setTimestamp(long ts) throws IOException {</span> |
| <span class="source-line-no">255</span><span id="line-255"> // The incoming cell is supposed to be ExtendedCell type.</span> |
| <span class="source-line-no">256</span><span id="line-256"> PrivateCellUtil.setTimestamp(cell, ts);</span> |
| <span class="source-line-no">257</span><span id="line-257"> }</span> |
| <span class="source-line-no">258</span><span id="line-258"></span> |
| <span class="source-line-no">259</span><span id="line-259"> @Override</span> |
| <span class="source-line-no">260</span><span id="line-260"> public void setTimestamp(byte[] ts) throws IOException {</span> |
| <span class="source-line-no">261</span><span id="line-261"> // The incoming cell is supposed to be ExtendedCell type.</span> |
| <span class="source-line-no">262</span><span id="line-262"> PrivateCellUtil.setTimestamp(cell, ts);</span> |
| <span class="source-line-no">263</span><span id="line-263"> }</span> |
| <span class="source-line-no">264</span><span id="line-264"></span> |
| <span class="source-line-no">265</span><span id="line-265"> @Override</span> |
| <span class="source-line-no">266</span><span id="line-266"> public void setSequenceId(long seqId) throws IOException {</span> |
| <span class="source-line-no">267</span><span id="line-267"> // The incoming cell is supposed to be ExtendedCell type.</span> |
| <span class="source-line-no">268</span><span id="line-268"> PrivateCellUtil.setSequenceId(cell, seqId);</span> |
| <span class="source-line-no">269</span><span id="line-269"> }</span> |
| <span class="source-line-no">270</span><span id="line-270"></span> |
| <span class="source-line-no">271</span><span id="line-271"> @Override</span> |
| <span class="source-line-no">272</span><span id="line-272"> public int write(OutputStream out, boolean withTags) throws IOException {</span> |
| <span class="source-line-no">273</span><span id="line-273"> int len = ((ExtendedCell) this.cell).write(out, false);</span> |
| <span class="source-line-no">274</span><span id="line-274"> if (withTags && this.tags != null) {</span> |
| <span class="source-line-no">275</span><span id="line-275"> // Write the tagsLength 2 bytes</span> |
| <span class="source-line-no">276</span><span id="line-276"> out.write((byte) (0xff & (this.tags.length >> 8)));</span> |
| <span class="source-line-no">277</span><span id="line-277"> out.write((byte) (0xff & this.tags.length));</span> |
| <span class="source-line-no">278</span><span id="line-278"> out.write(this.tags);</span> |
| <span class="source-line-no">279</span><span id="line-279"> len += KeyValue.TAGS_LENGTH_SIZE + this.tags.length;</span> |
| <span class="source-line-no">280</span><span id="line-280"> }</span> |
| <span class="source-line-no">281</span><span id="line-281"> return len;</span> |
| <span class="source-line-no">282</span><span id="line-282"> }</span> |
| <span class="source-line-no">283</span><span id="line-283"></span> |
| <span class="source-line-no">284</span><span id="line-284"> @Override</span> |
| <span class="source-line-no">285</span><span id="line-285"> public int getSerializedSize(boolean withTags) {</span> |
| <span class="source-line-no">286</span><span id="line-286"> int len = ((ExtendedCell) this.cell).getSerializedSize(false);</span> |
| <span class="source-line-no">287</span><span id="line-287"> if (withTags && this.tags != null) {</span> |
| <span class="source-line-no">288</span><span id="line-288"> len += KeyValue.TAGS_LENGTH_SIZE + this.tags.length;</span> |
| <span class="source-line-no">289</span><span id="line-289"> }</span> |
| <span class="source-line-no">290</span><span id="line-290"> return len;</span> |
| <span class="source-line-no">291</span><span id="line-291"> }</span> |
| <span class="source-line-no">292</span><span id="line-292"></span> |
| <span class="source-line-no">293</span><span id="line-293"> @Override</span> |
| <span class="source-line-no">294</span><span id="line-294"> public void write(ByteBuffer buf, int offset) {</span> |
| <span class="source-line-no">295</span><span id="line-295"> offset = KeyValueUtil.appendTo(this.cell, buf, offset, false);</span> |
| <span class="source-line-no">296</span><span id="line-296"> int tagsLen = this.tags == null ? 0 : this.tags.length;</span> |
| <span class="source-line-no">297</span><span id="line-297"> if (tagsLen > 0) {</span> |
| <span class="source-line-no">298</span><span id="line-298"> offset = ByteBufferUtils.putAsShort(buf, offset, tagsLen);</span> |
| <span class="source-line-no">299</span><span id="line-299"> ByteBufferUtils.copyFromArrayToBuffer(buf, offset, this.tags, 0, tagsLen);</span> |
| <span class="source-line-no">300</span><span id="line-300"> }</span> |
| <span class="source-line-no">301</span><span id="line-301"> }</span> |
| <span class="source-line-no">302</span><span id="line-302"></span> |
| <span class="source-line-no">303</span><span id="line-303"> @Override</span> |
| <span class="source-line-no">304</span><span id="line-304"> public ExtendedCell deepClone() {</span> |
| <span class="source-line-no">305</span><span id="line-305"> ExtendedCell clonedBaseCell = this.cell.deepClone();</span> |
| <span class="source-line-no">306</span><span id="line-306"> return new TagRewriteCell(clonedBaseCell, this.tags);</span> |
| <span class="source-line-no">307</span><span id="line-307"> }</span> |
| <span class="source-line-no">308</span><span id="line-308"> }</span> |
| <span class="source-line-no">309</span><span id="line-309"></span> |
| <span class="source-line-no">310</span><span id="line-310"> static class TagRewriteByteBufferExtendedCell extends ByteBufferExtendedCell {</span> |
| <span class="source-line-no">311</span><span id="line-311"></span> |
| <span class="source-line-no">312</span><span id="line-312"> protected ByteBufferExtendedCell cell;</span> |
| <span class="source-line-no">313</span><span id="line-313"> protected byte[] tags;</span> |
| <span class="source-line-no">314</span><span id="line-314"> private static final int HEAP_SIZE_OVERHEAD = ClassSize.OBJECT + 2 * ClassSize.REFERENCE;</span> |
| <span class="source-line-no">315</span><span id="line-315"></span> |
| <span class="source-line-no">316</span><span id="line-316"> /**</span> |
| <span class="source-line-no">317</span><span id="line-317"> * @param cell The original ByteBufferExtendedCell which it rewrites</span> |
| <span class="source-line-no">318</span><span id="line-318"> * @param tags the tags bytes. The array suppose to contain the tags bytes alone.</span> |
| <span class="source-line-no">319</span><span id="line-319"> */</span> |
| <span class="source-line-no">320</span><span id="line-320"> public TagRewriteByteBufferExtendedCell(ByteBufferExtendedCell cell, byte[] tags) {</span> |
| <span class="source-line-no">321</span><span id="line-321"> assert tags != null;</span> |
| <span class="source-line-no">322</span><span id="line-322"> this.cell = cell;</span> |
| <span class="source-line-no">323</span><span id="line-323"> this.tags = tags;</span> |
| <span class="source-line-no">324</span><span id="line-324"> // tag offset will be treated as 0 and length this.tags.length</span> |
| <span class="source-line-no">325</span><span id="line-325"> if (this.cell instanceof TagRewriteByteBufferExtendedCell) {</span> |
| <span class="source-line-no">326</span><span id="line-326"> // Cleaning the ref so that the byte[] can be GCed</span> |
| <span class="source-line-no">327</span><span id="line-327"> ((TagRewriteByteBufferExtendedCell) this.cell).tags = null;</span> |
| <span class="source-line-no">328</span><span id="line-328"> }</span> |
| <span class="source-line-no">329</span><span id="line-329"> }</span> |
| <span class="source-line-no">330</span><span id="line-330"></span> |
| <span class="source-line-no">331</span><span id="line-331"> @Override</span> |
| <span class="source-line-no">332</span><span id="line-332"> public byte[] getRowArray() {</span> |
| <span class="source-line-no">333</span><span id="line-333"> return this.cell.getRowArray();</span> |
| <span class="source-line-no">334</span><span id="line-334"> }</span> |
| <span class="source-line-no">335</span><span id="line-335"></span> |
| <span class="source-line-no">336</span><span id="line-336"> @Override</span> |
| <span class="source-line-no">337</span><span id="line-337"> public int getRowOffset() {</span> |
| <span class="source-line-no">338</span><span id="line-338"> return this.cell.getRowOffset();</span> |
| <span class="source-line-no">339</span><span id="line-339"> }</span> |
| <span class="source-line-no">340</span><span id="line-340"></span> |
| <span class="source-line-no">341</span><span id="line-341"> @Override</span> |
| <span class="source-line-no">342</span><span id="line-342"> public short getRowLength() {</span> |
| <span class="source-line-no">343</span><span id="line-343"> return this.cell.getRowLength();</span> |
| <span class="source-line-no">344</span><span id="line-344"> }</span> |
| <span class="source-line-no">345</span><span id="line-345"></span> |
| <span class="source-line-no">346</span><span id="line-346"> @Override</span> |
| <span class="source-line-no">347</span><span id="line-347"> public byte[] getFamilyArray() {</span> |
| <span class="source-line-no">348</span><span id="line-348"> return this.cell.getFamilyArray();</span> |
| <span class="source-line-no">349</span><span id="line-349"> }</span> |
| <span class="source-line-no">350</span><span id="line-350"></span> |
| <span class="source-line-no">351</span><span id="line-351"> @Override</span> |
| <span class="source-line-no">352</span><span id="line-352"> public int getFamilyOffset() {</span> |
| <span class="source-line-no">353</span><span id="line-353"> return this.cell.getFamilyOffset();</span> |
| <span class="source-line-no">354</span><span id="line-354"> }</span> |
| <span class="source-line-no">355</span><span id="line-355"></span> |
| <span class="source-line-no">356</span><span id="line-356"> @Override</span> |
| <span class="source-line-no">357</span><span id="line-357"> public byte getFamilyLength() {</span> |
| <span class="source-line-no">358</span><span id="line-358"> return this.cell.getFamilyLength();</span> |
| <span class="source-line-no">359</span><span id="line-359"> }</span> |
| <span class="source-line-no">360</span><span id="line-360"></span> |
| <span class="source-line-no">361</span><span id="line-361"> @Override</span> |
| <span class="source-line-no">362</span><span id="line-362"> public byte[] getQualifierArray() {</span> |
| <span class="source-line-no">363</span><span id="line-363"> return this.cell.getQualifierArray();</span> |
| <span class="source-line-no">364</span><span id="line-364"> }</span> |
| <span class="source-line-no">365</span><span id="line-365"></span> |
| <span class="source-line-no">366</span><span id="line-366"> @Override</span> |
| <span class="source-line-no">367</span><span id="line-367"> public int getQualifierOffset() {</span> |
| <span class="source-line-no">368</span><span id="line-368"> return this.cell.getQualifierOffset();</span> |
| <span class="source-line-no">369</span><span id="line-369"> }</span> |
| <span class="source-line-no">370</span><span id="line-370"></span> |
| <span class="source-line-no">371</span><span id="line-371"> @Override</span> |
| <span class="source-line-no">372</span><span id="line-372"> public int getQualifierLength() {</span> |
| <span class="source-line-no">373</span><span id="line-373"> return this.cell.getQualifierLength();</span> |
| <span class="source-line-no">374</span><span id="line-374"> }</span> |
| <span class="source-line-no">375</span><span id="line-375"></span> |
| <span class="source-line-no">376</span><span id="line-376"> @Override</span> |
| <span class="source-line-no">377</span><span id="line-377"> public long getTimestamp() {</span> |
| <span class="source-line-no">378</span><span id="line-378"> return this.cell.getTimestamp();</span> |
| <span class="source-line-no">379</span><span id="line-379"> }</span> |
| <span class="source-line-no">380</span><span id="line-380"></span> |
| <span class="source-line-no">381</span><span id="line-381"> @Override</span> |
| <span class="source-line-no">382</span><span id="line-382"> public byte getTypeByte() {</span> |
| <span class="source-line-no">383</span><span id="line-383"> return this.cell.getTypeByte();</span> |
| <span class="source-line-no">384</span><span id="line-384"> }</span> |
| <span class="source-line-no">385</span><span id="line-385"></span> |
| <span class="source-line-no">386</span><span id="line-386"> @Override</span> |
| <span class="source-line-no">387</span><span id="line-387"> public long getSequenceId() {</span> |
| <span class="source-line-no">388</span><span id="line-388"> return this.cell.getSequenceId();</span> |
| <span class="source-line-no">389</span><span id="line-389"> }</span> |
| <span class="source-line-no">390</span><span id="line-390"></span> |
| <span class="source-line-no">391</span><span id="line-391"> @Override</span> |
| <span class="source-line-no">392</span><span id="line-392"> public byte[] getValueArray() {</span> |
| <span class="source-line-no">393</span><span id="line-393"> return this.cell.getValueArray();</span> |
| <span class="source-line-no">394</span><span id="line-394"> }</span> |
| <span class="source-line-no">395</span><span id="line-395"></span> |
| <span class="source-line-no">396</span><span id="line-396"> @Override</span> |
| <span class="source-line-no">397</span><span id="line-397"> public int getValueOffset() {</span> |
| <span class="source-line-no">398</span><span id="line-398"> return this.cell.getValueOffset();</span> |
| <span class="source-line-no">399</span><span id="line-399"> }</span> |
| <span class="source-line-no">400</span><span id="line-400"></span> |
| <span class="source-line-no">401</span><span id="line-401"> @Override</span> |
| <span class="source-line-no">402</span><span id="line-402"> public int getValueLength() {</span> |
| <span class="source-line-no">403</span><span id="line-403"> return this.cell.getValueLength();</span> |
| <span class="source-line-no">404</span><span id="line-404"> }</span> |
| <span class="source-line-no">405</span><span id="line-405"></span> |
| <span class="source-line-no">406</span><span id="line-406"> @Override</span> |
| <span class="source-line-no">407</span><span id="line-407"> public byte[] getTagsArray() {</span> |
| <span class="source-line-no">408</span><span id="line-408"> return this.tags;</span> |
| <span class="source-line-no">409</span><span id="line-409"> }</span> |
| <span class="source-line-no">410</span><span id="line-410"></span> |
| <span class="source-line-no">411</span><span id="line-411"> @Override</span> |
| <span class="source-line-no">412</span><span id="line-412"> public int getTagsOffset() {</span> |
| <span class="source-line-no">413</span><span id="line-413"> return 0;</span> |
| <span class="source-line-no">414</span><span id="line-414"> }</span> |
| <span class="source-line-no">415</span><span id="line-415"></span> |
| <span class="source-line-no">416</span><span id="line-416"> @Override</span> |
| <span class="source-line-no">417</span><span id="line-417"> public int getTagsLength() {</span> |
| <span class="source-line-no">418</span><span id="line-418"> if (null == this.tags) {</span> |
| <span class="source-line-no">419</span><span id="line-419"> // Nulled out tags array optimization in constructor</span> |
| <span class="source-line-no">420</span><span id="line-420"> return 0;</span> |
| <span class="source-line-no">421</span><span id="line-421"> }</span> |
| <span class="source-line-no">422</span><span id="line-422"> return this.tags.length;</span> |
| <span class="source-line-no">423</span><span id="line-423"> }</span> |
| <span class="source-line-no">424</span><span id="line-424"></span> |
| <span class="source-line-no">425</span><span id="line-425"> @Override</span> |
| <span class="source-line-no">426</span><span id="line-426"> public void setSequenceId(long seqId) throws IOException {</span> |
| <span class="source-line-no">427</span><span id="line-427"> PrivateCellUtil.setSequenceId(this.cell, seqId);</span> |
| <span class="source-line-no">428</span><span id="line-428"> }</span> |
| <span class="source-line-no">429</span><span id="line-429"></span> |
| <span class="source-line-no">430</span><span id="line-430"> @Override</span> |
| <span class="source-line-no">431</span><span id="line-431"> public void setTimestamp(long ts) throws IOException {</span> |
| <span class="source-line-no">432</span><span id="line-432"> PrivateCellUtil.setTimestamp(this.cell, ts);</span> |
| <span class="source-line-no">433</span><span id="line-433"> }</span> |
| <span class="source-line-no">434</span><span id="line-434"></span> |
| <span class="source-line-no">435</span><span id="line-435"> @Override</span> |
| <span class="source-line-no">436</span><span id="line-436"> public void setTimestamp(byte[] ts) throws IOException {</span> |
| <span class="source-line-no">437</span><span id="line-437"> PrivateCellUtil.setTimestamp(this.cell, ts);</span> |
| <span class="source-line-no">438</span><span id="line-438"> }</span> |
| <span class="source-line-no">439</span><span id="line-439"></span> |
| <span class="source-line-no">440</span><span id="line-440"> @Override</span> |
| <span class="source-line-no">441</span><span id="line-441"> public long heapSize() {</span> |
| <span class="source-line-no">442</span><span id="line-442"> long sum = HEAP_SIZE_OVERHEAD + cell.heapSize();</span> |
| <span class="source-line-no">443</span><span id="line-443"> // this.tags is on heap byte[]</span> |
| <span class="source-line-no">444</span><span id="line-444"> if (this.tags != null) {</span> |
| <span class="source-line-no">445</span><span id="line-445"> sum += ClassSize.sizeOf(this.tags);</span> |
| <span class="source-line-no">446</span><span id="line-446"> }</span> |
| <span class="source-line-no">447</span><span id="line-447"> return sum;</span> |
| <span class="source-line-no">448</span><span id="line-448"> }</span> |
| <span class="source-line-no">449</span><span id="line-449"></span> |
| <span class="source-line-no">450</span><span id="line-450"> @Override</span> |
| <span class="source-line-no">451</span><span id="line-451"> public int write(OutputStream out, boolean withTags) throws IOException {</span> |
| <span class="source-line-no">452</span><span id="line-452"> int len = ((ExtendedCell) this.cell).write(out, false);</span> |
| <span class="source-line-no">453</span><span id="line-453"> if (withTags && this.tags != null) {</span> |
| <span class="source-line-no">454</span><span id="line-454"> // Write the tagsLength 2 bytes</span> |
| <span class="source-line-no">455</span><span id="line-455"> out.write((byte) (0xff & (this.tags.length >> 8)));</span> |
| <span class="source-line-no">456</span><span id="line-456"> out.write((byte) (0xff & this.tags.length));</span> |
| <span class="source-line-no">457</span><span id="line-457"> out.write(this.tags);</span> |
| <span class="source-line-no">458</span><span id="line-458"> len += KeyValue.TAGS_LENGTH_SIZE + this.tags.length;</span> |
| <span class="source-line-no">459</span><span id="line-459"> }</span> |
| <span class="source-line-no">460</span><span id="line-460"> return len;</span> |
| <span class="source-line-no">461</span><span id="line-461"> }</span> |
| <span class="source-line-no">462</span><span id="line-462"></span> |
| <span class="source-line-no">463</span><span id="line-463"> @Override</span> |
| <span class="source-line-no">464</span><span id="line-464"> public int getSerializedSize(boolean withTags) {</span> |
| <span class="source-line-no">465</span><span id="line-465"> int len = ((ExtendedCell) this.cell).getSerializedSize(false);</span> |
| <span class="source-line-no">466</span><span id="line-466"> if (withTags && this.tags != null) {</span> |
| <span class="source-line-no">467</span><span id="line-467"> len += KeyValue.TAGS_LENGTH_SIZE + this.tags.length;</span> |
| <span class="source-line-no">468</span><span id="line-468"> }</span> |
| <span class="source-line-no">469</span><span id="line-469"> return len;</span> |
| <span class="source-line-no">470</span><span id="line-470"> }</span> |
| <span class="source-line-no">471</span><span id="line-471"></span> |
| <span class="source-line-no">472</span><span id="line-472"> @Override</span> |
| <span class="source-line-no">473</span><span id="line-473"> public void write(ByteBuffer buf, int offset) {</span> |
| <span class="source-line-no">474</span><span id="line-474"> offset = KeyValueUtil.appendTo(this.cell, buf, offset, false);</span> |
| <span class="source-line-no">475</span><span id="line-475"> int tagsLen = this.tags == null ? 0 : this.tags.length;</span> |
| <span class="source-line-no">476</span><span id="line-476"> if (tagsLen > 0) {</span> |
| <span class="source-line-no">477</span><span id="line-477"> offset = ByteBufferUtils.putAsShort(buf, offset, tagsLen);</span> |
| <span class="source-line-no">478</span><span id="line-478"> ByteBufferUtils.copyFromArrayToBuffer(buf, offset, this.tags, 0, tagsLen);</span> |
| <span class="source-line-no">479</span><span id="line-479"> }</span> |
| <span class="source-line-no">480</span><span id="line-480"> }</span> |
| <span class="source-line-no">481</span><span id="line-481"></span> |
| <span class="source-line-no">482</span><span id="line-482"> @Override</span> |
| <span class="source-line-no">483</span><span id="line-483"> public ExtendedCell deepClone() {</span> |
| <span class="source-line-no">484</span><span id="line-484"> ExtendedCell clonedBaseCell = this.cell.deepClone();</span> |
| <span class="source-line-no">485</span><span id="line-485"> if (clonedBaseCell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">486</span><span id="line-486"> return new TagRewriteByteBufferExtendedCell((ByteBufferExtendedCell) clonedBaseCell,</span> |
| <span class="source-line-no">487</span><span id="line-487"> this.tags);</span> |
| <span class="source-line-no">488</span><span id="line-488"> }</span> |
| <span class="source-line-no">489</span><span id="line-489"> return new TagRewriteCell(clonedBaseCell, this.tags);</span> |
| <span class="source-line-no">490</span><span id="line-490"> }</span> |
| <span class="source-line-no">491</span><span id="line-491"></span> |
| <span class="source-line-no">492</span><span id="line-492"> @Override</span> |
| <span class="source-line-no">493</span><span id="line-493"> public ByteBuffer getRowByteBuffer() {</span> |
| <span class="source-line-no">494</span><span id="line-494"> return this.cell.getRowByteBuffer();</span> |
| <span class="source-line-no">495</span><span id="line-495"> }</span> |
| <span class="source-line-no">496</span><span id="line-496"></span> |
| <span class="source-line-no">497</span><span id="line-497"> @Override</span> |
| <span class="source-line-no">498</span><span id="line-498"> public int getRowPosition() {</span> |
| <span class="source-line-no">499</span><span id="line-499"> return this.cell.getRowPosition();</span> |
| <span class="source-line-no">500</span><span id="line-500"> }</span> |
| <span class="source-line-no">501</span><span id="line-501"></span> |
| <span class="source-line-no">502</span><span id="line-502"> @Override</span> |
| <span class="source-line-no">503</span><span id="line-503"> public ByteBuffer getFamilyByteBuffer() {</span> |
| <span class="source-line-no">504</span><span id="line-504"> return this.cell.getFamilyByteBuffer();</span> |
| <span class="source-line-no">505</span><span id="line-505"> }</span> |
| <span class="source-line-no">506</span><span id="line-506"></span> |
| <span class="source-line-no">507</span><span id="line-507"> @Override</span> |
| <span class="source-line-no">508</span><span id="line-508"> public int getFamilyPosition() {</span> |
| <span class="source-line-no">509</span><span id="line-509"> return this.cell.getFamilyPosition();</span> |
| <span class="source-line-no">510</span><span id="line-510"> }</span> |
| <span class="source-line-no">511</span><span id="line-511"></span> |
| <span class="source-line-no">512</span><span id="line-512"> @Override</span> |
| <span class="source-line-no">513</span><span id="line-513"> public ByteBuffer getQualifierByteBuffer() {</span> |
| <span class="source-line-no">514</span><span id="line-514"> return this.cell.getQualifierByteBuffer();</span> |
| <span class="source-line-no">515</span><span id="line-515"> }</span> |
| <span class="source-line-no">516</span><span id="line-516"></span> |
| <span class="source-line-no">517</span><span id="line-517"> @Override</span> |
| <span class="source-line-no">518</span><span id="line-518"> public int getQualifierPosition() {</span> |
| <span class="source-line-no">519</span><span id="line-519"> return this.cell.getQualifierPosition();</span> |
| <span class="source-line-no">520</span><span id="line-520"> }</span> |
| <span class="source-line-no">521</span><span id="line-521"></span> |
| <span class="source-line-no">522</span><span id="line-522"> @Override</span> |
| <span class="source-line-no">523</span><span id="line-523"> public ByteBuffer getValueByteBuffer() {</span> |
| <span class="source-line-no">524</span><span id="line-524"> return this.cell.getValueByteBuffer();</span> |
| <span class="source-line-no">525</span><span id="line-525"> }</span> |
| <span class="source-line-no">526</span><span id="line-526"></span> |
| <span class="source-line-no">527</span><span id="line-527"> @Override</span> |
| <span class="source-line-no">528</span><span id="line-528"> public int getValuePosition() {</span> |
| <span class="source-line-no">529</span><span id="line-529"> return this.cell.getValuePosition();</span> |
| <span class="source-line-no">530</span><span id="line-530"> }</span> |
| <span class="source-line-no">531</span><span id="line-531"></span> |
| <span class="source-line-no">532</span><span id="line-532"> @Override</span> |
| <span class="source-line-no">533</span><span id="line-533"> public ByteBuffer getTagsByteBuffer() {</span> |
| <span class="source-line-no">534</span><span id="line-534"> return this.tags == null ? HConstants.EMPTY_BYTE_BUFFER : ByteBuffer.wrap(this.tags);</span> |
| <span class="source-line-no">535</span><span id="line-535"> }</span> |
| <span class="source-line-no">536</span><span id="line-536"></span> |
| <span class="source-line-no">537</span><span id="line-537"> @Override</span> |
| <span class="source-line-no">538</span><span id="line-538"> public int getTagsPosition() {</span> |
| <span class="source-line-no">539</span><span id="line-539"> return 0;</span> |
| <span class="source-line-no">540</span><span id="line-540"> }</span> |
| <span class="source-line-no">541</span><span id="line-541"> }</span> |
| <span class="source-line-no">542</span><span id="line-542"></span> |
| <span class="source-line-no">543</span><span id="line-543"> static class ValueAndTagRewriteCell extends TagRewriteCell {</span> |
| <span class="source-line-no">544</span><span id="line-544"></span> |
| <span class="source-line-no">545</span><span id="line-545"> protected byte[] value;</span> |
| <span class="source-line-no">546</span><span id="line-546"></span> |
| <span class="source-line-no">547</span><span id="line-547"> public ValueAndTagRewriteCell(ExtendedCell cell, byte[] value, byte[] tags) {</span> |
| <span class="source-line-no">548</span><span id="line-548"> super(cell, tags);</span> |
| <span class="source-line-no">549</span><span id="line-549"> this.value = value;</span> |
| <span class="source-line-no">550</span><span id="line-550"> }</span> |
| <span class="source-line-no">551</span><span id="line-551"></span> |
| <span class="source-line-no">552</span><span id="line-552"> @Override</span> |
| <span class="source-line-no">553</span><span id="line-553"> public byte[] getValueArray() {</span> |
| <span class="source-line-no">554</span><span id="line-554"> return this.value;</span> |
| <span class="source-line-no">555</span><span id="line-555"> }</span> |
| <span class="source-line-no">556</span><span id="line-556"></span> |
| <span class="source-line-no">557</span><span id="line-557"> @Override</span> |
| <span class="source-line-no">558</span><span id="line-558"> public int getValueOffset() {</span> |
| <span class="source-line-no">559</span><span id="line-559"> return 0;</span> |
| <span class="source-line-no">560</span><span id="line-560"> }</span> |
| <span class="source-line-no">561</span><span id="line-561"></span> |
| <span class="source-line-no">562</span><span id="line-562"> @Override</span> |
| <span class="source-line-no">563</span><span id="line-563"> public int getValueLength() {</span> |
| <span class="source-line-no">564</span><span id="line-564"> return this.value == null ? 0 : this.value.length;</span> |
| <span class="source-line-no">565</span><span id="line-565"> }</span> |
| <span class="source-line-no">566</span><span id="line-566"></span> |
| <span class="source-line-no">567</span><span id="line-567"> @Override</span> |
| <span class="source-line-no">568</span><span id="line-568"> public long heapSize() {</span> |
| <span class="source-line-no">569</span><span id="line-569"> long sum = ClassSize.REFERENCE + super.heapSize();</span> |
| <span class="source-line-no">570</span><span id="line-570"> if (this.value != null) {</span> |
| <span class="source-line-no">571</span><span id="line-571"> sum += ClassSize.sizeOf(this.value);</span> |
| <span class="source-line-no">572</span><span id="line-572"> }</span> |
| <span class="source-line-no">573</span><span id="line-573"> return sum;</span> |
| <span class="source-line-no">574</span><span id="line-574"> }</span> |
| <span class="source-line-no">575</span><span id="line-575"></span> |
| <span class="source-line-no">576</span><span id="line-576"> @Override</span> |
| <span class="source-line-no">577</span><span id="line-577"> public int write(OutputStream out, boolean withTags) throws IOException {</span> |
| <span class="source-line-no">578</span><span id="line-578"> return write(out, withTags, this.cell, this.value, this.tags);</span> |
| <span class="source-line-no">579</span><span id="line-579"> }</span> |
| <span class="source-line-no">580</span><span id="line-580"></span> |
| <span class="source-line-no">581</span><span id="line-581"> /**</span> |
| <span class="source-line-no">582</span><span id="line-582"> * Made into a static method so as to reuse the logic within</span> |
| <span class="source-line-no">583</span><span id="line-583"> * ValueAndTagRewriteByteBufferExtendedCell</span> |
| <span class="source-line-no">584</span><span id="line-584"> */</span> |
| <span class="source-line-no">585</span><span id="line-585"> static int write(OutputStream out, boolean withTags, Cell cell, byte[] value, byte[] tags)</span> |
| <span class="source-line-no">586</span><span id="line-586"> throws IOException {</span> |
| <span class="source-line-no">587</span><span id="line-587"> int valLen = value == null ? 0 : value.length;</span> |
| <span class="source-line-no">588</span><span id="line-588"> ByteBufferUtils.putInt(out, KeyValueUtil.keyLength(cell));// Key length</span> |
| <span class="source-line-no">589</span><span id="line-589"> ByteBufferUtils.putInt(out, valLen);// Value length</span> |
| <span class="source-line-no">590</span><span id="line-590"> int len = 2 * Bytes.SIZEOF_INT;</span> |
| <span class="source-line-no">591</span><span id="line-591"> len += writeFlatKey(cell, out);// Key</span> |
| <span class="source-line-no">592</span><span id="line-592"> if (valLen > 0) {</span> |
| <span class="source-line-no">593</span><span id="line-593"> out.write(value);// Value</span> |
| <span class="source-line-no">594</span><span id="line-594"> }</span> |
| <span class="source-line-no">595</span><span id="line-595"> len += valLen;</span> |
| <span class="source-line-no">596</span><span id="line-596"> if (withTags && tags != null) {</span> |
| <span class="source-line-no">597</span><span id="line-597"> // Write the tagsLength 2 bytes</span> |
| <span class="source-line-no">598</span><span id="line-598"> out.write((byte) (0xff & (tags.length >> 8)));</span> |
| <span class="source-line-no">599</span><span id="line-599"> out.write((byte) (0xff & tags.length));</span> |
| <span class="source-line-no">600</span><span id="line-600"> out.write(tags);</span> |
| <span class="source-line-no">601</span><span id="line-601"> len += KeyValue.TAGS_LENGTH_SIZE + tags.length;</span> |
| <span class="source-line-no">602</span><span id="line-602"> }</span> |
| <span class="source-line-no">603</span><span id="line-603"> return len;</span> |
| <span class="source-line-no">604</span><span id="line-604"> }</span> |
| <span class="source-line-no">605</span><span id="line-605"></span> |
| <span class="source-line-no">606</span><span id="line-606"> @Override</span> |
| <span class="source-line-no">607</span><span id="line-607"> public int getSerializedSize(boolean withTags) {</span> |
| <span class="source-line-no">608</span><span id="line-608"> return super.getSerializedSize(withTags) - this.cell.getValueLength() + this.value.length;</span> |
| <span class="source-line-no">609</span><span id="line-609"> }</span> |
| <span class="source-line-no">610</span><span id="line-610"></span> |
| <span class="source-line-no">611</span><span id="line-611"> @Override</span> |
| <span class="source-line-no">612</span><span id="line-612"> public void write(ByteBuffer buf, int offset) {</span> |
| <span class="source-line-no">613</span><span id="line-613"> write(buf, offset, this.cell, this.value, this.tags);</span> |
| <span class="source-line-no">614</span><span id="line-614"> }</span> |
| <span class="source-line-no">615</span><span id="line-615"></span> |
| <span class="source-line-no">616</span><span id="line-616"> /**</span> |
| <span class="source-line-no">617</span><span id="line-617"> * Made into a static method so as to reuse the logic within</span> |
| <span class="source-line-no">618</span><span id="line-618"> * ValueAndTagRewriteByteBufferExtendedCell</span> |
| <span class="source-line-no">619</span><span id="line-619"> */</span> |
| <span class="source-line-no">620</span><span id="line-620"> static void write(ByteBuffer buf, int offset, ExtendedCell cell, byte[] value, byte[] tags) {</span> |
| <span class="source-line-no">621</span><span id="line-621"> offset = ByteBufferUtils.putInt(buf, offset, KeyValueUtil.keyLength(cell));// Key length</span> |
| <span class="source-line-no">622</span><span id="line-622"> offset = ByteBufferUtils.putInt(buf, offset, value.length);// Value length</span> |
| <span class="source-line-no">623</span><span id="line-623"> offset = KeyValueUtil.appendKeyTo(cell, buf, offset);</span> |
| <span class="source-line-no">624</span><span id="line-624"> ByteBufferUtils.copyFromArrayToBuffer(buf, offset, value, 0, value.length);</span> |
| <span class="source-line-no">625</span><span id="line-625"> offset += value.length;</span> |
| <span class="source-line-no">626</span><span id="line-626"> int tagsLen = tags == null ? 0 : tags.length;</span> |
| <span class="source-line-no">627</span><span id="line-627"> if (tagsLen > 0) {</span> |
| <span class="source-line-no">628</span><span id="line-628"> offset = ByteBufferUtils.putAsShort(buf, offset, tagsLen);</span> |
| <span class="source-line-no">629</span><span id="line-629"> ByteBufferUtils.copyFromArrayToBuffer(buf, offset, tags, 0, tagsLen);</span> |
| <span class="source-line-no">630</span><span id="line-630"> }</span> |
| <span class="source-line-no">631</span><span id="line-631"> }</span> |
| <span class="source-line-no">632</span><span id="line-632"></span> |
| <span class="source-line-no">633</span><span id="line-633"> @Override</span> |
| <span class="source-line-no">634</span><span id="line-634"> public ExtendedCell deepClone() {</span> |
| <span class="source-line-no">635</span><span id="line-635"> ExtendedCell clonedBaseCell = this.cell.deepClone();</span> |
| <span class="source-line-no">636</span><span id="line-636"> return new ValueAndTagRewriteCell(clonedBaseCell, this.value, this.tags);</span> |
| <span class="source-line-no">637</span><span id="line-637"> }</span> |
| <span class="source-line-no">638</span><span id="line-638"> }</span> |
| <span class="source-line-no">639</span><span id="line-639"></span> |
| <span class="source-line-no">640</span><span id="line-640"> static class ValueAndTagRewriteByteBufferExtendedCell extends TagRewriteByteBufferExtendedCell {</span> |
| <span class="source-line-no">641</span><span id="line-641"></span> |
| <span class="source-line-no">642</span><span id="line-642"> protected byte[] value;</span> |
| <span class="source-line-no">643</span><span id="line-643"></span> |
| <span class="source-line-no">644</span><span id="line-644"> public ValueAndTagRewriteByteBufferExtendedCell(ByteBufferExtendedCell cell, byte[] value,</span> |
| <span class="source-line-no">645</span><span id="line-645"> byte[] tags) {</span> |
| <span class="source-line-no">646</span><span id="line-646"> super(cell, tags);</span> |
| <span class="source-line-no">647</span><span id="line-647"> this.value = value;</span> |
| <span class="source-line-no">648</span><span id="line-648"> }</span> |
| <span class="source-line-no">649</span><span id="line-649"></span> |
| <span class="source-line-no">650</span><span id="line-650"> @Override</span> |
| <span class="source-line-no">651</span><span id="line-651"> public byte[] getValueArray() {</span> |
| <span class="source-line-no">652</span><span id="line-652"> return this.value;</span> |
| <span class="source-line-no">653</span><span id="line-653"> }</span> |
| <span class="source-line-no">654</span><span id="line-654"></span> |
| <span class="source-line-no">655</span><span id="line-655"> @Override</span> |
| <span class="source-line-no">656</span><span id="line-656"> public int getValueOffset() {</span> |
| <span class="source-line-no">657</span><span id="line-657"> return 0;</span> |
| <span class="source-line-no">658</span><span id="line-658"> }</span> |
| <span class="source-line-no">659</span><span id="line-659"></span> |
| <span class="source-line-no">660</span><span id="line-660"> @Override</span> |
| <span class="source-line-no">661</span><span id="line-661"> public int getValueLength() {</span> |
| <span class="source-line-no">662</span><span id="line-662"> return this.value == null ? 0 : this.value.length;</span> |
| <span class="source-line-no">663</span><span id="line-663"> }</span> |
| <span class="source-line-no">664</span><span id="line-664"></span> |
| <span class="source-line-no">665</span><span id="line-665"> @Override</span> |
| <span class="source-line-no">666</span><span id="line-666"> public ByteBuffer getValueByteBuffer() {</span> |
| <span class="source-line-no">667</span><span id="line-667"> return ByteBuffer.wrap(this.value);</span> |
| <span class="source-line-no">668</span><span id="line-668"> }</span> |
| <span class="source-line-no">669</span><span id="line-669"></span> |
| <span class="source-line-no">670</span><span id="line-670"> @Override</span> |
| <span class="source-line-no">671</span><span id="line-671"> public int getValuePosition() {</span> |
| <span class="source-line-no">672</span><span id="line-672"> return 0;</span> |
| <span class="source-line-no">673</span><span id="line-673"> }</span> |
| <span class="source-line-no">674</span><span id="line-674"></span> |
| <span class="source-line-no">675</span><span id="line-675"> @Override</span> |
| <span class="source-line-no">676</span><span id="line-676"> public long heapSize() {</span> |
| <span class="source-line-no">677</span><span id="line-677"> long sum = ClassSize.REFERENCE + super.heapSize();</span> |
| <span class="source-line-no">678</span><span id="line-678"> if (this.value != null) {</span> |
| <span class="source-line-no">679</span><span id="line-679"> sum += ClassSize.sizeOf(this.value);</span> |
| <span class="source-line-no">680</span><span id="line-680"> }</span> |
| <span class="source-line-no">681</span><span id="line-681"> return sum;</span> |
| <span class="source-line-no">682</span><span id="line-682"> }</span> |
| <span class="source-line-no">683</span><span id="line-683"></span> |
| <span class="source-line-no">684</span><span id="line-684"> @Override</span> |
| <span class="source-line-no">685</span><span id="line-685"> public int write(OutputStream out, boolean withTags) throws IOException {</span> |
| <span class="source-line-no">686</span><span id="line-686"> return ValueAndTagRewriteCell.write(out, withTags, this.cell, this.value, this.tags);</span> |
| <span class="source-line-no">687</span><span id="line-687"> }</span> |
| <span class="source-line-no">688</span><span id="line-688"></span> |
| <span class="source-line-no">689</span><span id="line-689"> @Override</span> |
| <span class="source-line-no">690</span><span id="line-690"> public int getSerializedSize(boolean withTags) {</span> |
| <span class="source-line-no">691</span><span id="line-691"> return super.getSerializedSize(withTags) - this.cell.getValueLength() + this.value.length;</span> |
| <span class="source-line-no">692</span><span id="line-692"> }</span> |
| <span class="source-line-no">693</span><span id="line-693"></span> |
| <span class="source-line-no">694</span><span id="line-694"> @Override</span> |
| <span class="source-line-no">695</span><span id="line-695"> public void write(ByteBuffer buf, int offset) {</span> |
| <span class="source-line-no">696</span><span id="line-696"> ValueAndTagRewriteCell.write(buf, offset, this.cell, this.value, this.tags);</span> |
| <span class="source-line-no">697</span><span id="line-697"> }</span> |
| <span class="source-line-no">698</span><span id="line-698"></span> |
| <span class="source-line-no">699</span><span id="line-699"> @Override</span> |
| <span class="source-line-no">700</span><span id="line-700"> public ExtendedCell deepClone() {</span> |
| <span class="source-line-no">701</span><span id="line-701"> ExtendedCell clonedBaseCell = this.cell.deepClone();</span> |
| <span class="source-line-no">702</span><span id="line-702"> if (clonedBaseCell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">703</span><span id="line-703"> return new ValueAndTagRewriteByteBufferExtendedCell((ByteBufferExtendedCell) clonedBaseCell,</span> |
| <span class="source-line-no">704</span><span id="line-704"> this.value, this.tags);</span> |
| <span class="source-line-no">705</span><span id="line-705"> }</span> |
| <span class="source-line-no">706</span><span id="line-706"> return new ValueAndTagRewriteCell(clonedBaseCell, this.value, this.tags);</span> |
| <span class="source-line-no">707</span><span id="line-707"> }</span> |
| <span class="source-line-no">708</span><span id="line-708"> }</span> |
| <span class="source-line-no">709</span><span id="line-709"></span> |
| <span class="source-line-no">710</span><span id="line-710"> public static boolean matchingRows(final Cell left, final byte[] buf, final int offset,</span> |
| <span class="source-line-no">711</span><span id="line-711"> final int length) {</span> |
| <span class="source-line-no">712</span><span id="line-712"> if (left instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">713</span><span id="line-713"> return ByteBufferUtils.equals(((ByteBufferExtendedCell) left).getRowByteBuffer(),</span> |
| <span class="source-line-no">714</span><span id="line-714"> ((ByteBufferExtendedCell) left).getRowPosition(), left.getRowLength(), buf, offset, length);</span> |
| <span class="source-line-no">715</span><span id="line-715"> }</span> |
| <span class="source-line-no">716</span><span id="line-716"> return Bytes.equals(left.getRowArray(), left.getRowOffset(), left.getRowLength(), buf, offset,</span> |
| <span class="source-line-no">717</span><span id="line-717"> length);</span> |
| <span class="source-line-no">718</span><span id="line-718"> }</span> |
| <span class="source-line-no">719</span><span id="line-719"></span> |
| <span class="source-line-no">720</span><span id="line-720"> public static boolean matchingFamily(final Cell left, final byte[] buf, final int offset,</span> |
| <span class="source-line-no">721</span><span id="line-721"> final int length) {</span> |
| <span class="source-line-no">722</span><span id="line-722"> if (left instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">723</span><span id="line-723"> return ByteBufferUtils.equals(((ByteBufferExtendedCell) left).getFamilyByteBuffer(),</span> |
| <span class="source-line-no">724</span><span id="line-724"> ((ByteBufferExtendedCell) left).getFamilyPosition(), left.getFamilyLength(), buf, offset,</span> |
| <span class="source-line-no">725</span><span id="line-725"> length);</span> |
| <span class="source-line-no">726</span><span id="line-726"> }</span> |
| <span class="source-line-no">727</span><span id="line-727"> return Bytes.equals(left.getFamilyArray(), left.getFamilyOffset(), left.getFamilyLength(), buf,</span> |
| <span class="source-line-no">728</span><span id="line-728"> offset, length);</span> |
| <span class="source-line-no">729</span><span id="line-729"> }</span> |
| <span class="source-line-no">730</span><span id="line-730"></span> |
| <span class="source-line-no">731</span><span id="line-731"> /**</span> |
| <span class="source-line-no">732</span><span id="line-732"> * Finds if the qualifier part of the cell and the KV serialized byte[] are equal</span> |
| <span class="source-line-no">733</span><span id="line-733"> * @param left the cell with which we need to match the qualifier</span> |
| <span class="source-line-no">734</span><span id="line-734"> * @param buf the serialized keyvalue format byte[]</span> |
| <span class="source-line-no">735</span><span id="line-735"> * @param offset the offset of the qualifier in the byte[]</span> |
| <span class="source-line-no">736</span><span id="line-736"> * @param length the length of the qualifier in the byte[]</span> |
| <span class="source-line-no">737</span><span id="line-737"> * @return true if the qualifier matches, false otherwise</span> |
| <span class="source-line-no">738</span><span id="line-738"> */</span> |
| <span class="source-line-no">739</span><span id="line-739"> public static boolean matchingQualifier(final Cell left, final byte[] buf, final int offset,</span> |
| <span class="source-line-no">740</span><span id="line-740"> final int length) {</span> |
| <span class="source-line-no">741</span><span id="line-741"> if (buf == null) {</span> |
| <span class="source-line-no">742</span><span id="line-742"> return left.getQualifierLength() == 0;</span> |
| <span class="source-line-no">743</span><span id="line-743"> }</span> |
| <span class="source-line-no">744</span><span id="line-744"> if (left instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">745</span><span id="line-745"> return ByteBufferUtils.equals(((ByteBufferExtendedCell) left).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">746</span><span id="line-746"> ((ByteBufferExtendedCell) left).getQualifierPosition(), left.getQualifierLength(), buf,</span> |
| <span class="source-line-no">747</span><span id="line-747"> offset, length);</span> |
| <span class="source-line-no">748</span><span id="line-748"> }</span> |
| <span class="source-line-no">749</span><span id="line-749"> return Bytes.equals(left.getQualifierArray(), left.getQualifierOffset(),</span> |
| <span class="source-line-no">750</span><span id="line-750"> left.getQualifierLength(), buf, offset, length);</span> |
| <span class="source-line-no">751</span><span id="line-751"> }</span> |
| <span class="source-line-no">752</span><span id="line-752"></span> |
| <span class="source-line-no">753</span><span id="line-753"> /**</span> |
| <span class="source-line-no">754</span><span id="line-754"> * Finds if the start of the qualifier part of the Cell matches <code>buf</code></span> |
| <span class="source-line-no">755</span><span id="line-755"> * @param left the cell with which we need to match the qualifier</span> |
| <span class="source-line-no">756</span><span id="line-756"> * @param startsWith the serialized keyvalue format byte[]</span> |
| <span class="source-line-no">757</span><span id="line-757"> * @return true if the qualifier have same staring characters, false otherwise</span> |
| <span class="source-line-no">758</span><span id="line-758"> */</span> |
| <span class="source-line-no">759</span><span id="line-759"> public static boolean qualifierStartsWith(final Cell left, final byte[] startsWith) {</span> |
| <span class="source-line-no">760</span><span id="line-760"> if (startsWith == null || startsWith.length == 0) {</span> |
| <span class="source-line-no">761</span><span id="line-761"> throw new IllegalArgumentException("Cannot pass an empty startsWith");</span> |
| <span class="source-line-no">762</span><span id="line-762"> }</span> |
| <span class="source-line-no">763</span><span id="line-763"> if (left.getQualifierLength() < startsWith.length) {</span> |
| <span class="source-line-no">764</span><span id="line-764"> return false;</span> |
| <span class="source-line-no">765</span><span id="line-765"> }</span> |
| <span class="source-line-no">766</span><span id="line-766"> if (left instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">767</span><span id="line-767"> return ByteBufferUtils.equals(((ByteBufferExtendedCell) left).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">768</span><span id="line-768"> ((ByteBufferExtendedCell) left).getQualifierPosition(), startsWith.length, startsWith, 0,</span> |
| <span class="source-line-no">769</span><span id="line-769"> startsWith.length);</span> |
| <span class="source-line-no">770</span><span id="line-770"> }</span> |
| <span class="source-line-no">771</span><span id="line-771"> return Bytes.equals(left.getQualifierArray(), left.getQualifierOffset(), startsWith.length,</span> |
| <span class="source-line-no">772</span><span id="line-772"> startsWith, 0, startsWith.length);</span> |
| <span class="source-line-no">773</span><span id="line-773"> }</span> |
| <span class="source-line-no">774</span><span id="line-774"></span> |
| <span class="source-line-no">775</span><span id="line-775"> public static boolean matchingColumn(final Cell left, final byte[] fam, final int foffset,</span> |
| <span class="source-line-no">776</span><span id="line-776"> final int flength, final byte[] qual, final int qoffset, final int qlength) {</span> |
| <span class="source-line-no">777</span><span id="line-777"> if (!matchingFamily(left, fam, foffset, flength)) {</span> |
| <span class="source-line-no">778</span><span id="line-778"> return false;</span> |
| <span class="source-line-no">779</span><span id="line-779"> }</span> |
| <span class="source-line-no">780</span><span id="line-780"> return matchingQualifier(left, qual, qoffset, qlength);</span> |
| <span class="source-line-no">781</span><span id="line-781"> }</span> |
| <span class="source-line-no">782</span><span id="line-782"></span> |
| <span class="source-line-no">783</span><span id="line-783"> public static boolean matchingValue(final Cell left, final Cell right, int lvlength,</span> |
| <span class="source-line-no">784</span><span id="line-784"> int rvlength) {</span> |
| <span class="source-line-no">785</span><span id="line-785"> if (left instanceof ByteBufferExtendedCell && right instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">786</span><span id="line-786"> return ByteBufferUtils.equals(((ByteBufferExtendedCell) left).getValueByteBuffer(),</span> |
| <span class="source-line-no">787</span><span id="line-787"> ((ByteBufferExtendedCell) left).getValuePosition(), lvlength,</span> |
| <span class="source-line-no">788</span><span id="line-788"> ((ByteBufferExtendedCell) right).getValueByteBuffer(),</span> |
| <span class="source-line-no">789</span><span id="line-789"> ((ByteBufferExtendedCell) right).getValuePosition(), rvlength);</span> |
| <span class="source-line-no">790</span><span id="line-790"> }</span> |
| <span class="source-line-no">791</span><span id="line-791"> if (left instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">792</span><span id="line-792"> return ByteBufferUtils.equals(((ByteBufferExtendedCell) left).getValueByteBuffer(),</span> |
| <span class="source-line-no">793</span><span id="line-793"> ((ByteBufferExtendedCell) left).getValuePosition(), lvlength, right.getValueArray(),</span> |
| <span class="source-line-no">794</span><span id="line-794"> right.getValueOffset(), rvlength);</span> |
| <span class="source-line-no">795</span><span id="line-795"> }</span> |
| <span class="source-line-no">796</span><span id="line-796"> if (right instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">797</span><span id="line-797"> return ByteBufferUtils.equals(((ByteBufferExtendedCell) right).getValueByteBuffer(),</span> |
| <span class="source-line-no">798</span><span id="line-798"> ((ByteBufferExtendedCell) right).getValuePosition(), rvlength, left.getValueArray(),</span> |
| <span class="source-line-no">799</span><span id="line-799"> left.getValueOffset(), lvlength);</span> |
| <span class="source-line-no">800</span><span id="line-800"> }</span> |
| <span class="source-line-no">801</span><span id="line-801"> return Bytes.equals(left.getValueArray(), left.getValueOffset(), lvlength,</span> |
| <span class="source-line-no">802</span><span id="line-802"> right.getValueArray(), right.getValueOffset(), rvlength);</span> |
| <span class="source-line-no">803</span><span id="line-803"> }</span> |
| <span class="source-line-no">804</span><span id="line-804"></span> |
| <span class="source-line-no">805</span><span id="line-805"> public static boolean matchingType(Cell a, Cell b) {</span> |
| <span class="source-line-no">806</span><span id="line-806"> return a.getTypeByte() == b.getTypeByte();</span> |
| <span class="source-line-no">807</span><span id="line-807"> }</span> |
| <span class="source-line-no">808</span><span id="line-808"></span> |
| <span class="source-line-no">809</span><span id="line-809"> public static boolean matchingTags(final Cell left, final Cell right, int llength, int rlength) {</span> |
| <span class="source-line-no">810</span><span id="line-810"> if (left instanceof ByteBufferExtendedCell && right instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">811</span><span id="line-811"> ByteBufferExtendedCell leftBBCell = (ByteBufferExtendedCell) left;</span> |
| <span class="source-line-no">812</span><span id="line-812"> ByteBufferExtendedCell rightBBCell = (ByteBufferExtendedCell) right;</span> |
| <span class="source-line-no">813</span><span id="line-813"> return ByteBufferUtils.equals(leftBBCell.getTagsByteBuffer(), leftBBCell.getTagsPosition(),</span> |
| <span class="source-line-no">814</span><span id="line-814"> llength, rightBBCell.getTagsByteBuffer(), rightBBCell.getTagsPosition(), rlength);</span> |
| <span class="source-line-no">815</span><span id="line-815"> }</span> |
| <span class="source-line-no">816</span><span id="line-816"> if (left instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">817</span><span id="line-817"> ByteBufferExtendedCell leftBBCell = (ByteBufferExtendedCell) left;</span> |
| <span class="source-line-no">818</span><span id="line-818"> return ByteBufferUtils.equals(leftBBCell.getTagsByteBuffer(), leftBBCell.getTagsPosition(),</span> |
| <span class="source-line-no">819</span><span id="line-819"> llength, right.getTagsArray(), right.getTagsOffset(), rlength);</span> |
| <span class="source-line-no">820</span><span id="line-820"> }</span> |
| <span class="source-line-no">821</span><span id="line-821"> if (right instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">822</span><span id="line-822"> ByteBufferExtendedCell rightBBCell = (ByteBufferExtendedCell) right;</span> |
| <span class="source-line-no">823</span><span id="line-823"> return ByteBufferUtils.equals(rightBBCell.getTagsByteBuffer(), rightBBCell.getTagsPosition(),</span> |
| <span class="source-line-no">824</span><span id="line-824"> rlength, left.getTagsArray(), left.getTagsOffset(), llength);</span> |
| <span class="source-line-no">825</span><span id="line-825"> }</span> |
| <span class="source-line-no">826</span><span id="line-826"> return Bytes.equals(left.getTagsArray(), left.getTagsOffset(), llength, right.getTagsArray(),</span> |
| <span class="source-line-no">827</span><span id="line-827"> right.getTagsOffset(), rlength);</span> |
| <span class="source-line-no">828</span><span id="line-828"> }</span> |
| <span class="source-line-no">829</span><span id="line-829"></span> |
| <span class="source-line-no">830</span><span id="line-830"> /**</span> |
| <span class="source-line-no">831</span><span id="line-831"> * Return true if a delete type, a {@link KeyValue.Type#Delete} or a {KeyValue.Type#DeleteFamily}</span> |
| <span class="source-line-no">832</span><span id="line-832"> * or a {@link KeyValue.Type#DeleteColumn} KeyValue type.</span> |
| <span class="source-line-no">833</span><span id="line-833"> */</span> |
| <span class="source-line-no">834</span><span id="line-834"> public static boolean isDelete(final byte type) {</span> |
| <span class="source-line-no">835</span><span id="line-835"> return KeyValue.Type.Delete.getCode() <= type && type <= KeyValue.Type.DeleteFamily.getCode();</span> |
| <span class="source-line-no">836</span><span id="line-836"> }</span> |
| <span class="source-line-no">837</span><span id="line-837"></span> |
| <span class="source-line-no">838</span><span id="line-838"> /** Returns True if this cell is a {@link KeyValue.Type#Delete} type. */</span> |
| <span class="source-line-no">839</span><span id="line-839"> public static boolean isDeleteType(ExtendedCell cell) {</span> |
| <span class="source-line-no">840</span><span id="line-840"> return cell.getTypeByte() == KeyValue.Type.Delete.getCode();</span> |
| <span class="source-line-no">841</span><span id="line-841"> }</span> |
| <span class="source-line-no">842</span><span id="line-842"></span> |
| <span class="source-line-no">843</span><span id="line-843"> public static boolean isDeleteFamily(final Cell cell) {</span> |
| <span class="source-line-no">844</span><span id="line-844"> return cell.getTypeByte() == KeyValue.Type.DeleteFamily.getCode();</span> |
| <span class="source-line-no">845</span><span id="line-845"> }</span> |
| <span class="source-line-no">846</span><span id="line-846"></span> |
| <span class="source-line-no">847</span><span id="line-847"> public static boolean isDeleteFamilyVersion(final ExtendedCell cell) {</span> |
| <span class="source-line-no">848</span><span id="line-848"> return cell.getTypeByte() == KeyValue.Type.DeleteFamilyVersion.getCode();</span> |
| <span class="source-line-no">849</span><span id="line-849"> }</span> |
| <span class="source-line-no">850</span><span id="line-850"></span> |
| <span class="source-line-no">851</span><span id="line-851"> public static boolean isDeleteColumns(final ExtendedCell cell) {</span> |
| <span class="source-line-no">852</span><span id="line-852"> return cell.getTypeByte() == KeyValue.Type.DeleteColumn.getCode();</span> |
| <span class="source-line-no">853</span><span id="line-853"> }</span> |
| <span class="source-line-no">854</span><span id="line-854"></span> |
| <span class="source-line-no">855</span><span id="line-855"> public static boolean isDeleteColumnVersion(final ExtendedCell cell) {</span> |
| <span class="source-line-no">856</span><span id="line-856"> return cell.getTypeByte() == KeyValue.Type.Delete.getCode();</span> |
| <span class="source-line-no">857</span><span id="line-857"> }</span> |
| <span class="source-line-no">858</span><span id="line-858"></span> |
| <span class="source-line-no">859</span><span id="line-859"> /** Returns True if this cell is a delete family or column type. */</span> |
| <span class="source-line-no">860</span><span id="line-860"> public static boolean isDeleteColumnOrFamily(ExtendedCell cell) {</span> |
| <span class="source-line-no">861</span><span id="line-861"> int t = cell.getTypeByte();</span> |
| <span class="source-line-no">862</span><span id="line-862"> return t == KeyValue.Type.DeleteColumn.getCode() || t == KeyValue.Type.DeleteFamily.getCode();</span> |
| <span class="source-line-no">863</span><span id="line-863"> }</span> |
| <span class="source-line-no">864</span><span id="line-864"></span> |
| <span class="source-line-no">865</span><span id="line-865"> public static byte[] cloneTags(Cell cell) {</span> |
| <span class="source-line-no">866</span><span id="line-866"> byte[] output = new byte[cell.getTagsLength()];</span> |
| <span class="source-line-no">867</span><span id="line-867"> copyTagsTo(cell, output, 0);</span> |
| <span class="source-line-no">868</span><span id="line-868"> return output;</span> |
| <span class="source-line-no">869</span><span id="line-869"> }</span> |
| <span class="source-line-no">870</span><span id="line-870"></span> |
| <span class="source-line-no">871</span><span id="line-871"> /** Copies the tags info into the tag portion of the cell */</span> |
| <span class="source-line-no">872</span><span id="line-872"> public static int copyTagsTo(Cell cell, byte[] destination, int destinationOffset) {</span> |
| <span class="source-line-no">873</span><span id="line-873"> int tlen = cell.getTagsLength();</span> |
| <span class="source-line-no">874</span><span id="line-874"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">875</span><span id="line-875"> ByteBufferUtils.copyFromBufferToArray(destination,</span> |
| <span class="source-line-no">876</span><span id="line-876"> ((ByteBufferExtendedCell) cell).getTagsByteBuffer(),</span> |
| <span class="source-line-no">877</span><span id="line-877"> ((ByteBufferExtendedCell) cell).getTagsPosition(), destinationOffset, tlen);</span> |
| <span class="source-line-no">878</span><span id="line-878"> } else {</span> |
| <span class="source-line-no">879</span><span id="line-879"> System.arraycopy(cell.getTagsArray(), cell.getTagsOffset(), destination, destinationOffset,</span> |
| <span class="source-line-no">880</span><span id="line-880"> tlen);</span> |
| <span class="source-line-no">881</span><span id="line-881"> }</span> |
| <span class="source-line-no">882</span><span id="line-882"> return destinationOffset + tlen;</span> |
| <span class="source-line-no">883</span><span id="line-883"> }</span> |
| <span class="source-line-no">884</span><span id="line-884"></span> |
| <span class="source-line-no">885</span><span id="line-885"> /** Copies the tags info into the tag portion of the cell */</span> |
| <span class="source-line-no">886</span><span id="line-886"> public static int copyTagsTo(Cell cell, ByteBuffer destination, int destinationOffset) {</span> |
| <span class="source-line-no">887</span><span id="line-887"> int tlen = cell.getTagsLength();</span> |
| <span class="source-line-no">888</span><span id="line-888"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">889</span><span id="line-889"> ByteBufferUtils.copyFromBufferToBuffer(((ByteBufferExtendedCell) cell).getTagsByteBuffer(),</span> |
| <span class="source-line-no">890</span><span id="line-890"> destination, ((ByteBufferExtendedCell) cell).getTagsPosition(), destinationOffset, tlen);</span> |
| <span class="source-line-no">891</span><span id="line-891"> } else {</span> |
| <span class="source-line-no">892</span><span id="line-892"> ByteBufferUtils.copyFromArrayToBuffer(destination, destinationOffset, cell.getTagsArray(),</span> |
| <span class="source-line-no">893</span><span id="line-893"> cell.getTagsOffset(), tlen);</span> |
| <span class="source-line-no">894</span><span id="line-894"> }</span> |
| <span class="source-line-no">895</span><span id="line-895"> return destinationOffset + tlen;</span> |
| <span class="source-line-no">896</span><span id="line-896"> }</span> |
| <span class="source-line-no">897</span><span id="line-897"></span> |
| <span class="source-line-no">898</span><span id="line-898"> /**</span> |
| <span class="source-line-no">899</span><span id="line-899"> * Return tags in the given Cell as a List</span> |
| <span class="source-line-no">900</span><span id="line-900"> * @param cell The Cell</span> |
| <span class="source-line-no">901</span><span id="line-901"> * @return Tags in the given Cell as a List</span> |
| <span class="source-line-no">902</span><span id="line-902"> */</span> |
| <span class="source-line-no">903</span><span id="line-903"> public static List<Tag> getTags(Cell cell) {</span> |
| <span class="source-line-no">904</span><span id="line-904"> List<Tag> tags = new ArrayList<>();</span> |
| <span class="source-line-no">905</span><span id="line-905"> Iterator<Tag> tagsItr = tagsIterator(cell);</span> |
| <span class="source-line-no">906</span><span id="line-906"> while (tagsItr.hasNext()) {</span> |
| <span class="source-line-no">907</span><span id="line-907"> tags.add(tagsItr.next());</span> |
| <span class="source-line-no">908</span><span id="line-908"> }</span> |
| <span class="source-line-no">909</span><span id="line-909"> return tags;</span> |
| <span class="source-line-no">910</span><span id="line-910"> }</span> |
| <span class="source-line-no">911</span><span id="line-911"></span> |
| <span class="source-line-no">912</span><span id="line-912"> /**</span> |
| <span class="source-line-no">913</span><span id="line-913"> * Retrieve Cell's first tag, matching the passed in type</span> |
| <span class="source-line-no">914</span><span id="line-914"> * @param cell The Cell</span> |
| <span class="source-line-no">915</span><span id="line-915"> * @param type Type of the Tag to retrieve</span> |
| <span class="source-line-no">916</span><span id="line-916"> * @return Optional, empty if there is no tag of the passed in tag type</span> |
| <span class="source-line-no">917</span><span id="line-917"> */</span> |
| <span class="source-line-no">918</span><span id="line-918"> public static Optional<Tag> getTag(Cell cell, byte type) {</span> |
| <span class="source-line-no">919</span><span id="line-919"> boolean bufferBacked = cell instanceof ByteBufferExtendedCell;</span> |
| <span class="source-line-no">920</span><span id="line-920"> int length = cell.getTagsLength();</span> |
| <span class="source-line-no">921</span><span id="line-921"> int offset =</span> |
| <span class="source-line-no">922</span><span id="line-922"> bufferBacked ? ((ByteBufferExtendedCell) cell).getTagsPosition() : cell.getTagsOffset();</span> |
| <span class="source-line-no">923</span><span id="line-923"> int pos = offset;</span> |
| <span class="source-line-no">924</span><span id="line-924"> while (pos < offset + length) {</span> |
| <span class="source-line-no">925</span><span id="line-925"> int tagLen;</span> |
| <span class="source-line-no">926</span><span id="line-926"> if (bufferBacked) {</span> |
| <span class="source-line-no">927</span><span id="line-927"> ByteBuffer tagsBuffer = ((ByteBufferExtendedCell) cell).getTagsByteBuffer();</span> |
| <span class="source-line-no">928</span><span id="line-928"> tagLen = ByteBufferUtils.readAsInt(tagsBuffer, pos, TAG_LENGTH_SIZE);</span> |
| <span class="source-line-no">929</span><span id="line-929"> if (ByteBufferUtils.toByte(tagsBuffer, pos + TAG_LENGTH_SIZE) == type) {</span> |
| <span class="source-line-no">930</span><span id="line-930"> return Optional.of(new ByteBufferTag(tagsBuffer, pos, tagLen + TAG_LENGTH_SIZE));</span> |
| <span class="source-line-no">931</span><span id="line-931"> }</span> |
| <span class="source-line-no">932</span><span id="line-932"> } else {</span> |
| <span class="source-line-no">933</span><span id="line-933"> tagLen = Bytes.readAsInt(cell.getTagsArray(), pos, TAG_LENGTH_SIZE);</span> |
| <span class="source-line-no">934</span><span id="line-934"> if (cell.getTagsArray()[pos + TAG_LENGTH_SIZE] == type) {</span> |
| <span class="source-line-no">935</span><span id="line-935"> return Optional</span> |
| <span class="source-line-no">936</span><span id="line-936"> .of(new ArrayBackedTag(cell.getTagsArray(), pos, tagLen + TAG_LENGTH_SIZE));</span> |
| <span class="source-line-no">937</span><span id="line-937"> }</span> |
| <span class="source-line-no">938</span><span id="line-938"> }</span> |
| <span class="source-line-no">939</span><span id="line-939"> pos += TAG_LENGTH_SIZE + tagLen;</span> |
| <span class="source-line-no">940</span><span id="line-940"> }</span> |
| <span class="source-line-no">941</span><span id="line-941"> return Optional.empty();</span> |
| <span class="source-line-no">942</span><span id="line-942"> }</span> |
| <span class="source-line-no">943</span><span id="line-943"></span> |
| <span class="source-line-no">944</span><span id="line-944"> /**</span> |
| <span class="source-line-no">945</span><span id="line-945"> * Utility method to iterate through the tags in the given cell.</span> |
| <span class="source-line-no">946</span><span id="line-946"> * @param cell The Cell over which tags iterator is needed.</span> |
| <span class="source-line-no">947</span><span id="line-947"> * @return iterator for the tags</span> |
| <span class="source-line-no">948</span><span id="line-948"> */</span> |
| <span class="source-line-no">949</span><span id="line-949"> public static Iterator<Tag> tagsIterator(final Cell cell) {</span> |
| <span class="source-line-no">950</span><span id="line-950"> final int tagsLength = cell.getTagsLength();</span> |
| <span class="source-line-no">951</span><span id="line-951"> // Save an object allocation where we can</span> |
| <span class="source-line-no">952</span><span id="line-952"> if (tagsLength == 0) {</span> |
| <span class="source-line-no">953</span><span id="line-953"> return TagUtil.EMPTY_TAGS_ITR;</span> |
| <span class="source-line-no">954</span><span id="line-954"> }</span> |
| <span class="source-line-no">955</span><span id="line-955"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">956</span><span id="line-956"> return tagsIterator(((ByteBufferExtendedCell) cell).getTagsByteBuffer(),</span> |
| <span class="source-line-no">957</span><span id="line-957"> ((ByteBufferExtendedCell) cell).getTagsPosition(), tagsLength);</span> |
| <span class="source-line-no">958</span><span id="line-958"> }</span> |
| <span class="source-line-no">959</span><span id="line-959"></span> |
| <span class="source-line-no">960</span><span id="line-960"> return new Iterator<Tag>() {</span> |
| <span class="source-line-no">961</span><span id="line-961"> private int offset = cell.getTagsOffset();</span> |
| <span class="source-line-no">962</span><span id="line-962"> private int pos = offset;</span> |
| <span class="source-line-no">963</span><span id="line-963"> private int endOffset = offset + cell.getTagsLength() - 1;</span> |
| <span class="source-line-no">964</span><span id="line-964"></span> |
| <span class="source-line-no">965</span><span id="line-965"> @Override</span> |
| <span class="source-line-no">966</span><span id="line-966"> public boolean hasNext() {</span> |
| <span class="source-line-no">967</span><span id="line-967"> return this.pos < endOffset;</span> |
| <span class="source-line-no">968</span><span id="line-968"> }</span> |
| <span class="source-line-no">969</span><span id="line-969"></span> |
| <span class="source-line-no">970</span><span id="line-970"> @Override</span> |
| <span class="source-line-no">971</span><span id="line-971"> public Tag next() {</span> |
| <span class="source-line-no">972</span><span id="line-972"> if (hasNext()) {</span> |
| <span class="source-line-no">973</span><span id="line-973"> byte[] tags = cell.getTagsArray();</span> |
| <span class="source-line-no">974</span><span id="line-974"> int curTagLen = Bytes.readAsInt(tags, this.pos, Tag.TAG_LENGTH_SIZE);</span> |
| <span class="source-line-no">975</span><span id="line-975"> Tag tag = new ArrayBackedTag(tags, pos, curTagLen + TAG_LENGTH_SIZE);</span> |
| <span class="source-line-no">976</span><span id="line-976"> this.pos += Bytes.SIZEOF_SHORT + curTagLen;</span> |
| <span class="source-line-no">977</span><span id="line-977"> return tag;</span> |
| <span class="source-line-no">978</span><span id="line-978"> }</span> |
| <span class="source-line-no">979</span><span id="line-979"> return null;</span> |
| <span class="source-line-no">980</span><span id="line-980"> }</span> |
| <span class="source-line-no">981</span><span id="line-981"></span> |
| <span class="source-line-no">982</span><span id="line-982"> @Override</span> |
| <span class="source-line-no">983</span><span id="line-983"> public void remove() {</span> |
| <span class="source-line-no">984</span><span id="line-984"> throw new UnsupportedOperationException();</span> |
| <span class="source-line-no">985</span><span id="line-985"> }</span> |
| <span class="source-line-no">986</span><span id="line-986"> };</span> |
| <span class="source-line-no">987</span><span id="line-987"> }</span> |
| <span class="source-line-no">988</span><span id="line-988"></span> |
| <span class="source-line-no">989</span><span id="line-989"> public static Iterator<Tag> tagsIterator(final ByteBuffer tags, final int offset,</span> |
| <span class="source-line-no">990</span><span id="line-990"> final int length) {</span> |
| <span class="source-line-no">991</span><span id="line-991"> return new Iterator<Tag>() {</span> |
| <span class="source-line-no">992</span><span id="line-992"> private int pos = offset;</span> |
| <span class="source-line-no">993</span><span id="line-993"> private int endOffset = offset + length - 1;</span> |
| <span class="source-line-no">994</span><span id="line-994"></span> |
| <span class="source-line-no">995</span><span id="line-995"> @Override</span> |
| <span class="source-line-no">996</span><span id="line-996"> public boolean hasNext() {</span> |
| <span class="source-line-no">997</span><span id="line-997"> return this.pos < endOffset;</span> |
| <span class="source-line-no">998</span><span id="line-998"> }</span> |
| <span class="source-line-no">999</span><span id="line-999"></span> |
| <span class="source-line-no">1000</span><span id="line-1000"> @Override</span> |
| <span class="source-line-no">1001</span><span id="line-1001"> public Tag next() {</span> |
| <span class="source-line-no">1002</span><span id="line-1002"> if (hasNext()) {</span> |
| <span class="source-line-no">1003</span><span id="line-1003"> int curTagLen = ByteBufferUtils.readAsInt(tags, this.pos, Tag.TAG_LENGTH_SIZE);</span> |
| <span class="source-line-no">1004</span><span id="line-1004"> Tag tag = new ByteBufferTag(tags, pos, curTagLen + Tag.TAG_LENGTH_SIZE);</span> |
| <span class="source-line-no">1005</span><span id="line-1005"> this.pos += Bytes.SIZEOF_SHORT + curTagLen;</span> |
| <span class="source-line-no">1006</span><span id="line-1006"> return tag;</span> |
| <span class="source-line-no">1007</span><span id="line-1007"> }</span> |
| <span class="source-line-no">1008</span><span id="line-1008"> return null;</span> |
| <span class="source-line-no">1009</span><span id="line-1009"> }</span> |
| <span class="source-line-no">1010</span><span id="line-1010"></span> |
| <span class="source-line-no">1011</span><span id="line-1011"> @Override</span> |
| <span class="source-line-no">1012</span><span id="line-1012"> public void remove() {</span> |
| <span class="source-line-no">1013</span><span id="line-1013"> throw new UnsupportedOperationException();</span> |
| <span class="source-line-no">1014</span><span id="line-1014"> }</span> |
| <span class="source-line-no">1015</span><span id="line-1015"> };</span> |
| <span class="source-line-no">1016</span><span id="line-1016"> }</span> |
| <span class="source-line-no">1017</span><span id="line-1017"></span> |
| <span class="source-line-no">1018</span><span id="line-1018"> /**</span> |
| <span class="source-line-no">1019</span><span id="line-1019"> * Returns true if the first range start1...end1 overlaps with the second range start2...end2,</span> |
| <span class="source-line-no">1020</span><span id="line-1020"> * assuming the byte arrays represent row keys</span> |
| <span class="source-line-no">1021</span><span id="line-1021"> */</span> |
| <span class="source-line-no">1022</span><span id="line-1022"> public static boolean overlappingKeys(final byte[] start1, final byte[] end1, final byte[] start2,</span> |
| <span class="source-line-no">1023</span><span id="line-1023"> final byte[] end2) {</span> |
| <span class="source-line-no">1024</span><span id="line-1024"> return (end2.length == 0 || start1.length == 0 || Bytes.compareTo(start1, end2) < 0)</span> |
| <span class="source-line-no">1025</span><span id="line-1025"> && (end1.length == 0 || start2.length == 0 || Bytes.compareTo(start2, end1) < 0);</span> |
| <span class="source-line-no">1026</span><span id="line-1026"> }</span> |
| <span class="source-line-no">1027</span><span id="line-1027"></span> |
| <span class="source-line-no">1028</span><span id="line-1028"> /** Write rowkey excluding the common part. */</span> |
| <span class="source-line-no">1029</span><span id="line-1029"> public static void writeRowKeyExcludingCommon(Cell cell, short rLen, int commonPrefix,</span> |
| <span class="source-line-no">1030</span><span id="line-1030"> DataOutputStream out) throws IOException {</span> |
| <span class="source-line-no">1031</span><span id="line-1031"> if (commonPrefix == 0) {</span> |
| <span class="source-line-no">1032</span><span id="line-1032"> out.writeShort(rLen);</span> |
| <span class="source-line-no">1033</span><span id="line-1033"> } else if (commonPrefix == 1) {</span> |
| <span class="source-line-no">1034</span><span id="line-1034"> out.writeByte((byte) rLen);</span> |
| <span class="source-line-no">1035</span><span id="line-1035"> commonPrefix--;</span> |
| <span class="source-line-no">1036</span><span id="line-1036"> } else {</span> |
| <span class="source-line-no">1037</span><span id="line-1037"> commonPrefix -= KeyValue.ROW_LENGTH_SIZE;</span> |
| <span class="source-line-no">1038</span><span id="line-1038"> }</span> |
| <span class="source-line-no">1039</span><span id="line-1039"> if (rLen > commonPrefix) {</span> |
| <span class="source-line-no">1040</span><span id="line-1040"> writeRowSkippingBytes(out, cell, rLen, commonPrefix);</span> |
| <span class="source-line-no">1041</span><span id="line-1041"> }</span> |
| <span class="source-line-no">1042</span><span id="line-1042"> }</span> |
| <span class="source-line-no">1043</span><span id="line-1043"></span> |
| <span class="source-line-no">1044</span><span id="line-1044"> /**</span> |
| <span class="source-line-no">1045</span><span id="line-1045"> * Writes the row from the given cell to the output stream excluding the common prefix</span> |
| <span class="source-line-no">1046</span><span id="line-1046"> * @param out The dataoutputstream to which the data has to be written</span> |
| <span class="source-line-no">1047</span><span id="line-1047"> * @param cell The cell whose contents has to be written</span> |
| <span class="source-line-no">1048</span><span id="line-1048"> * @param rlength the row length</span> |
| <span class="source-line-no">1049</span><span id="line-1049"> */</span> |
| <span class="source-line-no">1050</span><span id="line-1050"> public static void writeRowSkippingBytes(DataOutputStream out, Cell cell, short rlength,</span> |
| <span class="source-line-no">1051</span><span id="line-1051"> int commonPrefix) throws IOException {</span> |
| <span class="source-line-no">1052</span><span id="line-1052"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">1053</span><span id="line-1053"> ByteBufferUtils.copyBufferToStream((DataOutput) out,</span> |
| <span class="source-line-no">1054</span><span id="line-1054"> ((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">1055</span><span id="line-1055"> ((ByteBufferExtendedCell) cell).getRowPosition() + commonPrefix, rlength - commonPrefix);</span> |
| <span class="source-line-no">1056</span><span id="line-1056"> } else {</span> |
| <span class="source-line-no">1057</span><span id="line-1057"> out.write(cell.getRowArray(), cell.getRowOffset() + commonPrefix, rlength - commonPrefix);</span> |
| <span class="source-line-no">1058</span><span id="line-1058"> }</span> |
| <span class="source-line-no">1059</span><span id="line-1059"> }</span> |
| <span class="source-line-no">1060</span><span id="line-1060"></span> |
| <span class="source-line-no">1061</span><span id="line-1061"> /**</span> |
| <span class="source-line-no">1062</span><span id="line-1062"> * Find length of common prefix in keys of the cells, considering key as byte[] if serialized in</span> |
| <span class="source-line-no">1063</span><span id="line-1063"> * {@link KeyValue}. The key format is &lt;2 bytes rk len&gt;&lt;rk&gt;&lt;1 byte cf</span> |
| <span class="source-line-no">1064</span><span id="line-1064"> * len&gt;&lt;cf&gt;&lt;qualifier&gt;&lt;8 bytes timestamp&gt;&lt;1 byte type&gt;</span> |
| <span class="source-line-no">1065</span><span id="line-1065"> * @param c1 the cell</span> |
| <span class="source-line-no">1066</span><span id="line-1066"> * @param c2 the cell</span> |
| <span class="source-line-no">1067</span><span id="line-1067"> * @param bypassFamilyCheck when true assume the family bytes same in both cells. Pass it as true</span> |
| <span class="source-line-no">1068</span><span id="line-1068"> * when dealing with Cells in same CF so as to avoid some checks</span> |
| <span class="source-line-no">1069</span><span id="line-1069"> * @param withTsType when true check timestamp and type bytes also.</span> |
| <span class="source-line-no">1070</span><span id="line-1070"> * @return length of common prefix</span> |
| <span class="source-line-no">1071</span><span id="line-1071"> */</span> |
| <span class="source-line-no">1072</span><span id="line-1072"> public static int findCommonPrefixInFlatKey(Cell c1, Cell c2, boolean bypassFamilyCheck,</span> |
| <span class="source-line-no">1073</span><span id="line-1073"> boolean withTsType) {</span> |
| <span class="source-line-no">1074</span><span id="line-1074"> // Compare the 2 bytes in RK length part</span> |
| <span class="source-line-no">1075</span><span id="line-1075"> short rLen1 = c1.getRowLength();</span> |
| <span class="source-line-no">1076</span><span id="line-1076"> short rLen2 = c2.getRowLength();</span> |
| <span class="source-line-no">1077</span><span id="line-1077"> int commonPrefix = KeyValue.ROW_LENGTH_SIZE;</span> |
| <span class="source-line-no">1078</span><span id="line-1078"> if (rLen1 != rLen2) {</span> |
| <span class="source-line-no">1079</span><span id="line-1079"> // early out when the RK length itself is not matching</span> |
| <span class="source-line-no">1080</span><span id="line-1080"> return ByteBufferUtils.findCommonPrefix(Bytes.toBytes(rLen1), 0, KeyValue.ROW_LENGTH_SIZE,</span> |
| <span class="source-line-no">1081</span><span id="line-1081"> Bytes.toBytes(rLen2), 0, KeyValue.ROW_LENGTH_SIZE);</span> |
| <span class="source-line-no">1082</span><span id="line-1082"> }</span> |
| <span class="source-line-no">1083</span><span id="line-1083"> // Compare the RKs</span> |
| <span class="source-line-no">1084</span><span id="line-1084"> int rkCommonPrefix = 0;</span> |
| <span class="source-line-no">1085</span><span id="line-1085"> if (c1 instanceof ByteBufferExtendedCell && c2 instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">1086</span><span id="line-1086"> rkCommonPrefix =</span> |
| <span class="source-line-no">1087</span><span id="line-1087"> ByteBufferUtils.findCommonPrefix(((ByteBufferExtendedCell) c1).getRowByteBuffer(),</span> |
| <span class="source-line-no">1088</span><span id="line-1088"> ((ByteBufferExtendedCell) c1).getRowPosition(), rLen1,</span> |
| <span class="source-line-no">1089</span><span id="line-1089"> ((ByteBufferExtendedCell) c2).getRowByteBuffer(),</span> |
| <span class="source-line-no">1090</span><span id="line-1090"> ((ByteBufferExtendedCell) c2).getRowPosition(), rLen2);</span> |
| <span class="source-line-no">1091</span><span id="line-1091"> } else {</span> |
| <span class="source-line-no">1092</span><span id="line-1092"> // There cannot be a case where one cell is BBCell and other is KeyValue. This flow comes</span> |
| <span class="source-line-no">1093</span><span id="line-1093"> // either</span> |
| <span class="source-line-no">1094</span><span id="line-1094"> // in flush or compactions. In flushes both cells are KV and in case of compaction it will be</span> |
| <span class="source-line-no">1095</span><span id="line-1095"> // either</span> |
| <span class="source-line-no">1096</span><span id="line-1096"> // KV or BBCell</span> |
| <span class="source-line-no">1097</span><span id="line-1097"> rkCommonPrefix = ByteBufferUtils.findCommonPrefix(c1.getRowArray(), c1.getRowOffset(), rLen1,</span> |
| <span class="source-line-no">1098</span><span id="line-1098"> c2.getRowArray(), c2.getRowOffset(), rLen2);</span> |
| <span class="source-line-no">1099</span><span id="line-1099"> }</span> |
| <span class="source-line-no">1100</span><span id="line-1100"> commonPrefix += rkCommonPrefix;</span> |
| <span class="source-line-no">1101</span><span id="line-1101"> if (rkCommonPrefix != rLen1) {</span> |
| <span class="source-line-no">1102</span><span id="line-1102"> // Early out when RK is not fully matching.</span> |
| <span class="source-line-no">1103</span><span id="line-1103"> return commonPrefix;</span> |
| <span class="source-line-no">1104</span><span id="line-1104"> }</span> |
| <span class="source-line-no">1105</span><span id="line-1105"> // Compare 1 byte CF length part</span> |
| <span class="source-line-no">1106</span><span id="line-1106"> byte fLen1 = c1.getFamilyLength();</span> |
| <span class="source-line-no">1107</span><span id="line-1107"> if (bypassFamilyCheck) {</span> |
| <span class="source-line-no">1108</span><span id="line-1108"> // This flag will be true when caller is sure that the family will be same for both the cells</span> |
| <span class="source-line-no">1109</span><span id="line-1109"> // Just make commonPrefix to increment by the family part</span> |
| <span class="source-line-no">1110</span><span id="line-1110"> commonPrefix += KeyValue.FAMILY_LENGTH_SIZE + fLen1;</span> |
| <span class="source-line-no">1111</span><span id="line-1111"> } else {</span> |
| <span class="source-line-no">1112</span><span id="line-1112"> byte fLen2 = c2.getFamilyLength();</span> |
| <span class="source-line-no">1113</span><span id="line-1113"> if (fLen1 != fLen2) {</span> |
| <span class="source-line-no">1114</span><span id="line-1114"> // early out when the CF length itself is not matching</span> |
| <span class="source-line-no">1115</span><span id="line-1115"> return commonPrefix;</span> |
| <span class="source-line-no">1116</span><span id="line-1116"> }</span> |
| <span class="source-line-no">1117</span><span id="line-1117"> // CF lengths are same so there is one more byte common in key part</span> |
| <span class="source-line-no">1118</span><span id="line-1118"> commonPrefix += KeyValue.FAMILY_LENGTH_SIZE;</span> |
| <span class="source-line-no">1119</span><span id="line-1119"> // Compare the CF names</span> |
| <span class="source-line-no">1120</span><span id="line-1120"> int fCommonPrefix;</span> |
| <span class="source-line-no">1121</span><span id="line-1121"> if (c1 instanceof ByteBufferExtendedCell && c2 instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">1122</span><span id="line-1122"> fCommonPrefix =</span> |
| <span class="source-line-no">1123</span><span id="line-1123"> ByteBufferUtils.findCommonPrefix(((ByteBufferExtendedCell) c1).getFamilyByteBuffer(),</span> |
| <span class="source-line-no">1124</span><span id="line-1124"> ((ByteBufferExtendedCell) c1).getFamilyPosition(), fLen1,</span> |
| <span class="source-line-no">1125</span><span id="line-1125"> ((ByteBufferExtendedCell) c2).getFamilyByteBuffer(),</span> |
| <span class="source-line-no">1126</span><span id="line-1126"> ((ByteBufferExtendedCell) c2).getFamilyPosition(), fLen2);</span> |
| <span class="source-line-no">1127</span><span id="line-1127"> } else {</span> |
| <span class="source-line-no">1128</span><span id="line-1128"> fCommonPrefix = ByteBufferUtils.findCommonPrefix(c1.getFamilyArray(), c1.getFamilyOffset(),</span> |
| <span class="source-line-no">1129</span><span id="line-1129"> fLen1, c2.getFamilyArray(), c2.getFamilyOffset(), fLen2);</span> |
| <span class="source-line-no">1130</span><span id="line-1130"> }</span> |
| <span class="source-line-no">1131</span><span id="line-1131"> commonPrefix += fCommonPrefix;</span> |
| <span class="source-line-no">1132</span><span id="line-1132"> if (fCommonPrefix != fLen1) {</span> |
| <span class="source-line-no">1133</span><span id="line-1133"> return commonPrefix;</span> |
| <span class="source-line-no">1134</span><span id="line-1134"> }</span> |
| <span class="source-line-no">1135</span><span id="line-1135"> }</span> |
| <span class="source-line-no">1136</span><span id="line-1136"> // Compare the Qualifiers</span> |
| <span class="source-line-no">1137</span><span id="line-1137"> int qLen1 = c1.getQualifierLength();</span> |
| <span class="source-line-no">1138</span><span id="line-1138"> int qLen2 = c2.getQualifierLength();</span> |
| <span class="source-line-no">1139</span><span id="line-1139"> int qCommon;</span> |
| <span class="source-line-no">1140</span><span id="line-1140"> if (c1 instanceof ByteBufferExtendedCell && c2 instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">1141</span><span id="line-1141"> qCommon =</span> |
| <span class="source-line-no">1142</span><span id="line-1142"> ByteBufferUtils.findCommonPrefix(((ByteBufferExtendedCell) c1).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">1143</span><span id="line-1143"> ((ByteBufferExtendedCell) c1).getQualifierPosition(), qLen1,</span> |
| <span class="source-line-no">1144</span><span id="line-1144"> ((ByteBufferExtendedCell) c2).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">1145</span><span id="line-1145"> ((ByteBufferExtendedCell) c2).getQualifierPosition(), qLen2);</span> |
| <span class="source-line-no">1146</span><span id="line-1146"> } else {</span> |
| <span class="source-line-no">1147</span><span id="line-1147"> qCommon = ByteBufferUtils.findCommonPrefix(c1.getQualifierArray(), c1.getQualifierOffset(),</span> |
| <span class="source-line-no">1148</span><span id="line-1148"> qLen1, c2.getQualifierArray(), c2.getQualifierOffset(), qLen2);</span> |
| <span class="source-line-no">1149</span><span id="line-1149"> }</span> |
| <span class="source-line-no">1150</span><span id="line-1150"> commonPrefix += qCommon;</span> |
| <span class="source-line-no">1151</span><span id="line-1151"> if (!withTsType || Math.max(qLen1, qLen2) != qCommon) {</span> |
| <span class="source-line-no">1152</span><span id="line-1152"> return commonPrefix;</span> |
| <span class="source-line-no">1153</span><span id="line-1153"> }</span> |
| <span class="source-line-no">1154</span><span id="line-1154"> // Compare the timestamp parts</span> |
| <span class="source-line-no">1155</span><span id="line-1155"> int tsCommonPrefix = ByteBufferUtils.findCommonPrefix(Bytes.toBytes(c1.getTimestamp()), 0,</span> |
| <span class="source-line-no">1156</span><span id="line-1156"> KeyValue.TIMESTAMP_SIZE, Bytes.toBytes(c2.getTimestamp()), 0, KeyValue.TIMESTAMP_SIZE);</span> |
| <span class="source-line-no">1157</span><span id="line-1157"> commonPrefix += tsCommonPrefix;</span> |
| <span class="source-line-no">1158</span><span id="line-1158"> if (tsCommonPrefix != KeyValue.TIMESTAMP_SIZE) {</span> |
| <span class="source-line-no">1159</span><span id="line-1159"> return commonPrefix;</span> |
| <span class="source-line-no">1160</span><span id="line-1160"> }</span> |
| <span class="source-line-no">1161</span><span id="line-1161"> // Compare the type</span> |
| <span class="source-line-no">1162</span><span id="line-1162"> if (c1.getTypeByte() == c2.getTypeByte()) {</span> |
| <span class="source-line-no">1163</span><span id="line-1163"> commonPrefix += KeyValue.TYPE_SIZE;</span> |
| <span class="source-line-no">1164</span><span id="line-1164"> }</span> |
| <span class="source-line-no">1165</span><span id="line-1165"> return commonPrefix;</span> |
| <span class="source-line-no">1166</span><span id="line-1166"> }</span> |
| <span class="source-line-no">1167</span><span id="line-1167"></span> |
| <span class="source-line-no">1168</span><span id="line-1168"> /**</span> |
| <span class="source-line-no">1169</span><span id="line-1169"> * Used to compare two cells based on the column hint provided. This is specifically used when we</span> |
| <span class="source-line-no">1170</span><span id="line-1170"> * need to optimize the seeks based on the next indexed key. This is an advanced usage API</span> |
| <span class="source-line-no">1171</span><span id="line-1171"> * specifically needed for some optimizations.</span> |
| <span class="source-line-no">1172</span><span id="line-1172"> * @param nextIndexedCell the next indexed cell</span> |
| <span class="source-line-no">1173</span><span id="line-1173"> * @param currentCell the cell to be compared</span> |
| <span class="source-line-no">1174</span><span id="line-1174"> * @param foff the family offset of the currentCell</span> |
| <span class="source-line-no">1175</span><span id="line-1175"> * @param flen the family length of the currentCell</span> |
| <span class="source-line-no">1176</span><span id="line-1176"> * @param colHint the column hint provided - could be null</span> |
| <span class="source-line-no">1177</span><span id="line-1177"> * @param coff the offset of the column hint if provided, if not offset of the</span> |
| <span class="source-line-no">1178</span><span id="line-1178"> * currentCell's qualifier</span> |
| <span class="source-line-no">1179</span><span id="line-1179"> * @param clen the length of the column hint if provided, if not length of the</span> |
| <span class="source-line-no">1180</span><span id="line-1180"> * currentCell's qualifier</span> |
| <span class="source-line-no">1181</span><span id="line-1181"> * @param ts the timestamp to be seeked</span> |
| <span class="source-line-no">1182</span><span id="line-1182"> * @param type the type to be seeked</span> |
| <span class="source-line-no">1183</span><span id="line-1183"> * @return an int based on the given column hint TODO : To be moved out of here because this is a</span> |
| <span class="source-line-no">1184</span><span id="line-1184"> * special API used in scan optimization.</span> |
| <span class="source-line-no">1185</span><span id="line-1185"> */</span> |
| <span class="source-line-no">1186</span><span id="line-1186"> // compare a key against row/fam/qual/ts/type</span> |
| <span class="source-line-no">1187</span><span id="line-1187"> public static final int compareKeyBasedOnColHint(CellComparator comparator,</span> |
| <span class="source-line-no">1188</span><span id="line-1188"> ExtendedCell nextIndexedCell, ExtendedCell currentCell, int foff, int flen, byte[] colHint,</span> |
| <span class="source-line-no">1189</span><span id="line-1189"> int coff, int clen, long ts, byte type) {</span> |
| <span class="source-line-no">1190</span><span id="line-1190"> int compare = comparator.compareRows(nextIndexedCell, currentCell);</span> |
| <span class="source-line-no">1191</span><span id="line-1191"> if (compare != 0) {</span> |
| <span class="source-line-no">1192</span><span id="line-1192"> return compare;</span> |
| <span class="source-line-no">1193</span><span id="line-1193"> }</span> |
| <span class="source-line-no">1194</span><span id="line-1194"> // If the column is not specified, the "minimum" key type appears the</span> |
| <span class="source-line-no">1195</span><span id="line-1195"> // latest in the sorted order, regardless of the timestamp. This is used</span> |
| <span class="source-line-no">1196</span><span id="line-1196"> // for specifying the last key/value in a given row, because there is no</span> |
| <span class="source-line-no">1197</span><span id="line-1197"> // "lexicographically last column" (it would be infinitely long). The</span> |
| <span class="source-line-no">1198</span><span id="line-1198"> // "maximum" key type does not need this behavior.</span> |
| <span class="source-line-no">1199</span><span id="line-1199"> if (</span> |
| <span class="source-line-no">1200</span><span id="line-1200"> nextIndexedCell.getFamilyLength() + nextIndexedCell.getQualifierLength() == 0</span> |
| <span class="source-line-no">1201</span><span id="line-1201"> && nextIndexedCell.getTypeByte() == KeyValue.Type.Minimum.getCode()</span> |
| <span class="source-line-no">1202</span><span id="line-1202"> ) {</span> |
| <span class="source-line-no">1203</span><span id="line-1203"> // left is "bigger", i.e. it appears later in the sorted order</span> |
| <span class="source-line-no">1204</span><span id="line-1204"> return 1;</span> |
| <span class="source-line-no">1205</span><span id="line-1205"> }</span> |
| <span class="source-line-no">1206</span><span id="line-1206"> if (flen + clen == 0 && type == KeyValue.Type.Minimum.getCode()) {</span> |
| <span class="source-line-no">1207</span><span id="line-1207"> return -1;</span> |
| <span class="source-line-no">1208</span><span id="line-1208"> }</span> |
| <span class="source-line-no">1209</span><span id="line-1209"></span> |
| <span class="source-line-no">1210</span><span id="line-1210"> compare = comparator.compareFamilies(nextIndexedCell, currentCell);</span> |
| <span class="source-line-no">1211</span><span id="line-1211"> if (compare != 0) {</span> |
| <span class="source-line-no">1212</span><span id="line-1212"> return compare;</span> |
| <span class="source-line-no">1213</span><span id="line-1213"> }</span> |
| <span class="source-line-no">1214</span><span id="line-1214"> if (colHint == null) {</span> |
| <span class="source-line-no">1215</span><span id="line-1215"> compare = comparator.compareQualifiers(nextIndexedCell, currentCell);</span> |
| <span class="source-line-no">1216</span><span id="line-1216"> } else {</span> |
| <span class="source-line-no">1217</span><span id="line-1217"> compare = CellUtil.compareQualifiers(nextIndexedCell, colHint, coff, clen);</span> |
| <span class="source-line-no">1218</span><span id="line-1218"> }</span> |
| <span class="source-line-no">1219</span><span id="line-1219"> if (compare != 0) {</span> |
| <span class="source-line-no">1220</span><span id="line-1220"> return compare;</span> |
| <span class="source-line-no">1221</span><span id="line-1221"> }</span> |
| <span class="source-line-no">1222</span><span id="line-1222"> // Next compare timestamps.</span> |
| <span class="source-line-no">1223</span><span id="line-1223"> compare = comparator.compareTimestamps(nextIndexedCell.getTimestamp(), ts);</span> |
| <span class="source-line-no">1224</span><span id="line-1224"> if (compare != 0) {</span> |
| <span class="source-line-no">1225</span><span id="line-1225"> return compare;</span> |
| <span class="source-line-no">1226</span><span id="line-1226"> }</span> |
| <span class="source-line-no">1227</span><span id="line-1227"></span> |
| <span class="source-line-no">1228</span><span id="line-1228"> // Compare types. Let the delete types sort ahead of puts; i.e. types</span> |
| <span class="source-line-no">1229</span><span id="line-1229"> // of higher numbers sort before those of lesser numbers. Maximum (255)</span> |
| <span class="source-line-no">1230</span><span id="line-1230"> // appears ahead of everything, and minimum (0) appears after</span> |
| <span class="source-line-no">1231</span><span id="line-1231"> // everything.</span> |
| <span class="source-line-no">1232</span><span id="line-1232"> return (0xff & type) - (0xff & nextIndexedCell.getTypeByte());</span> |
| <span class="source-line-no">1233</span><span id="line-1233"> }</span> |
| <span class="source-line-no">1234</span><span id="line-1234"></span> |
| <span class="source-line-no">1235</span><span id="line-1235"> /**</span> |
| <span class="source-line-no">1236</span><span id="line-1236"> * Compares only the key portion of a cell. It does not include the sequence id/mvcc of the cell</span> |
| <span class="source-line-no">1237</span><span id="line-1237"> * @return an int greater than 0 if left &gt; than right lesser than 0 if left &lt; than right</span> |
| <span class="source-line-no">1238</span><span id="line-1238"> * equal to 0 if left is equal to right</span> |
| <span class="source-line-no">1239</span><span id="line-1239"> */</span> |
| <span class="source-line-no">1240</span><span id="line-1240"> public static final int compareKeyIgnoresMvcc(CellComparator comparator, Cell left, Cell right) {</span> |
| <span class="source-line-no">1241</span><span id="line-1241"> return ((CellComparatorImpl) comparator).compare(left, right, true);</span> |
| <span class="source-line-no">1242</span><span id="line-1242"> }</span> |
| <span class="source-line-no">1243</span><span id="line-1243"></span> |
| <span class="source-line-no">1244</span><span id="line-1244"> /**</span> |
| <span class="source-line-no">1245</span><span id="line-1245"> * Compare cell's row against given comparator</span> |
| <span class="source-line-no">1246</span><span id="line-1246"> * @param cell the cell to use for comparison</span> |
| <span class="source-line-no">1247</span><span id="line-1247"> * @param comparator the {@link CellComparator} to use for comparison</span> |
| <span class="source-line-no">1248</span><span id="line-1248"> * @return result comparing cell's row</span> |
| <span class="source-line-no">1249</span><span id="line-1249"> */</span> |
| <span class="source-line-no">1250</span><span id="line-1250"> public static int compareRow(Cell cell, ByteArrayComparable comparator) {</span> |
| <span class="source-line-no">1251</span><span id="line-1251"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">1252</span><span id="line-1252"> return comparator.compareTo(((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">1253</span><span id="line-1253"> ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength());</span> |
| <span class="source-line-no">1254</span><span id="line-1254"> }</span> |
| <span class="source-line-no">1255</span><span id="line-1255"> return comparator.compareTo(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());</span> |
| <span class="source-line-no">1256</span><span id="line-1256"> }</span> |
| <span class="source-line-no">1257</span><span id="line-1257"></span> |
| <span class="source-line-no">1258</span><span id="line-1258"> /**</span> |
| <span class="source-line-no">1259</span><span id="line-1259"> * Compare cell's column family against given comparator</span> |
| <span class="source-line-no">1260</span><span id="line-1260"> * @param cell the cell to use for comparison</span> |
| <span class="source-line-no">1261</span><span id="line-1261"> * @param comparator the {@link CellComparator} to use for comparison</span> |
| <span class="source-line-no">1262</span><span id="line-1262"> * @return result comparing cell's column family</span> |
| <span class="source-line-no">1263</span><span id="line-1263"> */</span> |
| <span class="source-line-no">1264</span><span id="line-1264"> public static int compareFamily(Cell cell, ByteArrayComparable comparator) {</span> |
| <span class="source-line-no">1265</span><span id="line-1265"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">1266</span><span id="line-1266"> return comparator.compareTo(((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),</span> |
| <span class="source-line-no">1267</span><span id="line-1267"> ((ByteBufferExtendedCell) cell).getFamilyPosition(), cell.getFamilyLength());</span> |
| <span class="source-line-no">1268</span><span id="line-1268"> }</span> |
| <span class="source-line-no">1269</span><span id="line-1269"> return comparator.compareTo(cell.getFamilyArray(), cell.getFamilyOffset(),</span> |
| <span class="source-line-no">1270</span><span id="line-1270"> cell.getFamilyLength());</span> |
| <span class="source-line-no">1271</span><span id="line-1271"> }</span> |
| <span class="source-line-no">1272</span><span id="line-1272"></span> |
| <span class="source-line-no">1273</span><span id="line-1273"> /**</span> |
| <span class="source-line-no">1274</span><span id="line-1274"> * Compare cell's qualifier against given comparator</span> |
| <span class="source-line-no">1275</span><span id="line-1275"> * @param cell the cell to use for comparison</span> |
| <span class="source-line-no">1276</span><span id="line-1276"> * @param comparator the {@link CellComparator} to use for comparison</span> |
| <span class="source-line-no">1277</span><span id="line-1277"> * @return result comparing cell's qualifier</span> |
| <span class="source-line-no">1278</span><span id="line-1278"> */</span> |
| <span class="source-line-no">1279</span><span id="line-1279"> public static int compareQualifier(Cell cell, ByteArrayComparable comparator) {</span> |
| <span class="source-line-no">1280</span><span id="line-1280"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">1281</span><span id="line-1281"> return comparator.compareTo(((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">1282</span><span id="line-1282"> ((ByteBufferExtendedCell) cell).getQualifierPosition(), cell.getQualifierLength());</span> |
| <span class="source-line-no">1283</span><span id="line-1283"> }</span> |
| <span class="source-line-no">1284</span><span id="line-1284"> return comparator.compareTo(cell.getQualifierArray(), cell.getQualifierOffset(),</span> |
| <span class="source-line-no">1285</span><span id="line-1285"> cell.getQualifierLength());</span> |
| <span class="source-line-no">1286</span><span id="line-1286"> }</span> |
| <span class="source-line-no">1287</span><span id="line-1287"></span> |
| <span class="source-line-no">1288</span><span id="line-1288"> public static Cell.Type toType(byte type) {</span> |
| <span class="source-line-no">1289</span><span id="line-1289"> KeyValue.Type codeToType = KeyValue.Type.codeToType(type);</span> |
| <span class="source-line-no">1290</span><span id="line-1290"> switch (codeToType) {</span> |
| <span class="source-line-no">1291</span><span id="line-1291"> case Put:</span> |
| <span class="source-line-no">1292</span><span id="line-1292"> return Cell.Type.Put;</span> |
| <span class="source-line-no">1293</span><span id="line-1293"> case Delete:</span> |
| <span class="source-line-no">1294</span><span id="line-1294"> return Cell.Type.Delete;</span> |
| <span class="source-line-no">1295</span><span id="line-1295"> case DeleteColumn:</span> |
| <span class="source-line-no">1296</span><span id="line-1296"> return Cell.Type.DeleteColumn;</span> |
| <span class="source-line-no">1297</span><span id="line-1297"> case DeleteFamily:</span> |
| <span class="source-line-no">1298</span><span id="line-1298"> return Cell.Type.DeleteFamily;</span> |
| <span class="source-line-no">1299</span><span id="line-1299"> case DeleteFamilyVersion:</span> |
| <span class="source-line-no">1300</span><span id="line-1300"> return Cell.Type.DeleteFamilyVersion;</span> |
| <span class="source-line-no">1301</span><span id="line-1301"> default:</span> |
| <span class="source-line-no">1302</span><span id="line-1302"> throw new UnsupportedOperationException("Invalid type of cell " + type);</span> |
| <span class="source-line-no">1303</span><span id="line-1303"> }</span> |
| <span class="source-line-no">1304</span><span id="line-1304"> }</span> |
| <span class="source-line-no">1305</span><span id="line-1305"></span> |
| <span class="source-line-no">1306</span><span id="line-1306"> public static KeyValue.Type toTypeByte(Cell.Type type) {</span> |
| <span class="source-line-no">1307</span><span id="line-1307"> switch (type) {</span> |
| <span class="source-line-no">1308</span><span id="line-1308"> case Put:</span> |
| <span class="source-line-no">1309</span><span id="line-1309"> return KeyValue.Type.Put;</span> |
| <span class="source-line-no">1310</span><span id="line-1310"> case Delete:</span> |
| <span class="source-line-no">1311</span><span id="line-1311"> return KeyValue.Type.Delete;</span> |
| <span class="source-line-no">1312</span><span id="line-1312"> case DeleteColumn:</span> |
| <span class="source-line-no">1313</span><span id="line-1313"> return KeyValue.Type.DeleteColumn;</span> |
| <span class="source-line-no">1314</span><span id="line-1314"> case DeleteFamilyVersion:</span> |
| <span class="source-line-no">1315</span><span id="line-1315"> return KeyValue.Type.DeleteFamilyVersion;</span> |
| <span class="source-line-no">1316</span><span id="line-1316"> case DeleteFamily:</span> |
| <span class="source-line-no">1317</span><span id="line-1317"> return KeyValue.Type.DeleteFamily;</span> |
| <span class="source-line-no">1318</span><span id="line-1318"> default:</span> |
| <span class="source-line-no">1319</span><span id="line-1319"> throw new UnsupportedOperationException("Unsupported data type:" + type);</span> |
| <span class="source-line-no">1320</span><span id="line-1320"> }</span> |
| <span class="source-line-no">1321</span><span id="line-1321"> }</span> |
| <span class="source-line-no">1322</span><span id="line-1322"></span> |
| <span class="source-line-no">1323</span><span id="line-1323"> /**</span> |
| <span class="source-line-no">1324</span><span id="line-1324"> * Compare cell's value against given comparator</span> |
| <span class="source-line-no">1325</span><span id="line-1325"> * @param cell the cell to use for comparison</span> |
| <span class="source-line-no">1326</span><span id="line-1326"> * @param comparator the {@link CellComparator} to use for comparison</span> |
| <span class="source-line-no">1327</span><span id="line-1327"> * @return result comparing cell's value</span> |
| <span class="source-line-no">1328</span><span id="line-1328"> */</span> |
| <span class="source-line-no">1329</span><span id="line-1329"> public static int compareValue(Cell cell, ByteArrayComparable comparator) {</span> |
| <span class="source-line-no">1330</span><span id="line-1330"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">1331</span><span id="line-1331"> return comparator.compareTo(((ByteBufferExtendedCell) cell).getValueByteBuffer(),</span> |
| <span class="source-line-no">1332</span><span id="line-1332"> ((ByteBufferExtendedCell) cell).getValuePosition(), cell.getValueLength());</span> |
| <span class="source-line-no">1333</span><span id="line-1333"> }</span> |
| <span class="source-line-no">1334</span><span id="line-1334"> return comparator.compareTo(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());</span> |
| <span class="source-line-no">1335</span><span id="line-1335"> }</span> |
| <span class="source-line-no">1336</span><span id="line-1336"></span> |
| <span class="source-line-no">1337</span><span id="line-1337"> /**</span> |
| <span class="source-line-no">1338</span><span id="line-1338"> * These cells are used in reseeks/seeks to improve the read performance. They are not real cells</span> |
| <span class="source-line-no">1339</span><span id="line-1339"> * that are returned back to the clients</span> |
| <span class="source-line-no">1340</span><span id="line-1340"> */</span> |
| <span class="source-line-no">1341</span><span id="line-1341"> private static abstract class EmptyCell implements ExtendedCell {</span> |
| <span class="source-line-no">1342</span><span id="line-1342"></span> |
| <span class="source-line-no">1343</span><span id="line-1343"> @Override</span> |
| <span class="source-line-no">1344</span><span id="line-1344"> public void setSequenceId(long seqId) {</span> |
| <span class="source-line-no">1345</span><span id="line-1345"> // Fake cells don't need seqId, so leaving it as a noop.</span> |
| <span class="source-line-no">1346</span><span id="line-1346"> }</span> |
| <span class="source-line-no">1347</span><span id="line-1347"></span> |
| <span class="source-line-no">1348</span><span id="line-1348"> @Override</span> |
| <span class="source-line-no">1349</span><span id="line-1349"> public void setTimestamp(long ts) {</span> |
| <span class="source-line-no">1350</span><span id="line-1350"> // Fake cells can't be changed timestamp, so leaving it as a noop.</span> |
| <span class="source-line-no">1351</span><span id="line-1351"> }</span> |
| <span class="source-line-no">1352</span><span id="line-1352"></span> |
| <span class="source-line-no">1353</span><span id="line-1353"> @Override</span> |
| <span class="source-line-no">1354</span><span id="line-1354"> public void setTimestamp(byte[] ts) {</span> |
| <span class="source-line-no">1355</span><span id="line-1355"> // Fake cells can't be changed timestamp, so leaving it as a noop.</span> |
| <span class="source-line-no">1356</span><span id="line-1356"> }</span> |
| <span class="source-line-no">1357</span><span id="line-1357"></span> |
| <span class="source-line-no">1358</span><span id="line-1358"> @Override</span> |
| <span class="source-line-no">1359</span><span id="line-1359"> public byte[] getRowArray() {</span> |
| <span class="source-line-no">1360</span><span id="line-1360"> return EMPTY_BYTE_ARRAY;</span> |
| <span class="source-line-no">1361</span><span id="line-1361"> }</span> |
| <span class="source-line-no">1362</span><span id="line-1362"></span> |
| <span class="source-line-no">1363</span><span id="line-1363"> @Override</span> |
| <span class="source-line-no">1364</span><span id="line-1364"> public int getRowOffset() {</span> |
| <span class="source-line-no">1365</span><span id="line-1365"> return 0;</span> |
| <span class="source-line-no">1366</span><span id="line-1366"> }</span> |
| <span class="source-line-no">1367</span><span id="line-1367"></span> |
| <span class="source-line-no">1368</span><span id="line-1368"> @Override</span> |
| <span class="source-line-no">1369</span><span id="line-1369"> public short getRowLength() {</span> |
| <span class="source-line-no">1370</span><span id="line-1370"> return 0;</span> |
| <span class="source-line-no">1371</span><span id="line-1371"> }</span> |
| <span class="source-line-no">1372</span><span id="line-1372"></span> |
| <span class="source-line-no">1373</span><span id="line-1373"> @Override</span> |
| <span class="source-line-no">1374</span><span id="line-1374"> public byte[] getFamilyArray() {</span> |
| <span class="source-line-no">1375</span><span id="line-1375"> return EMPTY_BYTE_ARRAY;</span> |
| <span class="source-line-no">1376</span><span id="line-1376"> }</span> |
| <span class="source-line-no">1377</span><span id="line-1377"></span> |
| <span class="source-line-no">1378</span><span id="line-1378"> @Override</span> |
| <span class="source-line-no">1379</span><span id="line-1379"> public int getFamilyOffset() {</span> |
| <span class="source-line-no">1380</span><span id="line-1380"> return 0;</span> |
| <span class="source-line-no">1381</span><span id="line-1381"> }</span> |
| <span class="source-line-no">1382</span><span id="line-1382"></span> |
| <span class="source-line-no">1383</span><span id="line-1383"> @Override</span> |
| <span class="source-line-no">1384</span><span id="line-1384"> public byte getFamilyLength() {</span> |
| <span class="source-line-no">1385</span><span id="line-1385"> return 0;</span> |
| <span class="source-line-no">1386</span><span id="line-1386"> }</span> |
| <span class="source-line-no">1387</span><span id="line-1387"></span> |
| <span class="source-line-no">1388</span><span id="line-1388"> @Override</span> |
| <span class="source-line-no">1389</span><span id="line-1389"> public byte[] getQualifierArray() {</span> |
| <span class="source-line-no">1390</span><span id="line-1390"> return EMPTY_BYTE_ARRAY;</span> |
| <span class="source-line-no">1391</span><span id="line-1391"> }</span> |
| <span class="source-line-no">1392</span><span id="line-1392"></span> |
| <span class="source-line-no">1393</span><span id="line-1393"> @Override</span> |
| <span class="source-line-no">1394</span><span id="line-1394"> public int getQualifierOffset() {</span> |
| <span class="source-line-no">1395</span><span id="line-1395"> return 0;</span> |
| <span class="source-line-no">1396</span><span id="line-1396"> }</span> |
| <span class="source-line-no">1397</span><span id="line-1397"></span> |
| <span class="source-line-no">1398</span><span id="line-1398"> @Override</span> |
| <span class="source-line-no">1399</span><span id="line-1399"> public int getQualifierLength() {</span> |
| <span class="source-line-no">1400</span><span id="line-1400"> return 0;</span> |
| <span class="source-line-no">1401</span><span id="line-1401"> }</span> |
| <span class="source-line-no">1402</span><span id="line-1402"></span> |
| <span class="source-line-no">1403</span><span id="line-1403"> @Override</span> |
| <span class="source-line-no">1404</span><span id="line-1404"> public long getSequenceId() {</span> |
| <span class="source-line-no">1405</span><span id="line-1405"> return 0;</span> |
| <span class="source-line-no">1406</span><span id="line-1406"> }</span> |
| <span class="source-line-no">1407</span><span id="line-1407"></span> |
| <span class="source-line-no">1408</span><span id="line-1408"> @Override</span> |
| <span class="source-line-no">1409</span><span id="line-1409"> public byte[] getValueArray() {</span> |
| <span class="source-line-no">1410</span><span id="line-1410"> return EMPTY_BYTE_ARRAY;</span> |
| <span class="source-line-no">1411</span><span id="line-1411"> }</span> |
| <span class="source-line-no">1412</span><span id="line-1412"></span> |
| <span class="source-line-no">1413</span><span id="line-1413"> @Override</span> |
| <span class="source-line-no">1414</span><span id="line-1414"> public int getValueOffset() {</span> |
| <span class="source-line-no">1415</span><span id="line-1415"> return 0;</span> |
| <span class="source-line-no">1416</span><span id="line-1416"> }</span> |
| <span class="source-line-no">1417</span><span id="line-1417"></span> |
| <span class="source-line-no">1418</span><span id="line-1418"> @Override</span> |
| <span class="source-line-no">1419</span><span id="line-1419"> public int getValueLength() {</span> |
| <span class="source-line-no">1420</span><span id="line-1420"> return 0;</span> |
| <span class="source-line-no">1421</span><span id="line-1421"> }</span> |
| <span class="source-line-no">1422</span><span id="line-1422"></span> |
| <span class="source-line-no">1423</span><span id="line-1423"> @Override</span> |
| <span class="source-line-no">1424</span><span id="line-1424"> public byte[] getTagsArray() {</span> |
| <span class="source-line-no">1425</span><span id="line-1425"> return EMPTY_BYTE_ARRAY;</span> |
| <span class="source-line-no">1426</span><span id="line-1426"> }</span> |
| <span class="source-line-no">1427</span><span id="line-1427"></span> |
| <span class="source-line-no">1428</span><span id="line-1428"> @Override</span> |
| <span class="source-line-no">1429</span><span id="line-1429"> public int getTagsOffset() {</span> |
| <span class="source-line-no">1430</span><span id="line-1430"> return 0;</span> |
| <span class="source-line-no">1431</span><span id="line-1431"> }</span> |
| <span class="source-line-no">1432</span><span id="line-1432"></span> |
| <span class="source-line-no">1433</span><span id="line-1433"> @Override</span> |
| <span class="source-line-no">1434</span><span id="line-1434"> public int getTagsLength() {</span> |
| <span class="source-line-no">1435</span><span id="line-1435"> return 0;</span> |
| <span class="source-line-no">1436</span><span id="line-1436"> }</span> |
| <span class="source-line-no">1437</span><span id="line-1437"> }</span> |
| <span class="source-line-no">1438</span><span id="line-1438"></span> |
| <span class="source-line-no">1439</span><span id="line-1439"> /**</span> |
| <span class="source-line-no">1440</span><span id="line-1440"> * These cells are used in reseeks/seeks to improve the read performance. They are not real cells</span> |
| <span class="source-line-no">1441</span><span id="line-1441"> * that are returned back to the clients</span> |
| <span class="source-line-no">1442</span><span id="line-1442"> */</span> |
| <span class="source-line-no">1443</span><span id="line-1443"> private static abstract class EmptyByteBufferExtendedCell extends ByteBufferExtendedCell {</span> |
| <span class="source-line-no">1444</span><span id="line-1444"></span> |
| <span class="source-line-no">1445</span><span id="line-1445"> @Override</span> |
| <span class="source-line-no">1446</span><span id="line-1446"> public void setSequenceId(long seqId) {</span> |
| <span class="source-line-no">1447</span><span id="line-1447"> // Fake cells don't need seqId, so leaving it as a noop.</span> |
| <span class="source-line-no">1448</span><span id="line-1448"> }</span> |
| <span class="source-line-no">1449</span><span id="line-1449"></span> |
| <span class="source-line-no">1450</span><span id="line-1450"> @Override</span> |
| <span class="source-line-no">1451</span><span id="line-1451"> public void setTimestamp(long ts) {</span> |
| <span class="source-line-no">1452</span><span id="line-1452"> // Fake cells can't be changed timestamp, so leaving it as a noop.</span> |
| <span class="source-line-no">1453</span><span id="line-1453"> }</span> |
| <span class="source-line-no">1454</span><span id="line-1454"></span> |
| <span class="source-line-no">1455</span><span id="line-1455"> @Override</span> |
| <span class="source-line-no">1456</span><span id="line-1456"> public void setTimestamp(byte[] ts) {</span> |
| <span class="source-line-no">1457</span><span id="line-1457"> // Fake cells can't be changed timestamp, so leaving it as a noop.</span> |
| <span class="source-line-no">1458</span><span id="line-1458"> }</span> |
| <span class="source-line-no">1459</span><span id="line-1459"></span> |
| <span class="source-line-no">1460</span><span id="line-1460"> @Override</span> |
| <span class="source-line-no">1461</span><span id="line-1461"> public byte[] getRowArray() {</span> |
| <span class="source-line-no">1462</span><span id="line-1462"> return CellUtil.cloneRow(this);</span> |
| <span class="source-line-no">1463</span><span id="line-1463"> }</span> |
| <span class="source-line-no">1464</span><span id="line-1464"></span> |
| <span class="source-line-no">1465</span><span id="line-1465"> @Override</span> |
| <span class="source-line-no">1466</span><span id="line-1466"> public int getRowOffset() {</span> |
| <span class="source-line-no">1467</span><span id="line-1467"> return 0;</span> |
| <span class="source-line-no">1468</span><span id="line-1468"> }</span> |
| <span class="source-line-no">1469</span><span id="line-1469"></span> |
| <span class="source-line-no">1470</span><span id="line-1470"> @Override</span> |
| <span class="source-line-no">1471</span><span id="line-1471"> public short getRowLength() {</span> |
| <span class="source-line-no">1472</span><span id="line-1472"> return 0;</span> |
| <span class="source-line-no">1473</span><span id="line-1473"> }</span> |
| <span class="source-line-no">1474</span><span id="line-1474"></span> |
| <span class="source-line-no">1475</span><span id="line-1475"> @Override</span> |
| <span class="source-line-no">1476</span><span id="line-1476"> public byte[] getFamilyArray() {</span> |
| <span class="source-line-no">1477</span><span id="line-1477"> return CellUtil.cloneFamily(this);</span> |
| <span class="source-line-no">1478</span><span id="line-1478"> }</span> |
| <span class="source-line-no">1479</span><span id="line-1479"></span> |
| <span class="source-line-no">1480</span><span id="line-1480"> @Override</span> |
| <span class="source-line-no">1481</span><span id="line-1481"> public int getFamilyOffset() {</span> |
| <span class="source-line-no">1482</span><span id="line-1482"> return 0;</span> |
| <span class="source-line-no">1483</span><span id="line-1483"> }</span> |
| <span class="source-line-no">1484</span><span id="line-1484"></span> |
| <span class="source-line-no">1485</span><span id="line-1485"> @Override</span> |
| <span class="source-line-no">1486</span><span id="line-1486"> public byte getFamilyLength() {</span> |
| <span class="source-line-no">1487</span><span id="line-1487"> return 0;</span> |
| <span class="source-line-no">1488</span><span id="line-1488"> }</span> |
| <span class="source-line-no">1489</span><span id="line-1489"></span> |
| <span class="source-line-no">1490</span><span id="line-1490"> @Override</span> |
| <span class="source-line-no">1491</span><span id="line-1491"> public byte[] getQualifierArray() {</span> |
| <span class="source-line-no">1492</span><span id="line-1492"> return CellUtil.cloneQualifier(this);</span> |
| <span class="source-line-no">1493</span><span id="line-1493"> }</span> |
| <span class="source-line-no">1494</span><span id="line-1494"></span> |
| <span class="source-line-no">1495</span><span id="line-1495"> @Override</span> |
| <span class="source-line-no">1496</span><span id="line-1496"> public int getQualifierOffset() {</span> |
| <span class="source-line-no">1497</span><span id="line-1497"> return 0;</span> |
| <span class="source-line-no">1498</span><span id="line-1498"> }</span> |
| <span class="source-line-no">1499</span><span id="line-1499"></span> |
| <span class="source-line-no">1500</span><span id="line-1500"> @Override</span> |
| <span class="source-line-no">1501</span><span id="line-1501"> public int getQualifierLength() {</span> |
| <span class="source-line-no">1502</span><span id="line-1502"> return 0;</span> |
| <span class="source-line-no">1503</span><span id="line-1503"> }</span> |
| <span class="source-line-no">1504</span><span id="line-1504"></span> |
| <span class="source-line-no">1505</span><span id="line-1505"> @Override</span> |
| <span class="source-line-no">1506</span><span id="line-1506"> public long getSequenceId() {</span> |
| <span class="source-line-no">1507</span><span id="line-1507"> return 0;</span> |
| <span class="source-line-no">1508</span><span id="line-1508"> }</span> |
| <span class="source-line-no">1509</span><span id="line-1509"></span> |
| <span class="source-line-no">1510</span><span id="line-1510"> @Override</span> |
| <span class="source-line-no">1511</span><span id="line-1511"> public byte[] getValueArray() {</span> |
| <span class="source-line-no">1512</span><span id="line-1512"> return CellUtil.cloneValue(this);</span> |
| <span class="source-line-no">1513</span><span id="line-1513"> }</span> |
| <span class="source-line-no">1514</span><span id="line-1514"></span> |
| <span class="source-line-no">1515</span><span id="line-1515"> @Override</span> |
| <span class="source-line-no">1516</span><span id="line-1516"> public int getValueOffset() {</span> |
| <span class="source-line-no">1517</span><span id="line-1517"> return 0;</span> |
| <span class="source-line-no">1518</span><span id="line-1518"> }</span> |
| <span class="source-line-no">1519</span><span id="line-1519"></span> |
| <span class="source-line-no">1520</span><span id="line-1520"> @Override</span> |
| <span class="source-line-no">1521</span><span id="line-1521"> public int getValueLength() {</span> |
| <span class="source-line-no">1522</span><span id="line-1522"> return 0;</span> |
| <span class="source-line-no">1523</span><span id="line-1523"> }</span> |
| <span class="source-line-no">1524</span><span id="line-1524"></span> |
| <span class="source-line-no">1525</span><span id="line-1525"> @Override</span> |
| <span class="source-line-no">1526</span><span id="line-1526"> public byte[] getTagsArray() {</span> |
| <span class="source-line-no">1527</span><span id="line-1527"> return PrivateCellUtil.cloneTags(this);</span> |
| <span class="source-line-no">1528</span><span id="line-1528"> }</span> |
| <span class="source-line-no">1529</span><span id="line-1529"></span> |
| <span class="source-line-no">1530</span><span id="line-1530"> @Override</span> |
| <span class="source-line-no">1531</span><span id="line-1531"> public int getTagsOffset() {</span> |
| <span class="source-line-no">1532</span><span id="line-1532"> return 0;</span> |
| <span class="source-line-no">1533</span><span id="line-1533"> }</span> |
| <span class="source-line-no">1534</span><span id="line-1534"></span> |
| <span class="source-line-no">1535</span><span id="line-1535"> @Override</span> |
| <span class="source-line-no">1536</span><span id="line-1536"> public int getTagsLength() {</span> |
| <span class="source-line-no">1537</span><span id="line-1537"> return 0;</span> |
| <span class="source-line-no">1538</span><span id="line-1538"> }</span> |
| <span class="source-line-no">1539</span><span id="line-1539"></span> |
| <span class="source-line-no">1540</span><span id="line-1540"> @Override</span> |
| <span class="source-line-no">1541</span><span id="line-1541"> public ByteBuffer getRowByteBuffer() {</span> |
| <span class="source-line-no">1542</span><span id="line-1542"> return HConstants.EMPTY_BYTE_BUFFER;</span> |
| <span class="source-line-no">1543</span><span id="line-1543"> }</span> |
| <span class="source-line-no">1544</span><span id="line-1544"></span> |
| <span class="source-line-no">1545</span><span id="line-1545"> @Override</span> |
| <span class="source-line-no">1546</span><span id="line-1546"> public int getRowPosition() {</span> |
| <span class="source-line-no">1547</span><span id="line-1547"> return 0;</span> |
| <span class="source-line-no">1548</span><span id="line-1548"> }</span> |
| <span class="source-line-no">1549</span><span id="line-1549"></span> |
| <span class="source-line-no">1550</span><span id="line-1550"> @Override</span> |
| <span class="source-line-no">1551</span><span id="line-1551"> public ByteBuffer getFamilyByteBuffer() {</span> |
| <span class="source-line-no">1552</span><span id="line-1552"> return HConstants.EMPTY_BYTE_BUFFER;</span> |
| <span class="source-line-no">1553</span><span id="line-1553"> }</span> |
| <span class="source-line-no">1554</span><span id="line-1554"></span> |
| <span class="source-line-no">1555</span><span id="line-1555"> @Override</span> |
| <span class="source-line-no">1556</span><span id="line-1556"> public int getFamilyPosition() {</span> |
| <span class="source-line-no">1557</span><span id="line-1557"> return 0;</span> |
| <span class="source-line-no">1558</span><span id="line-1558"> }</span> |
| <span class="source-line-no">1559</span><span id="line-1559"></span> |
| <span class="source-line-no">1560</span><span id="line-1560"> @Override</span> |
| <span class="source-line-no">1561</span><span id="line-1561"> public ByteBuffer getQualifierByteBuffer() {</span> |
| <span class="source-line-no">1562</span><span id="line-1562"> return HConstants.EMPTY_BYTE_BUFFER;</span> |
| <span class="source-line-no">1563</span><span id="line-1563"> }</span> |
| <span class="source-line-no">1564</span><span id="line-1564"></span> |
| <span class="source-line-no">1565</span><span id="line-1565"> @Override</span> |
| <span class="source-line-no">1566</span><span id="line-1566"> public int getQualifierPosition() {</span> |
| <span class="source-line-no">1567</span><span id="line-1567"> return 0;</span> |
| <span class="source-line-no">1568</span><span id="line-1568"> }</span> |
| <span class="source-line-no">1569</span><span id="line-1569"></span> |
| <span class="source-line-no">1570</span><span id="line-1570"> @Override</span> |
| <span class="source-line-no">1571</span><span id="line-1571"> public ByteBuffer getTagsByteBuffer() {</span> |
| <span class="source-line-no">1572</span><span id="line-1572"> return HConstants.EMPTY_BYTE_BUFFER;</span> |
| <span class="source-line-no">1573</span><span id="line-1573"> }</span> |
| <span class="source-line-no">1574</span><span id="line-1574"></span> |
| <span class="source-line-no">1575</span><span id="line-1575"> @Override</span> |
| <span class="source-line-no">1576</span><span id="line-1576"> public int getTagsPosition() {</span> |
| <span class="source-line-no">1577</span><span id="line-1577"> return 0;</span> |
| <span class="source-line-no">1578</span><span id="line-1578"> }</span> |
| <span class="source-line-no">1579</span><span id="line-1579"></span> |
| <span class="source-line-no">1580</span><span id="line-1580"> @Override</span> |
| <span class="source-line-no">1581</span><span id="line-1581"> public ByteBuffer getValueByteBuffer() {</span> |
| <span class="source-line-no">1582</span><span id="line-1582"> return HConstants.EMPTY_BYTE_BUFFER;</span> |
| <span class="source-line-no">1583</span><span id="line-1583"> }</span> |
| <span class="source-line-no">1584</span><span id="line-1584"></span> |
| <span class="source-line-no">1585</span><span id="line-1585"> @Override</span> |
| <span class="source-line-no">1586</span><span id="line-1586"> public int getValuePosition() {</span> |
| <span class="source-line-no">1587</span><span id="line-1587"> return 0;</span> |
| <span class="source-line-no">1588</span><span id="line-1588"> }</span> |
| <span class="source-line-no">1589</span><span id="line-1589"> }</span> |
| <span class="source-line-no">1590</span><span id="line-1590"></span> |
| <span class="source-line-no">1591</span><span id="line-1591"> private static class FirstOnRowCell extends EmptyCell {</span> |
| <span class="source-line-no">1592</span><span id="line-1592"> // @formatter:off</span> |
| <span class="source-line-no">1593</span><span id="line-1593"> private static final int FIXED_HEAPSIZE =</span> |
| <span class="source-line-no">1594</span><span id="line-1594"> ClassSize.OBJECT // object</span> |
| <span class="source-line-no">1595</span><span id="line-1595"> + ClassSize.REFERENCE // row array</span> |
| <span class="source-line-no">1596</span><span id="line-1596"> + Bytes.SIZEOF_INT // row offset</span> |
| <span class="source-line-no">1597</span><span id="line-1597"> + Bytes.SIZEOF_SHORT; // row length</span> |
| <span class="source-line-no">1598</span><span id="line-1598"> // @formatter:on</span> |
| <span class="source-line-no">1599</span><span id="line-1599"> private final byte[] rowArray;</span> |
| <span class="source-line-no">1600</span><span id="line-1600"> private final int roffset;</span> |
| <span class="source-line-no">1601</span><span id="line-1601"> private final short rlength;</span> |
| <span class="source-line-no">1602</span><span id="line-1602"></span> |
| <span class="source-line-no">1603</span><span id="line-1603"> public FirstOnRowCell(final byte[] row, int roffset, short rlength) {</span> |
| <span class="source-line-no">1604</span><span id="line-1604"> this.rowArray = row;</span> |
| <span class="source-line-no">1605</span><span id="line-1605"> this.roffset = roffset;</span> |
| <span class="source-line-no">1606</span><span id="line-1606"> this.rlength = rlength;</span> |
| <span class="source-line-no">1607</span><span id="line-1607"> }</span> |
| <span class="source-line-no">1608</span><span id="line-1608"></span> |
| <span class="source-line-no">1609</span><span id="line-1609"> @Override</span> |
| <span class="source-line-no">1610</span><span id="line-1610"> public long heapSize() {</span> |
| <span class="source-line-no">1611</span><span id="line-1611"> return ClassSize.align(FIXED_HEAPSIZE)</span> |
| <span class="source-line-no">1612</span><span id="line-1612"> // array overhead</span> |
| <span class="source-line-no">1613</span><span id="line-1613"> + (rlength == 0 ? ClassSize.sizeOfByteArray(rlength) : rlength);</span> |
| <span class="source-line-no">1614</span><span id="line-1614"> }</span> |
| <span class="source-line-no">1615</span><span id="line-1615"></span> |
| <span class="source-line-no">1616</span><span id="line-1616"> @Override</span> |
| <span class="source-line-no">1617</span><span id="line-1617"> public byte[] getRowArray() {</span> |
| <span class="source-line-no">1618</span><span id="line-1618"> return this.rowArray;</span> |
| <span class="source-line-no">1619</span><span id="line-1619"> }</span> |
| <span class="source-line-no">1620</span><span id="line-1620"></span> |
| <span class="source-line-no">1621</span><span id="line-1621"> @Override</span> |
| <span class="source-line-no">1622</span><span id="line-1622"> public int getRowOffset() {</span> |
| <span class="source-line-no">1623</span><span id="line-1623"> return this.roffset;</span> |
| <span class="source-line-no">1624</span><span id="line-1624"> }</span> |
| <span class="source-line-no">1625</span><span id="line-1625"></span> |
| <span class="source-line-no">1626</span><span id="line-1626"> @Override</span> |
| <span class="source-line-no">1627</span><span id="line-1627"> public short getRowLength() {</span> |
| <span class="source-line-no">1628</span><span id="line-1628"> return this.rlength;</span> |
| <span class="source-line-no">1629</span><span id="line-1629"> }</span> |
| <span class="source-line-no">1630</span><span id="line-1630"></span> |
| <span class="source-line-no">1631</span><span id="line-1631"> @Override</span> |
| <span class="source-line-no">1632</span><span id="line-1632"> public long getTimestamp() {</span> |
| <span class="source-line-no">1633</span><span id="line-1633"> return HConstants.LATEST_TIMESTAMP;</span> |
| <span class="source-line-no">1634</span><span id="line-1634"> }</span> |
| <span class="source-line-no">1635</span><span id="line-1635"></span> |
| <span class="source-line-no">1636</span><span id="line-1636"> @Override</span> |
| <span class="source-line-no">1637</span><span id="line-1637"> public byte getTypeByte() {</span> |
| <span class="source-line-no">1638</span><span id="line-1638"> return KeyValue.Type.Maximum.getCode();</span> |
| <span class="source-line-no">1639</span><span id="line-1639"> }</span> |
| <span class="source-line-no">1640</span><span id="line-1640"></span> |
| <span class="source-line-no">1641</span><span id="line-1641"> @Override</span> |
| <span class="source-line-no">1642</span><span id="line-1642"> public Type getType() {</span> |
| <span class="source-line-no">1643</span><span id="line-1643"> throw new UnsupportedOperationException();</span> |
| <span class="source-line-no">1644</span><span id="line-1644"> }</span> |
| <span class="source-line-no">1645</span><span id="line-1645"> }</span> |
| <span class="source-line-no">1646</span><span id="line-1646"></span> |
| <span class="source-line-no">1647</span><span id="line-1647"> private static class FirstOnRowByteBufferExtendedCell extends EmptyByteBufferExtendedCell {</span> |
| <span class="source-line-no">1648</span><span id="line-1648"> // @formatter:off</span> |
| <span class="source-line-no">1649</span><span id="line-1649"> private static final int FIXED_OVERHEAD =</span> |
| <span class="source-line-no">1650</span><span id="line-1650"> ClassSize.OBJECT // object</span> |
| <span class="source-line-no">1651</span><span id="line-1651"> + ClassSize.REFERENCE // row buffer</span> |
| <span class="source-line-no">1652</span><span id="line-1652"> + Bytes.SIZEOF_INT // row offset</span> |
| <span class="source-line-no">1653</span><span id="line-1653"> + Bytes.SIZEOF_SHORT; // row length</span> |
| <span class="source-line-no">1654</span><span id="line-1654"> // @formatter:on</span> |
| <span class="source-line-no">1655</span><span id="line-1655"> private final ByteBuffer rowBuff;</span> |
| <span class="source-line-no">1656</span><span id="line-1656"> private final int roffset;</span> |
| <span class="source-line-no">1657</span><span id="line-1657"> private final short rlength;</span> |
| <span class="source-line-no">1658</span><span id="line-1658"></span> |
| <span class="source-line-no">1659</span><span id="line-1659"> public FirstOnRowByteBufferExtendedCell(final ByteBuffer row, int roffset, short rlength) {</span> |
| <span class="source-line-no">1660</span><span id="line-1660"> this.rowBuff = row;</span> |
| <span class="source-line-no">1661</span><span id="line-1661"> this.roffset = roffset;</span> |
| <span class="source-line-no">1662</span><span id="line-1662"> this.rlength = rlength;</span> |
| <span class="source-line-no">1663</span><span id="line-1663"> }</span> |
| <span class="source-line-no">1664</span><span id="line-1664"></span> |
| <span class="source-line-no">1665</span><span id="line-1665"> @Override</span> |
| <span class="source-line-no">1666</span><span id="line-1666"> public long heapSize() {</span> |
| <span class="source-line-no">1667</span><span id="line-1667"> if (this.rowBuff.hasArray()) {</span> |
| <span class="source-line-no">1668</span><span id="line-1668"> return ClassSize.align(FIXED_OVERHEAD + rlength);</span> |
| <span class="source-line-no">1669</span><span id="line-1669"> }</span> |
| <span class="source-line-no">1670</span><span id="line-1670"> return ClassSize.align(FIXED_OVERHEAD);</span> |
| <span class="source-line-no">1671</span><span id="line-1671"> }</span> |
| <span class="source-line-no">1672</span><span id="line-1672"></span> |
| <span class="source-line-no">1673</span><span id="line-1673"> @Override</span> |
| <span class="source-line-no">1674</span><span id="line-1674"> public ByteBuffer getRowByteBuffer() {</span> |
| <span class="source-line-no">1675</span><span id="line-1675"> return this.rowBuff;</span> |
| <span class="source-line-no">1676</span><span id="line-1676"> }</span> |
| <span class="source-line-no">1677</span><span id="line-1677"></span> |
| <span class="source-line-no">1678</span><span id="line-1678"> @Override</span> |
| <span class="source-line-no">1679</span><span id="line-1679"> public int getRowPosition() {</span> |
| <span class="source-line-no">1680</span><span id="line-1680"> return this.roffset;</span> |
| <span class="source-line-no">1681</span><span id="line-1681"> }</span> |
| <span class="source-line-no">1682</span><span id="line-1682"></span> |
| <span class="source-line-no">1683</span><span id="line-1683"> @Override</span> |
| <span class="source-line-no">1684</span><span id="line-1684"> public short getRowLength() {</span> |
| <span class="source-line-no">1685</span><span id="line-1685"> return this.rlength;</span> |
| <span class="source-line-no">1686</span><span id="line-1686"> }</span> |
| <span class="source-line-no">1687</span><span id="line-1687"></span> |
| <span class="source-line-no">1688</span><span id="line-1688"> @Override</span> |
| <span class="source-line-no">1689</span><span id="line-1689"> public long getTimestamp() {</span> |
| <span class="source-line-no">1690</span><span id="line-1690"> return HConstants.LATEST_TIMESTAMP;</span> |
| <span class="source-line-no">1691</span><span id="line-1691"> }</span> |
| <span class="source-line-no">1692</span><span id="line-1692"></span> |
| <span class="source-line-no">1693</span><span id="line-1693"> @Override</span> |
| <span class="source-line-no">1694</span><span id="line-1694"> public byte getTypeByte() {</span> |
| <span class="source-line-no">1695</span><span id="line-1695"> return KeyValue.Type.Maximum.getCode();</span> |
| <span class="source-line-no">1696</span><span id="line-1696"> }</span> |
| <span class="source-line-no">1697</span><span id="line-1697"></span> |
| <span class="source-line-no">1698</span><span id="line-1698"> @Override</span> |
| <span class="source-line-no">1699</span><span id="line-1699"> public Type getType() {</span> |
| <span class="source-line-no">1700</span><span id="line-1700"> throw new UnsupportedOperationException();</span> |
| <span class="source-line-no">1701</span><span id="line-1701"> }</span> |
| <span class="source-line-no">1702</span><span id="line-1702"> }</span> |
| <span class="source-line-no">1703</span><span id="line-1703"></span> |
| <span class="source-line-no">1704</span><span id="line-1704"> private static class LastOnRowByteBufferExtendedCell extends EmptyByteBufferExtendedCell {</span> |
| <span class="source-line-no">1705</span><span id="line-1705"> // @formatter:off</span> |
| <span class="source-line-no">1706</span><span id="line-1706"> private static final int FIXED_OVERHEAD = ClassSize.OBJECT // object</span> |
| <span class="source-line-no">1707</span><span id="line-1707"> + ClassSize.REFERENCE // rowBuff</span> |
| <span class="source-line-no">1708</span><span id="line-1708"> + Bytes.SIZEOF_INT // roffset</span> |
| <span class="source-line-no">1709</span><span id="line-1709"> + Bytes.SIZEOF_SHORT; // rlength</span> |
| <span class="source-line-no">1710</span><span id="line-1710"> // @formatter:on</span> |
| <span class="source-line-no">1711</span><span id="line-1711"> private final ByteBuffer rowBuff;</span> |
| <span class="source-line-no">1712</span><span id="line-1712"> private final int roffset;</span> |
| <span class="source-line-no">1713</span><span id="line-1713"> private final short rlength;</span> |
| <span class="source-line-no">1714</span><span id="line-1714"></span> |
| <span class="source-line-no">1715</span><span id="line-1715"> public LastOnRowByteBufferExtendedCell(final ByteBuffer row, int roffset, short rlength) {</span> |
| <span class="source-line-no">1716</span><span id="line-1716"> this.rowBuff = row;</span> |
| <span class="source-line-no">1717</span><span id="line-1717"> this.roffset = roffset;</span> |
| <span class="source-line-no">1718</span><span id="line-1718"> this.rlength = rlength;</span> |
| <span class="source-line-no">1719</span><span id="line-1719"> }</span> |
| <span class="source-line-no">1720</span><span id="line-1720"></span> |
| <span class="source-line-no">1721</span><span id="line-1721"> @Override</span> |
| <span class="source-line-no">1722</span><span id="line-1722"> public long heapSize() {</span> |
| <span class="source-line-no">1723</span><span id="line-1723"> if (this.rowBuff.hasArray()) {</span> |
| <span class="source-line-no">1724</span><span id="line-1724"> return ClassSize.align(FIXED_OVERHEAD + rlength);</span> |
| <span class="source-line-no">1725</span><span id="line-1725"> }</span> |
| <span class="source-line-no">1726</span><span id="line-1726"> return ClassSize.align(FIXED_OVERHEAD);</span> |
| <span class="source-line-no">1727</span><span id="line-1727"> }</span> |
| <span class="source-line-no">1728</span><span id="line-1728"></span> |
| <span class="source-line-no">1729</span><span id="line-1729"> @Override</span> |
| <span class="source-line-no">1730</span><span id="line-1730"> public ByteBuffer getRowByteBuffer() {</span> |
| <span class="source-line-no">1731</span><span id="line-1731"> return this.rowBuff;</span> |
| <span class="source-line-no">1732</span><span id="line-1732"> }</span> |
| <span class="source-line-no">1733</span><span id="line-1733"></span> |
| <span class="source-line-no">1734</span><span id="line-1734"> @Override</span> |
| <span class="source-line-no">1735</span><span id="line-1735"> public int getRowPosition() {</span> |
| <span class="source-line-no">1736</span><span id="line-1736"> return this.roffset;</span> |
| <span class="source-line-no">1737</span><span id="line-1737"> }</span> |
| <span class="source-line-no">1738</span><span id="line-1738"></span> |
| <span class="source-line-no">1739</span><span id="line-1739"> @Override</span> |
| <span class="source-line-no">1740</span><span id="line-1740"> public short getRowLength() {</span> |
| <span class="source-line-no">1741</span><span id="line-1741"> return this.rlength;</span> |
| <span class="source-line-no">1742</span><span id="line-1742"> }</span> |
| <span class="source-line-no">1743</span><span id="line-1743"></span> |
| <span class="source-line-no">1744</span><span id="line-1744"> @Override</span> |
| <span class="source-line-no">1745</span><span id="line-1745"> public long getTimestamp() {</span> |
| <span class="source-line-no">1746</span><span id="line-1746"> return PrivateConstants.OLDEST_TIMESTAMP;</span> |
| <span class="source-line-no">1747</span><span id="line-1747"> }</span> |
| <span class="source-line-no">1748</span><span id="line-1748"></span> |
| <span class="source-line-no">1749</span><span id="line-1749"> @Override</span> |
| <span class="source-line-no">1750</span><span id="line-1750"> public byte getTypeByte() {</span> |
| <span class="source-line-no">1751</span><span id="line-1751"> return KeyValue.Type.Minimum.getCode();</span> |
| <span class="source-line-no">1752</span><span id="line-1752"> }</span> |
| <span class="source-line-no">1753</span><span id="line-1753"></span> |
| <span class="source-line-no">1754</span><span id="line-1754"> @Override</span> |
| <span class="source-line-no">1755</span><span id="line-1755"> public Type getType() {</span> |
| <span class="source-line-no">1756</span><span id="line-1756"> throw new UnsupportedOperationException();</span> |
| <span class="source-line-no">1757</span><span id="line-1757"> }</span> |
| <span class="source-line-no">1758</span><span id="line-1758"> }</span> |
| <span class="source-line-no">1759</span><span id="line-1759"></span> |
| <span class="source-line-no">1760</span><span id="line-1760"> private static class FirstOnRowColByteBufferExtendedCell</span> |
| <span class="source-line-no">1761</span><span id="line-1761"> extends FirstOnRowByteBufferExtendedCell {</span> |
| <span class="source-line-no">1762</span><span id="line-1762"> // @formatter:off</span> |
| <span class="source-line-no">1763</span><span id="line-1763"> private static final int FIXED_OVERHEAD = FirstOnRowByteBufferExtendedCell.FIXED_OVERHEAD</span> |
| <span class="source-line-no">1764</span><span id="line-1764"> + ClassSize.REFERENCE * 2 // family buffer and column buffer</span> |
| <span class="source-line-no">1765</span><span id="line-1765"> + Bytes.SIZEOF_INT * 3 // famOffset, colOffset, colLength</span> |
| <span class="source-line-no">1766</span><span id="line-1766"> + Bytes.SIZEOF_BYTE; // famLength</span> |
| <span class="source-line-no">1767</span><span id="line-1767"> // @formatter:on</span> |
| <span class="source-line-no">1768</span><span id="line-1768"> private final ByteBuffer famBuff;</span> |
| <span class="source-line-no">1769</span><span id="line-1769"> private final int famOffset;</span> |
| <span class="source-line-no">1770</span><span id="line-1770"> private final byte famLength;</span> |
| <span class="source-line-no">1771</span><span id="line-1771"> private final ByteBuffer colBuff;</span> |
| <span class="source-line-no">1772</span><span id="line-1772"> private final int colOffset;</span> |
| <span class="source-line-no">1773</span><span id="line-1773"> private final int colLength;</span> |
| <span class="source-line-no">1774</span><span id="line-1774"></span> |
| <span class="source-line-no">1775</span><span id="line-1775"> public FirstOnRowColByteBufferExtendedCell(final ByteBuffer row, int roffset, short rlength,</span> |
| <span class="source-line-no">1776</span><span id="line-1776"> final ByteBuffer famBuff, final int famOffset, final byte famLength, final ByteBuffer col,</span> |
| <span class="source-line-no">1777</span><span id="line-1777"> final int colOffset, final int colLength) {</span> |
| <span class="source-line-no">1778</span><span id="line-1778"> super(row, roffset, rlength);</span> |
| <span class="source-line-no">1779</span><span id="line-1779"> this.famBuff = famBuff;</span> |
| <span class="source-line-no">1780</span><span id="line-1780"> this.famOffset = famOffset;</span> |
| <span class="source-line-no">1781</span><span id="line-1781"> this.famLength = famLength;</span> |
| <span class="source-line-no">1782</span><span id="line-1782"> this.colBuff = col;</span> |
| <span class="source-line-no">1783</span><span id="line-1783"> this.colOffset = colOffset;</span> |
| <span class="source-line-no">1784</span><span id="line-1784"> this.colLength = colLength;</span> |
| <span class="source-line-no">1785</span><span id="line-1785"> }</span> |
| <span class="source-line-no">1786</span><span id="line-1786"></span> |
| <span class="source-line-no">1787</span><span id="line-1787"> @Override</span> |
| <span class="source-line-no">1788</span><span id="line-1788"> public long heapSize() {</span> |
| <span class="source-line-no">1789</span><span id="line-1789"> if (famBuff.hasArray() && colBuff.hasArray()) {</span> |
| <span class="source-line-no">1790</span><span id="line-1790"> return ClassSize.align(FIXED_OVERHEAD + famLength + colLength);</span> |
| <span class="source-line-no">1791</span><span id="line-1791"> } else if (famBuff.hasArray()) {</span> |
| <span class="source-line-no">1792</span><span id="line-1792"> return ClassSize.align(FIXED_OVERHEAD + famLength);</span> |
| <span class="source-line-no">1793</span><span id="line-1793"> } else if (colBuff.hasArray()) {</span> |
| <span class="source-line-no">1794</span><span id="line-1794"> return ClassSize.align(FIXED_OVERHEAD + colLength);</span> |
| <span class="source-line-no">1795</span><span id="line-1795"> } else {</span> |
| <span class="source-line-no">1796</span><span id="line-1796"> return ClassSize.align(FIXED_OVERHEAD);</span> |
| <span class="source-line-no">1797</span><span id="line-1797"> }</span> |
| <span class="source-line-no">1798</span><span id="line-1798"> }</span> |
| <span class="source-line-no">1799</span><span id="line-1799"></span> |
| <span class="source-line-no">1800</span><span id="line-1800"> @Override</span> |
| <span class="source-line-no">1801</span><span id="line-1801"> public ByteBuffer getFamilyByteBuffer() {</span> |
| <span class="source-line-no">1802</span><span id="line-1802"> return this.famBuff;</span> |
| <span class="source-line-no">1803</span><span id="line-1803"> }</span> |
| <span class="source-line-no">1804</span><span id="line-1804"></span> |
| <span class="source-line-no">1805</span><span id="line-1805"> @Override</span> |
| <span class="source-line-no">1806</span><span id="line-1806"> public int getFamilyPosition() {</span> |
| <span class="source-line-no">1807</span><span id="line-1807"> return this.famOffset;</span> |
| <span class="source-line-no">1808</span><span id="line-1808"> }</span> |
| <span class="source-line-no">1809</span><span id="line-1809"></span> |
| <span class="source-line-no">1810</span><span id="line-1810"> @Override</span> |
| <span class="source-line-no">1811</span><span id="line-1811"> public byte getFamilyLength() {</span> |
| <span class="source-line-no">1812</span><span id="line-1812"> return famLength;</span> |
| <span class="source-line-no">1813</span><span id="line-1813"> }</span> |
| <span class="source-line-no">1814</span><span id="line-1814"></span> |
| <span class="source-line-no">1815</span><span id="line-1815"> @Override</span> |
| <span class="source-line-no">1816</span><span id="line-1816"> public ByteBuffer getQualifierByteBuffer() {</span> |
| <span class="source-line-no">1817</span><span id="line-1817"> return this.colBuff;</span> |
| <span class="source-line-no">1818</span><span id="line-1818"> }</span> |
| <span class="source-line-no">1819</span><span id="line-1819"></span> |
| <span class="source-line-no">1820</span><span id="line-1820"> @Override</span> |
| <span class="source-line-no">1821</span><span id="line-1821"> public int getQualifierPosition() {</span> |
| <span class="source-line-no">1822</span><span id="line-1822"> return this.colOffset;</span> |
| <span class="source-line-no">1823</span><span id="line-1823"> }</span> |
| <span class="source-line-no">1824</span><span id="line-1824"></span> |
| <span class="source-line-no">1825</span><span id="line-1825"> @Override</span> |
| <span class="source-line-no">1826</span><span id="line-1826"> public int getQualifierLength() {</span> |
| <span class="source-line-no">1827</span><span id="line-1827"> return this.colLength;</span> |
| <span class="source-line-no">1828</span><span id="line-1828"> }</span> |
| <span class="source-line-no">1829</span><span id="line-1829"> }</span> |
| <span class="source-line-no">1830</span><span id="line-1830"></span> |
| <span class="source-line-no">1831</span><span id="line-1831"> private static class FirstOnRowColCell extends FirstOnRowCell {</span> |
| <span class="source-line-no">1832</span><span id="line-1832"> // @formatter:off</span> |
| <span class="source-line-no">1833</span><span id="line-1833"> private static final long FIXED_HEAPSIZE = (long) FirstOnRowCell.FIXED_HEAPSIZE</span> |
| <span class="source-line-no">1834</span><span id="line-1834"> + Bytes.SIZEOF_BYTE // flength</span> |
| <span class="source-line-no">1835</span><span id="line-1835"> + Bytes.SIZEOF_INT * 3 // foffset, qoffset, qlength</span> |
| <span class="source-line-no">1836</span><span id="line-1836"> + ClassSize.REFERENCE * 2; // fArray, qArray</span> |
| <span class="source-line-no">1837</span><span id="line-1837"> // @formatter:on</span> |
| <span class="source-line-no">1838</span><span id="line-1838"> private final byte[] fArray;</span> |
| <span class="source-line-no">1839</span><span id="line-1839"> private final int foffset;</span> |
| <span class="source-line-no">1840</span><span id="line-1840"> private final byte flength;</span> |
| <span class="source-line-no">1841</span><span id="line-1841"> private final byte[] qArray;</span> |
| <span class="source-line-no">1842</span><span id="line-1842"> private final int qoffset;</span> |
| <span class="source-line-no">1843</span><span id="line-1843"> private final int qlength;</span> |
| <span class="source-line-no">1844</span><span id="line-1844"></span> |
| <span class="source-line-no">1845</span><span id="line-1845"> public FirstOnRowColCell(byte[] rArray, int roffset, short rlength, byte[] fArray, int foffset,</span> |
| <span class="source-line-no">1846</span><span id="line-1846"> byte flength, byte[] qArray, int qoffset, int qlength) {</span> |
| <span class="source-line-no">1847</span><span id="line-1847"> super(rArray, roffset, rlength);</span> |
| <span class="source-line-no">1848</span><span id="line-1848"> this.fArray = fArray;</span> |
| <span class="source-line-no">1849</span><span id="line-1849"> this.foffset = foffset;</span> |
| <span class="source-line-no">1850</span><span id="line-1850"> this.flength = flength;</span> |
| <span class="source-line-no">1851</span><span id="line-1851"> this.qArray = qArray;</span> |
| <span class="source-line-no">1852</span><span id="line-1852"> this.qoffset = qoffset;</span> |
| <span class="source-line-no">1853</span><span id="line-1853"> this.qlength = qlength;</span> |
| <span class="source-line-no">1854</span><span id="line-1854"> }</span> |
| <span class="source-line-no">1855</span><span id="line-1855"></span> |
| <span class="source-line-no">1856</span><span id="line-1856"> @Override</span> |
| <span class="source-line-no">1857</span><span id="line-1857"> public long heapSize() {</span> |
| <span class="source-line-no">1858</span><span id="line-1858"> return ClassSize.align(FIXED_HEAPSIZE)</span> |
| <span class="source-line-no">1859</span><span id="line-1859"> // array overhead</span> |
| <span class="source-line-no">1860</span><span id="line-1860"> + (flength == 0 ? ClassSize.sizeOfByteArray(flength) : flength)</span> |
| <span class="source-line-no">1861</span><span id="line-1861"> + (qlength == 0 ? ClassSize.sizeOfByteArray(qlength) : qlength);</span> |
| <span class="source-line-no">1862</span><span id="line-1862"> }</span> |
| <span class="source-line-no">1863</span><span id="line-1863"></span> |
| <span class="source-line-no">1864</span><span id="line-1864"> @Override</span> |
| <span class="source-line-no">1865</span><span id="line-1865"> public byte[] getFamilyArray() {</span> |
| <span class="source-line-no">1866</span><span id="line-1866"> return this.fArray;</span> |
| <span class="source-line-no">1867</span><span id="line-1867"> }</span> |
| <span class="source-line-no">1868</span><span id="line-1868"></span> |
| <span class="source-line-no">1869</span><span id="line-1869"> @Override</span> |
| <span class="source-line-no">1870</span><span id="line-1870"> public int getFamilyOffset() {</span> |
| <span class="source-line-no">1871</span><span id="line-1871"> return this.foffset;</span> |
| <span class="source-line-no">1872</span><span id="line-1872"> }</span> |
| <span class="source-line-no">1873</span><span id="line-1873"></span> |
| <span class="source-line-no">1874</span><span id="line-1874"> @Override</span> |
| <span class="source-line-no">1875</span><span id="line-1875"> public byte getFamilyLength() {</span> |
| <span class="source-line-no">1876</span><span id="line-1876"> return this.flength;</span> |
| <span class="source-line-no">1877</span><span id="line-1877"> }</span> |
| <span class="source-line-no">1878</span><span id="line-1878"></span> |
| <span class="source-line-no">1879</span><span id="line-1879"> @Override</span> |
| <span class="source-line-no">1880</span><span id="line-1880"> public byte[] getQualifierArray() {</span> |
| <span class="source-line-no">1881</span><span id="line-1881"> return this.qArray;</span> |
| <span class="source-line-no">1882</span><span id="line-1882"> }</span> |
| <span class="source-line-no">1883</span><span id="line-1883"></span> |
| <span class="source-line-no">1884</span><span id="line-1884"> @Override</span> |
| <span class="source-line-no">1885</span><span id="line-1885"> public int getQualifierOffset() {</span> |
| <span class="source-line-no">1886</span><span id="line-1886"> return this.qoffset;</span> |
| <span class="source-line-no">1887</span><span id="line-1887"> }</span> |
| <span class="source-line-no">1888</span><span id="line-1888"></span> |
| <span class="source-line-no">1889</span><span id="line-1889"> @Override</span> |
| <span class="source-line-no">1890</span><span id="line-1890"> public int getQualifierLength() {</span> |
| <span class="source-line-no">1891</span><span id="line-1891"> return this.qlength;</span> |
| <span class="source-line-no">1892</span><span id="line-1892"> }</span> |
| <span class="source-line-no">1893</span><span id="line-1893"> }</span> |
| <span class="source-line-no">1894</span><span id="line-1894"></span> |
| <span class="source-line-no">1895</span><span id="line-1895"> private static class FirstOnRowColTSCell extends FirstOnRowColCell {</span> |
| <span class="source-line-no">1896</span><span id="line-1896"> // @formatter:off</span> |
| <span class="source-line-no">1897</span><span id="line-1897"> private static final long FIXED_HEAPSIZE = FirstOnRowColCell.FIXED_HEAPSIZE</span> |
| <span class="source-line-no">1898</span><span id="line-1898"> + Bytes.SIZEOF_LONG; // ts</span> |
| <span class="source-line-no">1899</span><span id="line-1899"> private long ts;</span> |
| <span class="source-line-no">1900</span><span id="line-1900"> // @formatter:on</span> |
| <span class="source-line-no">1901</span><span id="line-1901"></span> |
| <span class="source-line-no">1902</span><span id="line-1902"> public FirstOnRowColTSCell(byte[] rArray, int roffset, short rlength, byte[] fArray,</span> |
| <span class="source-line-no">1903</span><span id="line-1903"> int foffset, byte flength, byte[] qArray, int qoffset, int qlength, long ts) {</span> |
| <span class="source-line-no">1904</span><span id="line-1904"> super(rArray, roffset, rlength, fArray, foffset, flength, qArray, qoffset, qlength);</span> |
| <span class="source-line-no">1905</span><span id="line-1905"> this.ts = ts;</span> |
| <span class="source-line-no">1906</span><span id="line-1906"> }</span> |
| <span class="source-line-no">1907</span><span id="line-1907"></span> |
| <span class="source-line-no">1908</span><span id="line-1908"> @Override</span> |
| <span class="source-line-no">1909</span><span id="line-1909"> public long getTimestamp() {</span> |
| <span class="source-line-no">1910</span><span id="line-1910"> return this.ts;</span> |
| <span class="source-line-no">1911</span><span id="line-1911"> }</span> |
| <span class="source-line-no">1912</span><span id="line-1912"></span> |
| <span class="source-line-no">1913</span><span id="line-1913"> @Override</span> |
| <span class="source-line-no">1914</span><span id="line-1914"> public long heapSize() {</span> |
| <span class="source-line-no">1915</span><span id="line-1915"> return ClassSize.align(FIXED_HEAPSIZE);</span> |
| <span class="source-line-no">1916</span><span id="line-1916"> }</span> |
| <span class="source-line-no">1917</span><span id="line-1917"> }</span> |
| <span class="source-line-no">1918</span><span id="line-1918"></span> |
| <span class="source-line-no">1919</span><span id="line-1919"> private static class FirstOnRowColTSByteBufferExtendedCell</span> |
| <span class="source-line-no">1920</span><span id="line-1920"> extends FirstOnRowColByteBufferExtendedCell {</span> |
| <span class="source-line-no">1921</span><span id="line-1921"> // @formatter:off</span> |
| <span class="source-line-no">1922</span><span id="line-1922"> private static final int FIXED_OVERHEAD = FirstOnRowColByteBufferExtendedCell.FIXED_OVERHEAD</span> |
| <span class="source-line-no">1923</span><span id="line-1923"> + Bytes.SIZEOF_LONG; // ts</span> |
| <span class="source-line-no">1924</span><span id="line-1924"> private long ts;</span> |
| <span class="source-line-no">1925</span><span id="line-1925"> // @formatter:on</span> |
| <span class="source-line-no">1926</span><span id="line-1926"></span> |
| <span class="source-line-no">1927</span><span id="line-1927"> public FirstOnRowColTSByteBufferExtendedCell(ByteBuffer rBuffer, int roffset, short rlength,</span> |
| <span class="source-line-no">1928</span><span id="line-1928"> ByteBuffer fBuffer, int foffset, byte flength, ByteBuffer qBuffer, int qoffset, int qlength,</span> |
| <span class="source-line-no">1929</span><span id="line-1929"> long ts) {</span> |
| <span class="source-line-no">1930</span><span id="line-1930"> super(rBuffer, roffset, rlength, fBuffer, foffset, flength, qBuffer, qoffset, qlength);</span> |
| <span class="source-line-no">1931</span><span id="line-1931"> this.ts = ts;</span> |
| <span class="source-line-no">1932</span><span id="line-1932"> }</span> |
| <span class="source-line-no">1933</span><span id="line-1933"></span> |
| <span class="source-line-no">1934</span><span id="line-1934"> @Override</span> |
| <span class="source-line-no">1935</span><span id="line-1935"> public long getTimestamp() {</span> |
| <span class="source-line-no">1936</span><span id="line-1936"> return this.ts;</span> |
| <span class="source-line-no">1937</span><span id="line-1937"> }</span> |
| <span class="source-line-no">1938</span><span id="line-1938"></span> |
| <span class="source-line-no">1939</span><span id="line-1939"> @Override</span> |
| <span class="source-line-no">1940</span><span id="line-1940"> public long heapSize() {</span> |
| <span class="source-line-no">1941</span><span id="line-1941"> return ClassSize.align(FIXED_OVERHEAD + super.heapSize());</span> |
| <span class="source-line-no">1942</span><span id="line-1942"> }</span> |
| <span class="source-line-no">1943</span><span id="line-1943"> }</span> |
| <span class="source-line-no">1944</span><span id="line-1944"></span> |
| <span class="source-line-no">1945</span><span id="line-1945"> private static class LastOnRowCell extends EmptyCell {</span> |
| <span class="source-line-no">1946</span><span id="line-1946"> // @formatter:off</span> |
| <span class="source-line-no">1947</span><span id="line-1947"> private static final int FIXED_OVERHEAD = ClassSize.OBJECT // object</span> |
| <span class="source-line-no">1948</span><span id="line-1948"> + ClassSize.REFERENCE // row array</span> |
| <span class="source-line-no">1949</span><span id="line-1949"> + Bytes.SIZEOF_INT // row offset</span> |
| <span class="source-line-no">1950</span><span id="line-1950"> + Bytes.SIZEOF_SHORT; // row length</span> |
| <span class="source-line-no">1951</span><span id="line-1951"> // @formatter:on</span> |
| <span class="source-line-no">1952</span><span id="line-1952"> private final byte[] rowArray;</span> |
| <span class="source-line-no">1953</span><span id="line-1953"> private final int roffset;</span> |
| <span class="source-line-no">1954</span><span id="line-1954"> private final short rlength;</span> |
| <span class="source-line-no">1955</span><span id="line-1955"></span> |
| <span class="source-line-no">1956</span><span id="line-1956"> public LastOnRowCell(byte[] row, int roffset, short rlength) {</span> |
| <span class="source-line-no">1957</span><span id="line-1957"> this.rowArray = row;</span> |
| <span class="source-line-no">1958</span><span id="line-1958"> this.roffset = roffset;</span> |
| <span class="source-line-no">1959</span><span id="line-1959"> this.rlength = rlength;</span> |
| <span class="source-line-no">1960</span><span id="line-1960"> }</span> |
| <span class="source-line-no">1961</span><span id="line-1961"></span> |
| <span class="source-line-no">1962</span><span id="line-1962"> @Override</span> |
| <span class="source-line-no">1963</span><span id="line-1963"> public long heapSize() {</span> |
| <span class="source-line-no">1964</span><span id="line-1964"> return ClassSize.align(FIXED_OVERHEAD)</span> |
| <span class="source-line-no">1965</span><span id="line-1965"> // array overhead</span> |
| <span class="source-line-no">1966</span><span id="line-1966"> + (rlength == 0 ? ClassSize.sizeOfByteArray(rlength) : rlength);</span> |
| <span class="source-line-no">1967</span><span id="line-1967"> }</span> |
| <span class="source-line-no">1968</span><span id="line-1968"></span> |
| <span class="source-line-no">1969</span><span id="line-1969"> @Override</span> |
| <span class="source-line-no">1970</span><span id="line-1970"> public byte[] getRowArray() {</span> |
| <span class="source-line-no">1971</span><span id="line-1971"> return this.rowArray;</span> |
| <span class="source-line-no">1972</span><span id="line-1972"> }</span> |
| <span class="source-line-no">1973</span><span id="line-1973"></span> |
| <span class="source-line-no">1974</span><span id="line-1974"> @Override</span> |
| <span class="source-line-no">1975</span><span id="line-1975"> public int getRowOffset() {</span> |
| <span class="source-line-no">1976</span><span id="line-1976"> return this.roffset;</span> |
| <span class="source-line-no">1977</span><span id="line-1977"> }</span> |
| <span class="source-line-no">1978</span><span id="line-1978"></span> |
| <span class="source-line-no">1979</span><span id="line-1979"> @Override</span> |
| <span class="source-line-no">1980</span><span id="line-1980"> public short getRowLength() {</span> |
| <span class="source-line-no">1981</span><span id="line-1981"> return this.rlength;</span> |
| <span class="source-line-no">1982</span><span id="line-1982"> }</span> |
| <span class="source-line-no">1983</span><span id="line-1983"></span> |
| <span class="source-line-no">1984</span><span id="line-1984"> @Override</span> |
| <span class="source-line-no">1985</span><span id="line-1985"> public long getTimestamp() {</span> |
| <span class="source-line-no">1986</span><span id="line-1986"> return PrivateConstants.OLDEST_TIMESTAMP;</span> |
| <span class="source-line-no">1987</span><span id="line-1987"> }</span> |
| <span class="source-line-no">1988</span><span id="line-1988"></span> |
| <span class="source-line-no">1989</span><span id="line-1989"> @Override</span> |
| <span class="source-line-no">1990</span><span id="line-1990"> public byte getTypeByte() {</span> |
| <span class="source-line-no">1991</span><span id="line-1991"> return KeyValue.Type.Minimum.getCode();</span> |
| <span class="source-line-no">1992</span><span id="line-1992"> }</span> |
| <span class="source-line-no">1993</span><span id="line-1993"></span> |
| <span class="source-line-no">1994</span><span id="line-1994"> @Override</span> |
| <span class="source-line-no">1995</span><span id="line-1995"> public Type getType() {</span> |
| <span class="source-line-no">1996</span><span id="line-1996"> throw new UnsupportedOperationException();</span> |
| <span class="source-line-no">1997</span><span id="line-1997"> }</span> |
| <span class="source-line-no">1998</span><span id="line-1998"> }</span> |
| <span class="source-line-no">1999</span><span id="line-1999"></span> |
| <span class="source-line-no">2000</span><span id="line-2000"> private static class LastOnRowColCell extends LastOnRowCell {</span> |
| <span class="source-line-no">2001</span><span id="line-2001"> // @formatter:off</span> |
| <span class="source-line-no">2002</span><span id="line-2002"> private static final long FIXED_OVERHEAD = (long) LastOnRowCell.FIXED_OVERHEAD</span> |
| <span class="source-line-no">2003</span><span id="line-2003"> + ClassSize.REFERENCE * 2 // fArray and qArray</span> |
| <span class="source-line-no">2004</span><span id="line-2004"> + Bytes.SIZEOF_INT * 3 // foffset, qoffset, qlength</span> |
| <span class="source-line-no">2005</span><span id="line-2005"> + Bytes.SIZEOF_BYTE; // flength</span> |
| <span class="source-line-no">2006</span><span id="line-2006"> // @formatter:on</span> |
| <span class="source-line-no">2007</span><span id="line-2007"> private final byte[] fArray;</span> |
| <span class="source-line-no">2008</span><span id="line-2008"> private final int foffset;</span> |
| <span class="source-line-no">2009</span><span id="line-2009"> private final byte flength;</span> |
| <span class="source-line-no">2010</span><span id="line-2010"> private final byte[] qArray;</span> |
| <span class="source-line-no">2011</span><span id="line-2011"> private final int qoffset;</span> |
| <span class="source-line-no">2012</span><span id="line-2012"> private final int qlength;</span> |
| <span class="source-line-no">2013</span><span id="line-2013"></span> |
| <span class="source-line-no">2014</span><span id="line-2014"> public LastOnRowColCell(byte[] rArray, int roffset, short rlength, byte[] fArray, int foffset,</span> |
| <span class="source-line-no">2015</span><span id="line-2015"> byte flength, byte[] qArray, int qoffset, int qlength) {</span> |
| <span class="source-line-no">2016</span><span id="line-2016"> super(rArray, roffset, rlength);</span> |
| <span class="source-line-no">2017</span><span id="line-2017"> this.fArray = fArray;</span> |
| <span class="source-line-no">2018</span><span id="line-2018"> this.foffset = foffset;</span> |
| <span class="source-line-no">2019</span><span id="line-2019"> this.flength = flength;</span> |
| <span class="source-line-no">2020</span><span id="line-2020"> this.qArray = qArray;</span> |
| <span class="source-line-no">2021</span><span id="line-2021"> this.qoffset = qoffset;</span> |
| <span class="source-line-no">2022</span><span id="line-2022"> this.qlength = qlength;</span> |
| <span class="source-line-no">2023</span><span id="line-2023"> }</span> |
| <span class="source-line-no">2024</span><span id="line-2024"></span> |
| <span class="source-line-no">2025</span><span id="line-2025"> @Override</span> |
| <span class="source-line-no">2026</span><span id="line-2026"> public long heapSize() {</span> |
| <span class="source-line-no">2027</span><span id="line-2027"> return ClassSize.align(FIXED_OVERHEAD)</span> |
| <span class="source-line-no">2028</span><span id="line-2028"> // array overhead</span> |
| <span class="source-line-no">2029</span><span id="line-2029"> + (flength == 0 ? ClassSize.sizeOfByteArray(flength) : flength)</span> |
| <span class="source-line-no">2030</span><span id="line-2030"> + (qlength == 0 ? ClassSize.sizeOfByteArray(qlength) : qlength);</span> |
| <span class="source-line-no">2031</span><span id="line-2031"> }</span> |
| <span class="source-line-no">2032</span><span id="line-2032"></span> |
| <span class="source-line-no">2033</span><span id="line-2033"> @Override</span> |
| <span class="source-line-no">2034</span><span id="line-2034"> public byte[] getFamilyArray() {</span> |
| <span class="source-line-no">2035</span><span id="line-2035"> return this.fArray;</span> |
| <span class="source-line-no">2036</span><span id="line-2036"> }</span> |
| <span class="source-line-no">2037</span><span id="line-2037"></span> |
| <span class="source-line-no">2038</span><span id="line-2038"> @Override</span> |
| <span class="source-line-no">2039</span><span id="line-2039"> public int getFamilyOffset() {</span> |
| <span class="source-line-no">2040</span><span id="line-2040"> return this.foffset;</span> |
| <span class="source-line-no">2041</span><span id="line-2041"> }</span> |
| <span class="source-line-no">2042</span><span id="line-2042"></span> |
| <span class="source-line-no">2043</span><span id="line-2043"> @Override</span> |
| <span class="source-line-no">2044</span><span id="line-2044"> public byte getFamilyLength() {</span> |
| <span class="source-line-no">2045</span><span id="line-2045"> return this.flength;</span> |
| <span class="source-line-no">2046</span><span id="line-2046"> }</span> |
| <span class="source-line-no">2047</span><span id="line-2047"></span> |
| <span class="source-line-no">2048</span><span id="line-2048"> @Override</span> |
| <span class="source-line-no">2049</span><span id="line-2049"> public byte[] getQualifierArray() {</span> |
| <span class="source-line-no">2050</span><span id="line-2050"> return this.qArray;</span> |
| <span class="source-line-no">2051</span><span id="line-2051"> }</span> |
| <span class="source-line-no">2052</span><span id="line-2052"></span> |
| <span class="source-line-no">2053</span><span id="line-2053"> @Override</span> |
| <span class="source-line-no">2054</span><span id="line-2054"> public int getQualifierOffset() {</span> |
| <span class="source-line-no">2055</span><span id="line-2055"> return this.qoffset;</span> |
| <span class="source-line-no">2056</span><span id="line-2056"> }</span> |
| <span class="source-line-no">2057</span><span id="line-2057"></span> |
| <span class="source-line-no">2058</span><span id="line-2058"> @Override</span> |
| <span class="source-line-no">2059</span><span id="line-2059"> public int getQualifierLength() {</span> |
| <span class="source-line-no">2060</span><span id="line-2060"> return this.qlength;</span> |
| <span class="source-line-no">2061</span><span id="line-2061"> }</span> |
| <span class="source-line-no">2062</span><span id="line-2062"> }</span> |
| <span class="source-line-no">2063</span><span id="line-2063"></span> |
| <span class="source-line-no">2064</span><span id="line-2064"> private static class LastOnRowColByteBufferExtendedCell extends LastOnRowByteBufferExtendedCell {</span> |
| <span class="source-line-no">2065</span><span id="line-2065"> // @formatter:off</span> |
| <span class="source-line-no">2066</span><span id="line-2066"> private static final int FIXED_OVERHEAD = LastOnRowByteBufferExtendedCell.FIXED_OVERHEAD</span> |
| <span class="source-line-no">2067</span><span id="line-2067"> + ClassSize.REFERENCE * 2 // fBuffer and qBuffer</span> |
| <span class="source-line-no">2068</span><span id="line-2068"> + Bytes.SIZEOF_INT * 3 // foffset, qoffset, qlength</span> |
| <span class="source-line-no">2069</span><span id="line-2069"> + Bytes.SIZEOF_BYTE; // flength</span> |
| <span class="source-line-no">2070</span><span id="line-2070"> // @formatter:on</span> |
| <span class="source-line-no">2071</span><span id="line-2071"> private final ByteBuffer fBuffer;</span> |
| <span class="source-line-no">2072</span><span id="line-2072"> private final int foffset;</span> |
| <span class="source-line-no">2073</span><span id="line-2073"> private final byte flength;</span> |
| <span class="source-line-no">2074</span><span id="line-2074"> private final ByteBuffer qBuffer;</span> |
| <span class="source-line-no">2075</span><span id="line-2075"> private final int qoffset;</span> |
| <span class="source-line-no">2076</span><span id="line-2076"> private final int qlength;</span> |
| <span class="source-line-no">2077</span><span id="line-2077"></span> |
| <span class="source-line-no">2078</span><span id="line-2078"> public LastOnRowColByteBufferExtendedCell(ByteBuffer rBuffer, int roffset, short rlength,</span> |
| <span class="source-line-no">2079</span><span id="line-2079"> ByteBuffer fBuffer, int foffset, byte flength, ByteBuffer qBuffer, int qoffset, int qlength) {</span> |
| <span class="source-line-no">2080</span><span id="line-2080"> super(rBuffer, roffset, rlength);</span> |
| <span class="source-line-no">2081</span><span id="line-2081"> this.fBuffer = fBuffer;</span> |
| <span class="source-line-no">2082</span><span id="line-2082"> this.foffset = foffset;</span> |
| <span class="source-line-no">2083</span><span id="line-2083"> this.flength = flength;</span> |
| <span class="source-line-no">2084</span><span id="line-2084"> this.qBuffer = qBuffer;</span> |
| <span class="source-line-no">2085</span><span id="line-2085"> this.qoffset = qoffset;</span> |
| <span class="source-line-no">2086</span><span id="line-2086"> this.qlength = qlength;</span> |
| <span class="source-line-no">2087</span><span id="line-2087"> }</span> |
| <span class="source-line-no">2088</span><span id="line-2088"></span> |
| <span class="source-line-no">2089</span><span id="line-2089"> @Override</span> |
| <span class="source-line-no">2090</span><span id="line-2090"> public long heapSize() {</span> |
| <span class="source-line-no">2091</span><span id="line-2091"> if (fBuffer.hasArray() && qBuffer.hasArray()) {</span> |
| <span class="source-line-no">2092</span><span id="line-2092"> return ClassSize.align(FIXED_OVERHEAD + flength + qlength);</span> |
| <span class="source-line-no">2093</span><span id="line-2093"> } else if (fBuffer.hasArray()) {</span> |
| <span class="source-line-no">2094</span><span id="line-2094"> return ClassSize.align(FIXED_OVERHEAD + flength);</span> |
| <span class="source-line-no">2095</span><span id="line-2095"> } else if (qBuffer.hasArray()) {</span> |
| <span class="source-line-no">2096</span><span id="line-2096"> return ClassSize.align(FIXED_OVERHEAD + qlength);</span> |
| <span class="source-line-no">2097</span><span id="line-2097"> } else {</span> |
| <span class="source-line-no">2098</span><span id="line-2098"> return ClassSize.align(FIXED_OVERHEAD);</span> |
| <span class="source-line-no">2099</span><span id="line-2099"> }</span> |
| <span class="source-line-no">2100</span><span id="line-2100"> }</span> |
| <span class="source-line-no">2101</span><span id="line-2101"></span> |
| <span class="source-line-no">2102</span><span id="line-2102"> @Override</span> |
| <span class="source-line-no">2103</span><span id="line-2103"> public ByteBuffer getFamilyByteBuffer() {</span> |
| <span class="source-line-no">2104</span><span id="line-2104"> return this.fBuffer;</span> |
| <span class="source-line-no">2105</span><span id="line-2105"> }</span> |
| <span class="source-line-no">2106</span><span id="line-2106"></span> |
| <span class="source-line-no">2107</span><span id="line-2107"> @Override</span> |
| <span class="source-line-no">2108</span><span id="line-2108"> public int getFamilyPosition() {</span> |
| <span class="source-line-no">2109</span><span id="line-2109"> return this.foffset;</span> |
| <span class="source-line-no">2110</span><span id="line-2110"> }</span> |
| <span class="source-line-no">2111</span><span id="line-2111"></span> |
| <span class="source-line-no">2112</span><span id="line-2112"> @Override</span> |
| <span class="source-line-no">2113</span><span id="line-2113"> public byte getFamilyLength() {</span> |
| <span class="source-line-no">2114</span><span id="line-2114"> return this.flength;</span> |
| <span class="source-line-no">2115</span><span id="line-2115"> }</span> |
| <span class="source-line-no">2116</span><span id="line-2116"></span> |
| <span class="source-line-no">2117</span><span id="line-2117"> @Override</span> |
| <span class="source-line-no">2118</span><span id="line-2118"> public ByteBuffer getQualifierByteBuffer() {</span> |
| <span class="source-line-no">2119</span><span id="line-2119"> return this.qBuffer;</span> |
| <span class="source-line-no">2120</span><span id="line-2120"> }</span> |
| <span class="source-line-no">2121</span><span id="line-2121"></span> |
| <span class="source-line-no">2122</span><span id="line-2122"> @Override</span> |
| <span class="source-line-no">2123</span><span id="line-2123"> public int getQualifierPosition() {</span> |
| <span class="source-line-no">2124</span><span id="line-2124"> return this.qoffset;</span> |
| <span class="source-line-no">2125</span><span id="line-2125"> }</span> |
| <span class="source-line-no">2126</span><span id="line-2126"></span> |
| <span class="source-line-no">2127</span><span id="line-2127"> @Override</span> |
| <span class="source-line-no">2128</span><span id="line-2128"> public int getQualifierLength() {</span> |
| <span class="source-line-no">2129</span><span id="line-2129"> return this.qlength;</span> |
| <span class="source-line-no">2130</span><span id="line-2130"> }</span> |
| <span class="source-line-no">2131</span><span id="line-2131"> }</span> |
| <span class="source-line-no">2132</span><span id="line-2132"></span> |
| <span class="source-line-no">2133</span><span id="line-2133"> private static class FirstOnRowDeleteFamilyCell extends EmptyCell {</span> |
| <span class="source-line-no">2134</span><span id="line-2134"> // @formatter:off</span> |
| <span class="source-line-no">2135</span><span id="line-2135"> private static final int FIXED_OVERHEAD = ClassSize.OBJECT // object</span> |
| <span class="source-line-no">2136</span><span id="line-2136"> + ClassSize.REFERENCE * 2 // fBuffer and qBuffer</span> |
| <span class="source-line-no">2137</span><span id="line-2137"> + Bytes.SIZEOF_INT * 3 // foffset, qoffset, qlength</span> |
| <span class="source-line-no">2138</span><span id="line-2138"> + Bytes.SIZEOF_BYTE; // flength</span> |
| <span class="source-line-no">2139</span><span id="line-2139"> // @formatter:on</span> |
| <span class="source-line-no">2140</span><span id="line-2140"> private final byte[] row;</span> |
| <span class="source-line-no">2141</span><span id="line-2141"> private final byte[] fam;</span> |
| <span class="source-line-no">2142</span><span id="line-2142"></span> |
| <span class="source-line-no">2143</span><span id="line-2143"> public FirstOnRowDeleteFamilyCell(byte[] row, byte[] fam) {</span> |
| <span class="source-line-no">2144</span><span id="line-2144"> this.row = row;</span> |
| <span class="source-line-no">2145</span><span id="line-2145"> this.fam = fam;</span> |
| <span class="source-line-no">2146</span><span id="line-2146"> }</span> |
| <span class="source-line-no">2147</span><span id="line-2147"></span> |
| <span class="source-line-no">2148</span><span id="line-2148"> @Override</span> |
| <span class="source-line-no">2149</span><span id="line-2149"> public long heapSize() {</span> |
| <span class="source-line-no">2150</span><span id="line-2150"> return ClassSize.align(FIXED_OVERHEAD)</span> |
| <span class="source-line-no">2151</span><span id="line-2151"> // array overhead</span> |
| <span class="source-line-no">2152</span><span id="line-2152"> + (getRowLength() == 0 ? ClassSize.sizeOfByteArray(getRowLength()) : getRowLength())</span> |
| <span class="source-line-no">2153</span><span id="line-2153"> + (getFamilyLength() == 0</span> |
| <span class="source-line-no">2154</span><span id="line-2154"> ? ClassSize.sizeOfByteArray(getFamilyLength())</span> |
| <span class="source-line-no">2155</span><span id="line-2155"> : getFamilyLength());</span> |
| <span class="source-line-no">2156</span><span id="line-2156"> }</span> |
| <span class="source-line-no">2157</span><span id="line-2157"></span> |
| <span class="source-line-no">2158</span><span id="line-2158"> @Override</span> |
| <span class="source-line-no">2159</span><span id="line-2159"> public byte[] getRowArray() {</span> |
| <span class="source-line-no">2160</span><span id="line-2160"> return this.row;</span> |
| <span class="source-line-no">2161</span><span id="line-2161"> }</span> |
| <span class="source-line-no">2162</span><span id="line-2162"></span> |
| <span class="source-line-no">2163</span><span id="line-2163"> @Override</span> |
| <span class="source-line-no">2164</span><span id="line-2164"> public short getRowLength() {</span> |
| <span class="source-line-no">2165</span><span id="line-2165"> return (short) this.row.length;</span> |
| <span class="source-line-no">2166</span><span id="line-2166"> }</span> |
| <span class="source-line-no">2167</span><span id="line-2167"></span> |
| <span class="source-line-no">2168</span><span id="line-2168"> @Override</span> |
| <span class="source-line-no">2169</span><span id="line-2169"> public byte[] getFamilyArray() {</span> |
| <span class="source-line-no">2170</span><span id="line-2170"> return this.fam;</span> |
| <span class="source-line-no">2171</span><span id="line-2171"> }</span> |
| <span class="source-line-no">2172</span><span id="line-2172"></span> |
| <span class="source-line-no">2173</span><span id="line-2173"> @Override</span> |
| <span class="source-line-no">2174</span><span id="line-2174"> public byte getFamilyLength() {</span> |
| <span class="source-line-no">2175</span><span id="line-2175"> return (byte) this.fam.length;</span> |
| <span class="source-line-no">2176</span><span id="line-2176"> }</span> |
| <span class="source-line-no">2177</span><span id="line-2177"></span> |
| <span class="source-line-no">2178</span><span id="line-2178"> @Override</span> |
| <span class="source-line-no">2179</span><span id="line-2179"> public long getTimestamp() {</span> |
| <span class="source-line-no">2180</span><span id="line-2180"> return HConstants.LATEST_TIMESTAMP;</span> |
| <span class="source-line-no">2181</span><span id="line-2181"> }</span> |
| <span class="source-line-no">2182</span><span id="line-2182"></span> |
| <span class="source-line-no">2183</span><span id="line-2183"> @Override</span> |
| <span class="source-line-no">2184</span><span id="line-2184"> public byte getTypeByte() {</span> |
| <span class="source-line-no">2185</span><span id="line-2185"> return KeyValue.Type.DeleteFamily.getCode();</span> |
| <span class="source-line-no">2186</span><span id="line-2186"> }</span> |
| <span class="source-line-no">2187</span><span id="line-2187"></span> |
| <span class="source-line-no">2188</span><span id="line-2188"> @Override</span> |
| <span class="source-line-no">2189</span><span id="line-2189"> public Type getType() {</span> |
| <span class="source-line-no">2190</span><span id="line-2190"> return Type.DeleteFamily;</span> |
| <span class="source-line-no">2191</span><span id="line-2191"> }</span> |
| <span class="source-line-no">2192</span><span id="line-2192"> }</span> |
| <span class="source-line-no">2193</span><span id="line-2193"></span> |
| <span class="source-line-no">2194</span><span id="line-2194"> /**</span> |
| <span class="source-line-no">2195</span><span id="line-2195"> * Writes the Cell's key part as it would have serialized in a KeyValue. The format is &lt;2 bytes</span> |
| <span class="source-line-no">2196</span><span id="line-2196"> * rk len&gt;&lt;rk&gt;&lt;1 byte cf len&gt;&lt;cf&gt;&lt;qualifier&gt;&lt;8 bytes</span> |
| <span class="source-line-no">2197</span><span id="line-2197"> * timestamp&gt;&lt;1 byte type&gt;</span> |
| <span class="source-line-no">2198</span><span id="line-2198"> */</span> |
| <span class="source-line-no">2199</span><span id="line-2199"> public static void writeFlatKey(Cell cell, DataOutput out) throws IOException {</span> |
| <span class="source-line-no">2200</span><span id="line-2200"> short rowLen = cell.getRowLength();</span> |
| <span class="source-line-no">2201</span><span id="line-2201"> byte fLen = cell.getFamilyLength();</span> |
| <span class="source-line-no">2202</span><span id="line-2202"> int qLen = cell.getQualifierLength();</span> |
| <span class="source-line-no">2203</span><span id="line-2203"> // Using just one if/else loop instead of every time checking before writing every</span> |
| <span class="source-line-no">2204</span><span id="line-2204"> // component of cell</span> |
| <span class="source-line-no">2205</span><span id="line-2205"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2206</span><span id="line-2206"> out.writeShort(rowLen);</span> |
| <span class="source-line-no">2207</span><span id="line-2207"> ByteBufferUtils.copyBufferToStream(out, ((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2208</span><span id="line-2208"> ((ByteBufferExtendedCell) cell).getRowPosition(), rowLen);</span> |
| <span class="source-line-no">2209</span><span id="line-2209"> out.writeByte(fLen);</span> |
| <span class="source-line-no">2210</span><span id="line-2210"> ByteBufferUtils.copyBufferToStream(out, ((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),</span> |
| <span class="source-line-no">2211</span><span id="line-2211"> ((ByteBufferExtendedCell) cell).getFamilyPosition(), fLen);</span> |
| <span class="source-line-no">2212</span><span id="line-2212"> ByteBufferUtils.copyBufferToStream(out,</span> |
| <span class="source-line-no">2213</span><span id="line-2213"> ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">2214</span><span id="line-2214"> ((ByteBufferExtendedCell) cell).getQualifierPosition(), qLen);</span> |
| <span class="source-line-no">2215</span><span id="line-2215"> } else {</span> |
| <span class="source-line-no">2216</span><span id="line-2216"> out.writeShort(rowLen);</span> |
| <span class="source-line-no">2217</span><span id="line-2217"> out.write(cell.getRowArray(), cell.getRowOffset(), rowLen);</span> |
| <span class="source-line-no">2218</span><span id="line-2218"> out.writeByte(fLen);</span> |
| <span class="source-line-no">2219</span><span id="line-2219"> out.write(cell.getFamilyArray(), cell.getFamilyOffset(), fLen);</span> |
| <span class="source-line-no">2220</span><span id="line-2220"> out.write(cell.getQualifierArray(), cell.getQualifierOffset(), qLen);</span> |
| <span class="source-line-no">2221</span><span id="line-2221"> }</span> |
| <span class="source-line-no">2222</span><span id="line-2222"> out.writeLong(cell.getTimestamp());</span> |
| <span class="source-line-no">2223</span><span id="line-2223"> out.writeByte(cell.getTypeByte());</span> |
| <span class="source-line-no">2224</span><span id="line-2224"> }</span> |
| <span class="source-line-no">2225</span><span id="line-2225"></span> |
| <span class="source-line-no">2226</span><span id="line-2226"> /**</span> |
| <span class="source-line-no">2227</span><span id="line-2227"> * Deep clones the given cell if the cell supports deep cloning</span> |
| <span class="source-line-no">2228</span><span id="line-2228"> * @param cell the cell to be cloned</span> |
| <span class="source-line-no">2229</span><span id="line-2229"> * @return the cloned cell</span> |
| <span class="source-line-no">2230</span><span id="line-2230"> */</span> |
| <span class="source-line-no">2231</span><span id="line-2231"> public static Cell deepClone(Cell cell) throws CloneNotSupportedException {</span> |
| <span class="source-line-no">2232</span><span id="line-2232"> if (cell instanceof ExtendedCell) {</span> |
| <span class="source-line-no">2233</span><span id="line-2233"> return ((ExtendedCell) cell).deepClone();</span> |
| <span class="source-line-no">2234</span><span id="line-2234"> }</span> |
| <span class="source-line-no">2235</span><span id="line-2235"> throw new CloneNotSupportedException();</span> |
| <span class="source-line-no">2236</span><span id="line-2236"> }</span> |
| <span class="source-line-no">2237</span><span id="line-2237"></span> |
| <span class="source-line-no">2238</span><span id="line-2238"> /**</span> |
| <span class="source-line-no">2239</span><span id="line-2239"> * Writes the cell to the given OutputStream</span> |
| <span class="source-line-no">2240</span><span id="line-2240"> * @param cell the cell to be written</span> |
| <span class="source-line-no">2241</span><span id="line-2241"> * @param out the outputstream</span> |
| <span class="source-line-no">2242</span><span id="line-2242"> * @param withTags if tags are to be written or not</span> |
| <span class="source-line-no">2243</span><span id="line-2243"> * @return the total bytes written</span> |
| <span class="source-line-no">2244</span><span id="line-2244"> */</span> |
| <span class="source-line-no">2245</span><span id="line-2245"> public static int writeCell(Cell cell, OutputStream out, boolean withTags) throws IOException {</span> |
| <span class="source-line-no">2246</span><span id="line-2246"> if (cell instanceof ExtendedCell) {</span> |
| <span class="source-line-no">2247</span><span id="line-2247"> return ((ExtendedCell) cell).write(out, withTags);</span> |
| <span class="source-line-no">2248</span><span id="line-2248"> } else {</span> |
| <span class="source-line-no">2249</span><span id="line-2249"> ByteBufferUtils.putInt(out, estimatedSerializedSizeOfKey(cell));</span> |
| <span class="source-line-no">2250</span><span id="line-2250"> ByteBufferUtils.putInt(out, cell.getValueLength());</span> |
| <span class="source-line-no">2251</span><span id="line-2251"> writeFlatKey(cell, out);</span> |
| <span class="source-line-no">2252</span><span id="line-2252"> writeValue(out, cell, cell.getValueLength());</span> |
| <span class="source-line-no">2253</span><span id="line-2253"> int tagsLength = cell.getTagsLength();</span> |
| <span class="source-line-no">2254</span><span id="line-2254"> if (withTags) {</span> |
| <span class="source-line-no">2255</span><span id="line-2255"> byte[] len = new byte[Bytes.SIZEOF_SHORT];</span> |
| <span class="source-line-no">2256</span><span id="line-2256"> Bytes.putAsShort(len, 0, tagsLength);</span> |
| <span class="source-line-no">2257</span><span id="line-2257"> out.write(len);</span> |
| <span class="source-line-no">2258</span><span id="line-2258"> if (tagsLength > 0) {</span> |
| <span class="source-line-no">2259</span><span id="line-2259"> writeTags(out, cell, tagsLength);</span> |
| <span class="source-line-no">2260</span><span id="line-2260"> }</span> |
| <span class="source-line-no">2261</span><span id="line-2261"> }</span> |
| <span class="source-line-no">2262</span><span id="line-2262"> int lenWritten =</span> |
| <span class="source-line-no">2263</span><span id="line-2263"> (2 * Bytes.SIZEOF_INT) + estimatedSerializedSizeOfKey(cell) + cell.getValueLength();</span> |
| <span class="source-line-no">2264</span><span id="line-2264"> if (withTags) {</span> |
| <span class="source-line-no">2265</span><span id="line-2265"> lenWritten += Bytes.SIZEOF_SHORT + tagsLength;</span> |
| <span class="source-line-no">2266</span><span id="line-2266"> }</span> |
| <span class="source-line-no">2267</span><span id="line-2267"> return lenWritten;</span> |
| <span class="source-line-no">2268</span><span id="line-2268"> }</span> |
| <span class="source-line-no">2269</span><span id="line-2269"> }</span> |
| <span class="source-line-no">2270</span><span id="line-2270"></span> |
| <span class="source-line-no">2271</span><span id="line-2271"> /**</span> |
| <span class="source-line-no">2272</span><span id="line-2272"> * Writes a cell to the buffer at the given offset</span> |
| <span class="source-line-no">2273</span><span id="line-2273"> * @param cell the cell to be written</span> |
| <span class="source-line-no">2274</span><span id="line-2274"> * @param buf the buffer to which the cell has to be wrriten</span> |
| <span class="source-line-no">2275</span><span id="line-2275"> * @param offset the offset at which the cell should be written</span> |
| <span class="source-line-no">2276</span><span id="line-2276"> */</span> |
| <span class="source-line-no">2277</span><span id="line-2277"> public static void writeCellToBuffer(Cell cell, ByteBuffer buf, int offset) {</span> |
| <span class="source-line-no">2278</span><span id="line-2278"> if (cell instanceof ExtendedCell) {</span> |
| <span class="source-line-no">2279</span><span id="line-2279"> ((ExtendedCell) cell).write(buf, offset);</span> |
| <span class="source-line-no">2280</span><span id="line-2280"> } else {</span> |
| <span class="source-line-no">2281</span><span id="line-2281"> // Using the KVUtil</span> |
| <span class="source-line-no">2282</span><span id="line-2282"> byte[] bytes = KeyValueUtil.copyToNewByteArray(cell);</span> |
| <span class="source-line-no">2283</span><span id="line-2283"> ByteBufferUtils.copyFromArrayToBuffer(buf, offset, bytes, 0, bytes.length);</span> |
| <span class="source-line-no">2284</span><span id="line-2284"> }</span> |
| <span class="source-line-no">2285</span><span id="line-2285"> }</span> |
| <span class="source-line-no">2286</span><span id="line-2286"></span> |
| <span class="source-line-no">2287</span><span id="line-2287"> public static int writeFlatKey(Cell cell, OutputStream out) throws IOException {</span> |
| <span class="source-line-no">2288</span><span id="line-2288"> short rowLen = cell.getRowLength();</span> |
| <span class="source-line-no">2289</span><span id="line-2289"> byte fLen = cell.getFamilyLength();</span> |
| <span class="source-line-no">2290</span><span id="line-2290"> int qLen = cell.getQualifierLength();</span> |
| <span class="source-line-no">2291</span><span id="line-2291"> // Using just one if/else loop instead of every time checking before writing every</span> |
| <span class="source-line-no">2292</span><span id="line-2292"> // component of cell</span> |
| <span class="source-line-no">2293</span><span id="line-2293"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2294</span><span id="line-2294"> StreamUtils.writeShort(out, rowLen);</span> |
| <span class="source-line-no">2295</span><span id="line-2295"> ByteBufferUtils.copyBufferToStream(out, ((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2296</span><span id="line-2296"> ((ByteBufferExtendedCell) cell).getRowPosition(), rowLen);</span> |
| <span class="source-line-no">2297</span><span id="line-2297"> out.write(fLen);</span> |
| <span class="source-line-no">2298</span><span id="line-2298"> ByteBufferUtils.copyBufferToStream(out, ((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),</span> |
| <span class="source-line-no">2299</span><span id="line-2299"> ((ByteBufferExtendedCell) cell).getFamilyPosition(), fLen);</span> |
| <span class="source-line-no">2300</span><span id="line-2300"> ByteBufferUtils.copyBufferToStream(out,</span> |
| <span class="source-line-no">2301</span><span id="line-2301"> ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">2302</span><span id="line-2302"> ((ByteBufferExtendedCell) cell).getQualifierPosition(), qLen);</span> |
| <span class="source-line-no">2303</span><span id="line-2303"> } else {</span> |
| <span class="source-line-no">2304</span><span id="line-2304"> StreamUtils.writeShort(out, rowLen);</span> |
| <span class="source-line-no">2305</span><span id="line-2305"> out.write(cell.getRowArray(), cell.getRowOffset(), rowLen);</span> |
| <span class="source-line-no">2306</span><span id="line-2306"> out.write(fLen);</span> |
| <span class="source-line-no">2307</span><span id="line-2307"> out.write(cell.getFamilyArray(), cell.getFamilyOffset(), fLen);</span> |
| <span class="source-line-no">2308</span><span id="line-2308"> out.write(cell.getQualifierArray(), cell.getQualifierOffset(), qLen);</span> |
| <span class="source-line-no">2309</span><span id="line-2309"> }</span> |
| <span class="source-line-no">2310</span><span id="line-2310"> StreamUtils.writeLong(out, cell.getTimestamp());</span> |
| <span class="source-line-no">2311</span><span id="line-2311"> out.write(cell.getTypeByte());</span> |
| <span class="source-line-no">2312</span><span id="line-2312"> return Bytes.SIZEOF_SHORT + rowLen + Bytes.SIZEOF_BYTE + fLen + qLen + Bytes.SIZEOF_LONG</span> |
| <span class="source-line-no">2313</span><span id="line-2313"> + Bytes.SIZEOF_BYTE;</span> |
| <span class="source-line-no">2314</span><span id="line-2314"> }</span> |
| <span class="source-line-no">2315</span><span id="line-2315"></span> |
| <span class="source-line-no">2316</span><span id="line-2316"> /**</span> |
| <span class="source-line-no">2317</span><span id="line-2317"> * Sets the given seqId to the cell. Marked as audience Private as of 1.2.0. Setting a Cell</span> |
| <span class="source-line-no">2318</span><span id="line-2318"> * sequenceid is an internal implementation detail not for general public use.</span> |
| <span class="source-line-no">2319</span><span id="line-2319"> * @throws IOException when the passed cell is not of type {@link ExtendedCell}</span> |
| <span class="source-line-no">2320</span><span id="line-2320"> */</span> |
| <span class="source-line-no">2321</span><span id="line-2321"> public static void setSequenceId(Cell cell, long seqId) throws IOException {</span> |
| <span class="source-line-no">2322</span><span id="line-2322"> if (cell instanceof ExtendedCell) {</span> |
| <span class="source-line-no">2323</span><span id="line-2323"> ((ExtendedCell) cell).setSequenceId(seqId);</span> |
| <span class="source-line-no">2324</span><span id="line-2324"> } else {</span> |
| <span class="source-line-no">2325</span><span id="line-2325"> throw new IOException(</span> |
| <span class="source-line-no">2326</span><span id="line-2326"> new UnsupportedOperationException("Cell is not of type " + ExtendedCell.class.getName()));</span> |
| <span class="source-line-no">2327</span><span id="line-2327"> }</span> |
| <span class="source-line-no">2328</span><span id="line-2328"> }</span> |
| <span class="source-line-no">2329</span><span id="line-2329"></span> |
| <span class="source-line-no">2330</span><span id="line-2330"> /**</span> |
| <span class="source-line-no">2331</span><span id="line-2331"> * Sets the given timestamp to the cell.</span> |
| <span class="source-line-no">2332</span><span id="line-2332"> * @throws IOException when the passed cell is not of type {@link ExtendedCell}</span> |
| <span class="source-line-no">2333</span><span id="line-2333"> */</span> |
| <span class="source-line-no">2334</span><span id="line-2334"> public static void setTimestamp(Cell cell, long ts) throws IOException {</span> |
| <span class="source-line-no">2335</span><span id="line-2335"> if (cell instanceof ExtendedCell) {</span> |
| <span class="source-line-no">2336</span><span id="line-2336"> ((ExtendedCell) cell).setTimestamp(ts);</span> |
| <span class="source-line-no">2337</span><span id="line-2337"> } else {</span> |
| <span class="source-line-no">2338</span><span id="line-2338"> throw new IOException(</span> |
| <span class="source-line-no">2339</span><span id="line-2339"> new UnsupportedOperationException("Cell is not of type " + ExtendedCell.class.getName()));</span> |
| <span class="source-line-no">2340</span><span id="line-2340"> }</span> |
| <span class="source-line-no">2341</span><span id="line-2341"> }</span> |
| <span class="source-line-no">2342</span><span id="line-2342"></span> |
| <span class="source-line-no">2343</span><span id="line-2343"> /**</span> |
| <span class="source-line-no">2344</span><span id="line-2344"> * Sets the given timestamp to the cell.</span> |
| <span class="source-line-no">2345</span><span id="line-2345"> * @throws IOException when the passed cell is not of type {@link ExtendedCell}</span> |
| <span class="source-line-no">2346</span><span id="line-2346"> */</span> |
| <span class="source-line-no">2347</span><span id="line-2347"> public static void setTimestamp(Cell cell, byte[] ts) throws IOException {</span> |
| <span class="source-line-no">2348</span><span id="line-2348"> if (cell instanceof ExtendedCell) {</span> |
| <span class="source-line-no">2349</span><span id="line-2349"> ((ExtendedCell) cell).setTimestamp(ts);</span> |
| <span class="source-line-no">2350</span><span id="line-2350"> } else {</span> |
| <span class="source-line-no">2351</span><span id="line-2351"> throw new IOException(</span> |
| <span class="source-line-no">2352</span><span id="line-2352"> new UnsupportedOperationException("Cell is not of type " + ExtendedCell.class.getName()));</span> |
| <span class="source-line-no">2353</span><span id="line-2353"> }</span> |
| <span class="source-line-no">2354</span><span id="line-2354"> }</span> |
| <span class="source-line-no">2355</span><span id="line-2355"></span> |
| <span class="source-line-no">2356</span><span id="line-2356"> /**</span> |
| <span class="source-line-no">2357</span><span id="line-2357"> * Sets the given timestamp to the cell iff current timestamp is</span> |
| <span class="source-line-no">2358</span><span id="line-2358"> * {@link HConstants#LATEST_TIMESTAMP}.</span> |
| <span class="source-line-no">2359</span><span id="line-2359"> * @return True if cell timestamp is modified.</span> |
| <span class="source-line-no">2360</span><span id="line-2360"> * @throws IOException when the passed cell is not of type {@link ExtendedCell}</span> |
| <span class="source-line-no">2361</span><span id="line-2361"> */</span> |
| <span class="source-line-no">2362</span><span id="line-2362"> public static boolean updateLatestStamp(Cell cell, long ts) throws IOException {</span> |
| <span class="source-line-no">2363</span><span id="line-2363"> if (cell.getTimestamp() == HConstants.LATEST_TIMESTAMP) {</span> |
| <span class="source-line-no">2364</span><span id="line-2364"> setTimestamp(cell, ts);</span> |
| <span class="source-line-no">2365</span><span id="line-2365"> return true;</span> |
| <span class="source-line-no">2366</span><span id="line-2366"> }</span> |
| <span class="source-line-no">2367</span><span id="line-2367"> return false;</span> |
| <span class="source-line-no">2368</span><span id="line-2368"> }</span> |
| <span class="source-line-no">2369</span><span id="line-2369"></span> |
| <span class="source-line-no">2370</span><span id="line-2370"> /**</span> |
| <span class="source-line-no">2371</span><span id="line-2371"> * Sets the given timestamp to the cell iff current timestamp is</span> |
| <span class="source-line-no">2372</span><span id="line-2372"> * {@link HConstants#LATEST_TIMESTAMP}.</span> |
| <span class="source-line-no">2373</span><span id="line-2373"> * @return True if cell timestamp is modified.</span> |
| <span class="source-line-no">2374</span><span id="line-2374"> * @throws IOException when the passed cell is not of type {@link ExtendedCell}</span> |
| <span class="source-line-no">2375</span><span id="line-2375"> */</span> |
| <span class="source-line-no">2376</span><span id="line-2376"> public static boolean updateLatestStamp(Cell cell, byte[] ts) throws IOException {</span> |
| <span class="source-line-no">2377</span><span id="line-2377"> if (cell.getTimestamp() == HConstants.LATEST_TIMESTAMP) {</span> |
| <span class="source-line-no">2378</span><span id="line-2378"> setTimestamp(cell, ts);</span> |
| <span class="source-line-no">2379</span><span id="line-2379"> return true;</span> |
| <span class="source-line-no">2380</span><span id="line-2380"> }</span> |
| <span class="source-line-no">2381</span><span id="line-2381"> return false;</span> |
| <span class="source-line-no">2382</span><span id="line-2382"> }</span> |
| <span class="source-line-no">2383</span><span id="line-2383"></span> |
| <span class="source-line-no">2384</span><span id="line-2384"> /**</span> |
| <span class="source-line-no">2385</span><span id="line-2385"> * Writes the row from the given cell to the output stream</span> |
| <span class="source-line-no">2386</span><span id="line-2386"> * @param out The outputstream to which the data has to be written</span> |
| <span class="source-line-no">2387</span><span id="line-2387"> * @param cell The cell whose contents has to be written</span> |
| <span class="source-line-no">2388</span><span id="line-2388"> * @param rlength the row length</span> |
| <span class="source-line-no">2389</span><span id="line-2389"> */</span> |
| <span class="source-line-no">2390</span><span id="line-2390"> public static void writeRow(OutputStream out, Cell cell, short rlength) throws IOException {</span> |
| <span class="source-line-no">2391</span><span id="line-2391"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2392</span><span id="line-2392"> ByteBufferUtils.copyBufferToStream(out, ((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2393</span><span id="line-2393"> ((ByteBufferExtendedCell) cell).getRowPosition(), rlength);</span> |
| <span class="source-line-no">2394</span><span id="line-2394"> } else {</span> |
| <span class="source-line-no">2395</span><span id="line-2395"> out.write(cell.getRowArray(), cell.getRowOffset(), rlength);</span> |
| <span class="source-line-no">2396</span><span id="line-2396"> }</span> |
| <span class="source-line-no">2397</span><span id="line-2397"> }</span> |
| <span class="source-line-no">2398</span><span id="line-2398"></span> |
| <span class="source-line-no">2399</span><span id="line-2399"> /**</span> |
| <span class="source-line-no">2400</span><span id="line-2400"> * Writes the family from the given cell to the output stream</span> |
| <span class="source-line-no">2401</span><span id="line-2401"> * @param out The outputstream to which the data has to be written</span> |
| <span class="source-line-no">2402</span><span id="line-2402"> * @param cell The cell whose contents has to be written</span> |
| <span class="source-line-no">2403</span><span id="line-2403"> * @param flength the family length</span> |
| <span class="source-line-no">2404</span><span id="line-2404"> */</span> |
| <span class="source-line-no">2405</span><span id="line-2405"> public static void writeFamily(OutputStream out, Cell cell, byte flength) throws IOException {</span> |
| <span class="source-line-no">2406</span><span id="line-2406"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2407</span><span id="line-2407"> ByteBufferUtils.copyBufferToStream(out, ((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),</span> |
| <span class="source-line-no">2408</span><span id="line-2408"> ((ByteBufferExtendedCell) cell).getFamilyPosition(), flength);</span> |
| <span class="source-line-no">2409</span><span id="line-2409"> } else {</span> |
| <span class="source-line-no">2410</span><span id="line-2410"> out.write(cell.getFamilyArray(), cell.getFamilyOffset(), flength);</span> |
| <span class="source-line-no">2411</span><span id="line-2411"> }</span> |
| <span class="source-line-no">2412</span><span id="line-2412"> }</span> |
| <span class="source-line-no">2413</span><span id="line-2413"></span> |
| <span class="source-line-no">2414</span><span id="line-2414"> /**</span> |
| <span class="source-line-no">2415</span><span id="line-2415"> * Writes the qualifier from the given cell to the output stream</span> |
| <span class="source-line-no">2416</span><span id="line-2416"> * @param out The outputstream to which the data has to be written</span> |
| <span class="source-line-no">2417</span><span id="line-2417"> * @param cell The cell whose contents has to be written</span> |
| <span class="source-line-no">2418</span><span id="line-2418"> * @param qlength the qualifier length</span> |
| <span class="source-line-no">2419</span><span id="line-2419"> */</span> |
| <span class="source-line-no">2420</span><span id="line-2420"> public static void writeQualifier(OutputStream out, Cell cell, int qlength) throws IOException {</span> |
| <span class="source-line-no">2421</span><span id="line-2421"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2422</span><span id="line-2422"> ByteBufferUtils.copyBufferToStream(out,</span> |
| <span class="source-line-no">2423</span><span id="line-2423"> ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">2424</span><span id="line-2424"> ((ByteBufferExtendedCell) cell).getQualifierPosition(), qlength);</span> |
| <span class="source-line-no">2425</span><span id="line-2425"> } else {</span> |
| <span class="source-line-no">2426</span><span id="line-2426"> out.write(cell.getQualifierArray(), cell.getQualifierOffset(), qlength);</span> |
| <span class="source-line-no">2427</span><span id="line-2427"> }</span> |
| <span class="source-line-no">2428</span><span id="line-2428"> }</span> |
| <span class="source-line-no">2429</span><span id="line-2429"></span> |
| <span class="source-line-no">2430</span><span id="line-2430"> /**</span> |
| <span class="source-line-no">2431</span><span id="line-2431"> * Writes the qualifier from the given cell to the output stream excluding the common prefix</span> |
| <span class="source-line-no">2432</span><span id="line-2432"> * @param out The dataoutputstream to which the data has to be written</span> |
| <span class="source-line-no">2433</span><span id="line-2433"> * @param cell The cell whose contents has to be written</span> |
| <span class="source-line-no">2434</span><span id="line-2434"> * @param qlength the qualifier length</span> |
| <span class="source-line-no">2435</span><span id="line-2435"> */</span> |
| <span class="source-line-no">2436</span><span id="line-2436"> public static void writeQualifierSkippingBytes(DataOutputStream out, Cell cell, int qlength,</span> |
| <span class="source-line-no">2437</span><span id="line-2437"> int commonPrefix) throws IOException {</span> |
| <span class="source-line-no">2438</span><span id="line-2438"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2439</span><span id="line-2439"> ByteBufferUtils.copyBufferToStream((DataOutput) out,</span> |
| <span class="source-line-no">2440</span><span id="line-2440"> ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">2441</span><span id="line-2441"> ((ByteBufferExtendedCell) cell).getQualifierPosition() + commonPrefix,</span> |
| <span class="source-line-no">2442</span><span id="line-2442"> qlength - commonPrefix);</span> |
| <span class="source-line-no">2443</span><span id="line-2443"> } else {</span> |
| <span class="source-line-no">2444</span><span id="line-2444"> out.write(cell.getQualifierArray(), cell.getQualifierOffset() + commonPrefix,</span> |
| <span class="source-line-no">2445</span><span id="line-2445"> qlength - commonPrefix);</span> |
| <span class="source-line-no">2446</span><span id="line-2446"> }</span> |
| <span class="source-line-no">2447</span><span id="line-2447"> }</span> |
| <span class="source-line-no">2448</span><span id="line-2448"></span> |
| <span class="source-line-no">2449</span><span id="line-2449"> /**</span> |
| <span class="source-line-no">2450</span><span id="line-2450"> * Writes the value from the given cell to the output stream</span> |
| <span class="source-line-no">2451</span><span id="line-2451"> * @param out The outputstream to which the data has to be written</span> |
| <span class="source-line-no">2452</span><span id="line-2452"> * @param cell The cell whose contents has to be written</span> |
| <span class="source-line-no">2453</span><span id="line-2453"> * @param vlength the value length</span> |
| <span class="source-line-no">2454</span><span id="line-2454"> */</span> |
| <span class="source-line-no">2455</span><span id="line-2455"> public static void writeValue(OutputStream out, Cell cell, int vlength) throws IOException {</span> |
| <span class="source-line-no">2456</span><span id="line-2456"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2457</span><span id="line-2457"> ByteBufferUtils.copyBufferToStream(out, ((ByteBufferExtendedCell) cell).getValueByteBuffer(),</span> |
| <span class="source-line-no">2458</span><span id="line-2458"> ((ByteBufferExtendedCell) cell).getValuePosition(), vlength);</span> |
| <span class="source-line-no">2459</span><span id="line-2459"> } else {</span> |
| <span class="source-line-no">2460</span><span id="line-2460"> out.write(cell.getValueArray(), cell.getValueOffset(), vlength);</span> |
| <span class="source-line-no">2461</span><span id="line-2461"> }</span> |
| <span class="source-line-no">2462</span><span id="line-2462"> }</span> |
| <span class="source-line-no">2463</span><span id="line-2463"></span> |
| <span class="source-line-no">2464</span><span id="line-2464"> /**</span> |
| <span class="source-line-no">2465</span><span id="line-2465"> * Writes the tag from the given cell to the output stream</span> |
| <span class="source-line-no">2466</span><span id="line-2466"> * @param out The outputstream to which the data has to be written</span> |
| <span class="source-line-no">2467</span><span id="line-2467"> * @param cell The cell whose contents has to be written</span> |
| <span class="source-line-no">2468</span><span id="line-2468"> * @param tagsLength the tag length</span> |
| <span class="source-line-no">2469</span><span id="line-2469"> */</span> |
| <span class="source-line-no">2470</span><span id="line-2470"> public static void writeTags(OutputStream out, Cell cell, int tagsLength) throws IOException {</span> |
| <span class="source-line-no">2471</span><span id="line-2471"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2472</span><span id="line-2472"> ByteBufferUtils.copyBufferToStream(out, ((ByteBufferExtendedCell) cell).getTagsByteBuffer(),</span> |
| <span class="source-line-no">2473</span><span id="line-2473"> ((ByteBufferExtendedCell) cell).getTagsPosition(), tagsLength);</span> |
| <span class="source-line-no">2474</span><span id="line-2474"> } else {</span> |
| <span class="source-line-no">2475</span><span id="line-2475"> out.write(cell.getTagsArray(), cell.getTagsOffset(), tagsLength);</span> |
| <span class="source-line-no">2476</span><span id="line-2476"> }</span> |
| <span class="source-line-no">2477</span><span id="line-2477"> }</span> |
| <span class="source-line-no">2478</span><span id="line-2478"></span> |
| <span class="source-line-no">2479</span><span id="line-2479"> /**</span> |
| <span class="source-line-no">2480</span><span id="line-2480"> * special case for Cell.equals</span> |
| <span class="source-line-no">2481</span><span id="line-2481"> */</span> |
| <span class="source-line-no">2482</span><span id="line-2482"> public static boolean equalsIgnoreMvccVersion(Cell a, Cell b) {</span> |
| <span class="source-line-no">2483</span><span id="line-2483"> // row</span> |
| <span class="source-line-no">2484</span><span id="line-2484"> boolean res = CellUtil.matchingRows(a, b);</span> |
| <span class="source-line-no">2485</span><span id="line-2485"> if (!res) return res;</span> |
| <span class="source-line-no">2486</span><span id="line-2486"></span> |
| <span class="source-line-no">2487</span><span id="line-2487"> // family</span> |
| <span class="source-line-no">2488</span><span id="line-2488"> res = CellUtil.matchingColumn(a, b);</span> |
| <span class="source-line-no">2489</span><span id="line-2489"> if (!res) return res;</span> |
| <span class="source-line-no">2490</span><span id="line-2490"></span> |
| <span class="source-line-no">2491</span><span id="line-2491"> // timestamp: later sorts first</span> |
| <span class="source-line-no">2492</span><span id="line-2492"> if (!CellUtil.matchingTimestamp(a, b)) return false;</span> |
| <span class="source-line-no">2493</span><span id="line-2493"></span> |
| <span class="source-line-no">2494</span><span id="line-2494"> // type</span> |
| <span class="source-line-no">2495</span><span id="line-2495"> int c = (0xff & b.getTypeByte()) - (0xff & a.getTypeByte());</span> |
| <span class="source-line-no">2496</span><span id="line-2496"> if (c != 0) return false;</span> |
| <span class="source-line-no">2497</span><span id="line-2497"> else return true;</span> |
| <span class="source-line-no">2498</span><span id="line-2498"> }</span> |
| <span class="source-line-no">2499</span><span id="line-2499"></span> |
| <span class="source-line-no">2500</span><span id="line-2500"> /**</span> |
| <span class="source-line-no">2501</span><span id="line-2501"> * Converts the rowkey bytes of the given cell into an int value</span> |
| <span class="source-line-no">2502</span><span id="line-2502"> * @return rowkey as int</span> |
| <span class="source-line-no">2503</span><span id="line-2503"> */</span> |
| <span class="source-line-no">2504</span><span id="line-2504"> public static int getRowAsInt(Cell cell) {</span> |
| <span class="source-line-no">2505</span><span id="line-2505"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2506</span><span id="line-2506"> return ByteBufferUtils.toInt(((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2507</span><span id="line-2507"> ((ByteBufferExtendedCell) cell).getRowPosition());</span> |
| <span class="source-line-no">2508</span><span id="line-2508"> }</span> |
| <span class="source-line-no">2509</span><span id="line-2509"> return Bytes.toInt(cell.getRowArray(), cell.getRowOffset());</span> |
| <span class="source-line-no">2510</span><span id="line-2510"> }</span> |
| <span class="source-line-no">2511</span><span id="line-2511"></span> |
| <span class="source-line-no">2512</span><span id="line-2512"> /**</span> |
| <span class="source-line-no">2513</span><span id="line-2513"> * Converts the value bytes of the given cell into a long value</span> |
| <span class="source-line-no">2514</span><span id="line-2514"> * @return value as long</span> |
| <span class="source-line-no">2515</span><span id="line-2515"> */</span> |
| <span class="source-line-no">2516</span><span id="line-2516"> public static long getValueAsLong(Cell cell) {</span> |
| <span class="source-line-no">2517</span><span id="line-2517"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2518</span><span id="line-2518"> return ByteBufferUtils.toLong(((ByteBufferExtendedCell) cell).getValueByteBuffer(),</span> |
| <span class="source-line-no">2519</span><span id="line-2519"> ((ByteBufferExtendedCell) cell).getValuePosition());</span> |
| <span class="source-line-no">2520</span><span id="line-2520"> }</span> |
| <span class="source-line-no">2521</span><span id="line-2521"> return Bytes.toLong(cell.getValueArray(), cell.getValueOffset());</span> |
| <span class="source-line-no">2522</span><span id="line-2522"> }</span> |
| <span class="source-line-no">2523</span><span id="line-2523"></span> |
| <span class="source-line-no">2524</span><span id="line-2524"> /**</span> |
| <span class="source-line-no">2525</span><span id="line-2525"> * Converts the value bytes of the given cell into a int value</span> |
| <span class="source-line-no">2526</span><span id="line-2526"> * @return value as int</span> |
| <span class="source-line-no">2527</span><span id="line-2527"> */</span> |
| <span class="source-line-no">2528</span><span id="line-2528"> public static int getValueAsInt(Cell cell) {</span> |
| <span class="source-line-no">2529</span><span id="line-2529"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2530</span><span id="line-2530"> return ByteBufferUtils.toInt(((ByteBufferExtendedCell) cell).getValueByteBuffer(),</span> |
| <span class="source-line-no">2531</span><span id="line-2531"> ((ByteBufferExtendedCell) cell).getValuePosition());</span> |
| <span class="source-line-no">2532</span><span id="line-2532"> }</span> |
| <span class="source-line-no">2533</span><span id="line-2533"> return Bytes.toInt(cell.getValueArray(), cell.getValueOffset());</span> |
| <span class="source-line-no">2534</span><span id="line-2534"> }</span> |
| <span class="source-line-no">2535</span><span id="line-2535"></span> |
| <span class="source-line-no">2536</span><span id="line-2536"> /**</span> |
| <span class="source-line-no">2537</span><span id="line-2537"> * Converts the value bytes of the given cell into a double value</span> |
| <span class="source-line-no">2538</span><span id="line-2538"> * @return value as double</span> |
| <span class="source-line-no">2539</span><span id="line-2539"> */</span> |
| <span class="source-line-no">2540</span><span id="line-2540"> public static double getValueAsDouble(Cell cell) {</span> |
| <span class="source-line-no">2541</span><span id="line-2541"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2542</span><span id="line-2542"> return ByteBufferUtils.toDouble(((ByteBufferExtendedCell) cell).getValueByteBuffer(),</span> |
| <span class="source-line-no">2543</span><span id="line-2543"> ((ByteBufferExtendedCell) cell).getValuePosition());</span> |
| <span class="source-line-no">2544</span><span id="line-2544"> }</span> |
| <span class="source-line-no">2545</span><span id="line-2545"> return Bytes.toDouble(cell.getValueArray(), cell.getValueOffset());</span> |
| <span class="source-line-no">2546</span><span id="line-2546"> }</span> |
| <span class="source-line-no">2547</span><span id="line-2547"></span> |
| <span class="source-line-no">2548</span><span id="line-2548"> /**</span> |
| <span class="source-line-no">2549</span><span id="line-2549"> * Converts the value bytes of the given cell into a BigDecimal</span> |
| <span class="source-line-no">2550</span><span id="line-2550"> * @return value as BigDecimal</span> |
| <span class="source-line-no">2551</span><span id="line-2551"> */</span> |
| <span class="source-line-no">2552</span><span id="line-2552"> public static BigDecimal getValueAsBigDecimal(Cell cell) {</span> |
| <span class="source-line-no">2553</span><span id="line-2553"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2554</span><span id="line-2554"> return ByteBufferUtils.toBigDecimal(((ByteBufferExtendedCell) cell).getValueByteBuffer(),</span> |
| <span class="source-line-no">2555</span><span id="line-2555"> ((ByteBufferExtendedCell) cell).getValuePosition(), cell.getValueLength());</span> |
| <span class="source-line-no">2556</span><span id="line-2556"> }</span> |
| <span class="source-line-no">2557</span><span id="line-2557"> return Bytes.toBigDecimal(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());</span> |
| <span class="source-line-no">2558</span><span id="line-2558"> }</span> |
| <span class="source-line-no">2559</span><span id="line-2559"></span> |
| <span class="source-line-no">2560</span><span id="line-2560"> /**</span> |
| <span class="source-line-no">2561</span><span id="line-2561"> * Compresses the tags to the given outputstream using the TagcompressionContext</span> |
| <span class="source-line-no">2562</span><span id="line-2562"> * @param out the outputstream to which the compression should happen</span> |
| <span class="source-line-no">2563</span><span id="line-2563"> * @param cell the cell which has tags</span> |
| <span class="source-line-no">2564</span><span id="line-2564"> * @param tagCompressionContext the TagCompressionContext</span> |
| <span class="source-line-no">2565</span><span id="line-2565"> * @throws IOException can throw IOException if the compression encounters issue</span> |
| <span class="source-line-no">2566</span><span id="line-2566"> */</span> |
| <span class="source-line-no">2567</span><span id="line-2567"> public static void compressTags(OutputStream out, ExtendedCell cell,</span> |
| <span class="source-line-no">2568</span><span id="line-2568"> TagCompressionContext tagCompressionContext) throws IOException {</span> |
| <span class="source-line-no">2569</span><span id="line-2569"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2570</span><span id="line-2570"> tagCompressionContext.compressTags(out, ((ByteBufferExtendedCell) cell).getTagsByteBuffer(),</span> |
| <span class="source-line-no">2571</span><span id="line-2571"> ((ByteBufferExtendedCell) cell).getTagsPosition(), cell.getTagsLength());</span> |
| <span class="source-line-no">2572</span><span id="line-2572"> } else {</span> |
| <span class="source-line-no">2573</span><span id="line-2573"> tagCompressionContext.compressTags(out, cell.getTagsArray(), cell.getTagsOffset(),</span> |
| <span class="source-line-no">2574</span><span id="line-2574"> cell.getTagsLength());</span> |
| <span class="source-line-no">2575</span><span id="line-2575"> }</span> |
| <span class="source-line-no">2576</span><span id="line-2576"> }</span> |
| <span class="source-line-no">2577</span><span id="line-2577"></span> |
| <span class="source-line-no">2578</span><span id="line-2578"> public static void compressRow(OutputStream out, Cell cell, Dictionary dict) throws IOException {</span> |
| <span class="source-line-no">2579</span><span id="line-2579"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2580</span><span id="line-2580"> Dictionary.write(out, ((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2581</span><span id="line-2581"> ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength(), dict);</span> |
| <span class="source-line-no">2582</span><span id="line-2582"> } else {</span> |
| <span class="source-line-no">2583</span><span id="line-2583"> Dictionary.write(out, cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(), dict);</span> |
| <span class="source-line-no">2584</span><span id="line-2584"> }</span> |
| <span class="source-line-no">2585</span><span id="line-2585"> }</span> |
| <span class="source-line-no">2586</span><span id="line-2586"></span> |
| <span class="source-line-no">2587</span><span id="line-2587"> public static void compressFamily(OutputStream out, Cell cell, Dictionary dict)</span> |
| <span class="source-line-no">2588</span><span id="line-2588"> throws IOException {</span> |
| <span class="source-line-no">2589</span><span id="line-2589"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2590</span><span id="line-2590"> Dictionary.write(out, ((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),</span> |
| <span class="source-line-no">2591</span><span id="line-2591"> ((ByteBufferExtendedCell) cell).getFamilyPosition(), cell.getFamilyLength(), dict);</span> |
| <span class="source-line-no">2592</span><span id="line-2592"> } else {</span> |
| <span class="source-line-no">2593</span><span id="line-2593"> Dictionary.write(out, cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength(),</span> |
| <span class="source-line-no">2594</span><span id="line-2594"> dict);</span> |
| <span class="source-line-no">2595</span><span id="line-2595"> }</span> |
| <span class="source-line-no">2596</span><span id="line-2596"> }</span> |
| <span class="source-line-no">2597</span><span id="line-2597"></span> |
| <span class="source-line-no">2598</span><span id="line-2598"> public static void compressQualifier(OutputStream out, Cell cell, Dictionary dict)</span> |
| <span class="source-line-no">2599</span><span id="line-2599"> throws IOException {</span> |
| <span class="source-line-no">2600</span><span id="line-2600"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2601</span><span id="line-2601"> Dictionary.write(out, ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">2602</span><span id="line-2602"> ((ByteBufferExtendedCell) cell).getQualifierPosition(), cell.getQualifierLength(), dict);</span> |
| <span class="source-line-no">2603</span><span id="line-2603"> } else {</span> |
| <span class="source-line-no">2604</span><span id="line-2604"> Dictionary.write(out, cell.getQualifierArray(), cell.getQualifierOffset(),</span> |
| <span class="source-line-no">2605</span><span id="line-2605"> cell.getQualifierLength(), dict);</span> |
| <span class="source-line-no">2606</span><span id="line-2606"> }</span> |
| <span class="source-line-no">2607</span><span id="line-2607"> }</span> |
| <span class="source-line-no">2608</span><span id="line-2608"></span> |
| <span class="source-line-no">2609</span><span id="line-2609"> /**</span> |
| <span class="source-line-no">2610</span><span id="line-2610"> * Used when a cell needs to be compared with a key byte[] such as cases of finding the index from</span> |
| <span class="source-line-no">2611</span><span id="line-2611"> * the index block, bloom keys from the bloom blocks This byte[] is expected to be serialized in</span> |
| <span class="source-line-no">2612</span><span id="line-2612"> * the KeyValue serialization format If the KeyValue (Cell's) serialization format changes this</span> |
| <span class="source-line-no">2613</span><span id="line-2613"> * method cannot be used.</span> |
| <span class="source-line-no">2614</span><span id="line-2614"> * @param comparator the {@link CellComparator} to use for comparison</span> |
| <span class="source-line-no">2615</span><span id="line-2615"> * @param left the cell to be compared</span> |
| <span class="source-line-no">2616</span><span id="line-2616"> * @param key the serialized key part of a KeyValue</span> |
| <span class="source-line-no">2617</span><span id="line-2617"> * @param offset the offset in the key byte[]</span> |
| <span class="source-line-no">2618</span><span id="line-2618"> * @param length the length of the key byte[]</span> |
| <span class="source-line-no">2619</span><span id="line-2619"> * @return an int greater than 0 if left is greater than right lesser than 0 if left is lesser</span> |
| <span class="source-line-no">2620</span><span id="line-2620"> * than right equal to 0 if left is equal to right</span> |
| <span class="source-line-no">2621</span><span id="line-2621"> */</span> |
| <span class="source-line-no">2622</span><span id="line-2622"> public static final int compare(CellComparator comparator, Cell left, byte[] key, int offset,</span> |
| <span class="source-line-no">2623</span><span id="line-2623"> int length) {</span> |
| <span class="source-line-no">2624</span><span id="line-2624"> // row</span> |
| <span class="source-line-no">2625</span><span id="line-2625"> short rrowlength = Bytes.toShort(key, offset);</span> |
| <span class="source-line-no">2626</span><span id="line-2626"> int c = comparator.compareRows(left, key, offset + Bytes.SIZEOF_SHORT, rrowlength);</span> |
| <span class="source-line-no">2627</span><span id="line-2627"> if (c != 0) return c;</span> |
| <span class="source-line-no">2628</span><span id="line-2628"></span> |
| <span class="source-line-no">2629</span><span id="line-2629"> // Compare the rest of the two KVs without making any assumptions about</span> |
| <span class="source-line-no">2630</span><span id="line-2630"> // the common prefix. This function will not compare rows anyway, so we</span> |
| <span class="source-line-no">2631</span><span id="line-2631"> // don't need to tell it that the common prefix includes the row.</span> |
| <span class="source-line-no">2632</span><span id="line-2632"> return compareWithoutRow(comparator, left, key, offset, length, rrowlength);</span> |
| <span class="source-line-no">2633</span><span id="line-2633"> }</span> |
| <span class="source-line-no">2634</span><span id="line-2634"></span> |
| <span class="source-line-no">2635</span><span id="line-2635"> /**</span> |
| <span class="source-line-no">2636</span><span id="line-2636"> * Compare columnFamily, qualifier, timestamp, and key type (everything except the row). This</span> |
| <span class="source-line-no">2637</span><span id="line-2637"> * method is used both in the normal comparator and the "same-prefix" comparator. Note that we are</span> |
| <span class="source-line-no">2638</span><span id="line-2638"> * assuming that row portions of both KVs have already been parsed and found identical, and we</span> |
| <span class="source-line-no">2639</span><span id="line-2639"> * don't validate that assumption here.</span> |
| <span class="source-line-no">2640</span><span id="line-2640"> * @param comparator the {@link CellComparator} to use for comparison</span> |
| <span class="source-line-no">2641</span><span id="line-2641"> * @param left the cell to be compared</span> |
| <span class="source-line-no">2642</span><span id="line-2642"> * @param right the serialized key part of a key-value</span> |
| <span class="source-line-no">2643</span><span id="line-2643"> * @param roffset the offset in the key byte[]</span> |
| <span class="source-line-no">2644</span><span id="line-2644"> * @param rlength the length of the key byte[]</span> |
| <span class="source-line-no">2645</span><span id="line-2645"> * @param rowlength the row length</span> |
| <span class="source-line-no">2646</span><span id="line-2646"> * @return greater than 0 if left cell is bigger, less than 0 if right cell is bigger, 0 if both</span> |
| <span class="source-line-no">2647</span><span id="line-2647"> * cells are equal</span> |
| <span class="source-line-no">2648</span><span id="line-2648"> */</span> |
| <span class="source-line-no">2649</span><span id="line-2649"> static final int compareWithoutRow(CellComparator comparator, Cell left, byte[] right,</span> |
| <span class="source-line-no">2650</span><span id="line-2650"> int roffset, int rlength, short rowlength) {</span> |
| <span class="source-line-no">2651</span><span id="line-2651"> /***</span> |
| <span class="source-line-no">2652</span><span id="line-2652"> * KeyValue Format and commonLength:</span> |
| <span class="source-line-no">2653</span><span id="line-2653"> * |_keyLen_|_valLen_|_rowLen_|_rowKey_|_famiLen_|_fami_|_Quali_|....</span> |
| <span class="source-line-no">2654</span><span id="line-2654"> * ------------------|-------commonLength--------|--------------</span> |
| <span class="source-line-no">2655</span><span id="line-2655"> */</span> |
| <span class="source-line-no">2656</span><span id="line-2656"> int commonLength = KeyValue.ROW_LENGTH_SIZE + KeyValue.FAMILY_LENGTH_SIZE + rowlength;</span> |
| <span class="source-line-no">2657</span><span id="line-2657"></span> |
| <span class="source-line-no">2658</span><span id="line-2658"> // commonLength + TIMESTAMP_TYPE_SIZE</span> |
| <span class="source-line-no">2659</span><span id="line-2659"> int commonLengthWithTSAndType = KeyValue.TIMESTAMP_TYPE_SIZE + commonLength;</span> |
| <span class="source-line-no">2660</span><span id="line-2660"> // ColumnFamily + Qualifier length.</span> |
| <span class="source-line-no">2661</span><span id="line-2661"> int lcolumnlength = left.getFamilyLength() + left.getQualifierLength();</span> |
| <span class="source-line-no">2662</span><span id="line-2662"> int rcolumnlength = rlength - commonLengthWithTSAndType;</span> |
| <span class="source-line-no">2663</span><span id="line-2663"></span> |
| <span class="source-line-no">2664</span><span id="line-2664"> byte ltype = left.getTypeByte();</span> |
| <span class="source-line-no">2665</span><span id="line-2665"> byte rtype = right[roffset + (rlength - 1)];</span> |
| <span class="source-line-no">2666</span><span id="line-2666"></span> |
| <span class="source-line-no">2667</span><span id="line-2667"> // If the column is not specified, the "minimum" key type appears the</span> |
| <span class="source-line-no">2668</span><span id="line-2668"> // latest in the sorted order, regardless of the timestamp. This is used</span> |
| <span class="source-line-no">2669</span><span id="line-2669"> // for specifying the last key/value in a given row, because there is no</span> |
| <span class="source-line-no">2670</span><span id="line-2670"> // "lexicographically last column" (it would be infinitely long). The</span> |
| <span class="source-line-no">2671</span><span id="line-2671"> // "maximum" key type does not need this behavior.</span> |
| <span class="source-line-no">2672</span><span id="line-2672"> if (lcolumnlength == 0 && ltype == KeyValue.Type.Minimum.getCode()) {</span> |
| <span class="source-line-no">2673</span><span id="line-2673"> // left is "bigger", i.e. it appears later in the sorted order</span> |
| <span class="source-line-no">2674</span><span id="line-2674"> return 1;</span> |
| <span class="source-line-no">2675</span><span id="line-2675"> }</span> |
| <span class="source-line-no">2676</span><span id="line-2676"> if (rcolumnlength == 0 && rtype == KeyValue.Type.Minimum.getCode()) {</span> |
| <span class="source-line-no">2677</span><span id="line-2677"> return -1;</span> |
| <span class="source-line-no">2678</span><span id="line-2678"> }</span> |
| <span class="source-line-no">2679</span><span id="line-2679"></span> |
| <span class="source-line-no">2680</span><span id="line-2680"> int rfamilyoffset = commonLength + roffset;</span> |
| <span class="source-line-no">2681</span><span id="line-2681"></span> |
| <span class="source-line-no">2682</span><span id="line-2682"> // Column family length.</span> |
| <span class="source-line-no">2683</span><span id="line-2683"> int lfamilylength = left.getFamilyLength();</span> |
| <span class="source-line-no">2684</span><span id="line-2684"> int rfamilylength = right[rfamilyoffset - 1];</span> |
| <span class="source-line-no">2685</span><span id="line-2685"> // If left family size is not equal to right family size, we need not</span> |
| <span class="source-line-no">2686</span><span id="line-2686"> // compare the qualifiers.</span> |
| <span class="source-line-no">2687</span><span id="line-2687"> boolean sameFamilySize = (lfamilylength == rfamilylength);</span> |
| <span class="source-line-no">2688</span><span id="line-2688"> if (!sameFamilySize) {</span> |
| <span class="source-line-no">2689</span><span id="line-2689"> // comparing column family is enough.</span> |
| <span class="source-line-no">2690</span><span id="line-2690"> return CellUtil.compareFamilies(left, right, rfamilyoffset, rfamilylength);</span> |
| <span class="source-line-no">2691</span><span id="line-2691"> }</span> |
| <span class="source-line-no">2692</span><span id="line-2692"> // Compare family & qualifier together.</span> |
| <span class="source-line-no">2693</span><span id="line-2693"> // Families are same. Compare on qualifiers.</span> |
| <span class="source-line-no">2694</span><span id="line-2694"> int comparison = CellUtil.compareColumns(left, right, rfamilyoffset, rfamilylength,</span> |
| <span class="source-line-no">2695</span><span id="line-2695"> rfamilyoffset + rfamilylength, (rcolumnlength - rfamilylength));</span> |
| <span class="source-line-no">2696</span><span id="line-2696"> if (comparison != 0) {</span> |
| <span class="source-line-no">2697</span><span id="line-2697"> return comparison;</span> |
| <span class="source-line-no">2698</span><span id="line-2698"> }</span> |
| <span class="source-line-no">2699</span><span id="line-2699"></span> |
| <span class="source-line-no">2700</span><span id="line-2700"> // //</span> |
| <span class="source-line-no">2701</span><span id="line-2701"> // Next compare timestamps.</span> |
| <span class="source-line-no">2702</span><span id="line-2702"> long rtimestamp = Bytes.toLong(right, roffset + (rlength - KeyValue.TIMESTAMP_TYPE_SIZE));</span> |
| <span class="source-line-no">2703</span><span id="line-2703"> int compare = comparator.compareTimestamps(left.getTimestamp(), rtimestamp);</span> |
| <span class="source-line-no">2704</span><span id="line-2704"> if (compare != 0) {</span> |
| <span class="source-line-no">2705</span><span id="line-2705"> return compare;</span> |
| <span class="source-line-no">2706</span><span id="line-2706"> }</span> |
| <span class="source-line-no">2707</span><span id="line-2707"></span> |
| <span class="source-line-no">2708</span><span id="line-2708"> // Compare types. Let the delete types sort ahead of puts; i.e. types</span> |
| <span class="source-line-no">2709</span><span id="line-2709"> // of higher numbers sort before those of lesser numbers. Maximum (255)</span> |
| <span class="source-line-no">2710</span><span id="line-2710"> // appears ahead of everything, and minimum (0) appears after</span> |
| <span class="source-line-no">2711</span><span id="line-2711"> // everything.</span> |
| <span class="source-line-no">2712</span><span id="line-2712"> return (0xff & rtype) - (0xff & ltype);</span> |
| <span class="source-line-no">2713</span><span id="line-2713"> }</span> |
| <span class="source-line-no">2714</span><span id="line-2714"></span> |
| <span class="source-line-no">2715</span><span id="line-2715"> /**</span> |
| <span class="source-line-no">2716</span><span id="line-2716"> * Return a new cell is located following input cell. If both of type and timestamp are minimum,</span> |
| <span class="source-line-no">2717</span><span id="line-2717"> * the input cell will be returned directly.</span> |
| <span class="source-line-no">2718</span><span id="line-2718"> */</span> |
| <span class="source-line-no">2719</span><span id="line-2719"> public static ExtendedCell createNextOnRowCol(ExtendedCell cell) {</span> |
| <span class="source-line-no">2720</span><span id="line-2720"> long ts = cell.getTimestamp();</span> |
| <span class="source-line-no">2721</span><span id="line-2721"> byte type = cell.getTypeByte();</span> |
| <span class="source-line-no">2722</span><span id="line-2722"> if (type != KeyValue.Type.Minimum.getCode()) {</span> |
| <span class="source-line-no">2723</span><span id="line-2723"> type = KeyValue.Type.values()[KeyValue.Type.codeToType(type).ordinal() - 1].getCode();</span> |
| <span class="source-line-no">2724</span><span id="line-2724"> } else if (ts != PrivateConstants.OLDEST_TIMESTAMP) {</span> |
| <span class="source-line-no">2725</span><span id="line-2725"> ts = ts - 1;</span> |
| <span class="source-line-no">2726</span><span id="line-2726"> type = KeyValue.Type.Maximum.getCode();</span> |
| <span class="source-line-no">2727</span><span id="line-2727"> } else {</span> |
| <span class="source-line-no">2728</span><span id="line-2728"> return cell;</span> |
| <span class="source-line-no">2729</span><span id="line-2729"> }</span> |
| <span class="source-line-no">2730</span><span id="line-2730"> return createNextOnRowCol(cell, ts, type);</span> |
| <span class="source-line-no">2731</span><span id="line-2731"> }</span> |
| <span class="source-line-no">2732</span><span id="line-2732"></span> |
| <span class="source-line-no">2733</span><span id="line-2733"> static ExtendedCell createNextOnRowCol(ExtendedCell cell, long ts, byte type) {</span> |
| <span class="source-line-no">2734</span><span id="line-2734"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2735</span><span id="line-2735"> return new LastOnRowColByteBufferExtendedCell(</span> |
| <span class="source-line-no">2736</span><span id="line-2736"> ((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2737</span><span id="line-2737"> ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength(),</span> |
| <span class="source-line-no">2738</span><span id="line-2738"> ((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),</span> |
| <span class="source-line-no">2739</span><span id="line-2739"> ((ByteBufferExtendedCell) cell).getFamilyPosition(), cell.getFamilyLength(),</span> |
| <span class="source-line-no">2740</span><span id="line-2740"> ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">2741</span><span id="line-2741"> ((ByteBufferExtendedCell) cell).getQualifierPosition(), cell.getQualifierLength()) {</span> |
| <span class="source-line-no">2742</span><span id="line-2742"> @Override</span> |
| <span class="source-line-no">2743</span><span id="line-2743"> public long getTimestamp() {</span> |
| <span class="source-line-no">2744</span><span id="line-2744"> return ts;</span> |
| <span class="source-line-no">2745</span><span id="line-2745"> }</span> |
| <span class="source-line-no">2746</span><span id="line-2746"></span> |
| <span class="source-line-no">2747</span><span id="line-2747"> @Override</span> |
| <span class="source-line-no">2748</span><span id="line-2748"> public byte getTypeByte() {</span> |
| <span class="source-line-no">2749</span><span id="line-2749"> return type;</span> |
| <span class="source-line-no">2750</span><span id="line-2750"> }</span> |
| <span class="source-line-no">2751</span><span id="line-2751"> };</span> |
| <span class="source-line-no">2752</span><span id="line-2752"> }</span> |
| <span class="source-line-no">2753</span><span id="line-2753"> return new LastOnRowColCell(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(),</span> |
| <span class="source-line-no">2754</span><span id="line-2754"> cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength(),</span> |
| <span class="source-line-no">2755</span><span id="line-2755"> cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()) {</span> |
| <span class="source-line-no">2756</span><span id="line-2756"> @Override</span> |
| <span class="source-line-no">2757</span><span id="line-2757"> public long getTimestamp() {</span> |
| <span class="source-line-no">2758</span><span id="line-2758"> return ts;</span> |
| <span class="source-line-no">2759</span><span id="line-2759"> }</span> |
| <span class="source-line-no">2760</span><span id="line-2760"></span> |
| <span class="source-line-no">2761</span><span id="line-2761"> @Override</span> |
| <span class="source-line-no">2762</span><span id="line-2762"> public byte getTypeByte() {</span> |
| <span class="source-line-no">2763</span><span id="line-2763"> return type;</span> |
| <span class="source-line-no">2764</span><span id="line-2764"> }</span> |
| <span class="source-line-no">2765</span><span id="line-2765"> };</span> |
| <span class="source-line-no">2766</span><span id="line-2766"> }</span> |
| <span class="source-line-no">2767</span><span id="line-2767"></span> |
| <span class="source-line-no">2768</span><span id="line-2768"> /**</span> |
| <span class="source-line-no">2769</span><span id="line-2769"> * Estimate based on keyvalue's serialization format in the RPC layer. Note that there is an extra</span> |
| <span class="source-line-no">2770</span><span id="line-2770"> * SIZEOF_INT added to the size here that indicates the actual length of the cell for cases where</span> |
| <span class="source-line-no">2771</span><span id="line-2771"> * cell's are serialized in a contiguous format (For eg in RPCs).</span> |
| <span class="source-line-no">2772</span><span id="line-2772"> * @return Estimate of the <code>cell</code> size in bytes plus an extra SIZEOF_INT indicating the</span> |
| <span class="source-line-no">2773</span><span id="line-2773"> * actual cell length.</span> |
| <span class="source-line-no">2774</span><span id="line-2774"> */</span> |
| <span class="source-line-no">2775</span><span id="line-2775"> public static int estimatedSerializedSizeOf(final Cell cell) {</span> |
| <span class="source-line-no">2776</span><span id="line-2776"> return cell.getSerializedSize() + Bytes.SIZEOF_INT;</span> |
| <span class="source-line-no">2777</span><span id="line-2777"> }</span> |
| <span class="source-line-no">2778</span><span id="line-2778"></span> |
| <span class="source-line-no">2779</span><span id="line-2779"> /**</span> |
| <span class="source-line-no">2780</span><span id="line-2780"> * Calculates the serialized key size. We always serialize in the KeyValue's serialization format.</span> |
| <span class="source-line-no">2781</span><span id="line-2781"> * @param cell the cell for which the key size has to be calculated.</span> |
| <span class="source-line-no">2782</span><span id="line-2782"> * @return the key size</span> |
| <span class="source-line-no">2783</span><span id="line-2783"> */</span> |
| <span class="source-line-no">2784</span><span id="line-2784"> public static int estimatedSerializedSizeOfKey(final Cell cell) {</span> |
| <span class="source-line-no">2785</span><span id="line-2785"> if (cell instanceof KeyValue) return ((KeyValue) cell).getKeyLength();</span> |
| <span class="source-line-no">2786</span><span id="line-2786"> return cell.getRowLength() + cell.getFamilyLength() + cell.getQualifierLength()</span> |
| <span class="source-line-no">2787</span><span id="line-2787"> + KeyValue.KEY_INFRASTRUCTURE_SIZE;</span> |
| <span class="source-line-no">2788</span><span id="line-2788"> }</span> |
| <span class="source-line-no">2789</span><span id="line-2789"></span> |
| <span class="source-line-no">2790</span><span id="line-2790"> /**</span> |
| <span class="source-line-no">2791</span><span id="line-2791"> * This method exists just to encapsulate how we serialize keys. To be replaced by a factory that</span> |
| <span class="source-line-no">2792</span><span id="line-2792"> * we query to figure what the Cell implementation is and then, what serialization engine to use</span> |
| <span class="source-line-no">2793</span><span id="line-2793"> * and further, how to serialize the key for inclusion in hfile index. TODO.</span> |
| <span class="source-line-no">2794</span><span id="line-2794"> * @return The key portion of the Cell serialized in the old-school KeyValue way or null if passed</span> |
| <span class="source-line-no">2795</span><span id="line-2795"> * a null <code>cell</code></span> |
| <span class="source-line-no">2796</span><span id="line-2796"> */</span> |
| <span class="source-line-no">2797</span><span id="line-2797"> public static byte[] getCellKeySerializedAsKeyValueKey(final ExtendedCell cell) {</span> |
| <span class="source-line-no">2798</span><span id="line-2798"> if (cell == null) return null;</span> |
| <span class="source-line-no">2799</span><span id="line-2799"> byte[] b = new byte[KeyValueUtil.keyLength(cell)];</span> |
| <span class="source-line-no">2800</span><span id="line-2800"> KeyValueUtil.appendKeyTo(cell, b, 0);</span> |
| <span class="source-line-no">2801</span><span id="line-2801"> return b;</span> |
| <span class="source-line-no">2802</span><span id="line-2802"> }</span> |
| <span class="source-line-no">2803</span><span id="line-2803"></span> |
| <span class="source-line-no">2804</span><span id="line-2804"> /**</span> |
| <span class="source-line-no">2805</span><span id="line-2805"> * Create a Cell that is smaller than all other possible Cells for the given Cell's row.</span> |
| <span class="source-line-no">2806</span><span id="line-2806"> * @return First possible Cell on passed Cell's row.</span> |
| <span class="source-line-no">2807</span><span id="line-2807"> */</span> |
| <span class="source-line-no">2808</span><span id="line-2808"> public static ExtendedCell createFirstOnRow(final Cell cell) {</span> |
| <span class="source-line-no">2809</span><span id="line-2809"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2810</span><span id="line-2810"> return new FirstOnRowByteBufferExtendedCell(</span> |
| <span class="source-line-no">2811</span><span id="line-2811"> ((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2812</span><span id="line-2812"> ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength());</span> |
| <span class="source-line-no">2813</span><span id="line-2813"> }</span> |
| <span class="source-line-no">2814</span><span id="line-2814"> return new FirstOnRowCell(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());</span> |
| <span class="source-line-no">2815</span><span id="line-2815"> }</span> |
| <span class="source-line-no">2816</span><span id="line-2816"></span> |
| <span class="source-line-no">2817</span><span id="line-2817"> public static ExtendedCell createFirstOnRow(final byte[] row, int roffset, short rlength) {</span> |
| <span class="source-line-no">2818</span><span id="line-2818"> return new FirstOnRowCell(row, roffset, rlength);</span> |
| <span class="source-line-no">2819</span><span id="line-2819"> }</span> |
| <span class="source-line-no">2820</span><span id="line-2820"></span> |
| <span class="source-line-no">2821</span><span id="line-2821"> public static ExtendedCell createFirstOnRow(final byte[] row, final byte[] family,</span> |
| <span class="source-line-no">2822</span><span id="line-2822"> final byte[] col) {</span> |
| <span class="source-line-no">2823</span><span id="line-2823"> return createFirstOnRow(row, 0, (short) row.length, family, 0, (byte) family.length, col, 0,</span> |
| <span class="source-line-no">2824</span><span id="line-2824"> col.length);</span> |
| <span class="source-line-no">2825</span><span id="line-2825"> }</span> |
| <span class="source-line-no">2826</span><span id="line-2826"></span> |
| <span class="source-line-no">2827</span><span id="line-2827"> public static ExtendedCell createFirstOnRow(final byte[] row, int roffset, short rlength,</span> |
| <span class="source-line-no">2828</span><span id="line-2828"> final byte[] family, int foffset, byte flength, final byte[] col, int coffset, int clength) {</span> |
| <span class="source-line-no">2829</span><span id="line-2829"> return new FirstOnRowColCell(row, roffset, rlength, family, foffset, flength, col, coffset,</span> |
| <span class="source-line-no">2830</span><span id="line-2830"> clength);</span> |
| <span class="source-line-no">2831</span><span id="line-2831"> }</span> |
| <span class="source-line-no">2832</span><span id="line-2832"></span> |
| <span class="source-line-no">2833</span><span id="line-2833"> public static ExtendedCell createFirstOnRow(final byte[] row) {</span> |
| <span class="source-line-no">2834</span><span id="line-2834"> return createFirstOnRow(row, 0, (short) row.length);</span> |
| <span class="source-line-no">2835</span><span id="line-2835"> }</span> |
| <span class="source-line-no">2836</span><span id="line-2836"></span> |
| <span class="source-line-no">2837</span><span id="line-2837"> public static ExtendedCell createFirstOnRowFamily(Cell cell, byte[] fArray, int foff, int flen) {</span> |
| <span class="source-line-no">2838</span><span id="line-2838"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2839</span><span id="line-2839"> return new FirstOnRowColByteBufferExtendedCell(</span> |
| <span class="source-line-no">2840</span><span id="line-2840"> ((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2841</span><span id="line-2841"> ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength(),</span> |
| <span class="source-line-no">2842</span><span id="line-2842"> ByteBuffer.wrap(fArray), foff, (byte) flen, HConstants.EMPTY_BYTE_BUFFER, 0, 0);</span> |
| <span class="source-line-no">2843</span><span id="line-2843"> }</span> |
| <span class="source-line-no">2844</span><span id="line-2844"> return new FirstOnRowColCell(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(),</span> |
| <span class="source-line-no">2845</span><span id="line-2845"> fArray, foff, (byte) flen, HConstants.EMPTY_BYTE_ARRAY, 0, 0);</span> |
| <span class="source-line-no">2846</span><span id="line-2846"> }</span> |
| <span class="source-line-no">2847</span><span id="line-2847"></span> |
| <span class="source-line-no">2848</span><span id="line-2848"> public static ExtendedCell createFirstOnRowCol(final Cell cell) {</span> |
| <span class="source-line-no">2849</span><span id="line-2849"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2850</span><span id="line-2850"> return new FirstOnRowColByteBufferExtendedCell(</span> |
| <span class="source-line-no">2851</span><span id="line-2851"> ((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2852</span><span id="line-2852"> ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength(),</span> |
| <span class="source-line-no">2853</span><span id="line-2853"> HConstants.EMPTY_BYTE_BUFFER, 0, (byte) 0,</span> |
| <span class="source-line-no">2854</span><span id="line-2854"> ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">2855</span><span id="line-2855"> ((ByteBufferExtendedCell) cell).getQualifierPosition(), cell.getQualifierLength());</span> |
| <span class="source-line-no">2856</span><span id="line-2856"> }</span> |
| <span class="source-line-no">2857</span><span id="line-2857"> return new FirstOnRowColCell(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(),</span> |
| <span class="source-line-no">2858</span><span id="line-2858"> HConstants.EMPTY_BYTE_ARRAY, 0, (byte) 0, cell.getQualifierArray(), cell.getQualifierOffset(),</span> |
| <span class="source-line-no">2859</span><span id="line-2859"> cell.getQualifierLength());</span> |
| <span class="source-line-no">2860</span><span id="line-2860"> }</span> |
| <span class="source-line-no">2861</span><span id="line-2861"></span> |
| <span class="source-line-no">2862</span><span id="line-2862"> public static ExtendedCell createFirstOnNextRow(final Cell cell) {</span> |
| <span class="source-line-no">2863</span><span id="line-2863"> byte[] nextRow = new byte[cell.getRowLength() + 1];</span> |
| <span class="source-line-no">2864</span><span id="line-2864"> CellUtil.copyRowTo(cell, nextRow, 0);</span> |
| <span class="source-line-no">2865</span><span id="line-2865"> nextRow[nextRow.length - 1] = 0;// maybe not necessary</span> |
| <span class="source-line-no">2866</span><span id="line-2866"> return new FirstOnRowCell(nextRow, 0, (short) nextRow.length);</span> |
| <span class="source-line-no">2867</span><span id="line-2867"> }</span> |
| <span class="source-line-no">2868</span><span id="line-2868"></span> |
| <span class="source-line-no">2869</span><span id="line-2869"> /**</span> |
| <span class="source-line-no">2870</span><span id="line-2870"> * Create a Cell that is smaller than all other possible Cells for the given Cell's rk:cf and</span> |
| <span class="source-line-no">2871</span><span id="line-2871"> * passed qualifier.</span> |
| <span class="source-line-no">2872</span><span id="line-2872"> * @return Last possible Cell on passed Cell's rk:cf and passed qualifier.</span> |
| <span class="source-line-no">2873</span><span id="line-2873"> */</span> |
| <span class="source-line-no">2874</span><span id="line-2874"> public static ExtendedCell createFirstOnRowCol(final Cell cell, byte[] qArray, int qoffest,</span> |
| <span class="source-line-no">2875</span><span id="line-2875"> int qlength) {</span> |
| <span class="source-line-no">2876</span><span id="line-2876"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2877</span><span id="line-2877"> return new FirstOnRowColByteBufferExtendedCell(</span> |
| <span class="source-line-no">2878</span><span id="line-2878"> ((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2879</span><span id="line-2879"> ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength(),</span> |
| <span class="source-line-no">2880</span><span id="line-2880"> ((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),</span> |
| <span class="source-line-no">2881</span><span id="line-2881"> ((ByteBufferExtendedCell) cell).getFamilyPosition(), cell.getFamilyLength(),</span> |
| <span class="source-line-no">2882</span><span id="line-2882"> ByteBuffer.wrap(qArray), qoffest, qlength);</span> |
| <span class="source-line-no">2883</span><span id="line-2883"> }</span> |
| <span class="source-line-no">2884</span><span id="line-2884"> return new FirstOnRowColCell(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(),</span> |
| <span class="source-line-no">2885</span><span id="line-2885"> cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength(), qArray, qoffest,</span> |
| <span class="source-line-no">2886</span><span id="line-2886"> qlength);</span> |
| <span class="source-line-no">2887</span><span id="line-2887"> }</span> |
| <span class="source-line-no">2888</span><span id="line-2888"></span> |
| <span class="source-line-no">2889</span><span id="line-2889"> /**</span> |
| <span class="source-line-no">2890</span><span id="line-2890"> * Creates the first cell with the row/family/qualifier of this cell and the given timestamp. Uses</span> |
| <span class="source-line-no">2891</span><span id="line-2891"> * the "maximum" type that guarantees that the new cell is the lowest possible for this</span> |
| <span class="source-line-no">2892</span><span id="line-2892"> * combination of row, family, qualifier, and timestamp. This cell's own timestamp is ignored.</span> |
| <span class="source-line-no">2893</span><span id="line-2893"> * @param cell - cell</span> |
| <span class="source-line-no">2894</span><span id="line-2894"> */</span> |
| <span class="source-line-no">2895</span><span id="line-2895"> public static ExtendedCell createFirstOnRowColTS(Cell cell, long ts) {</span> |
| <span class="source-line-no">2896</span><span id="line-2896"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2897</span><span id="line-2897"> return new FirstOnRowColTSByteBufferExtendedCell(</span> |
| <span class="source-line-no">2898</span><span id="line-2898"> ((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2899</span><span id="line-2899"> ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength(),</span> |
| <span class="source-line-no">2900</span><span id="line-2900"> ((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),</span> |
| <span class="source-line-no">2901</span><span id="line-2901"> ((ByteBufferExtendedCell) cell).getFamilyPosition(), cell.getFamilyLength(),</span> |
| <span class="source-line-no">2902</span><span id="line-2902"> ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">2903</span><span id="line-2903"> ((ByteBufferExtendedCell) cell).getQualifierPosition(), cell.getQualifierLength(), ts);</span> |
| <span class="source-line-no">2904</span><span id="line-2904"> }</span> |
| <span class="source-line-no">2905</span><span id="line-2905"> return new FirstOnRowColTSCell(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(),</span> |
| <span class="source-line-no">2906</span><span id="line-2906"> cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength(),</span> |
| <span class="source-line-no">2907</span><span id="line-2907"> cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength(), ts);</span> |
| <span class="source-line-no">2908</span><span id="line-2908"> }</span> |
| <span class="source-line-no">2909</span><span id="line-2909"></span> |
| <span class="source-line-no">2910</span><span id="line-2910"> /**</span> |
| <span class="source-line-no">2911</span><span id="line-2911"> * Create a Cell that is larger than all other possible Cells for the given Cell's row.</span> |
| <span class="source-line-no">2912</span><span id="line-2912"> * @return Last possible Cell on passed Cell's row.</span> |
| <span class="source-line-no">2913</span><span id="line-2913"> */</span> |
| <span class="source-line-no">2914</span><span id="line-2914"> public static ExtendedCell createLastOnRow(final Cell cell) {</span> |
| <span class="source-line-no">2915</span><span id="line-2915"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2916</span><span id="line-2916"> return new LastOnRowByteBufferExtendedCell(((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2917</span><span id="line-2917"> ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength());</span> |
| <span class="source-line-no">2918</span><span id="line-2918"> }</span> |
| <span class="source-line-no">2919</span><span id="line-2919"> return new LastOnRowCell(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());</span> |
| <span class="source-line-no">2920</span><span id="line-2920"> }</span> |
| <span class="source-line-no">2921</span><span id="line-2921"></span> |
| <span class="source-line-no">2922</span><span id="line-2922"> public static ExtendedCell createLastOnRow(final byte[] row) {</span> |
| <span class="source-line-no">2923</span><span id="line-2923"> return new LastOnRowCell(row, 0, (short) row.length);</span> |
| <span class="source-line-no">2924</span><span id="line-2924"> }</span> |
| <span class="source-line-no">2925</span><span id="line-2925"></span> |
| <span class="source-line-no">2926</span><span id="line-2926"> /**</span> |
| <span class="source-line-no">2927</span><span id="line-2927"> * Create a Cell that is larger than all other possible Cells for the given Cell's rk:cf:q. Used</span> |
| <span class="source-line-no">2928</span><span id="line-2928"> * in creating "fake keys" for the multi-column Bloom filter optimization to skip the row/column</span> |
| <span class="source-line-no">2929</span><span id="line-2929"> * we already know is not in the file.</span> |
| <span class="source-line-no">2930</span><span id="line-2930"> * @return Last possible Cell on passed Cell's rk:cf:q.</span> |
| <span class="source-line-no">2931</span><span id="line-2931"> */</span> |
| <span class="source-line-no">2932</span><span id="line-2932"> public static ExtendedCell createLastOnRowCol(final Cell cell) {</span> |
| <span class="source-line-no">2933</span><span id="line-2933"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2934</span><span id="line-2934"> return new LastOnRowColByteBufferExtendedCell(</span> |
| <span class="source-line-no">2935</span><span id="line-2935"> ((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2936</span><span id="line-2936"> ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength(),</span> |
| <span class="source-line-no">2937</span><span id="line-2937"> ((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),</span> |
| <span class="source-line-no">2938</span><span id="line-2938"> ((ByteBufferExtendedCell) cell).getFamilyPosition(), cell.getFamilyLength(),</span> |
| <span class="source-line-no">2939</span><span id="line-2939"> ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">2940</span><span id="line-2940"> ((ByteBufferExtendedCell) cell).getQualifierPosition(), cell.getQualifierLength());</span> |
| <span class="source-line-no">2941</span><span id="line-2941"> }</span> |
| <span class="source-line-no">2942</span><span id="line-2942"> return new LastOnRowColCell(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(),</span> |
| <span class="source-line-no">2943</span><span id="line-2943"> cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength(),</span> |
| <span class="source-line-no">2944</span><span id="line-2944"> cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());</span> |
| <span class="source-line-no">2945</span><span id="line-2945"> }</span> |
| <span class="source-line-no">2946</span><span id="line-2946"></span> |
| <span class="source-line-no">2947</span><span id="line-2947"> /**</span> |
| <span class="source-line-no">2948</span><span id="line-2948"> * Create a Delete Family Cell for the specified row and family that would be smaller than all</span> |
| <span class="source-line-no">2949</span><span id="line-2949"> * other possible Delete Family KeyValues that have the same row and family. Used for seeking.</span> |
| <span class="source-line-no">2950</span><span id="line-2950"> * @param row - row key (arbitrary byte array)</span> |
| <span class="source-line-no">2951</span><span id="line-2951"> * @param fam - family name</span> |
| <span class="source-line-no">2952</span><span id="line-2952"> * @return First Delete Family possible key on passed <code>row</code>.</span> |
| <span class="source-line-no">2953</span><span id="line-2953"> */</span> |
| <span class="source-line-no">2954</span><span id="line-2954"> public static ExtendedCell createFirstDeleteFamilyCellOnRow(final byte[] row, final byte[] fam) {</span> |
| <span class="source-line-no">2955</span><span id="line-2955"> return new FirstOnRowDeleteFamilyCell(row, fam);</span> |
| <span class="source-line-no">2956</span><span id="line-2956"> }</span> |
| <span class="source-line-no">2957</span><span id="line-2957">}</span> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| </pre> |
| </div> |
| </main> |
| </body> |
| </html> |