| <!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"> |
| <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.Map.Entry;</span> |
| <span class="source-line-no">033</span><span id="line-33">import java.util.NavigableMap;</span> |
| <span class="source-line-no">034</span><span id="line-34">import java.util.Optional;</span> |
| <span class="source-line-no">035</span><span id="line-35">import org.apache.hadoop.hbase.filter.ByteArrayComparable;</span> |
| <span class="source-line-no">036</span><span id="line-36">import org.apache.hadoop.hbase.io.TagCompressionContext;</span> |
| <span class="source-line-no">037</span><span id="line-37">import org.apache.hadoop.hbase.io.util.Dictionary;</span> |
| <span class="source-line-no">038</span><span id="line-38">import org.apache.hadoop.hbase.io.util.StreamUtils;</span> |
| <span class="source-line-no">039</span><span id="line-39">import org.apache.hadoop.hbase.util.ByteBufferUtils;</span> |
| <span class="source-line-no">040</span><span id="line-40">import org.apache.hadoop.hbase.util.ByteRange;</span> |
| <span class="source-line-no">041</span><span id="line-41">import org.apache.hadoop.hbase.util.Bytes;</span> |
| <span class="source-line-no">042</span><span id="line-42">import org.apache.hadoop.hbase.util.ClassSize;</span> |
| <span class="source-line-no">043</span><span id="line-43">import org.apache.yetus.audience.InterfaceAudience;</span> |
| <span class="source-line-no">044</span><span id="line-44"></span> |
| <span class="source-line-no">045</span><span id="line-45">import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;</span> |
| <span class="source-line-no">046</span><span id="line-46"></span> |
| <span class="source-line-no">047</span><span id="line-47">/**</span> |
| <span class="source-line-no">048</span><span id="line-48"> * Utility methods helpful slinging {@link Cell} instances. It has more powerful and rich set of</span> |
| <span class="source-line-no">049</span><span id="line-49"> * APIs than those in {@link CellUtil} for internal usage.</span> |
| <span class="source-line-no">050</span><span id="line-50"> */</span> |
| <span class="source-line-no">051</span><span id="line-51">@InterfaceAudience.Private</span> |
| <span class="source-line-no">052</span><span id="line-52">public final class PrivateCellUtil {</span> |
| <span class="source-line-no">053</span><span id="line-53"></span> |
| <span class="source-line-no">054</span><span id="line-54"> /**</span> |
| <span class="source-line-no">055</span><span id="line-55"> * Private constructor to keep this class from being instantiated.</span> |
| <span class="source-line-no">056</span><span id="line-56"> */</span> |
| <span class="source-line-no">057</span><span id="line-57"> private PrivateCellUtil() {</span> |
| <span class="source-line-no">058</span><span id="line-58"> }</span> |
| <span class="source-line-no">059</span><span id="line-59"></span> |
| <span class="source-line-no">060</span><span id="line-60"> /******************* ByteRange *******************************/</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 fillRowRange(Cell cell, ByteRange range) {</span> |
| <span class="source-line-no">063</span><span id="line-63"> return range.set(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());</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 fillFamilyRange(Cell cell, ByteRange range) {</span> |
| <span class="source-line-no">067</span><span id="line-67"> return range.set(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());</span> |
| <span class="source-line-no">068</span><span id="line-68"> }</span> |
| <span class="source-line-no">069</span><span id="line-69"></span> |
| <span class="source-line-no">070</span><span id="line-70"> public static ByteRange fillQualifierRange(Cell cell, ByteRange range) {</span> |
| <span class="source-line-no">071</span><span id="line-71"> return range.set(cell.getQualifierArray(), cell.getQualifierOffset(),</span> |
| <span class="source-line-no">072</span><span id="line-72"> cell.getQualifierLength());</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 fillValueRange(Cell cell, ByteRange range) {</span> |
| <span class="source-line-no">076</span><span id="line-76"> return range.set(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());</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"> public static ByteRange fillTagRange(ExtendedCell cell, ByteRange range) {</span> |
| <span class="source-line-no">080</span><span id="line-80"> return range.set(cell.getTagsArray(), cell.getTagsOffset(), cell.getTagsLength());</span> |
| <span class="source-line-no">081</span><span id="line-81"> }</span> |
| <span class="source-line-no">082</span><span id="line-82"></span> |
| <span class="source-line-no">083</span><span id="line-83"> /********************* misc *************************************/</span> |
| <span class="source-line-no">084</span><span id="line-84"></span> |
| <span class="source-line-no">085</span><span id="line-85"> public static byte getRowByte(Cell cell, int index) {</span> |
| <span class="source-line-no">086</span><span id="line-86"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">087</span><span id="line-87"> return ((ByteBufferExtendedCell) cell).getRowByteBuffer()</span> |
| <span class="source-line-no">088</span><span id="line-88"> .get(((ByteBufferExtendedCell) cell).getRowPosition() + index);</span> |
| <span class="source-line-no">089</span><span id="line-89"> }</span> |
| <span class="source-line-no">090</span><span id="line-90"> return cell.getRowArray()[cell.getRowOffset() + index];</span> |
| <span class="source-line-no">091</span><span id="line-91"> }</span> |
| <span class="source-line-no">092</span><span id="line-92"></span> |
| <span class="source-line-no">093</span><span id="line-93"> public static byte getQualifierByte(Cell cell, int index) {</span> |
| <span class="source-line-no">094</span><span id="line-94"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">095</span><span id="line-95"> return ((ByteBufferExtendedCell) cell).getQualifierByteBuffer()</span> |
| <span class="source-line-no">096</span><span id="line-96"> .get(((ByteBufferExtendedCell) cell).getQualifierPosition() + index);</span> |
| <span class="source-line-no">097</span><span id="line-97"> }</span> |
| <span class="source-line-no">098</span><span id="line-98"> return cell.getQualifierArray()[cell.getQualifierOffset() + index];</span> |
| <span class="source-line-no">099</span><span id="line-99"> }</span> |
| <span class="source-line-no">100</span><span id="line-100"></span> |
| <span class="source-line-no">101</span><span id="line-101"> public static ByteBuffer getValueBufferShallowCopy(Cell cell) {</span> |
| <span class="source-line-no">102</span><span id="line-102"> ByteBuffer buffer =</span> |
| <span class="source-line-no">103</span><span id="line-103"> ByteBuffer.wrap(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());</span> |
| <span class="source-line-no">104</span><span id="line-104"> return buffer;</span> |
| <span class="source-line-no">105</span><span id="line-105"> }</span> |
| <span class="source-line-no">106</span><span id="line-106"></span> |
| <span class="source-line-no">107</span><span id="line-107"> /** Returns A new cell which is having the extra tags also added to it. */</span> |
| <span class="source-line-no">108</span><span id="line-108"> public static ExtendedCell createCell(ExtendedCell cell, List<Tag> tags) {</span> |
| <span class="source-line-no">109</span><span id="line-109"> return createCell(cell, TagUtil.fromList(tags));</span> |
| <span class="source-line-no">110</span><span id="line-110"> }</span> |
| <span class="source-line-no">111</span><span id="line-111"></span> |
| <span class="source-line-no">112</span><span id="line-112"> /** Returns A new cell which is having the extra tags also added to it. */</span> |
| <span class="source-line-no">113</span><span id="line-113"> public static ExtendedCell createCell(ExtendedCell cell, byte[] tags) {</span> |
| <span class="source-line-no">114</span><span id="line-114"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">115</span><span id="line-115"> return new TagRewriteByteBufferExtendedCell((ByteBufferExtendedCell) cell, tags);</span> |
| <span class="source-line-no">116</span><span id="line-116"> }</span> |
| <span class="source-line-no">117</span><span id="line-117"> return new TagRewriteCell(cell, tags);</span> |
| <span class="source-line-no">118</span><span id="line-118"> }</span> |
| <span class="source-line-no">119</span><span id="line-119"></span> |
| <span class="source-line-no">120</span><span id="line-120"> public static ExtendedCell createCell(ExtendedCell cell, byte[] value, byte[] tags) {</span> |
| <span class="source-line-no">121</span><span id="line-121"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">122</span><span id="line-122"> return new ValueAndTagRewriteByteBufferExtendedCell((ByteBufferExtendedCell) cell, value,</span> |
| <span class="source-line-no">123</span><span id="line-123"> tags);</span> |
| <span class="source-line-no">124</span><span id="line-124"> }</span> |
| <span class="source-line-no">125</span><span id="line-125"> return new ValueAndTagRewriteCell(cell, value, tags);</span> |
| <span class="source-line-no">126</span><span id="line-126"> }</span> |
| <span class="source-line-no">127</span><span id="line-127"></span> |
| <span class="source-line-no">128</span><span id="line-128"> /**</span> |
| <span class="source-line-no">129</span><span id="line-129"> * 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">130</span><span id="line-130"> * 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">131</span><span id="line-131"> * other parts, refer to the original Cell.</span> |
| <span class="source-line-no">132</span><span id="line-132"> */</span> |
| <span class="source-line-no">133</span><span id="line-133"> static class TagRewriteCell implements ExtendedCell {</span> |
| <span class="source-line-no">134</span><span id="line-134"> protected ExtendedCell cell;</span> |
| <span class="source-line-no">135</span><span id="line-135"> protected byte[] tags;</span> |
| <span class="source-line-no">136</span><span id="line-136"> private static final int HEAP_SIZE_OVERHEAD = ClassSize.OBJECT + 2 * ClassSize.REFERENCE;</span> |
| <span class="source-line-no">137</span><span id="line-137"></span> |
| <span class="source-line-no">138</span><span id="line-138"> /**</span> |
| <span class="source-line-no">139</span><span id="line-139"> * Construct a TagRewriteCell</span> |
| <span class="source-line-no">140</span><span id="line-140"> * @param cell The original Cell which it rewrites</span> |
| <span class="source-line-no">141</span><span id="line-141"> * @param tags the tags bytes. The array suppose to contain the tags bytes alone.</span> |
| <span class="source-line-no">142</span><span id="line-142"> */</span> |
| <span class="source-line-no">143</span><span id="line-143"> public TagRewriteCell(ExtendedCell cell, byte[] tags) {</span> |
| <span class="source-line-no">144</span><span id="line-144"> assert tags != null;</span> |
| <span class="source-line-no">145</span><span id="line-145"> this.cell = cell;</span> |
| <span class="source-line-no">146</span><span id="line-146"> this.tags = tags;</span> |
| <span class="source-line-no">147</span><span id="line-147"> // tag offset will be treated as 0 and length this.tags.length</span> |
| <span class="source-line-no">148</span><span id="line-148"> if (this.cell instanceof TagRewriteCell) {</span> |
| <span class="source-line-no">149</span><span id="line-149"> // Cleaning the ref so that the byte[] can be GCed</span> |
| <span class="source-line-no">150</span><span id="line-150"> ((TagRewriteCell) this.cell).tags = null;</span> |
| <span class="source-line-no">151</span><span id="line-151"> }</span> |
| <span class="source-line-no">152</span><span id="line-152"> }</span> |
| <span class="source-line-no">153</span><span id="line-153"></span> |
| <span class="source-line-no">154</span><span id="line-154"> @Override</span> |
| <span class="source-line-no">155</span><span id="line-155"> public byte[] getRowArray() {</span> |
| <span class="source-line-no">156</span><span id="line-156"> return cell.getRowArray();</span> |
| <span class="source-line-no">157</span><span id="line-157"> }</span> |
| <span class="source-line-no">158</span><span id="line-158"></span> |
| <span class="source-line-no">159</span><span id="line-159"> @Override</span> |
| <span class="source-line-no">160</span><span id="line-160"> public int getRowOffset() {</span> |
| <span class="source-line-no">161</span><span id="line-161"> return cell.getRowOffset();</span> |
| <span class="source-line-no">162</span><span id="line-162"> }</span> |
| <span class="source-line-no">163</span><span id="line-163"></span> |
| <span class="source-line-no">164</span><span id="line-164"> @Override</span> |
| <span class="source-line-no">165</span><span id="line-165"> public short getRowLength() {</span> |
| <span class="source-line-no">166</span><span id="line-166"> return cell.getRowLength();</span> |
| <span class="source-line-no">167</span><span id="line-167"> }</span> |
| <span class="source-line-no">168</span><span id="line-168"></span> |
| <span class="source-line-no">169</span><span id="line-169"> @Override</span> |
| <span class="source-line-no">170</span><span id="line-170"> public byte[] getFamilyArray() {</span> |
| <span class="source-line-no">171</span><span id="line-171"> return cell.getFamilyArray();</span> |
| <span class="source-line-no">172</span><span id="line-172"> }</span> |
| <span class="source-line-no">173</span><span id="line-173"></span> |
| <span class="source-line-no">174</span><span id="line-174"> @Override</span> |
| <span class="source-line-no">175</span><span id="line-175"> public int getFamilyOffset() {</span> |
| <span class="source-line-no">176</span><span id="line-176"> return cell.getFamilyOffset();</span> |
| <span class="source-line-no">177</span><span id="line-177"> }</span> |
| <span class="source-line-no">178</span><span id="line-178"></span> |
| <span class="source-line-no">179</span><span id="line-179"> @Override</span> |
| <span class="source-line-no">180</span><span id="line-180"> public byte getFamilyLength() {</span> |
| <span class="source-line-no">181</span><span id="line-181"> return cell.getFamilyLength();</span> |
| <span class="source-line-no">182</span><span id="line-182"> }</span> |
| <span class="source-line-no">183</span><span id="line-183"></span> |
| <span class="source-line-no">184</span><span id="line-184"> @Override</span> |
| <span class="source-line-no">185</span><span id="line-185"> public byte[] getQualifierArray() {</span> |
| <span class="source-line-no">186</span><span id="line-186"> return cell.getQualifierArray();</span> |
| <span class="source-line-no">187</span><span id="line-187"> }</span> |
| <span class="source-line-no">188</span><span id="line-188"></span> |
| <span class="source-line-no">189</span><span id="line-189"> @Override</span> |
| <span class="source-line-no">190</span><span id="line-190"> public int getQualifierOffset() {</span> |
| <span class="source-line-no">191</span><span id="line-191"> return cell.getQualifierOffset();</span> |
| <span class="source-line-no">192</span><span id="line-192"> }</span> |
| <span class="source-line-no">193</span><span id="line-193"></span> |
| <span class="source-line-no">194</span><span id="line-194"> @Override</span> |
| <span class="source-line-no">195</span><span id="line-195"> public int getQualifierLength() {</span> |
| <span class="source-line-no">196</span><span id="line-196"> return cell.getQualifierLength();</span> |
| <span class="source-line-no">197</span><span id="line-197"> }</span> |
| <span class="source-line-no">198</span><span id="line-198"></span> |
| <span class="source-line-no">199</span><span id="line-199"> @Override</span> |
| <span class="source-line-no">200</span><span id="line-200"> public long getTimestamp() {</span> |
| <span class="source-line-no">201</span><span id="line-201"> return cell.getTimestamp();</span> |
| <span class="source-line-no">202</span><span id="line-202"> }</span> |
| <span class="source-line-no">203</span><span id="line-203"></span> |
| <span class="source-line-no">204</span><span id="line-204"> @Override</span> |
| <span class="source-line-no">205</span><span id="line-205"> public byte getTypeByte() {</span> |
| <span class="source-line-no">206</span><span id="line-206"> return cell.getTypeByte();</span> |
| <span class="source-line-no">207</span><span id="line-207"> }</span> |
| <span class="source-line-no">208</span><span id="line-208"></span> |
| <span class="source-line-no">209</span><span id="line-209"> @Override</span> |
| <span class="source-line-no">210</span><span id="line-210"> public long getSequenceId() {</span> |
| <span class="source-line-no">211</span><span id="line-211"> return cell.getSequenceId();</span> |
| <span class="source-line-no">212</span><span id="line-212"> }</span> |
| <span class="source-line-no">213</span><span id="line-213"></span> |
| <span class="source-line-no">214</span><span id="line-214"> @Override</span> |
| <span class="source-line-no">215</span><span id="line-215"> public byte[] getValueArray() {</span> |
| <span class="source-line-no">216</span><span id="line-216"> return cell.getValueArray();</span> |
| <span class="source-line-no">217</span><span id="line-217"> }</span> |
| <span class="source-line-no">218</span><span id="line-218"></span> |
| <span class="source-line-no">219</span><span id="line-219"> @Override</span> |
| <span class="source-line-no">220</span><span id="line-220"> public int getValueOffset() {</span> |
| <span class="source-line-no">221</span><span id="line-221"> return cell.getValueOffset();</span> |
| <span class="source-line-no">222</span><span id="line-222"> }</span> |
| <span class="source-line-no">223</span><span id="line-223"></span> |
| <span class="source-line-no">224</span><span id="line-224"> @Override</span> |
| <span class="source-line-no">225</span><span id="line-225"> public int getValueLength() {</span> |
| <span class="source-line-no">226</span><span id="line-226"> return cell.getValueLength();</span> |
| <span class="source-line-no">227</span><span id="line-227"> }</span> |
| <span class="source-line-no">228</span><span id="line-228"></span> |
| <span class="source-line-no">229</span><span id="line-229"> @Override</span> |
| <span class="source-line-no">230</span><span id="line-230"> public byte[] getTagsArray() {</span> |
| <span class="source-line-no">231</span><span id="line-231"> return this.tags;</span> |
| <span class="source-line-no">232</span><span id="line-232"> }</span> |
| <span class="source-line-no">233</span><span id="line-233"></span> |
| <span class="source-line-no">234</span><span id="line-234"> @Override</span> |
| <span class="source-line-no">235</span><span id="line-235"> public int getTagsOffset() {</span> |
| <span class="source-line-no">236</span><span id="line-236"> return 0;</span> |
| <span class="source-line-no">237</span><span id="line-237"> }</span> |
| <span class="source-line-no">238</span><span id="line-238"></span> |
| <span class="source-line-no">239</span><span id="line-239"> @Override</span> |
| <span class="source-line-no">240</span><span id="line-240"> public int getTagsLength() {</span> |
| <span class="source-line-no">241</span><span id="line-241"> if (null == this.tags) {</span> |
| <span class="source-line-no">242</span><span id="line-242"> // Nulled out tags array optimization in constructor</span> |
| <span class="source-line-no">243</span><span id="line-243"> return 0;</span> |
| <span class="source-line-no">244</span><span id="line-244"> }</span> |
| <span class="source-line-no">245</span><span id="line-245"> return this.tags.length;</span> |
| <span class="source-line-no">246</span><span id="line-246"> }</span> |
| <span class="source-line-no">247</span><span id="line-247"></span> |
| <span class="source-line-no">248</span><span id="line-248"> @Override</span> |
| <span class="source-line-no">249</span><span id="line-249"> public long heapSize() {</span> |
| <span class="source-line-no">250</span><span id="line-250"> long sum = HEAP_SIZE_OVERHEAD + cell.heapSize();</span> |
| <span class="source-line-no">251</span><span id="line-251"> if (this.tags != null) {</span> |
| <span class="source-line-no">252</span><span id="line-252"> sum += ClassSize.sizeOf(this.tags);</span> |
| <span class="source-line-no">253</span><span id="line-253"> }</span> |
| <span class="source-line-no">254</span><span id="line-254"> return sum;</span> |
| <span class="source-line-no">255</span><span id="line-255"> }</span> |
| <span class="source-line-no">256</span><span id="line-256"></span> |
| <span class="source-line-no">257</span><span id="line-257"> @Override</span> |
| <span class="source-line-no">258</span><span id="line-258"> public void setTimestamp(long ts) throws IOException {</span> |
| <span class="source-line-no">259</span><span id="line-259"> // The incoming cell is supposed to be ExtendedCell type.</span> |
| <span class="source-line-no">260</span><span id="line-260"> PrivateCellUtil.setTimestamp(cell, ts);</span> |
| <span class="source-line-no">261</span><span id="line-261"> }</span> |
| <span class="source-line-no">262</span><span id="line-262"></span> |
| <span class="source-line-no">263</span><span id="line-263"> @Override</span> |
| <span class="source-line-no">264</span><span id="line-264"> public void setTimestamp(byte[] ts) throws IOException {</span> |
| <span class="source-line-no">265</span><span id="line-265"> // The incoming cell is supposed to be ExtendedCell type.</span> |
| <span class="source-line-no">266</span><span id="line-266"> PrivateCellUtil.setTimestamp(cell, ts);</span> |
| <span class="source-line-no">267</span><span id="line-267"> }</span> |
| <span class="source-line-no">268</span><span id="line-268"></span> |
| <span class="source-line-no">269</span><span id="line-269"> @Override</span> |
| <span class="source-line-no">270</span><span id="line-270"> public void setSequenceId(long seqId) throws IOException {</span> |
| <span class="source-line-no">271</span><span id="line-271"> // The incoming cell is supposed to be ExtendedCell type.</span> |
| <span class="source-line-no">272</span><span id="line-272"> PrivateCellUtil.setSequenceId(cell, seqId);</span> |
| <span class="source-line-no">273</span><span id="line-273"> }</span> |
| <span class="source-line-no">274</span><span id="line-274"></span> |
| <span class="source-line-no">275</span><span id="line-275"> @Override</span> |
| <span class="source-line-no">276</span><span id="line-276"> public int write(OutputStream out, boolean withTags) throws IOException {</span> |
| <span class="source-line-no">277</span><span id="line-277"> int len = ((ExtendedCell) this.cell).write(out, false);</span> |
| <span class="source-line-no">278</span><span id="line-278"> if (withTags && this.tags != null) {</span> |
| <span class="source-line-no">279</span><span id="line-279"> // Write the tagsLength 2 bytes</span> |
| <span class="source-line-no">280</span><span id="line-280"> out.write((byte) (0xff & (this.tags.length >> 8)));</span> |
| <span class="source-line-no">281</span><span id="line-281"> out.write((byte) (0xff & this.tags.length));</span> |
| <span class="source-line-no">282</span><span id="line-282"> out.write(this.tags);</span> |
| <span class="source-line-no">283</span><span id="line-283"> len += KeyValue.TAGS_LENGTH_SIZE + this.tags.length;</span> |
| <span class="source-line-no">284</span><span id="line-284"> }</span> |
| <span class="source-line-no">285</span><span id="line-285"> return len;</span> |
| <span class="source-line-no">286</span><span id="line-286"> }</span> |
| <span class="source-line-no">287</span><span id="line-287"></span> |
| <span class="source-line-no">288</span><span id="line-288"> @Override</span> |
| <span class="source-line-no">289</span><span id="line-289"> public int getSerializedSize(boolean withTags) {</span> |
| <span class="source-line-no">290</span><span id="line-290"> int len = ((ExtendedCell) this.cell).getSerializedSize(false);</span> |
| <span class="source-line-no">291</span><span id="line-291"> if (withTags && this.tags != null) {</span> |
| <span class="source-line-no">292</span><span id="line-292"> len += KeyValue.TAGS_LENGTH_SIZE + this.tags.length;</span> |
| <span class="source-line-no">293</span><span id="line-293"> }</span> |
| <span class="source-line-no">294</span><span id="line-294"> return len;</span> |
| <span class="source-line-no">295</span><span id="line-295"> }</span> |
| <span class="source-line-no">296</span><span id="line-296"></span> |
| <span class="source-line-no">297</span><span id="line-297"> @Override</span> |
| <span class="source-line-no">298</span><span id="line-298"> public void write(ByteBuffer buf, int offset) {</span> |
| <span class="source-line-no">299</span><span id="line-299"> offset = KeyValueUtil.appendTo(this.cell, buf, offset, false);</span> |
| <span class="source-line-no">300</span><span id="line-300"> int tagsLen = this.tags == null ? 0 : this.tags.length;</span> |
| <span class="source-line-no">301</span><span id="line-301"> if (tagsLen > 0) {</span> |
| <span class="source-line-no">302</span><span id="line-302"> offset = ByteBufferUtils.putAsShort(buf, offset, tagsLen);</span> |
| <span class="source-line-no">303</span><span id="line-303"> ByteBufferUtils.copyFromArrayToBuffer(buf, offset, this.tags, 0, tagsLen);</span> |
| <span class="source-line-no">304</span><span id="line-304"> }</span> |
| <span class="source-line-no">305</span><span id="line-305"> }</span> |
| <span class="source-line-no">306</span><span id="line-306"></span> |
| <span class="source-line-no">307</span><span id="line-307"> @Override</span> |
| <span class="source-line-no">308</span><span id="line-308"> public ExtendedCell deepClone() {</span> |
| <span class="source-line-no">309</span><span id="line-309"> ExtendedCell clonedBaseCell = this.cell.deepClone();</span> |
| <span class="source-line-no">310</span><span id="line-310"> return new TagRewriteCell(clonedBaseCell, this.tags);</span> |
| <span class="source-line-no">311</span><span id="line-311"> }</span> |
| <span class="source-line-no">312</span><span id="line-312"> }</span> |
| <span class="source-line-no">313</span><span id="line-313"></span> |
| <span class="source-line-no">314</span><span id="line-314"> static class TagRewriteByteBufferExtendedCell extends ByteBufferExtendedCell {</span> |
| <span class="source-line-no">315</span><span id="line-315"></span> |
| <span class="source-line-no">316</span><span id="line-316"> protected ByteBufferExtendedCell cell;</span> |
| <span class="source-line-no">317</span><span id="line-317"> protected byte[] tags;</span> |
| <span class="source-line-no">318</span><span id="line-318"> private static final int HEAP_SIZE_OVERHEAD = ClassSize.OBJECT + 2 * ClassSize.REFERENCE;</span> |
| <span class="source-line-no">319</span><span id="line-319"></span> |
| <span class="source-line-no">320</span><span id="line-320"> /**</span> |
| <span class="source-line-no">321</span><span id="line-321"> * @param cell The original ByteBufferExtendedCell which it rewrites</span> |
| <span class="source-line-no">322</span><span id="line-322"> * @param tags the tags bytes. The array suppose to contain the tags bytes alone.</span> |
| <span class="source-line-no">323</span><span id="line-323"> */</span> |
| <span class="source-line-no">324</span><span id="line-324"> public TagRewriteByteBufferExtendedCell(ByteBufferExtendedCell cell, byte[] tags) {</span> |
| <span class="source-line-no">325</span><span id="line-325"> assert tags != null;</span> |
| <span class="source-line-no">326</span><span id="line-326"> this.cell = cell;</span> |
| <span class="source-line-no">327</span><span id="line-327"> this.tags = tags;</span> |
| <span class="source-line-no">328</span><span id="line-328"> // tag offset will be treated as 0 and length this.tags.length</span> |
| <span class="source-line-no">329</span><span id="line-329"> if (this.cell instanceof TagRewriteByteBufferExtendedCell) {</span> |
| <span class="source-line-no">330</span><span id="line-330"> // Cleaning the ref so that the byte[] can be GCed</span> |
| <span class="source-line-no">331</span><span id="line-331"> ((TagRewriteByteBufferExtendedCell) this.cell).tags = null;</span> |
| <span class="source-line-no">332</span><span id="line-332"> }</span> |
| <span class="source-line-no">333</span><span id="line-333"> }</span> |
| <span class="source-line-no">334</span><span id="line-334"></span> |
| <span class="source-line-no">335</span><span id="line-335"> @Override</span> |
| <span class="source-line-no">336</span><span id="line-336"> public byte[] getRowArray() {</span> |
| <span class="source-line-no">337</span><span id="line-337"> return this.cell.getRowArray();</span> |
| <span class="source-line-no">338</span><span id="line-338"> }</span> |
| <span class="source-line-no">339</span><span id="line-339"></span> |
| <span class="source-line-no">340</span><span id="line-340"> @Override</span> |
| <span class="source-line-no">341</span><span id="line-341"> public int getRowOffset() {</span> |
| <span class="source-line-no">342</span><span id="line-342"> return this.cell.getRowOffset();</span> |
| <span class="source-line-no">343</span><span id="line-343"> }</span> |
| <span class="source-line-no">344</span><span id="line-344"></span> |
| <span class="source-line-no">345</span><span id="line-345"> @Override</span> |
| <span class="source-line-no">346</span><span id="line-346"> public short getRowLength() {</span> |
| <span class="source-line-no">347</span><span id="line-347"> return this.cell.getRowLength();</span> |
| <span class="source-line-no">348</span><span id="line-348"> }</span> |
| <span class="source-line-no">349</span><span id="line-349"></span> |
| <span class="source-line-no">350</span><span id="line-350"> @Override</span> |
| <span class="source-line-no">351</span><span id="line-351"> public byte[] getFamilyArray() {</span> |
| <span class="source-line-no">352</span><span id="line-352"> return this.cell.getFamilyArray();</span> |
| <span class="source-line-no">353</span><span id="line-353"> }</span> |
| <span class="source-line-no">354</span><span id="line-354"></span> |
| <span class="source-line-no">355</span><span id="line-355"> @Override</span> |
| <span class="source-line-no">356</span><span id="line-356"> public int getFamilyOffset() {</span> |
| <span class="source-line-no">357</span><span id="line-357"> return this.cell.getFamilyOffset();</span> |
| <span class="source-line-no">358</span><span id="line-358"> }</span> |
| <span class="source-line-no">359</span><span id="line-359"></span> |
| <span class="source-line-no">360</span><span id="line-360"> @Override</span> |
| <span class="source-line-no">361</span><span id="line-361"> public byte getFamilyLength() {</span> |
| <span class="source-line-no">362</span><span id="line-362"> return this.cell.getFamilyLength();</span> |
| <span class="source-line-no">363</span><span id="line-363"> }</span> |
| <span class="source-line-no">364</span><span id="line-364"></span> |
| <span class="source-line-no">365</span><span id="line-365"> @Override</span> |
| <span class="source-line-no">366</span><span id="line-366"> public byte[] getQualifierArray() {</span> |
| <span class="source-line-no">367</span><span id="line-367"> return this.cell.getQualifierArray();</span> |
| <span class="source-line-no">368</span><span id="line-368"> }</span> |
| <span class="source-line-no">369</span><span id="line-369"></span> |
| <span class="source-line-no">370</span><span id="line-370"> @Override</span> |
| <span class="source-line-no">371</span><span id="line-371"> public int getQualifierOffset() {</span> |
| <span class="source-line-no">372</span><span id="line-372"> return this.cell.getQualifierOffset();</span> |
| <span class="source-line-no">373</span><span id="line-373"> }</span> |
| <span class="source-line-no">374</span><span id="line-374"></span> |
| <span class="source-line-no">375</span><span id="line-375"> @Override</span> |
| <span class="source-line-no">376</span><span id="line-376"> public int getQualifierLength() {</span> |
| <span class="source-line-no">377</span><span id="line-377"> return this.cell.getQualifierLength();</span> |
| <span class="source-line-no">378</span><span id="line-378"> }</span> |
| <span class="source-line-no">379</span><span id="line-379"></span> |
| <span class="source-line-no">380</span><span id="line-380"> @Override</span> |
| <span class="source-line-no">381</span><span id="line-381"> public long getTimestamp() {</span> |
| <span class="source-line-no">382</span><span id="line-382"> return this.cell.getTimestamp();</span> |
| <span class="source-line-no">383</span><span id="line-383"> }</span> |
| <span class="source-line-no">384</span><span id="line-384"></span> |
| <span class="source-line-no">385</span><span id="line-385"> @Override</span> |
| <span class="source-line-no">386</span><span id="line-386"> public byte getTypeByte() {</span> |
| <span class="source-line-no">387</span><span id="line-387"> return this.cell.getTypeByte();</span> |
| <span class="source-line-no">388</span><span id="line-388"> }</span> |
| <span class="source-line-no">389</span><span id="line-389"></span> |
| <span class="source-line-no">390</span><span id="line-390"> @Override</span> |
| <span class="source-line-no">391</span><span id="line-391"> public long getSequenceId() {</span> |
| <span class="source-line-no">392</span><span id="line-392"> return this.cell.getSequenceId();</span> |
| <span class="source-line-no">393</span><span id="line-393"> }</span> |
| <span class="source-line-no">394</span><span id="line-394"></span> |
| <span class="source-line-no">395</span><span id="line-395"> @Override</span> |
| <span class="source-line-no">396</span><span id="line-396"> public byte[] getValueArray() {</span> |
| <span class="source-line-no">397</span><span id="line-397"> return this.cell.getValueArray();</span> |
| <span class="source-line-no">398</span><span id="line-398"> }</span> |
| <span class="source-line-no">399</span><span id="line-399"></span> |
| <span class="source-line-no">400</span><span id="line-400"> @Override</span> |
| <span class="source-line-no">401</span><span id="line-401"> public int getValueOffset() {</span> |
| <span class="source-line-no">402</span><span id="line-402"> return this.cell.getValueOffset();</span> |
| <span class="source-line-no">403</span><span id="line-403"> }</span> |
| <span class="source-line-no">404</span><span id="line-404"></span> |
| <span class="source-line-no">405</span><span id="line-405"> @Override</span> |
| <span class="source-line-no">406</span><span id="line-406"> public int getValueLength() {</span> |
| <span class="source-line-no">407</span><span id="line-407"> return this.cell.getValueLength();</span> |
| <span class="source-line-no">408</span><span id="line-408"> }</span> |
| <span class="source-line-no">409</span><span id="line-409"></span> |
| <span class="source-line-no">410</span><span id="line-410"> @Override</span> |
| <span class="source-line-no">411</span><span id="line-411"> public byte[] getTagsArray() {</span> |
| <span class="source-line-no">412</span><span id="line-412"> return this.tags;</span> |
| <span class="source-line-no">413</span><span id="line-413"> }</span> |
| <span class="source-line-no">414</span><span id="line-414"></span> |
| <span class="source-line-no">415</span><span id="line-415"> @Override</span> |
| <span class="source-line-no">416</span><span id="line-416"> public int getTagsOffset() {</span> |
| <span class="source-line-no">417</span><span id="line-417"> return 0;</span> |
| <span class="source-line-no">418</span><span id="line-418"> }</span> |
| <span class="source-line-no">419</span><span id="line-419"></span> |
| <span class="source-line-no">420</span><span id="line-420"> @Override</span> |
| <span class="source-line-no">421</span><span id="line-421"> public int getTagsLength() {</span> |
| <span class="source-line-no">422</span><span id="line-422"> if (null == this.tags) {</span> |
| <span class="source-line-no">423</span><span id="line-423"> // Nulled out tags array optimization in constructor</span> |
| <span class="source-line-no">424</span><span id="line-424"> return 0;</span> |
| <span class="source-line-no">425</span><span id="line-425"> }</span> |
| <span class="source-line-no">426</span><span id="line-426"> return this.tags.length;</span> |
| <span class="source-line-no">427</span><span id="line-427"> }</span> |
| <span class="source-line-no">428</span><span id="line-428"></span> |
| <span class="source-line-no">429</span><span id="line-429"> @Override</span> |
| <span class="source-line-no">430</span><span id="line-430"> public void setSequenceId(long seqId) throws IOException {</span> |
| <span class="source-line-no">431</span><span id="line-431"> PrivateCellUtil.setSequenceId(this.cell, seqId);</span> |
| <span class="source-line-no">432</span><span id="line-432"> }</span> |
| <span class="source-line-no">433</span><span id="line-433"></span> |
| <span class="source-line-no">434</span><span id="line-434"> @Override</span> |
| <span class="source-line-no">435</span><span id="line-435"> public void setTimestamp(long ts) throws IOException {</span> |
| <span class="source-line-no">436</span><span id="line-436"> PrivateCellUtil.setTimestamp(this.cell, ts);</span> |
| <span class="source-line-no">437</span><span id="line-437"> }</span> |
| <span class="source-line-no">438</span><span id="line-438"></span> |
| <span class="source-line-no">439</span><span id="line-439"> @Override</span> |
| <span class="source-line-no">440</span><span id="line-440"> public void setTimestamp(byte[] ts) throws IOException {</span> |
| <span class="source-line-no">441</span><span id="line-441"> PrivateCellUtil.setTimestamp(this.cell, ts);</span> |
| <span class="source-line-no">442</span><span id="line-442"> }</span> |
| <span class="source-line-no">443</span><span id="line-443"></span> |
| <span class="source-line-no">444</span><span id="line-444"> @Override</span> |
| <span class="source-line-no">445</span><span id="line-445"> public long heapSize() {</span> |
| <span class="source-line-no">446</span><span id="line-446"> long sum = HEAP_SIZE_OVERHEAD + cell.heapSize();</span> |
| <span class="source-line-no">447</span><span id="line-447"> // this.tags is on heap byte[]</span> |
| <span class="source-line-no">448</span><span id="line-448"> if (this.tags != null) {</span> |
| <span class="source-line-no">449</span><span id="line-449"> sum += ClassSize.sizeOf(this.tags);</span> |
| <span class="source-line-no">450</span><span id="line-450"> }</span> |
| <span class="source-line-no">451</span><span id="line-451"> return sum;</span> |
| <span class="source-line-no">452</span><span id="line-452"> }</span> |
| <span class="source-line-no">453</span><span id="line-453"></span> |
| <span class="source-line-no">454</span><span id="line-454"> @Override</span> |
| <span class="source-line-no">455</span><span id="line-455"> public int write(OutputStream out, boolean withTags) throws IOException {</span> |
| <span class="source-line-no">456</span><span id="line-456"> int len = ((ExtendedCell) this.cell).write(out, false);</span> |
| <span class="source-line-no">457</span><span id="line-457"> if (withTags && this.tags != null) {</span> |
| <span class="source-line-no">458</span><span id="line-458"> // Write the tagsLength 2 bytes</span> |
| <span class="source-line-no">459</span><span id="line-459"> out.write((byte) (0xff & (this.tags.length >> 8)));</span> |
| <span class="source-line-no">460</span><span id="line-460"> out.write((byte) (0xff & this.tags.length));</span> |
| <span class="source-line-no">461</span><span id="line-461"> out.write(this.tags);</span> |
| <span class="source-line-no">462</span><span id="line-462"> len += KeyValue.TAGS_LENGTH_SIZE + this.tags.length;</span> |
| <span class="source-line-no">463</span><span id="line-463"> }</span> |
| <span class="source-line-no">464</span><span id="line-464"> return len;</span> |
| <span class="source-line-no">465</span><span id="line-465"> }</span> |
| <span class="source-line-no">466</span><span id="line-466"></span> |
| <span class="source-line-no">467</span><span id="line-467"> @Override</span> |
| <span class="source-line-no">468</span><span id="line-468"> public int getSerializedSize(boolean withTags) {</span> |
| <span class="source-line-no">469</span><span id="line-469"> int len = ((ExtendedCell) this.cell).getSerializedSize(false);</span> |
| <span class="source-line-no">470</span><span id="line-470"> if (withTags && this.tags != null) {</span> |
| <span class="source-line-no">471</span><span id="line-471"> len += KeyValue.TAGS_LENGTH_SIZE + this.tags.length;</span> |
| <span class="source-line-no">472</span><span id="line-472"> }</span> |
| <span class="source-line-no">473</span><span id="line-473"> return len;</span> |
| <span class="source-line-no">474</span><span id="line-474"> }</span> |
| <span class="source-line-no">475</span><span id="line-475"></span> |
| <span class="source-line-no">476</span><span id="line-476"> @Override</span> |
| <span class="source-line-no">477</span><span id="line-477"> public void write(ByteBuffer buf, int offset) {</span> |
| <span class="source-line-no">478</span><span id="line-478"> offset = KeyValueUtil.appendTo(this.cell, buf, offset, false);</span> |
| <span class="source-line-no">479</span><span id="line-479"> int tagsLen = this.tags == null ? 0 : this.tags.length;</span> |
| <span class="source-line-no">480</span><span id="line-480"> if (tagsLen > 0) {</span> |
| <span class="source-line-no">481</span><span id="line-481"> offset = ByteBufferUtils.putAsShort(buf, offset, tagsLen);</span> |
| <span class="source-line-no">482</span><span id="line-482"> ByteBufferUtils.copyFromArrayToBuffer(buf, offset, this.tags, 0, tagsLen);</span> |
| <span class="source-line-no">483</span><span id="line-483"> }</span> |
| <span class="source-line-no">484</span><span id="line-484"> }</span> |
| <span class="source-line-no">485</span><span id="line-485"></span> |
| <span class="source-line-no">486</span><span id="line-486"> @Override</span> |
| <span class="source-line-no">487</span><span id="line-487"> public ExtendedCell deepClone() {</span> |
| <span class="source-line-no">488</span><span id="line-488"> ExtendedCell clonedBaseCell = this.cell.deepClone();</span> |
| <span class="source-line-no">489</span><span id="line-489"> if (clonedBaseCell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">490</span><span id="line-490"> return new TagRewriteByteBufferExtendedCell((ByteBufferExtendedCell) clonedBaseCell,</span> |
| <span class="source-line-no">491</span><span id="line-491"> this.tags);</span> |
| <span class="source-line-no">492</span><span id="line-492"> }</span> |
| <span class="source-line-no">493</span><span id="line-493"> return new TagRewriteCell(clonedBaseCell, this.tags);</span> |
| <span class="source-line-no">494</span><span id="line-494"> }</span> |
| <span class="source-line-no">495</span><span id="line-495"></span> |
| <span class="source-line-no">496</span><span id="line-496"> @Override</span> |
| <span class="source-line-no">497</span><span id="line-497"> public ByteBuffer getRowByteBuffer() {</span> |
| <span class="source-line-no">498</span><span id="line-498"> return this.cell.getRowByteBuffer();</span> |
| <span class="source-line-no">499</span><span id="line-499"> }</span> |
| <span class="source-line-no">500</span><span id="line-500"></span> |
| <span class="source-line-no">501</span><span id="line-501"> @Override</span> |
| <span class="source-line-no">502</span><span id="line-502"> public int getRowPosition() {</span> |
| <span class="source-line-no">503</span><span id="line-503"> return this.cell.getRowPosition();</span> |
| <span class="source-line-no">504</span><span id="line-504"> }</span> |
| <span class="source-line-no">505</span><span id="line-505"></span> |
| <span class="source-line-no">506</span><span id="line-506"> @Override</span> |
| <span class="source-line-no">507</span><span id="line-507"> public ByteBuffer getFamilyByteBuffer() {</span> |
| <span class="source-line-no">508</span><span id="line-508"> return this.cell.getFamilyByteBuffer();</span> |
| <span class="source-line-no">509</span><span id="line-509"> }</span> |
| <span class="source-line-no">510</span><span id="line-510"></span> |
| <span class="source-line-no">511</span><span id="line-511"> @Override</span> |
| <span class="source-line-no">512</span><span id="line-512"> public int getFamilyPosition() {</span> |
| <span class="source-line-no">513</span><span id="line-513"> return this.cell.getFamilyPosition();</span> |
| <span class="source-line-no">514</span><span id="line-514"> }</span> |
| <span class="source-line-no">515</span><span id="line-515"></span> |
| <span class="source-line-no">516</span><span id="line-516"> @Override</span> |
| <span class="source-line-no">517</span><span id="line-517"> public ByteBuffer getQualifierByteBuffer() {</span> |
| <span class="source-line-no">518</span><span id="line-518"> return this.cell.getQualifierByteBuffer();</span> |
| <span class="source-line-no">519</span><span id="line-519"> }</span> |
| <span class="source-line-no">520</span><span id="line-520"></span> |
| <span class="source-line-no">521</span><span id="line-521"> @Override</span> |
| <span class="source-line-no">522</span><span id="line-522"> public int getQualifierPosition() {</span> |
| <span class="source-line-no">523</span><span id="line-523"> return this.cell.getQualifierPosition();</span> |
| <span class="source-line-no">524</span><span id="line-524"> }</span> |
| <span class="source-line-no">525</span><span id="line-525"></span> |
| <span class="source-line-no">526</span><span id="line-526"> @Override</span> |
| <span class="source-line-no">527</span><span id="line-527"> public ByteBuffer getValueByteBuffer() {</span> |
| <span class="source-line-no">528</span><span id="line-528"> return this.cell.getValueByteBuffer();</span> |
| <span class="source-line-no">529</span><span id="line-529"> }</span> |
| <span class="source-line-no">530</span><span id="line-530"></span> |
| <span class="source-line-no">531</span><span id="line-531"> @Override</span> |
| <span class="source-line-no">532</span><span id="line-532"> public int getValuePosition() {</span> |
| <span class="source-line-no">533</span><span id="line-533"> return this.cell.getValuePosition();</span> |
| <span class="source-line-no">534</span><span id="line-534"> }</span> |
| <span class="source-line-no">535</span><span id="line-535"></span> |
| <span class="source-line-no">536</span><span id="line-536"> @Override</span> |
| <span class="source-line-no">537</span><span id="line-537"> public ByteBuffer getTagsByteBuffer() {</span> |
| <span class="source-line-no">538</span><span id="line-538"> return this.tags == null ? HConstants.EMPTY_BYTE_BUFFER : ByteBuffer.wrap(this.tags);</span> |
| <span class="source-line-no">539</span><span id="line-539"> }</span> |
| <span class="source-line-no">540</span><span id="line-540"></span> |
| <span class="source-line-no">541</span><span id="line-541"> @Override</span> |
| <span class="source-line-no">542</span><span id="line-542"> public int getTagsPosition() {</span> |
| <span class="source-line-no">543</span><span id="line-543"> return 0;</span> |
| <span class="source-line-no">544</span><span id="line-544"> }</span> |
| <span class="source-line-no">545</span><span id="line-545"> }</span> |
| <span class="source-line-no">546</span><span id="line-546"></span> |
| <span class="source-line-no">547</span><span id="line-547"> static class ValueAndTagRewriteCell extends TagRewriteCell {</span> |
| <span class="source-line-no">548</span><span id="line-548"></span> |
| <span class="source-line-no">549</span><span id="line-549"> protected byte[] 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"> public ValueAndTagRewriteCell(ExtendedCell cell, byte[] value, byte[] tags) {</span> |
| <span class="source-line-no">552</span><span id="line-552"> super(cell, tags);</span> |
| <span class="source-line-no">553</span><span id="line-553"> this.value = value;</span> |
| <span class="source-line-no">554</span><span id="line-554"> }</span> |
| <span class="source-line-no">555</span><span id="line-555"></span> |
| <span class="source-line-no">556</span><span id="line-556"> @Override</span> |
| <span class="source-line-no">557</span><span id="line-557"> public byte[] getValueArray() {</span> |
| <span class="source-line-no">558</span><span id="line-558"> return this.value;</span> |
| <span class="source-line-no">559</span><span id="line-559"> }</span> |
| <span class="source-line-no">560</span><span id="line-560"></span> |
| <span class="source-line-no">561</span><span id="line-561"> @Override</span> |
| <span class="source-line-no">562</span><span id="line-562"> public int getValueOffset() {</span> |
| <span class="source-line-no">563</span><span id="line-563"> return 0;</span> |
| <span class="source-line-no">564</span><span id="line-564"> }</span> |
| <span class="source-line-no">565</span><span id="line-565"></span> |
| <span class="source-line-no">566</span><span id="line-566"> @Override</span> |
| <span class="source-line-no">567</span><span id="line-567"> public int getValueLength() {</span> |
| <span class="source-line-no">568</span><span id="line-568"> return this.value == null ? 0 : this.value.length;</span> |
| <span class="source-line-no">569</span><span id="line-569"> }</span> |
| <span class="source-line-no">570</span><span id="line-570"></span> |
| <span class="source-line-no">571</span><span id="line-571"> @Override</span> |
| <span class="source-line-no">572</span><span id="line-572"> public long heapSize() {</span> |
| <span class="source-line-no">573</span><span id="line-573"> long sum = ClassSize.REFERENCE + super.heapSize();</span> |
| <span class="source-line-no">574</span><span id="line-574"> if (this.value != null) {</span> |
| <span class="source-line-no">575</span><span id="line-575"> sum += ClassSize.sizeOf(this.value);</span> |
| <span class="source-line-no">576</span><span id="line-576"> }</span> |
| <span class="source-line-no">577</span><span id="line-577"> return sum;</span> |
| <span class="source-line-no">578</span><span id="line-578"> }</span> |
| <span class="source-line-no">579</span><span id="line-579"></span> |
| <span class="source-line-no">580</span><span id="line-580"> @Override</span> |
| <span class="source-line-no">581</span><span id="line-581"> public int write(OutputStream out, boolean withTags) throws IOException {</span> |
| <span class="source-line-no">582</span><span id="line-582"> return write(out, withTags, this.cell, this.value, this.tags);</span> |
| <span class="source-line-no">583</span><span id="line-583"> }</span> |
| <span class="source-line-no">584</span><span id="line-584"></span> |
| <span class="source-line-no">585</span><span id="line-585"> /**</span> |
| <span class="source-line-no">586</span><span id="line-586"> * Made into a static method so as to reuse the logic within</span> |
| <span class="source-line-no">587</span><span id="line-587"> * ValueAndTagRewriteByteBufferExtendedCell</span> |
| <span class="source-line-no">588</span><span id="line-588"> */</span> |
| <span class="source-line-no">589</span><span id="line-589"> static int write(OutputStream out, boolean withTags, ExtendedCell cell, byte[] value,</span> |
| <span class="source-line-no">590</span><span id="line-590"> byte[] tags) throws IOException {</span> |
| <span class="source-line-no">591</span><span id="line-591"> int valLen = value == null ? 0 : value.length;</span> |
| <span class="source-line-no">592</span><span id="line-592"> ByteBufferUtils.putInt(out, KeyValueUtil.keyLength(cell));// Key length</span> |
| <span class="source-line-no">593</span><span id="line-593"> ByteBufferUtils.putInt(out, valLen);// Value length</span> |
| <span class="source-line-no">594</span><span id="line-594"> int len = 2 * Bytes.SIZEOF_INT;</span> |
| <span class="source-line-no">595</span><span id="line-595"> len += writeFlatKey(cell, out);// Key</span> |
| <span class="source-line-no">596</span><span id="line-596"> if (valLen > 0) {</span> |
| <span class="source-line-no">597</span><span id="line-597"> out.write(value);// Value</span> |
| <span class="source-line-no">598</span><span id="line-598"> }</span> |
| <span class="source-line-no">599</span><span id="line-599"> len += valLen;</span> |
| <span class="source-line-no">600</span><span id="line-600"> if (withTags && tags != null) {</span> |
| <span class="source-line-no">601</span><span id="line-601"> // Write the tagsLength 2 bytes</span> |
| <span class="source-line-no">602</span><span id="line-602"> out.write((byte) (0xff & (tags.length >> 8)));</span> |
| <span class="source-line-no">603</span><span id="line-603"> out.write((byte) (0xff & tags.length));</span> |
| <span class="source-line-no">604</span><span id="line-604"> out.write(tags);</span> |
| <span class="source-line-no">605</span><span id="line-605"> len += KeyValue.TAGS_LENGTH_SIZE + tags.length;</span> |
| <span class="source-line-no">606</span><span id="line-606"> }</span> |
| <span class="source-line-no">607</span><span id="line-607"> return len;</span> |
| <span class="source-line-no">608</span><span id="line-608"> }</span> |
| <span class="source-line-no">609</span><span id="line-609"></span> |
| <span class="source-line-no">610</span><span id="line-610"> @Override</span> |
| <span class="source-line-no">611</span><span id="line-611"> public int getSerializedSize(boolean withTags) {</span> |
| <span class="source-line-no">612</span><span id="line-612"> return super.getSerializedSize(withTags) - this.cell.getValueLength() + this.value.length;</span> |
| <span class="source-line-no">613</span><span id="line-613"> }</span> |
| <span class="source-line-no">614</span><span id="line-614"></span> |
| <span class="source-line-no">615</span><span id="line-615"> @Override</span> |
| <span class="source-line-no">616</span><span id="line-616"> public void write(ByteBuffer buf, int offset) {</span> |
| <span class="source-line-no">617</span><span id="line-617"> write(buf, offset, this.cell, this.value, this.tags);</span> |
| <span class="source-line-no">618</span><span id="line-618"> }</span> |
| <span class="source-line-no">619</span><span id="line-619"></span> |
| <span class="source-line-no">620</span><span id="line-620"> /**</span> |
| <span class="source-line-no">621</span><span id="line-621"> * Made into a static method so as to reuse the logic within</span> |
| <span class="source-line-no">622</span><span id="line-622"> * ValueAndTagRewriteByteBufferExtendedCell</span> |
| <span class="source-line-no">623</span><span id="line-623"> */</span> |
| <span class="source-line-no">624</span><span id="line-624"> static void write(ByteBuffer buf, int offset, ExtendedCell cell, byte[] value, byte[] tags) {</span> |
| <span class="source-line-no">625</span><span id="line-625"> offset = ByteBufferUtils.putInt(buf, offset, KeyValueUtil.keyLength(cell));// Key length</span> |
| <span class="source-line-no">626</span><span id="line-626"> offset = ByteBufferUtils.putInt(buf, offset, value.length);// Value length</span> |
| <span class="source-line-no">627</span><span id="line-627"> offset = KeyValueUtil.appendKeyTo(cell, buf, offset);</span> |
| <span class="source-line-no">628</span><span id="line-628"> ByteBufferUtils.copyFromArrayToBuffer(buf, offset, value, 0, value.length);</span> |
| <span class="source-line-no">629</span><span id="line-629"> offset += value.length;</span> |
| <span class="source-line-no">630</span><span id="line-630"> int tagsLen = tags == null ? 0 : tags.length;</span> |
| <span class="source-line-no">631</span><span id="line-631"> if (tagsLen > 0) {</span> |
| <span class="source-line-no">632</span><span id="line-632"> offset = ByteBufferUtils.putAsShort(buf, offset, tagsLen);</span> |
| <span class="source-line-no">633</span><span id="line-633"> ByteBufferUtils.copyFromArrayToBuffer(buf, offset, tags, 0, tagsLen);</span> |
| <span class="source-line-no">634</span><span id="line-634"> }</span> |
| <span class="source-line-no">635</span><span id="line-635"> }</span> |
| <span class="source-line-no">636</span><span id="line-636"></span> |
| <span class="source-line-no">637</span><span id="line-637"> @Override</span> |
| <span class="source-line-no">638</span><span id="line-638"> public ExtendedCell deepClone() {</span> |
| <span class="source-line-no">639</span><span id="line-639"> ExtendedCell clonedBaseCell = this.cell.deepClone();</span> |
| <span class="source-line-no">640</span><span id="line-640"> return new ValueAndTagRewriteCell(clonedBaseCell, this.value, this.tags);</span> |
| <span class="source-line-no">641</span><span id="line-641"> }</span> |
| <span class="source-line-no">642</span><span id="line-642"> }</span> |
| <span class="source-line-no">643</span><span id="line-643"></span> |
| <span class="source-line-no">644</span><span id="line-644"> static class ValueAndTagRewriteByteBufferExtendedCell extends TagRewriteByteBufferExtendedCell {</span> |
| <span class="source-line-no">645</span><span id="line-645"></span> |
| <span class="source-line-no">646</span><span id="line-646"> protected byte[] value;</span> |
| <span class="source-line-no">647</span><span id="line-647"></span> |
| <span class="source-line-no">648</span><span id="line-648"> public ValueAndTagRewriteByteBufferExtendedCell(ByteBufferExtendedCell cell, byte[] value,</span> |
| <span class="source-line-no">649</span><span id="line-649"> byte[] tags) {</span> |
| <span class="source-line-no">650</span><span id="line-650"> super(cell, tags);</span> |
| <span class="source-line-no">651</span><span id="line-651"> this.value = value;</span> |
| <span class="source-line-no">652</span><span id="line-652"> }</span> |
| <span class="source-line-no">653</span><span id="line-653"></span> |
| <span class="source-line-no">654</span><span id="line-654"> @Override</span> |
| <span class="source-line-no">655</span><span id="line-655"> public byte[] getValueArray() {</span> |
| <span class="source-line-no">656</span><span id="line-656"> return this.value;</span> |
| <span class="source-line-no">657</span><span id="line-657"> }</span> |
| <span class="source-line-no">658</span><span id="line-658"></span> |
| <span class="source-line-no">659</span><span id="line-659"> @Override</span> |
| <span class="source-line-no">660</span><span id="line-660"> public int getValueOffset() {</span> |
| <span class="source-line-no">661</span><span id="line-661"> return 0;</span> |
| <span class="source-line-no">662</span><span id="line-662"> }</span> |
| <span class="source-line-no">663</span><span id="line-663"></span> |
| <span class="source-line-no">664</span><span id="line-664"> @Override</span> |
| <span class="source-line-no">665</span><span id="line-665"> public int getValueLength() {</span> |
| <span class="source-line-no">666</span><span id="line-666"> return this.value == null ? 0 : this.value.length;</span> |
| <span class="source-line-no">667</span><span id="line-667"> }</span> |
| <span class="source-line-no">668</span><span id="line-668"></span> |
| <span class="source-line-no">669</span><span id="line-669"> @Override</span> |
| <span class="source-line-no">670</span><span id="line-670"> public ByteBuffer getValueByteBuffer() {</span> |
| <span class="source-line-no">671</span><span id="line-671"> return ByteBuffer.wrap(this.value);</span> |
| <span class="source-line-no">672</span><span id="line-672"> }</span> |
| <span class="source-line-no">673</span><span id="line-673"></span> |
| <span class="source-line-no">674</span><span id="line-674"> @Override</span> |
| <span class="source-line-no">675</span><span id="line-675"> public int getValuePosition() {</span> |
| <span class="source-line-no">676</span><span id="line-676"> return 0;</span> |
| <span class="source-line-no">677</span><span id="line-677"> }</span> |
| <span class="source-line-no">678</span><span id="line-678"></span> |
| <span class="source-line-no">679</span><span id="line-679"> @Override</span> |
| <span class="source-line-no">680</span><span id="line-680"> public long heapSize() {</span> |
| <span class="source-line-no">681</span><span id="line-681"> long sum = ClassSize.REFERENCE + super.heapSize();</span> |
| <span class="source-line-no">682</span><span id="line-682"> if (this.value != null) {</span> |
| <span class="source-line-no">683</span><span id="line-683"> sum += ClassSize.sizeOf(this.value);</span> |
| <span class="source-line-no">684</span><span id="line-684"> }</span> |
| <span class="source-line-no">685</span><span id="line-685"> return sum;</span> |
| <span class="source-line-no">686</span><span id="line-686"> }</span> |
| <span class="source-line-no">687</span><span id="line-687"></span> |
| <span class="source-line-no">688</span><span id="line-688"> @Override</span> |
| <span class="source-line-no">689</span><span id="line-689"> public int write(OutputStream out, boolean withTags) throws IOException {</span> |
| <span class="source-line-no">690</span><span id="line-690"> return ValueAndTagRewriteCell.write(out, withTags, this.cell, this.value, this.tags);</span> |
| <span class="source-line-no">691</span><span id="line-691"> }</span> |
| <span class="source-line-no">692</span><span id="line-692"></span> |
| <span class="source-line-no">693</span><span id="line-693"> @Override</span> |
| <span class="source-line-no">694</span><span id="line-694"> public int getSerializedSize(boolean withTags) {</span> |
| <span class="source-line-no">695</span><span id="line-695"> return super.getSerializedSize(withTags) - this.cell.getValueLength() + this.value.length;</span> |
| <span class="source-line-no">696</span><span id="line-696"> }</span> |
| <span class="source-line-no">697</span><span id="line-697"></span> |
| <span class="source-line-no">698</span><span id="line-698"> @Override</span> |
| <span class="source-line-no">699</span><span id="line-699"> public void write(ByteBuffer buf, int offset) {</span> |
| <span class="source-line-no">700</span><span id="line-700"> ValueAndTagRewriteCell.write(buf, offset, this.cell, this.value, this.tags);</span> |
| <span class="source-line-no">701</span><span id="line-701"> }</span> |
| <span class="source-line-no">702</span><span id="line-702"></span> |
| <span class="source-line-no">703</span><span id="line-703"> @Override</span> |
| <span class="source-line-no">704</span><span id="line-704"> public ExtendedCell deepClone() {</span> |
| <span class="source-line-no">705</span><span id="line-705"> ExtendedCell clonedBaseCell = this.cell.deepClone();</span> |
| <span class="source-line-no">706</span><span id="line-706"> if (clonedBaseCell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">707</span><span id="line-707"> return new ValueAndTagRewriteByteBufferExtendedCell((ByteBufferExtendedCell) clonedBaseCell,</span> |
| <span class="source-line-no">708</span><span id="line-708"> this.value, this.tags);</span> |
| <span class="source-line-no">709</span><span id="line-709"> }</span> |
| <span class="source-line-no">710</span><span id="line-710"> return new ValueAndTagRewriteCell(clonedBaseCell, this.value, this.tags);</span> |
| <span class="source-line-no">711</span><span id="line-711"> }</span> |
| <span class="source-line-no">712</span><span id="line-712"> }</span> |
| <span class="source-line-no">713</span><span id="line-713"></span> |
| <span class="source-line-no">714</span><span id="line-714"> public static boolean matchingRows(final Cell left, final byte[] buf, final int offset,</span> |
| <span class="source-line-no">715</span><span id="line-715"> final int length) {</span> |
| <span class="source-line-no">716</span><span id="line-716"> if (left instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">717</span><span id="line-717"> return ByteBufferUtils.equals(((ByteBufferExtendedCell) left).getRowByteBuffer(),</span> |
| <span class="source-line-no">718</span><span id="line-718"> ((ByteBufferExtendedCell) left).getRowPosition(), left.getRowLength(), buf, offset, length);</span> |
| <span class="source-line-no">719</span><span id="line-719"> }</span> |
| <span class="source-line-no">720</span><span id="line-720"> return Bytes.equals(left.getRowArray(), left.getRowOffset(), left.getRowLength(), buf, offset,</span> |
| <span class="source-line-no">721</span><span id="line-721"> length);</span> |
| <span class="source-line-no">722</span><span id="line-722"> }</span> |
| <span class="source-line-no">723</span><span id="line-723"></span> |
| <span class="source-line-no">724</span><span id="line-724"> public static boolean matchingFamily(final Cell left, final byte[] buf, final int offset,</span> |
| <span class="source-line-no">725</span><span id="line-725"> final int length) {</span> |
| <span class="source-line-no">726</span><span id="line-726"> if (left instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">727</span><span id="line-727"> return ByteBufferUtils.equals(((ByteBufferExtendedCell) left).getFamilyByteBuffer(),</span> |
| <span class="source-line-no">728</span><span id="line-728"> ((ByteBufferExtendedCell) left).getFamilyPosition(), left.getFamilyLength(), buf, offset,</span> |
| <span class="source-line-no">729</span><span id="line-729"> length);</span> |
| <span class="source-line-no">730</span><span id="line-730"> }</span> |
| <span class="source-line-no">731</span><span id="line-731"> return Bytes.equals(left.getFamilyArray(), left.getFamilyOffset(), left.getFamilyLength(), buf,</span> |
| <span class="source-line-no">732</span><span id="line-732"> offset, length);</span> |
| <span class="source-line-no">733</span><span id="line-733"> }</span> |
| <span class="source-line-no">734</span><span id="line-734"></span> |
| <span class="source-line-no">735</span><span id="line-735"> /**</span> |
| <span class="source-line-no">736</span><span id="line-736"> * Finds if the qualifier part of the cell and the KV serialized byte[] are equal</span> |
| <span class="source-line-no">737</span><span id="line-737"> * @param left the cell with which we need to match the qualifier</span> |
| <span class="source-line-no">738</span><span id="line-738"> * @param buf the serialized keyvalue format byte[]</span> |
| <span class="source-line-no">739</span><span id="line-739"> * @param offset the offset of the qualifier in the byte[]</span> |
| <span class="source-line-no">740</span><span id="line-740"> * @param length the length of the qualifier in the byte[]</span> |
| <span class="source-line-no">741</span><span id="line-741"> * @return true if the qualifier matches, false otherwise</span> |
| <span class="source-line-no">742</span><span id="line-742"> */</span> |
| <span class="source-line-no">743</span><span id="line-743"> public static boolean matchingQualifier(final Cell left, final byte[] buf, final int offset,</span> |
| <span class="source-line-no">744</span><span id="line-744"> final int length) {</span> |
| <span class="source-line-no">745</span><span id="line-745"> if (buf == null) {</span> |
| <span class="source-line-no">746</span><span id="line-746"> return left.getQualifierLength() == 0;</span> |
| <span class="source-line-no">747</span><span id="line-747"> }</span> |
| <span class="source-line-no">748</span><span id="line-748"> if (left instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">749</span><span id="line-749"> return ByteBufferUtils.equals(((ByteBufferExtendedCell) left).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">750</span><span id="line-750"> ((ByteBufferExtendedCell) left).getQualifierPosition(), left.getQualifierLength(), buf,</span> |
| <span class="source-line-no">751</span><span id="line-751"> offset, length);</span> |
| <span class="source-line-no">752</span><span id="line-752"> }</span> |
| <span class="source-line-no">753</span><span id="line-753"> return Bytes.equals(left.getQualifierArray(), left.getQualifierOffset(),</span> |
| <span class="source-line-no">754</span><span id="line-754"> left.getQualifierLength(), buf, offset, length);</span> |
| <span class="source-line-no">755</span><span id="line-755"> }</span> |
| <span class="source-line-no">756</span><span id="line-756"></span> |
| <span class="source-line-no">757</span><span id="line-757"> /**</span> |
| <span class="source-line-no">758</span><span id="line-758"> * Finds if the start of the qualifier part of the Cell matches <code>buf</code></span> |
| <span class="source-line-no">759</span><span id="line-759"> * @param left the cell with which we need to match the qualifier</span> |
| <span class="source-line-no">760</span><span id="line-760"> * @param startsWith the serialized keyvalue format byte[]</span> |
| <span class="source-line-no">761</span><span id="line-761"> * @return true if the qualifier have same staring characters, false otherwise</span> |
| <span class="source-line-no">762</span><span id="line-762"> */</span> |
| <span class="source-line-no">763</span><span id="line-763"> public static boolean qualifierStartsWith(final Cell left, final byte[] startsWith) {</span> |
| <span class="source-line-no">764</span><span id="line-764"> if (startsWith == null || startsWith.length == 0) {</span> |
| <span class="source-line-no">765</span><span id="line-765"> throw new IllegalArgumentException("Cannot pass an empty startsWith");</span> |
| <span class="source-line-no">766</span><span id="line-766"> }</span> |
| <span class="source-line-no">767</span><span id="line-767"> if (left.getQualifierLength() < startsWith.length) {</span> |
| <span class="source-line-no">768</span><span id="line-768"> return false;</span> |
| <span class="source-line-no">769</span><span id="line-769"> }</span> |
| <span class="source-line-no">770</span><span id="line-770"> if (left instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">771</span><span id="line-771"> return ByteBufferUtils.equals(((ByteBufferExtendedCell) left).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">772</span><span id="line-772"> ((ByteBufferExtendedCell) left).getQualifierPosition(), startsWith.length, startsWith, 0,</span> |
| <span class="source-line-no">773</span><span id="line-773"> startsWith.length);</span> |
| <span class="source-line-no">774</span><span id="line-774"> }</span> |
| <span class="source-line-no">775</span><span id="line-775"> return Bytes.equals(left.getQualifierArray(), left.getQualifierOffset(), startsWith.length,</span> |
| <span class="source-line-no">776</span><span id="line-776"> startsWith, 0, startsWith.length);</span> |
| <span class="source-line-no">777</span><span id="line-777"> }</span> |
| <span class="source-line-no">778</span><span id="line-778"></span> |
| <span class="source-line-no">779</span><span id="line-779"> public static boolean matchingColumn(final Cell left, final byte[] fam, final int foffset,</span> |
| <span class="source-line-no">780</span><span id="line-780"> final int flength, final byte[] qual, final int qoffset, final int qlength) {</span> |
| <span class="source-line-no">781</span><span id="line-781"> if (!matchingFamily(left, fam, foffset, flength)) {</span> |
| <span class="source-line-no">782</span><span id="line-782"> return false;</span> |
| <span class="source-line-no">783</span><span id="line-783"> }</span> |
| <span class="source-line-no">784</span><span id="line-784"> return matchingQualifier(left, qual, qoffset, qlength);</span> |
| <span class="source-line-no">785</span><span id="line-785"> }</span> |
| <span class="source-line-no">786</span><span id="line-786"></span> |
| <span class="source-line-no">787</span><span id="line-787"> public static boolean matchingValue(final Cell left, final Cell right, int lvlength,</span> |
| <span class="source-line-no">788</span><span id="line-788"> int rvlength) {</span> |
| <span class="source-line-no">789</span><span id="line-789"> if (left instanceof ByteBufferExtendedCell && right instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">790</span><span id="line-790"> return ByteBufferUtils.equals(((ByteBufferExtendedCell) left).getValueByteBuffer(),</span> |
| <span class="source-line-no">791</span><span id="line-791"> ((ByteBufferExtendedCell) left).getValuePosition(), lvlength,</span> |
| <span class="source-line-no">792</span><span id="line-792"> ((ByteBufferExtendedCell) right).getValueByteBuffer(),</span> |
| <span class="source-line-no">793</span><span id="line-793"> ((ByteBufferExtendedCell) right).getValuePosition(), rvlength);</span> |
| <span class="source-line-no">794</span><span id="line-794"> }</span> |
| <span class="source-line-no">795</span><span id="line-795"> if (left instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">796</span><span id="line-796"> return ByteBufferUtils.equals(((ByteBufferExtendedCell) left).getValueByteBuffer(),</span> |
| <span class="source-line-no">797</span><span id="line-797"> ((ByteBufferExtendedCell) left).getValuePosition(), lvlength, right.getValueArray(),</span> |
| <span class="source-line-no">798</span><span id="line-798"> right.getValueOffset(), rvlength);</span> |
| <span class="source-line-no">799</span><span id="line-799"> }</span> |
| <span class="source-line-no">800</span><span id="line-800"> if (right instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">801</span><span id="line-801"> return ByteBufferUtils.equals(((ByteBufferExtendedCell) right).getValueByteBuffer(),</span> |
| <span class="source-line-no">802</span><span id="line-802"> ((ByteBufferExtendedCell) right).getValuePosition(), rvlength, left.getValueArray(),</span> |
| <span class="source-line-no">803</span><span id="line-803"> left.getValueOffset(), lvlength);</span> |
| <span class="source-line-no">804</span><span id="line-804"> }</span> |
| <span class="source-line-no">805</span><span id="line-805"> return Bytes.equals(left.getValueArray(), left.getValueOffset(), lvlength,</span> |
| <span class="source-line-no">806</span><span id="line-806"> right.getValueArray(), right.getValueOffset(), rvlength);</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 matchingType(ExtendedCell a, ExtendedCell b) {</span> |
| <span class="source-line-no">810</span><span id="line-810"> return a.getTypeByte() == b.getTypeByte();</span> |
| <span class="source-line-no">811</span><span id="line-811"> }</span> |
| <span class="source-line-no">812</span><span id="line-812"></span> |
| <span class="source-line-no">813</span><span id="line-813"> public static boolean matchingTags(final ExtendedCell left, final ExtendedCell right) {</span> |
| <span class="source-line-no">814</span><span id="line-814"> return matchingTags(left, right, left.getTagsLength(), right.getTagsLength());</span> |
| <span class="source-line-no">815</span><span id="line-815"> }</span> |
| <span class="source-line-no">816</span><span id="line-816"></span> |
| <span class="source-line-no">817</span><span id="line-817"> public static boolean matchingTags(final ExtendedCell left, final ExtendedCell right, int llength,</span> |
| <span class="source-line-no">818</span><span id="line-818"> int rlength) {</span> |
| <span class="source-line-no">819</span><span id="line-819"> if (left instanceof ByteBufferExtendedCell && right instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">820</span><span id="line-820"> ByteBufferExtendedCell leftBBCell = (ByteBufferExtendedCell) left;</span> |
| <span class="source-line-no">821</span><span id="line-821"> ByteBufferExtendedCell rightBBCell = (ByteBufferExtendedCell) right;</span> |
| <span class="source-line-no">822</span><span id="line-822"> return ByteBufferUtils.equals(leftBBCell.getTagsByteBuffer(), leftBBCell.getTagsPosition(),</span> |
| <span class="source-line-no">823</span><span id="line-823"> llength, rightBBCell.getTagsByteBuffer(), rightBBCell.getTagsPosition(), rlength);</span> |
| <span class="source-line-no">824</span><span id="line-824"> }</span> |
| <span class="source-line-no">825</span><span id="line-825"> if (left instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">826</span><span id="line-826"> ByteBufferExtendedCell leftBBCell = (ByteBufferExtendedCell) left;</span> |
| <span class="source-line-no">827</span><span id="line-827"> return ByteBufferUtils.equals(leftBBCell.getTagsByteBuffer(), leftBBCell.getTagsPosition(),</span> |
| <span class="source-line-no">828</span><span id="line-828"> llength, right.getTagsArray(), right.getTagsOffset(), rlength);</span> |
| <span class="source-line-no">829</span><span id="line-829"> }</span> |
| <span class="source-line-no">830</span><span id="line-830"> if (right instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">831</span><span id="line-831"> ByteBufferExtendedCell rightBBCell = (ByteBufferExtendedCell) right;</span> |
| <span class="source-line-no">832</span><span id="line-832"> return ByteBufferUtils.equals(rightBBCell.getTagsByteBuffer(), rightBBCell.getTagsPosition(),</span> |
| <span class="source-line-no">833</span><span id="line-833"> rlength, left.getTagsArray(), left.getTagsOffset(), llength);</span> |
| <span class="source-line-no">834</span><span id="line-834"> }</span> |
| <span class="source-line-no">835</span><span id="line-835"> return Bytes.equals(left.getTagsArray(), left.getTagsOffset(), llength, right.getTagsArray(),</span> |
| <span class="source-line-no">836</span><span id="line-836"> right.getTagsOffset(), rlength);</span> |
| <span class="source-line-no">837</span><span id="line-837"> }</span> |
| <span class="source-line-no">838</span><span id="line-838"></span> |
| <span class="source-line-no">839</span><span id="line-839"> /**</span> |
| <span class="source-line-no">840</span><span id="line-840"> * Return true if a delete type, a {@link KeyValue.Type#Delete} or a {KeyValue.Type#DeleteFamily}</span> |
| <span class="source-line-no">841</span><span id="line-841"> * or a {@link KeyValue.Type#DeleteColumn} KeyValue type.</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 isDelete(final byte type) {</span> |
| <span class="source-line-no">844</span><span id="line-844"> return KeyValue.Type.Delete.getCode() <= type && type <= 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"> /** Returns True if this cell is a {@link KeyValue.Type#Delete} type. */</span> |
| <span class="source-line-no">848</span><span id="line-848"> public static boolean isDeleteType(ExtendedCell cell) {</span> |
| <span class="source-line-no">849</span><span id="line-849"> return cell.getTypeByte() == KeyValue.Type.Delete.getCode();</span> |
| <span class="source-line-no">850</span><span id="line-850"> }</span> |
| <span class="source-line-no">851</span><span id="line-851"></span> |
| <span class="source-line-no">852</span><span id="line-852"> public static boolean isDeleteFamily(final ExtendedCell cell) {</span> |
| <span class="source-line-no">853</span><span id="line-853"> return cell.getTypeByte() == KeyValue.Type.DeleteFamily.getCode();</span> |
| <span class="source-line-no">854</span><span id="line-854"> }</span> |
| <span class="source-line-no">855</span><span id="line-855"></span> |
| <span class="source-line-no">856</span><span id="line-856"> public static boolean isDeleteFamilyVersion(final ExtendedCell cell) {</span> |
| <span class="source-line-no">857</span><span id="line-857"> return cell.getTypeByte() == KeyValue.Type.DeleteFamilyVersion.getCode();</span> |
| <span class="source-line-no">858</span><span id="line-858"> }</span> |
| <span class="source-line-no">859</span><span id="line-859"></span> |
| <span class="source-line-no">860</span><span id="line-860"> public static boolean isDeleteColumns(final ExtendedCell cell) {</span> |
| <span class="source-line-no">861</span><span id="line-861"> return cell.getTypeByte() == KeyValue.Type.DeleteColumn.getCode();</span> |
| <span class="source-line-no">862</span><span id="line-862"> }</span> |
| <span class="source-line-no">863</span><span id="line-863"></span> |
| <span class="source-line-no">864</span><span id="line-864"> public static boolean isDeleteColumnVersion(final ExtendedCell cell) {</span> |
| <span class="source-line-no">865</span><span id="line-865"> return cell.getTypeByte() == KeyValue.Type.Delete.getCode();</span> |
| <span class="source-line-no">866</span><span id="line-866"> }</span> |
| <span class="source-line-no">867</span><span id="line-867"></span> |
| <span class="source-line-no">868</span><span id="line-868"> /** Returns True if this cell is a delete family or column type. */</span> |
| <span class="source-line-no">869</span><span id="line-869"> public static boolean isDeleteColumnOrFamily(ExtendedCell cell) {</span> |
| <span class="source-line-no">870</span><span id="line-870"> int t = cell.getTypeByte();</span> |
| <span class="source-line-no">871</span><span id="line-871"> return t == KeyValue.Type.DeleteColumn.getCode() || t == KeyValue.Type.DeleteFamily.getCode();</span> |
| <span class="source-line-no">872</span><span id="line-872"> }</span> |
| <span class="source-line-no">873</span><span id="line-873"></span> |
| <span class="source-line-no">874</span><span id="line-874"> public static byte[] cloneTags(ExtendedCell cell) {</span> |
| <span class="source-line-no">875</span><span id="line-875"> byte[] output = new byte[cell.getTagsLength()];</span> |
| <span class="source-line-no">876</span><span id="line-876"> copyTagsTo(cell, output, 0);</span> |
| <span class="source-line-no">877</span><span id="line-877"> return output;</span> |
| <span class="source-line-no">878</span><span id="line-878"> }</span> |
| <span class="source-line-no">879</span><span id="line-879"></span> |
| <span class="source-line-no">880</span><span id="line-880"> /** Copies the tags info into the tag portion of the cell */</span> |
| <span class="source-line-no">881</span><span id="line-881"> public static int copyTagsTo(ExtendedCell cell, byte[] destination, int destinationOffset) {</span> |
| <span class="source-line-no">882</span><span id="line-882"> int tlen = cell.getTagsLength();</span> |
| <span class="source-line-no">883</span><span id="line-883"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">884</span><span id="line-884"> ByteBufferUtils.copyFromBufferToArray(destination,</span> |
| <span class="source-line-no">885</span><span id="line-885"> ((ByteBufferExtendedCell) cell).getTagsByteBuffer(),</span> |
| <span class="source-line-no">886</span><span id="line-886"> ((ByteBufferExtendedCell) cell).getTagsPosition(), destinationOffset, tlen);</span> |
| <span class="source-line-no">887</span><span id="line-887"> } else {</span> |
| <span class="source-line-no">888</span><span id="line-888"> System.arraycopy(cell.getTagsArray(), cell.getTagsOffset(), destination, destinationOffset,</span> |
| <span class="source-line-no">889</span><span id="line-889"> tlen);</span> |
| <span class="source-line-no">890</span><span id="line-890"> }</span> |
| <span class="source-line-no">891</span><span id="line-891"> return destinationOffset + tlen;</span> |
| <span class="source-line-no">892</span><span id="line-892"> }</span> |
| <span class="source-line-no">893</span><span id="line-893"></span> |
| <span class="source-line-no">894</span><span id="line-894"> /** Copies the tags info into the tag portion of the cell */</span> |
| <span class="source-line-no">895</span><span id="line-895"> public static int copyTagsTo(ExtendedCell cell, ByteBuffer destination, int destinationOffset) {</span> |
| <span class="source-line-no">896</span><span id="line-896"> int tlen = cell.getTagsLength();</span> |
| <span class="source-line-no">897</span><span id="line-897"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">898</span><span id="line-898"> ByteBufferUtils.copyFromBufferToBuffer(((ByteBufferExtendedCell) cell).getTagsByteBuffer(),</span> |
| <span class="source-line-no">899</span><span id="line-899"> destination, ((ByteBufferExtendedCell) cell).getTagsPosition(), destinationOffset, tlen);</span> |
| <span class="source-line-no">900</span><span id="line-900"> } else {</span> |
| <span class="source-line-no">901</span><span id="line-901"> ByteBufferUtils.copyFromArrayToBuffer(destination, destinationOffset, cell.getTagsArray(),</span> |
| <span class="source-line-no">902</span><span id="line-902"> cell.getTagsOffset(), tlen);</span> |
| <span class="source-line-no">903</span><span id="line-903"> }</span> |
| <span class="source-line-no">904</span><span id="line-904"> return destinationOffset + tlen;</span> |
| <span class="source-line-no">905</span><span id="line-905"> }</span> |
| <span class="source-line-no">906</span><span id="line-906"></span> |
| <span class="source-line-no">907</span><span id="line-907"> /**</span> |
| <span class="source-line-no">908</span><span id="line-908"> * Return tags in the given Cell as a List</span> |
| <span class="source-line-no">909</span><span id="line-909"> * @param cell The Cell</span> |
| <span class="source-line-no">910</span><span id="line-910"> * @return Tags in the given Cell as a List</span> |
| <span class="source-line-no">911</span><span id="line-911"> */</span> |
| <span class="source-line-no">912</span><span id="line-912"> public static List<Tag> getTags(ExtendedCell cell) {</span> |
| <span class="source-line-no">913</span><span id="line-913"> List<Tag> tags = new ArrayList<>();</span> |
| <span class="source-line-no">914</span><span id="line-914"> Iterator<Tag> tagsItr = tagsIterator(cell);</span> |
| <span class="source-line-no">915</span><span id="line-915"> while (tagsItr.hasNext()) {</span> |
| <span class="source-line-no">916</span><span id="line-916"> tags.add(tagsItr.next());</span> |
| <span class="source-line-no">917</span><span id="line-917"> }</span> |
| <span class="source-line-no">918</span><span id="line-918"> return tags;</span> |
| <span class="source-line-no">919</span><span id="line-919"> }</span> |
| <span class="source-line-no">920</span><span id="line-920"></span> |
| <span class="source-line-no">921</span><span id="line-921"> /**</span> |
| <span class="source-line-no">922</span><span id="line-922"> * Retrieve Cell's first tag, matching the passed in type</span> |
| <span class="source-line-no">923</span><span id="line-923"> * @param cell The Cell</span> |
| <span class="source-line-no">924</span><span id="line-924"> * @param type Type of the Tag to retrieve</span> |
| <span class="source-line-no">925</span><span id="line-925"> * @return Optional, empty if there is no tag of the passed in tag type</span> |
| <span class="source-line-no">926</span><span id="line-926"> */</span> |
| <span class="source-line-no">927</span><span id="line-927"> public static Optional<Tag> getTag(ExtendedCell cell, byte type) {</span> |
| <span class="source-line-no">928</span><span id="line-928"> boolean bufferBacked = cell instanceof ByteBufferExtendedCell;</span> |
| <span class="source-line-no">929</span><span id="line-929"> int length = cell.getTagsLength();</span> |
| <span class="source-line-no">930</span><span id="line-930"> int offset =</span> |
| <span class="source-line-no">931</span><span id="line-931"> bufferBacked ? ((ByteBufferExtendedCell) cell).getTagsPosition() : cell.getTagsOffset();</span> |
| <span class="source-line-no">932</span><span id="line-932"> int pos = offset;</span> |
| <span class="source-line-no">933</span><span id="line-933"> while (pos < offset + length) {</span> |
| <span class="source-line-no">934</span><span id="line-934"> int tagLen;</span> |
| <span class="source-line-no">935</span><span id="line-935"> if (bufferBacked) {</span> |
| <span class="source-line-no">936</span><span id="line-936"> ByteBuffer tagsBuffer = ((ByteBufferExtendedCell) cell).getTagsByteBuffer();</span> |
| <span class="source-line-no">937</span><span id="line-937"> tagLen = ByteBufferUtils.readAsInt(tagsBuffer, pos, TAG_LENGTH_SIZE);</span> |
| <span class="source-line-no">938</span><span id="line-938"> if (ByteBufferUtils.toByte(tagsBuffer, pos + TAG_LENGTH_SIZE) == type) {</span> |
| <span class="source-line-no">939</span><span id="line-939"> return Optional.of(new ByteBufferTag(tagsBuffer, pos, tagLen + TAG_LENGTH_SIZE));</span> |
| <span class="source-line-no">940</span><span id="line-940"> }</span> |
| <span class="source-line-no">941</span><span id="line-941"> } else {</span> |
| <span class="source-line-no">942</span><span id="line-942"> tagLen = Bytes.readAsInt(cell.getTagsArray(), pos, TAG_LENGTH_SIZE);</span> |
| <span class="source-line-no">943</span><span id="line-943"> if (cell.getTagsArray()[pos + TAG_LENGTH_SIZE] == type) {</span> |
| <span class="source-line-no">944</span><span id="line-944"> return Optional</span> |
| <span class="source-line-no">945</span><span id="line-945"> .of(new ArrayBackedTag(cell.getTagsArray(), pos, tagLen + TAG_LENGTH_SIZE));</span> |
| <span class="source-line-no">946</span><span id="line-946"> }</span> |
| <span class="source-line-no">947</span><span id="line-947"> }</span> |
| <span class="source-line-no">948</span><span id="line-948"> pos += TAG_LENGTH_SIZE + tagLen;</span> |
| <span class="source-line-no">949</span><span id="line-949"> }</span> |
| <span class="source-line-no">950</span><span id="line-950"> return Optional.empty();</span> |
| <span class="source-line-no">951</span><span id="line-951"> }</span> |
| <span class="source-line-no">952</span><span id="line-952"></span> |
| <span class="source-line-no">953</span><span id="line-953"> /**</span> |
| <span class="source-line-no">954</span><span id="line-954"> * Utility method to iterate through the tags in the given cell.</span> |
| <span class="source-line-no">955</span><span id="line-955"> * @param cell The Cell over which tags iterator is needed.</span> |
| <span class="source-line-no">956</span><span id="line-956"> * @return iterator for the tags</span> |
| <span class="source-line-no">957</span><span id="line-957"> */</span> |
| <span class="source-line-no">958</span><span id="line-958"> public static Iterator<Tag> tagsIterator(final ExtendedCell cell) {</span> |
| <span class="source-line-no">959</span><span id="line-959"> final int tagsLength = cell.getTagsLength();</span> |
| <span class="source-line-no">960</span><span id="line-960"> // Save an object allocation where we can</span> |
| <span class="source-line-no">961</span><span id="line-961"> if (tagsLength == 0) {</span> |
| <span class="source-line-no">962</span><span id="line-962"> return TagUtil.EMPTY_TAGS_ITR;</span> |
| <span class="source-line-no">963</span><span id="line-963"> }</span> |
| <span class="source-line-no">964</span><span id="line-964"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">965</span><span id="line-965"> return tagsIterator(((ByteBufferExtendedCell) cell).getTagsByteBuffer(),</span> |
| <span class="source-line-no">966</span><span id="line-966"> ((ByteBufferExtendedCell) cell).getTagsPosition(), tagsLength);</span> |
| <span class="source-line-no">967</span><span id="line-967"> }</span> |
| <span class="source-line-no">968</span><span id="line-968"></span> |
| <span class="source-line-no">969</span><span id="line-969"> return new Iterator<Tag>() {</span> |
| <span class="source-line-no">970</span><span id="line-970"> private int offset = cell.getTagsOffset();</span> |
| <span class="source-line-no">971</span><span id="line-971"> private int pos = offset;</span> |
| <span class="source-line-no">972</span><span id="line-972"> private int endOffset = offset + cell.getTagsLength() - 1;</span> |
| <span class="source-line-no">973</span><span id="line-973"></span> |
| <span class="source-line-no">974</span><span id="line-974"> @Override</span> |
| <span class="source-line-no">975</span><span id="line-975"> public boolean hasNext() {</span> |
| <span class="source-line-no">976</span><span id="line-976"> return this.pos < endOffset;</span> |
| <span class="source-line-no">977</span><span id="line-977"> }</span> |
| <span class="source-line-no">978</span><span id="line-978"></span> |
| <span class="source-line-no">979</span><span id="line-979"> @Override</span> |
| <span class="source-line-no">980</span><span id="line-980"> public Tag next() {</span> |
| <span class="source-line-no">981</span><span id="line-981"> if (hasNext()) {</span> |
| <span class="source-line-no">982</span><span id="line-982"> byte[] tags = cell.getTagsArray();</span> |
| <span class="source-line-no">983</span><span id="line-983"> int curTagLen = Bytes.readAsInt(tags, this.pos, Tag.TAG_LENGTH_SIZE);</span> |
| <span class="source-line-no">984</span><span id="line-984"> Tag tag = new ArrayBackedTag(tags, pos, curTagLen + TAG_LENGTH_SIZE);</span> |
| <span class="source-line-no">985</span><span id="line-985"> this.pos += Bytes.SIZEOF_SHORT + curTagLen;</span> |
| <span class="source-line-no">986</span><span id="line-986"> return tag;</span> |
| <span class="source-line-no">987</span><span id="line-987"> }</span> |
| <span class="source-line-no">988</span><span id="line-988"> return null;</span> |
| <span class="source-line-no">989</span><span id="line-989"> }</span> |
| <span class="source-line-no">990</span><span id="line-990"></span> |
| <span class="source-line-no">991</span><span id="line-991"> @Override</span> |
| <span class="source-line-no">992</span><span id="line-992"> public void remove() {</span> |
| <span class="source-line-no">993</span><span id="line-993"> throw new UnsupportedOperationException();</span> |
| <span class="source-line-no">994</span><span id="line-994"> }</span> |
| <span class="source-line-no">995</span><span id="line-995"> };</span> |
| <span class="source-line-no">996</span><span id="line-996"> }</span> |
| <span class="source-line-no">997</span><span id="line-997"></span> |
| <span class="source-line-no">998</span><span id="line-998"> public static Iterator<Tag> tagsIterator(final ByteBuffer tags, final int offset,</span> |
| <span class="source-line-no">999</span><span id="line-999"> final int length) {</span> |
| <span class="source-line-no">1000</span><span id="line-1000"> return new Iterator<Tag>() {</span> |
| <span class="source-line-no">1001</span><span id="line-1001"> private int pos = offset;</span> |
| <span class="source-line-no">1002</span><span id="line-1002"> private int endOffset = offset + length - 1;</span> |
| <span class="source-line-no">1003</span><span id="line-1003"></span> |
| <span class="source-line-no">1004</span><span id="line-1004"> @Override</span> |
| <span class="source-line-no">1005</span><span id="line-1005"> public boolean hasNext() {</span> |
| <span class="source-line-no">1006</span><span id="line-1006"> return this.pos < endOffset;</span> |
| <span class="source-line-no">1007</span><span id="line-1007"> }</span> |
| <span class="source-line-no">1008</span><span id="line-1008"></span> |
| <span class="source-line-no">1009</span><span id="line-1009"> @Override</span> |
| <span class="source-line-no">1010</span><span id="line-1010"> public Tag next() {</span> |
| <span class="source-line-no">1011</span><span id="line-1011"> if (hasNext()) {</span> |
| <span class="source-line-no">1012</span><span id="line-1012"> int curTagLen = ByteBufferUtils.readAsInt(tags, this.pos, Tag.TAG_LENGTH_SIZE);</span> |
| <span class="source-line-no">1013</span><span id="line-1013"> Tag tag = new ByteBufferTag(tags, pos, curTagLen + Tag.TAG_LENGTH_SIZE);</span> |
| <span class="source-line-no">1014</span><span id="line-1014"> this.pos += Bytes.SIZEOF_SHORT + curTagLen;</span> |
| <span class="source-line-no">1015</span><span id="line-1015"> return tag;</span> |
| <span class="source-line-no">1016</span><span id="line-1016"> }</span> |
| <span class="source-line-no">1017</span><span id="line-1017"> return null;</span> |
| <span class="source-line-no">1018</span><span id="line-1018"> }</span> |
| <span class="source-line-no">1019</span><span id="line-1019"></span> |
| <span class="source-line-no">1020</span><span id="line-1020"> @Override</span> |
| <span class="source-line-no">1021</span><span id="line-1021"> public void remove() {</span> |
| <span class="source-line-no">1022</span><span id="line-1022"> throw new UnsupportedOperationException();</span> |
| <span class="source-line-no">1023</span><span id="line-1023"> }</span> |
| <span class="source-line-no">1024</span><span id="line-1024"> };</span> |
| <span class="source-line-no">1025</span><span id="line-1025"> }</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"> * Returns true if the first range start1...end1 overlaps with the second range start2...end2,</span> |
| <span class="source-line-no">1029</span><span id="line-1029"> * assuming the byte arrays represent row keys</span> |
| <span class="source-line-no">1030</span><span id="line-1030"> */</span> |
| <span class="source-line-no">1031</span><span id="line-1031"> public static boolean overlappingKeys(final byte[] start1, final byte[] end1, final byte[] start2,</span> |
| <span class="source-line-no">1032</span><span id="line-1032"> final byte[] end2) {</span> |
| <span class="source-line-no">1033</span><span id="line-1033"> return (end2.length == 0 || start1.length == 0 || Bytes.compareTo(start1, end2) < 0)</span> |
| <span class="source-line-no">1034</span><span id="line-1034"> && (end1.length == 0 || start2.length == 0 || Bytes.compareTo(start2, end1) < 0);</span> |
| <span class="source-line-no">1035</span><span id="line-1035"> }</span> |
| <span class="source-line-no">1036</span><span id="line-1036"></span> |
| <span class="source-line-no">1037</span><span id="line-1037"> /** Write rowkey excluding the common part. */</span> |
| <span class="source-line-no">1038</span><span id="line-1038"> public static void writeRowKeyExcludingCommon(Cell cell, short rLen, int commonPrefix,</span> |
| <span class="source-line-no">1039</span><span id="line-1039"> DataOutputStream out) throws IOException {</span> |
| <span class="source-line-no">1040</span><span id="line-1040"> if (commonPrefix == 0) {</span> |
| <span class="source-line-no">1041</span><span id="line-1041"> out.writeShort(rLen);</span> |
| <span class="source-line-no">1042</span><span id="line-1042"> } else if (commonPrefix == 1) {</span> |
| <span class="source-line-no">1043</span><span id="line-1043"> out.writeByte((byte) rLen);</span> |
| <span class="source-line-no">1044</span><span id="line-1044"> commonPrefix--;</span> |
| <span class="source-line-no">1045</span><span id="line-1045"> } else {</span> |
| <span class="source-line-no">1046</span><span id="line-1046"> commonPrefix -= KeyValue.ROW_LENGTH_SIZE;</span> |
| <span class="source-line-no">1047</span><span id="line-1047"> }</span> |
| <span class="source-line-no">1048</span><span id="line-1048"> if (rLen > commonPrefix) {</span> |
| <span class="source-line-no">1049</span><span id="line-1049"> writeRowSkippingBytes(out, cell, rLen, commonPrefix);</span> |
| <span class="source-line-no">1050</span><span id="line-1050"> }</span> |
| <span class="source-line-no">1051</span><span id="line-1051"> }</span> |
| <span class="source-line-no">1052</span><span id="line-1052"></span> |
| <span class="source-line-no">1053</span><span id="line-1053"> /**</span> |
| <span class="source-line-no">1054</span><span id="line-1054"> * Writes the row from the given cell to the output stream excluding the common prefix</span> |
| <span class="source-line-no">1055</span><span id="line-1055"> * @param out The dataoutputstream to which the data has to be written</span> |
| <span class="source-line-no">1056</span><span id="line-1056"> * @param cell The cell whose contents has to be written</span> |
| <span class="source-line-no">1057</span><span id="line-1057"> * @param rlength the row length</span> |
| <span class="source-line-no">1058</span><span id="line-1058"> */</span> |
| <span class="source-line-no">1059</span><span id="line-1059"> public static void writeRowSkippingBytes(DataOutputStream out, Cell cell, short rlength,</span> |
| <span class="source-line-no">1060</span><span id="line-1060"> int commonPrefix) throws IOException {</span> |
| <span class="source-line-no">1061</span><span id="line-1061"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">1062</span><span id="line-1062"> ByteBufferUtils.copyBufferToStream((DataOutput) out,</span> |
| <span class="source-line-no">1063</span><span id="line-1063"> ((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">1064</span><span id="line-1064"> ((ByteBufferExtendedCell) cell).getRowPosition() + commonPrefix, rlength - commonPrefix);</span> |
| <span class="source-line-no">1065</span><span id="line-1065"> } else {</span> |
| <span class="source-line-no">1066</span><span id="line-1066"> out.write(cell.getRowArray(), cell.getRowOffset() + commonPrefix, rlength - commonPrefix);</span> |
| <span class="source-line-no">1067</span><span id="line-1067"> }</span> |
| <span class="source-line-no">1068</span><span id="line-1068"> }</span> |
| <span class="source-line-no">1069</span><span id="line-1069"></span> |
| <span class="source-line-no">1070</span><span id="line-1070"> /**</span> |
| <span class="source-line-no">1071</span><span id="line-1071"> * Find length of common prefix in keys of the cells, considering key as byte[] if serialized in</span> |
| <span class="source-line-no">1072</span><span id="line-1072"> * {@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">1073</span><span id="line-1073"> * len&gt;&lt;cf&gt;&lt;qualifier&gt;&lt;8 bytes timestamp&gt;&lt;1 byte type&gt;</span> |
| <span class="source-line-no">1074</span><span id="line-1074"> * @param c1 the cell</span> |
| <span class="source-line-no">1075</span><span id="line-1075"> * @param c2 the cell</span> |
| <span class="source-line-no">1076</span><span id="line-1076"> * @param bypassFamilyCheck when true assume the family bytes same in both cells. Pass it as true</span> |
| <span class="source-line-no">1077</span><span id="line-1077"> * when dealing with Cells in same CF so as to avoid some checks</span> |
| <span class="source-line-no">1078</span><span id="line-1078"> * @param withTsType when true check timestamp and type bytes also.</span> |
| <span class="source-line-no">1079</span><span id="line-1079"> * @return length of common prefix</span> |
| <span class="source-line-no">1080</span><span id="line-1080"> */</span> |
| <span class="source-line-no">1081</span><span id="line-1081"> public static int findCommonPrefixInFlatKey(ExtendedCell c1, ExtendedCell c2,</span> |
| <span class="source-line-no">1082</span><span id="line-1082"> boolean bypassFamilyCheck, boolean withTsType) {</span> |
| <span class="source-line-no">1083</span><span id="line-1083"> // Compare the 2 bytes in RK length part</span> |
| <span class="source-line-no">1084</span><span id="line-1084"> short rLen1 = c1.getRowLength();</span> |
| <span class="source-line-no">1085</span><span id="line-1085"> short rLen2 = c2.getRowLength();</span> |
| <span class="source-line-no">1086</span><span id="line-1086"> int commonPrefix = KeyValue.ROW_LENGTH_SIZE;</span> |
| <span class="source-line-no">1087</span><span id="line-1087"> if (rLen1 != rLen2) {</span> |
| <span class="source-line-no">1088</span><span id="line-1088"> // early out when the RK length itself is not matching</span> |
| <span class="source-line-no">1089</span><span id="line-1089"> return ByteBufferUtils.findCommonPrefix(Bytes.toBytes(rLen1), 0, KeyValue.ROW_LENGTH_SIZE,</span> |
| <span class="source-line-no">1090</span><span id="line-1090"> Bytes.toBytes(rLen2), 0, KeyValue.ROW_LENGTH_SIZE);</span> |
| <span class="source-line-no">1091</span><span id="line-1091"> }</span> |
| <span class="source-line-no">1092</span><span id="line-1092"> // Compare the RKs</span> |
| <span class="source-line-no">1093</span><span id="line-1093"> int rkCommonPrefix = 0;</span> |
| <span class="source-line-no">1094</span><span id="line-1094"> if (c1 instanceof ByteBufferExtendedCell && c2 instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">1095</span><span id="line-1095"> rkCommonPrefix =</span> |
| <span class="source-line-no">1096</span><span id="line-1096"> ByteBufferUtils.findCommonPrefix(((ByteBufferExtendedCell) c1).getRowByteBuffer(),</span> |
| <span class="source-line-no">1097</span><span id="line-1097"> ((ByteBufferExtendedCell) c1).getRowPosition(), rLen1,</span> |
| <span class="source-line-no">1098</span><span id="line-1098"> ((ByteBufferExtendedCell) c2).getRowByteBuffer(),</span> |
| <span class="source-line-no">1099</span><span id="line-1099"> ((ByteBufferExtendedCell) c2).getRowPosition(), rLen2);</span> |
| <span class="source-line-no">1100</span><span id="line-1100"> } else {</span> |
| <span class="source-line-no">1101</span><span id="line-1101"> // There cannot be a case where one cell is BBCell and other is KeyValue. This flow comes</span> |
| <span class="source-line-no">1102</span><span id="line-1102"> // either</span> |
| <span class="source-line-no">1103</span><span id="line-1103"> // in flush or compactions. In flushes both cells are KV and in case of compaction it will be</span> |
| <span class="source-line-no">1104</span><span id="line-1104"> // either</span> |
| <span class="source-line-no">1105</span><span id="line-1105"> // KV or BBCell</span> |
| <span class="source-line-no">1106</span><span id="line-1106"> rkCommonPrefix = ByteBufferUtils.findCommonPrefix(c1.getRowArray(), c1.getRowOffset(), rLen1,</span> |
| <span class="source-line-no">1107</span><span id="line-1107"> c2.getRowArray(), c2.getRowOffset(), rLen2);</span> |
| <span class="source-line-no">1108</span><span id="line-1108"> }</span> |
| <span class="source-line-no">1109</span><span id="line-1109"> commonPrefix += rkCommonPrefix;</span> |
| <span class="source-line-no">1110</span><span id="line-1110"> if (rkCommonPrefix != rLen1) {</span> |
| <span class="source-line-no">1111</span><span id="line-1111"> // Early out when RK is not fully matching.</span> |
| <span class="source-line-no">1112</span><span id="line-1112"> return commonPrefix;</span> |
| <span class="source-line-no">1113</span><span id="line-1113"> }</span> |
| <span class="source-line-no">1114</span><span id="line-1114"> // Compare 1 byte CF length part</span> |
| <span class="source-line-no">1115</span><span id="line-1115"> byte fLen1 = c1.getFamilyLength();</span> |
| <span class="source-line-no">1116</span><span id="line-1116"> if (bypassFamilyCheck) {</span> |
| <span class="source-line-no">1117</span><span id="line-1117"> // 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">1118</span><span id="line-1118"> // Just make commonPrefix to increment by the family part</span> |
| <span class="source-line-no">1119</span><span id="line-1119"> commonPrefix += KeyValue.FAMILY_LENGTH_SIZE + fLen1;</span> |
| <span class="source-line-no">1120</span><span id="line-1120"> } else {</span> |
| <span class="source-line-no">1121</span><span id="line-1121"> byte fLen2 = c2.getFamilyLength();</span> |
| <span class="source-line-no">1122</span><span id="line-1122"> if (fLen1 != fLen2) {</span> |
| <span class="source-line-no">1123</span><span id="line-1123"> // early out when the CF length itself is not matching</span> |
| <span class="source-line-no">1124</span><span id="line-1124"> return commonPrefix;</span> |
| <span class="source-line-no">1125</span><span id="line-1125"> }</span> |
| <span class="source-line-no">1126</span><span id="line-1126"> // CF lengths are same so there is one more byte common in key part</span> |
| <span class="source-line-no">1127</span><span id="line-1127"> commonPrefix += KeyValue.FAMILY_LENGTH_SIZE;</span> |
| <span class="source-line-no">1128</span><span id="line-1128"> // Compare the CF names</span> |
| <span class="source-line-no">1129</span><span id="line-1129"> int fCommonPrefix;</span> |
| <span class="source-line-no">1130</span><span id="line-1130"> if (c1 instanceof ByteBufferExtendedCell && c2 instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">1131</span><span id="line-1131"> fCommonPrefix =</span> |
| <span class="source-line-no">1132</span><span id="line-1132"> ByteBufferUtils.findCommonPrefix(((ByteBufferExtendedCell) c1).getFamilyByteBuffer(),</span> |
| <span class="source-line-no">1133</span><span id="line-1133"> ((ByteBufferExtendedCell) c1).getFamilyPosition(), fLen1,</span> |
| <span class="source-line-no">1134</span><span id="line-1134"> ((ByteBufferExtendedCell) c2).getFamilyByteBuffer(),</span> |
| <span class="source-line-no">1135</span><span id="line-1135"> ((ByteBufferExtendedCell) c2).getFamilyPosition(), fLen2);</span> |
| <span class="source-line-no">1136</span><span id="line-1136"> } else {</span> |
| <span class="source-line-no">1137</span><span id="line-1137"> fCommonPrefix = ByteBufferUtils.findCommonPrefix(c1.getFamilyArray(), c1.getFamilyOffset(),</span> |
| <span class="source-line-no">1138</span><span id="line-1138"> fLen1, c2.getFamilyArray(), c2.getFamilyOffset(), fLen2);</span> |
| <span class="source-line-no">1139</span><span id="line-1139"> }</span> |
| <span class="source-line-no">1140</span><span id="line-1140"> commonPrefix += fCommonPrefix;</span> |
| <span class="source-line-no">1141</span><span id="line-1141"> if (fCommonPrefix != fLen1) {</span> |
| <span class="source-line-no">1142</span><span id="line-1142"> return commonPrefix;</span> |
| <span class="source-line-no">1143</span><span id="line-1143"> }</span> |
| <span class="source-line-no">1144</span><span id="line-1144"> }</span> |
| <span class="source-line-no">1145</span><span id="line-1145"> // Compare the Qualifiers</span> |
| <span class="source-line-no">1146</span><span id="line-1146"> int qLen1 = c1.getQualifierLength();</span> |
| <span class="source-line-no">1147</span><span id="line-1147"> int qLen2 = c2.getQualifierLength();</span> |
| <span class="source-line-no">1148</span><span id="line-1148"> int qCommon;</span> |
| <span class="source-line-no">1149</span><span id="line-1149"> if (c1 instanceof ByteBufferExtendedCell && c2 instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">1150</span><span id="line-1150"> qCommon =</span> |
| <span class="source-line-no">1151</span><span id="line-1151"> ByteBufferUtils.findCommonPrefix(((ByteBufferExtendedCell) c1).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">1152</span><span id="line-1152"> ((ByteBufferExtendedCell) c1).getQualifierPosition(), qLen1,</span> |
| <span class="source-line-no">1153</span><span id="line-1153"> ((ByteBufferExtendedCell) c2).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">1154</span><span id="line-1154"> ((ByteBufferExtendedCell) c2).getQualifierPosition(), qLen2);</span> |
| <span class="source-line-no">1155</span><span id="line-1155"> } else {</span> |
| <span class="source-line-no">1156</span><span id="line-1156"> qCommon = ByteBufferUtils.findCommonPrefix(c1.getQualifierArray(), c1.getQualifierOffset(),</span> |
| <span class="source-line-no">1157</span><span id="line-1157"> qLen1, c2.getQualifierArray(), c2.getQualifierOffset(), qLen2);</span> |
| <span class="source-line-no">1158</span><span id="line-1158"> }</span> |
| <span class="source-line-no">1159</span><span id="line-1159"> commonPrefix += qCommon;</span> |
| <span class="source-line-no">1160</span><span id="line-1160"> if (!withTsType || Math.max(qLen1, qLen2) != qCommon) {</span> |
| <span class="source-line-no">1161</span><span id="line-1161"> return commonPrefix;</span> |
| <span class="source-line-no">1162</span><span id="line-1162"> }</span> |
| <span class="source-line-no">1163</span><span id="line-1163"> // Compare the timestamp parts</span> |
| <span class="source-line-no">1164</span><span id="line-1164"> int tsCommonPrefix = ByteBufferUtils.findCommonPrefix(Bytes.toBytes(c1.getTimestamp()), 0,</span> |
| <span class="source-line-no">1165</span><span id="line-1165"> KeyValue.TIMESTAMP_SIZE, Bytes.toBytes(c2.getTimestamp()), 0, KeyValue.TIMESTAMP_SIZE);</span> |
| <span class="source-line-no">1166</span><span id="line-1166"> commonPrefix += tsCommonPrefix;</span> |
| <span class="source-line-no">1167</span><span id="line-1167"> if (tsCommonPrefix != KeyValue.TIMESTAMP_SIZE) {</span> |
| <span class="source-line-no">1168</span><span id="line-1168"> return commonPrefix;</span> |
| <span class="source-line-no">1169</span><span id="line-1169"> }</span> |
| <span class="source-line-no">1170</span><span id="line-1170"> // Compare the type</span> |
| <span class="source-line-no">1171</span><span id="line-1171"> if (c1.getTypeByte() == c2.getTypeByte()) {</span> |
| <span class="source-line-no">1172</span><span id="line-1172"> commonPrefix += KeyValue.TYPE_SIZE;</span> |
| <span class="source-line-no">1173</span><span id="line-1173"> }</span> |
| <span class="source-line-no">1174</span><span id="line-1174"> return commonPrefix;</span> |
| <span class="source-line-no">1175</span><span id="line-1175"> }</span> |
| <span class="source-line-no">1176</span><span id="line-1176"></span> |
| <span class="source-line-no">1177</span><span id="line-1177"> /**</span> |
| <span class="source-line-no">1178</span><span id="line-1178"> * Used to compare two cells based on the column hint provided. This is specifically used when we</span> |
| <span class="source-line-no">1179</span><span id="line-1179"> * need to optimize the seeks based on the next indexed key. This is an advanced usage API</span> |
| <span class="source-line-no">1180</span><span id="line-1180"> * specifically needed for some optimizations.</span> |
| <span class="source-line-no">1181</span><span id="line-1181"> * @param nextIndexedCell the next indexed cell</span> |
| <span class="source-line-no">1182</span><span id="line-1182"> * @param currentCell the cell to be compared</span> |
| <span class="source-line-no">1183</span><span id="line-1183"> * @param foff the family offset of the currentCell</span> |
| <span class="source-line-no">1184</span><span id="line-1184"> * @param flen the family length of the currentCell</span> |
| <span class="source-line-no">1185</span><span id="line-1185"> * @param colHint the column hint provided - could be null</span> |
| <span class="source-line-no">1186</span><span id="line-1186"> * @param coff the offset of the column hint if provided, if not offset of the</span> |
| <span class="source-line-no">1187</span><span id="line-1187"> * currentCell's qualifier</span> |
| <span class="source-line-no">1188</span><span id="line-1188"> * @param clen the length of the column hint if provided, if not length of the</span> |
| <span class="source-line-no">1189</span><span id="line-1189"> * currentCell's qualifier</span> |
| <span class="source-line-no">1190</span><span id="line-1190"> * @param ts the timestamp to be seeked</span> |
| <span class="source-line-no">1191</span><span id="line-1191"> * @param type the type to be seeked</span> |
| <span class="source-line-no">1192</span><span id="line-1192"> * @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">1193</span><span id="line-1193"> * special API used in scan optimization.</span> |
| <span class="source-line-no">1194</span><span id="line-1194"> */</span> |
| <span class="source-line-no">1195</span><span id="line-1195"> // compare a key against row/fam/qual/ts/type</span> |
| <span class="source-line-no">1196</span><span id="line-1196"> public static final int compareKeyBasedOnColHint(CellComparator comparator,</span> |
| <span class="source-line-no">1197</span><span id="line-1197"> ExtendedCell nextIndexedCell, ExtendedCell currentCell, int foff, int flen, byte[] colHint,</span> |
| <span class="source-line-no">1198</span><span id="line-1198"> int coff, int clen, long ts, byte type) {</span> |
| <span class="source-line-no">1199</span><span id="line-1199"> int compare = comparator.compareRows(nextIndexedCell, currentCell);</span> |
| <span class="source-line-no">1200</span><span id="line-1200"> if (compare != 0) {</span> |
| <span class="source-line-no">1201</span><span id="line-1201"> return compare;</span> |
| <span class="source-line-no">1202</span><span id="line-1202"> }</span> |
| <span class="source-line-no">1203</span><span id="line-1203"> // If the column is not specified, the "minimum" key type appears the</span> |
| <span class="source-line-no">1204</span><span id="line-1204"> // latest in the sorted order, regardless of the timestamp. This is used</span> |
| <span class="source-line-no">1205</span><span id="line-1205"> // for specifying the last key/value in a given row, because there is no</span> |
| <span class="source-line-no">1206</span><span id="line-1206"> // "lexicographically last column" (it would be infinitely long). The</span> |
| <span class="source-line-no">1207</span><span id="line-1207"> // "maximum" key type does not need this behavior.</span> |
| <span class="source-line-no">1208</span><span id="line-1208"> if (</span> |
| <span class="source-line-no">1209</span><span id="line-1209"> nextIndexedCell.getFamilyLength() + nextIndexedCell.getQualifierLength() == 0</span> |
| <span class="source-line-no">1210</span><span id="line-1210"> && nextIndexedCell.getTypeByte() == KeyValue.Type.Minimum.getCode()</span> |
| <span class="source-line-no">1211</span><span id="line-1211"> ) {</span> |
| <span class="source-line-no">1212</span><span id="line-1212"> // left is "bigger", i.e. it appears later in the sorted order</span> |
| <span class="source-line-no">1213</span><span id="line-1213"> return 1;</span> |
| <span class="source-line-no">1214</span><span id="line-1214"> }</span> |
| <span class="source-line-no">1215</span><span id="line-1215"> if (flen + clen == 0 && type == KeyValue.Type.Minimum.getCode()) {</span> |
| <span class="source-line-no">1216</span><span id="line-1216"> return -1;</span> |
| <span class="source-line-no">1217</span><span id="line-1217"> }</span> |
| <span class="source-line-no">1218</span><span id="line-1218"></span> |
| <span class="source-line-no">1219</span><span id="line-1219"> compare = comparator.compareFamilies(nextIndexedCell, currentCell);</span> |
| <span class="source-line-no">1220</span><span id="line-1220"> if (compare != 0) {</span> |
| <span class="source-line-no">1221</span><span id="line-1221"> return compare;</span> |
| <span class="source-line-no">1222</span><span id="line-1222"> }</span> |
| <span class="source-line-no">1223</span><span id="line-1223"> if (colHint == null) {</span> |
| <span class="source-line-no">1224</span><span id="line-1224"> compare = comparator.compareQualifiers(nextIndexedCell, currentCell);</span> |
| <span class="source-line-no">1225</span><span id="line-1225"> } else {</span> |
| <span class="source-line-no">1226</span><span id="line-1226"> compare = CellUtil.compareQualifiers(nextIndexedCell, colHint, coff, clen);</span> |
| <span class="source-line-no">1227</span><span id="line-1227"> }</span> |
| <span class="source-line-no">1228</span><span id="line-1228"> if (compare != 0) {</span> |
| <span class="source-line-no">1229</span><span id="line-1229"> return compare;</span> |
| <span class="source-line-no">1230</span><span id="line-1230"> }</span> |
| <span class="source-line-no">1231</span><span id="line-1231"> // Next compare timestamps.</span> |
| <span class="source-line-no">1232</span><span id="line-1232"> compare = comparator.compareTimestamps(nextIndexedCell.getTimestamp(), ts);</span> |
| <span class="source-line-no">1233</span><span id="line-1233"> if (compare != 0) {</span> |
| <span class="source-line-no">1234</span><span id="line-1234"> return compare;</span> |
| <span class="source-line-no">1235</span><span id="line-1235"> }</span> |
| <span class="source-line-no">1236</span><span id="line-1236"></span> |
| <span class="source-line-no">1237</span><span id="line-1237"> // Compare types. Let the delete types sort ahead of puts; i.e. types</span> |
| <span class="source-line-no">1238</span><span id="line-1238"> // of higher numbers sort before those of lesser numbers. Maximum (255)</span> |
| <span class="source-line-no">1239</span><span id="line-1239"> // appears ahead of everything, and minimum (0) appears after</span> |
| <span class="source-line-no">1240</span><span id="line-1240"> // everything.</span> |
| <span class="source-line-no">1241</span><span id="line-1241"> return (0xff & type) - (0xff & nextIndexedCell.getTypeByte());</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"> * 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">1246</span><span id="line-1246"> * @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">1247</span><span id="line-1247"> * equal to 0 if left is equal to right</span> |
| <span class="source-line-no">1248</span><span id="line-1248"> */</span> |
| <span class="source-line-no">1249</span><span id="line-1249"> public static final int compareKeyIgnoresMvcc(CellComparator comparator, Cell left, Cell right) {</span> |
| <span class="source-line-no">1250</span><span id="line-1250"> return ((CellComparatorImpl) comparator).compare(left, right, true);</span> |
| <span class="source-line-no">1251</span><span id="line-1251"> }</span> |
| <span class="source-line-no">1252</span><span id="line-1252"></span> |
| <span class="source-line-no">1253</span><span id="line-1253"> /**</span> |
| <span class="source-line-no">1254</span><span id="line-1254"> * Compare cell's row against given comparator</span> |
| <span class="source-line-no">1255</span><span id="line-1255"> * @param cell the cell to use for comparison</span> |
| <span class="source-line-no">1256</span><span id="line-1256"> * @param comparator the {@link CellComparator} to use for comparison</span> |
| <span class="source-line-no">1257</span><span id="line-1257"> * @return result comparing cell's row</span> |
| <span class="source-line-no">1258</span><span id="line-1258"> */</span> |
| <span class="source-line-no">1259</span><span id="line-1259"> public static int compareRow(Cell cell, ByteArrayComparable comparator) {</span> |
| <span class="source-line-no">1260</span><span id="line-1260"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">1261</span><span id="line-1261"> return comparator.compareTo(((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">1262</span><span id="line-1262"> ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength());</span> |
| <span class="source-line-no">1263</span><span id="line-1263"> }</span> |
| <span class="source-line-no">1264</span><span id="line-1264"> return comparator.compareTo(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());</span> |
| <span class="source-line-no">1265</span><span id="line-1265"> }</span> |
| <span class="source-line-no">1266</span><span id="line-1266"></span> |
| <span class="source-line-no">1267</span><span id="line-1267"> /**</span> |
| <span class="source-line-no">1268</span><span id="line-1268"> * Compare cell's column family against given comparator</span> |
| <span class="source-line-no">1269</span><span id="line-1269"> * @param cell the cell to use for comparison</span> |
| <span class="source-line-no">1270</span><span id="line-1270"> * @param comparator the {@link CellComparator} to use for comparison</span> |
| <span class="source-line-no">1271</span><span id="line-1271"> * @return result comparing cell's column family</span> |
| <span class="source-line-no">1272</span><span id="line-1272"> */</span> |
| <span class="source-line-no">1273</span><span id="line-1273"> public static int compareFamily(Cell cell, ByteArrayComparable comparator) {</span> |
| <span class="source-line-no">1274</span><span id="line-1274"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">1275</span><span id="line-1275"> return comparator.compareTo(((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),</span> |
| <span class="source-line-no">1276</span><span id="line-1276"> ((ByteBufferExtendedCell) cell).getFamilyPosition(), cell.getFamilyLength());</span> |
| <span class="source-line-no">1277</span><span id="line-1277"> }</span> |
| <span class="source-line-no">1278</span><span id="line-1278"> return comparator.compareTo(cell.getFamilyArray(), cell.getFamilyOffset(),</span> |
| <span class="source-line-no">1279</span><span id="line-1279"> cell.getFamilyLength());</span> |
| <span class="source-line-no">1280</span><span id="line-1280"> }</span> |
| <span class="source-line-no">1281</span><span id="line-1281"></span> |
| <span class="source-line-no">1282</span><span id="line-1282"> /**</span> |
| <span class="source-line-no">1283</span><span id="line-1283"> * Compare cell's qualifier against given comparator</span> |
| <span class="source-line-no">1284</span><span id="line-1284"> * @param cell the cell to use for comparison</span> |
| <span class="source-line-no">1285</span><span id="line-1285"> * @param comparator the {@link CellComparator} to use for comparison</span> |
| <span class="source-line-no">1286</span><span id="line-1286"> * @return result comparing cell's qualifier</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 int compareQualifier(Cell cell, ByteArrayComparable comparator) {</span> |
| <span class="source-line-no">1289</span><span id="line-1289"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">1290</span><span id="line-1290"> return comparator.compareTo(((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">1291</span><span id="line-1291"> ((ByteBufferExtendedCell) cell).getQualifierPosition(), cell.getQualifierLength());</span> |
| <span class="source-line-no">1292</span><span id="line-1292"> }</span> |
| <span class="source-line-no">1293</span><span id="line-1293"> return comparator.compareTo(cell.getQualifierArray(), cell.getQualifierOffset(),</span> |
| <span class="source-line-no">1294</span><span id="line-1294"> cell.getQualifierLength());</span> |
| <span class="source-line-no">1295</span><span id="line-1295"> }</span> |
| <span class="source-line-no">1296</span><span id="line-1296"></span> |
| <span class="source-line-no">1297</span><span id="line-1297"> public static Cell.Type toType(byte type) {</span> |
| <span class="source-line-no">1298</span><span id="line-1298"> KeyValue.Type codeToType = KeyValue.Type.codeToType(type);</span> |
| <span class="source-line-no">1299</span><span id="line-1299"> switch (codeToType) {</span> |
| <span class="source-line-no">1300</span><span id="line-1300"> case Put:</span> |
| <span class="source-line-no">1301</span><span id="line-1301"> return Cell.Type.Put;</span> |
| <span class="source-line-no">1302</span><span id="line-1302"> case Delete:</span> |
| <span class="source-line-no">1303</span><span id="line-1303"> return Cell.Type.Delete;</span> |
| <span class="source-line-no">1304</span><span id="line-1304"> case DeleteColumn:</span> |
| <span class="source-line-no">1305</span><span id="line-1305"> return Cell.Type.DeleteColumn;</span> |
| <span class="source-line-no">1306</span><span id="line-1306"> case DeleteFamily:</span> |
| <span class="source-line-no">1307</span><span id="line-1307"> return Cell.Type.DeleteFamily;</span> |
| <span class="source-line-no">1308</span><span id="line-1308"> case DeleteFamilyVersion:</span> |
| <span class="source-line-no">1309</span><span id="line-1309"> return Cell.Type.DeleteFamilyVersion;</span> |
| <span class="source-line-no">1310</span><span id="line-1310"> default:</span> |
| <span class="source-line-no">1311</span><span id="line-1311"> throw new UnsupportedOperationException("Invalid type of cell " + type);</span> |
| <span class="source-line-no">1312</span><span id="line-1312"> }</span> |
| <span class="source-line-no">1313</span><span id="line-1313"> }</span> |
| <span class="source-line-no">1314</span><span id="line-1314"></span> |
| <span class="source-line-no">1315</span><span id="line-1315"> public static KeyValue.Type toTypeByte(Cell.Type type) {</span> |
| <span class="source-line-no">1316</span><span id="line-1316"> switch (type) {</span> |
| <span class="source-line-no">1317</span><span id="line-1317"> case Put:</span> |
| <span class="source-line-no">1318</span><span id="line-1318"> return KeyValue.Type.Put;</span> |
| <span class="source-line-no">1319</span><span id="line-1319"> case Delete:</span> |
| <span class="source-line-no">1320</span><span id="line-1320"> return KeyValue.Type.Delete;</span> |
| <span class="source-line-no">1321</span><span id="line-1321"> case DeleteColumn:</span> |
| <span class="source-line-no">1322</span><span id="line-1322"> return KeyValue.Type.DeleteColumn;</span> |
| <span class="source-line-no">1323</span><span id="line-1323"> case DeleteFamilyVersion:</span> |
| <span class="source-line-no">1324</span><span id="line-1324"> return KeyValue.Type.DeleteFamilyVersion;</span> |
| <span class="source-line-no">1325</span><span id="line-1325"> case DeleteFamily:</span> |
| <span class="source-line-no">1326</span><span id="line-1326"> return KeyValue.Type.DeleteFamily;</span> |
| <span class="source-line-no">1327</span><span id="line-1327"> default:</span> |
| <span class="source-line-no">1328</span><span id="line-1328"> throw new UnsupportedOperationException("Unsupported data type:" + type);</span> |
| <span class="source-line-no">1329</span><span id="line-1329"> }</span> |
| <span class="source-line-no">1330</span><span id="line-1330"> }</span> |
| <span class="source-line-no">1331</span><span id="line-1331"></span> |
| <span class="source-line-no">1332</span><span id="line-1332"> /**</span> |
| <span class="source-line-no">1333</span><span id="line-1333"> * Compare cell's value against given comparator</span> |
| <span class="source-line-no">1334</span><span id="line-1334"> * @param cell the cell to use for comparison</span> |
| <span class="source-line-no">1335</span><span id="line-1335"> * @param comparator the {@link CellComparator} to use for comparison</span> |
| <span class="source-line-no">1336</span><span id="line-1336"> * @return result comparing cell's value</span> |
| <span class="source-line-no">1337</span><span id="line-1337"> */</span> |
| <span class="source-line-no">1338</span><span id="line-1338"> public static int compareValue(Cell cell, ByteArrayComparable comparator) {</span> |
| <span class="source-line-no">1339</span><span id="line-1339"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">1340</span><span id="line-1340"> return comparator.compareTo(((ByteBufferExtendedCell) cell).getValueByteBuffer(),</span> |
| <span class="source-line-no">1341</span><span id="line-1341"> ((ByteBufferExtendedCell) cell).getValuePosition(), cell.getValueLength());</span> |
| <span class="source-line-no">1342</span><span id="line-1342"> }</span> |
| <span class="source-line-no">1343</span><span id="line-1343"> return comparator.compareTo(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());</span> |
| <span class="source-line-no">1344</span><span id="line-1344"> }</span> |
| <span class="source-line-no">1345</span><span id="line-1345"></span> |
| <span class="source-line-no">1346</span><span id="line-1346"> /**</span> |
| <span class="source-line-no">1347</span><span id="line-1347"> * These cells are used in reseeks/seeks to improve the read performance. They are not real cells</span> |
| <span class="source-line-no">1348</span><span id="line-1348"> * that are returned back to the clients</span> |
| <span class="source-line-no">1349</span><span id="line-1349"> */</span> |
| <span class="source-line-no">1350</span><span id="line-1350"> private static abstract class EmptyCell implements ExtendedCell {</span> |
| <span class="source-line-no">1351</span><span id="line-1351"></span> |
| <span class="source-line-no">1352</span><span id="line-1352"> @Override</span> |
| <span class="source-line-no">1353</span><span id="line-1353"> public void setSequenceId(long seqId) {</span> |
| <span class="source-line-no">1354</span><span id="line-1354"> // Fake cells don't need seqId, so leaving it as a noop.</span> |
| <span class="source-line-no">1355</span><span id="line-1355"> }</span> |
| <span class="source-line-no">1356</span><span id="line-1356"></span> |
| <span class="source-line-no">1357</span><span id="line-1357"> @Override</span> |
| <span class="source-line-no">1358</span><span id="line-1358"> public void setTimestamp(long ts) {</span> |
| <span class="source-line-no">1359</span><span id="line-1359"> // Fake cells can't be changed timestamp, so leaving it as a noop.</span> |
| <span class="source-line-no">1360</span><span id="line-1360"> }</span> |
| <span class="source-line-no">1361</span><span id="line-1361"></span> |
| <span class="source-line-no">1362</span><span id="line-1362"> @Override</span> |
| <span class="source-line-no">1363</span><span id="line-1363"> public void setTimestamp(byte[] ts) {</span> |
| <span class="source-line-no">1364</span><span id="line-1364"> // Fake cells can't be changed timestamp, so leaving it as a noop.</span> |
| <span class="source-line-no">1365</span><span id="line-1365"> }</span> |
| <span class="source-line-no">1366</span><span id="line-1366"></span> |
| <span class="source-line-no">1367</span><span id="line-1367"> @Override</span> |
| <span class="source-line-no">1368</span><span id="line-1368"> public byte[] getRowArray() {</span> |
| <span class="source-line-no">1369</span><span id="line-1369"> return EMPTY_BYTE_ARRAY;</span> |
| <span class="source-line-no">1370</span><span id="line-1370"> }</span> |
| <span class="source-line-no">1371</span><span id="line-1371"></span> |
| <span class="source-line-no">1372</span><span id="line-1372"> @Override</span> |
| <span class="source-line-no">1373</span><span id="line-1373"> public int getRowOffset() {</span> |
| <span class="source-line-no">1374</span><span id="line-1374"> return 0;</span> |
| <span class="source-line-no">1375</span><span id="line-1375"> }</span> |
| <span class="source-line-no">1376</span><span id="line-1376"></span> |
| <span class="source-line-no">1377</span><span id="line-1377"> @Override</span> |
| <span class="source-line-no">1378</span><span id="line-1378"> public short getRowLength() {</span> |
| <span class="source-line-no">1379</span><span id="line-1379"> return 0;</span> |
| <span class="source-line-no">1380</span><span id="line-1380"> }</span> |
| <span class="source-line-no">1381</span><span id="line-1381"></span> |
| <span class="source-line-no">1382</span><span id="line-1382"> @Override</span> |
| <span class="source-line-no">1383</span><span id="line-1383"> public byte[] getFamilyArray() {</span> |
| <span class="source-line-no">1384</span><span id="line-1384"> return EMPTY_BYTE_ARRAY;</span> |
| <span class="source-line-no">1385</span><span id="line-1385"> }</span> |
| <span class="source-line-no">1386</span><span id="line-1386"></span> |
| <span class="source-line-no">1387</span><span id="line-1387"> @Override</span> |
| <span class="source-line-no">1388</span><span id="line-1388"> public int getFamilyOffset() {</span> |
| <span class="source-line-no">1389</span><span id="line-1389"> return 0;</span> |
| <span class="source-line-no">1390</span><span id="line-1390"> }</span> |
| <span class="source-line-no">1391</span><span id="line-1391"></span> |
| <span class="source-line-no">1392</span><span id="line-1392"> @Override</span> |
| <span class="source-line-no">1393</span><span id="line-1393"> public byte getFamilyLength() {</span> |
| <span class="source-line-no">1394</span><span id="line-1394"> return 0;</span> |
| <span class="source-line-no">1395</span><span id="line-1395"> }</span> |
| <span class="source-line-no">1396</span><span id="line-1396"></span> |
| <span class="source-line-no">1397</span><span id="line-1397"> @Override</span> |
| <span class="source-line-no">1398</span><span id="line-1398"> public byte[] getQualifierArray() {</span> |
| <span class="source-line-no">1399</span><span id="line-1399"> return EMPTY_BYTE_ARRAY;</span> |
| <span class="source-line-no">1400</span><span id="line-1400"> }</span> |
| <span class="source-line-no">1401</span><span id="line-1401"></span> |
| <span class="source-line-no">1402</span><span id="line-1402"> @Override</span> |
| <span class="source-line-no">1403</span><span id="line-1403"> public int getQualifierOffset() {</span> |
| <span class="source-line-no">1404</span><span id="line-1404"> return 0;</span> |
| <span class="source-line-no">1405</span><span id="line-1405"> }</span> |
| <span class="source-line-no">1406</span><span id="line-1406"></span> |
| <span class="source-line-no">1407</span><span id="line-1407"> @Override</span> |
| <span class="source-line-no">1408</span><span id="line-1408"> public int getQualifierLength() {</span> |
| <span class="source-line-no">1409</span><span id="line-1409"> return 0;</span> |
| <span class="source-line-no">1410</span><span id="line-1410"> }</span> |
| <span class="source-line-no">1411</span><span id="line-1411"></span> |
| <span class="source-line-no">1412</span><span id="line-1412"> @Override</span> |
| <span class="source-line-no">1413</span><span id="line-1413"> public long getSequenceId() {</span> |
| <span class="source-line-no">1414</span><span id="line-1414"> return 0;</span> |
| <span class="source-line-no">1415</span><span id="line-1415"> }</span> |
| <span class="source-line-no">1416</span><span id="line-1416"></span> |
| <span class="source-line-no">1417</span><span id="line-1417"> @Override</span> |
| <span class="source-line-no">1418</span><span id="line-1418"> public byte[] getValueArray() {</span> |
| <span class="source-line-no">1419</span><span id="line-1419"> return EMPTY_BYTE_ARRAY;</span> |
| <span class="source-line-no">1420</span><span id="line-1420"> }</span> |
| <span class="source-line-no">1421</span><span id="line-1421"></span> |
| <span class="source-line-no">1422</span><span id="line-1422"> @Override</span> |
| <span class="source-line-no">1423</span><span id="line-1423"> public int getValueOffset() {</span> |
| <span class="source-line-no">1424</span><span id="line-1424"> return 0;</span> |
| <span class="source-line-no">1425</span><span id="line-1425"> }</span> |
| <span class="source-line-no">1426</span><span id="line-1426"></span> |
| <span class="source-line-no">1427</span><span id="line-1427"> @Override</span> |
| <span class="source-line-no">1428</span><span id="line-1428"> public int getValueLength() {</span> |
| <span class="source-line-no">1429</span><span id="line-1429"> return 0;</span> |
| <span class="source-line-no">1430</span><span id="line-1430"> }</span> |
| <span class="source-line-no">1431</span><span id="line-1431"></span> |
| <span class="source-line-no">1432</span><span id="line-1432"> @Override</span> |
| <span class="source-line-no">1433</span><span id="line-1433"> public byte[] getTagsArray() {</span> |
| <span class="source-line-no">1434</span><span id="line-1434"> return EMPTY_BYTE_ARRAY;</span> |
| <span class="source-line-no">1435</span><span id="line-1435"> }</span> |
| <span class="source-line-no">1436</span><span id="line-1436"></span> |
| <span class="source-line-no">1437</span><span id="line-1437"> @Override</span> |
| <span class="source-line-no">1438</span><span id="line-1438"> public int getTagsOffset() {</span> |
| <span class="source-line-no">1439</span><span id="line-1439"> return 0;</span> |
| <span class="source-line-no">1440</span><span id="line-1440"> }</span> |
| <span class="source-line-no">1441</span><span id="line-1441"></span> |
| <span class="source-line-no">1442</span><span id="line-1442"> @Override</span> |
| <span class="source-line-no">1443</span><span id="line-1443"> public int getTagsLength() {</span> |
| <span class="source-line-no">1444</span><span id="line-1444"> return 0;</span> |
| <span class="source-line-no">1445</span><span id="line-1445"> }</span> |
| <span class="source-line-no">1446</span><span id="line-1446"> }</span> |
| <span class="source-line-no">1447</span><span id="line-1447"></span> |
| <span class="source-line-no">1448</span><span id="line-1448"> /**</span> |
| <span class="source-line-no">1449</span><span id="line-1449"> * These cells are used in reseeks/seeks to improve the read performance. They are not real cells</span> |
| <span class="source-line-no">1450</span><span id="line-1450"> * that are returned back to the clients</span> |
| <span class="source-line-no">1451</span><span id="line-1451"> */</span> |
| <span class="source-line-no">1452</span><span id="line-1452"> private static abstract class EmptyByteBufferExtendedCell extends ByteBufferExtendedCell {</span> |
| <span class="source-line-no">1453</span><span id="line-1453"></span> |
| <span class="source-line-no">1454</span><span id="line-1454"> @Override</span> |
| <span class="source-line-no">1455</span><span id="line-1455"> public void setSequenceId(long seqId) {</span> |
| <span class="source-line-no">1456</span><span id="line-1456"> // Fake cells don't need seqId, so leaving it as a noop.</span> |
| <span class="source-line-no">1457</span><span id="line-1457"> }</span> |
| <span class="source-line-no">1458</span><span id="line-1458"></span> |
| <span class="source-line-no">1459</span><span id="line-1459"> @Override</span> |
| <span class="source-line-no">1460</span><span id="line-1460"> public void setTimestamp(long ts) {</span> |
| <span class="source-line-no">1461</span><span id="line-1461"> // Fake cells can't be changed timestamp, so leaving it as a noop.</span> |
| <span class="source-line-no">1462</span><span id="line-1462"> }</span> |
| <span class="source-line-no">1463</span><span id="line-1463"></span> |
| <span class="source-line-no">1464</span><span id="line-1464"> @Override</span> |
| <span class="source-line-no">1465</span><span id="line-1465"> public void setTimestamp(byte[] ts) {</span> |
| <span class="source-line-no">1466</span><span id="line-1466"> // Fake cells can't be changed timestamp, so leaving it as a noop.</span> |
| <span class="source-line-no">1467</span><span id="line-1467"> }</span> |
| <span class="source-line-no">1468</span><span id="line-1468"></span> |
| <span class="source-line-no">1469</span><span id="line-1469"> @Override</span> |
| <span class="source-line-no">1470</span><span id="line-1470"> public byte[] getRowArray() {</span> |
| <span class="source-line-no">1471</span><span id="line-1471"> return CellUtil.cloneRow(this);</span> |
| <span class="source-line-no">1472</span><span id="line-1472"> }</span> |
| <span class="source-line-no">1473</span><span id="line-1473"></span> |
| <span class="source-line-no">1474</span><span id="line-1474"> @Override</span> |
| <span class="source-line-no">1475</span><span id="line-1475"> public int getRowOffset() {</span> |
| <span class="source-line-no">1476</span><span id="line-1476"> return 0;</span> |
| <span class="source-line-no">1477</span><span id="line-1477"> }</span> |
| <span class="source-line-no">1478</span><span id="line-1478"></span> |
| <span class="source-line-no">1479</span><span id="line-1479"> @Override</span> |
| <span class="source-line-no">1480</span><span id="line-1480"> public short getRowLength() {</span> |
| <span class="source-line-no">1481</span><span id="line-1481"> return 0;</span> |
| <span class="source-line-no">1482</span><span id="line-1482"> }</span> |
| <span class="source-line-no">1483</span><span id="line-1483"></span> |
| <span class="source-line-no">1484</span><span id="line-1484"> @Override</span> |
| <span class="source-line-no">1485</span><span id="line-1485"> public byte[] getFamilyArray() {</span> |
| <span class="source-line-no">1486</span><span id="line-1486"> return CellUtil.cloneFamily(this);</span> |
| <span class="source-line-no">1487</span><span id="line-1487"> }</span> |
| <span class="source-line-no">1488</span><span id="line-1488"></span> |
| <span class="source-line-no">1489</span><span id="line-1489"> @Override</span> |
| <span class="source-line-no">1490</span><span id="line-1490"> public int getFamilyOffset() {</span> |
| <span class="source-line-no">1491</span><span id="line-1491"> return 0;</span> |
| <span class="source-line-no">1492</span><span id="line-1492"> }</span> |
| <span class="source-line-no">1493</span><span id="line-1493"></span> |
| <span class="source-line-no">1494</span><span id="line-1494"> @Override</span> |
| <span class="source-line-no">1495</span><span id="line-1495"> public byte getFamilyLength() {</span> |
| <span class="source-line-no">1496</span><span id="line-1496"> return 0;</span> |
| <span class="source-line-no">1497</span><span id="line-1497"> }</span> |
| <span class="source-line-no">1498</span><span id="line-1498"></span> |
| <span class="source-line-no">1499</span><span id="line-1499"> @Override</span> |
| <span class="source-line-no">1500</span><span id="line-1500"> public byte[] getQualifierArray() {</span> |
| <span class="source-line-no">1501</span><span id="line-1501"> return CellUtil.cloneQualifier(this);</span> |
| <span class="source-line-no">1502</span><span id="line-1502"> }</span> |
| <span class="source-line-no">1503</span><span id="line-1503"></span> |
| <span class="source-line-no">1504</span><span id="line-1504"> @Override</span> |
| <span class="source-line-no">1505</span><span id="line-1505"> public int getQualifierOffset() {</span> |
| <span class="source-line-no">1506</span><span id="line-1506"> return 0;</span> |
| <span class="source-line-no">1507</span><span id="line-1507"> }</span> |
| <span class="source-line-no">1508</span><span id="line-1508"></span> |
| <span class="source-line-no">1509</span><span id="line-1509"> @Override</span> |
| <span class="source-line-no">1510</span><span id="line-1510"> public int getQualifierLength() {</span> |
| <span class="source-line-no">1511</span><span id="line-1511"> return 0;</span> |
| <span class="source-line-no">1512</span><span id="line-1512"> }</span> |
| <span class="source-line-no">1513</span><span id="line-1513"></span> |
| <span class="source-line-no">1514</span><span id="line-1514"> @Override</span> |
| <span class="source-line-no">1515</span><span id="line-1515"> public long getSequenceId() {</span> |
| <span class="source-line-no">1516</span><span id="line-1516"> return 0;</span> |
| <span class="source-line-no">1517</span><span id="line-1517"> }</span> |
| <span class="source-line-no">1518</span><span id="line-1518"></span> |
| <span class="source-line-no">1519</span><span id="line-1519"> @Override</span> |
| <span class="source-line-no">1520</span><span id="line-1520"> public byte[] getValueArray() {</span> |
| <span class="source-line-no">1521</span><span id="line-1521"> return CellUtil.cloneValue(this);</span> |
| <span class="source-line-no">1522</span><span id="line-1522"> }</span> |
| <span class="source-line-no">1523</span><span id="line-1523"></span> |
| <span class="source-line-no">1524</span><span id="line-1524"> @Override</span> |
| <span class="source-line-no">1525</span><span id="line-1525"> public int getValueOffset() {</span> |
| <span class="source-line-no">1526</span><span id="line-1526"> return 0;</span> |
| <span class="source-line-no">1527</span><span id="line-1527"> }</span> |
| <span class="source-line-no">1528</span><span id="line-1528"></span> |
| <span class="source-line-no">1529</span><span id="line-1529"> @Override</span> |
| <span class="source-line-no">1530</span><span id="line-1530"> public int getValueLength() {</span> |
| <span class="source-line-no">1531</span><span id="line-1531"> return 0;</span> |
| <span class="source-line-no">1532</span><span id="line-1532"> }</span> |
| <span class="source-line-no">1533</span><span id="line-1533"></span> |
| <span class="source-line-no">1534</span><span id="line-1534"> @Override</span> |
| <span class="source-line-no">1535</span><span id="line-1535"> public byte[] getTagsArray() {</span> |
| <span class="source-line-no">1536</span><span id="line-1536"> return PrivateCellUtil.cloneTags(this);</span> |
| <span class="source-line-no">1537</span><span id="line-1537"> }</span> |
| <span class="source-line-no">1538</span><span id="line-1538"></span> |
| <span class="source-line-no">1539</span><span id="line-1539"> @Override</span> |
| <span class="source-line-no">1540</span><span id="line-1540"> public int getTagsOffset() {</span> |
| <span class="source-line-no">1541</span><span id="line-1541"> return 0;</span> |
| <span class="source-line-no">1542</span><span id="line-1542"> }</span> |
| <span class="source-line-no">1543</span><span id="line-1543"></span> |
| <span class="source-line-no">1544</span><span id="line-1544"> @Override</span> |
| <span class="source-line-no">1545</span><span id="line-1545"> public int getTagsLength() {</span> |
| <span class="source-line-no">1546</span><span id="line-1546"> return 0;</span> |
| <span class="source-line-no">1547</span><span id="line-1547"> }</span> |
| <span class="source-line-no">1548</span><span id="line-1548"></span> |
| <span class="source-line-no">1549</span><span id="line-1549"> @Override</span> |
| <span class="source-line-no">1550</span><span id="line-1550"> public ByteBuffer getRowByteBuffer() {</span> |
| <span class="source-line-no">1551</span><span id="line-1551"> return HConstants.EMPTY_BYTE_BUFFER;</span> |
| <span class="source-line-no">1552</span><span id="line-1552"> }</span> |
| <span class="source-line-no">1553</span><span id="line-1553"></span> |
| <span class="source-line-no">1554</span><span id="line-1554"> @Override</span> |
| <span class="source-line-no">1555</span><span id="line-1555"> public int getRowPosition() {</span> |
| <span class="source-line-no">1556</span><span id="line-1556"> return 0;</span> |
| <span class="source-line-no">1557</span><span id="line-1557"> }</span> |
| <span class="source-line-no">1558</span><span id="line-1558"></span> |
| <span class="source-line-no">1559</span><span id="line-1559"> @Override</span> |
| <span class="source-line-no">1560</span><span id="line-1560"> public ByteBuffer getFamilyByteBuffer() {</span> |
| <span class="source-line-no">1561</span><span id="line-1561"> return HConstants.EMPTY_BYTE_BUFFER;</span> |
| <span class="source-line-no">1562</span><span id="line-1562"> }</span> |
| <span class="source-line-no">1563</span><span id="line-1563"></span> |
| <span class="source-line-no">1564</span><span id="line-1564"> @Override</span> |
| <span class="source-line-no">1565</span><span id="line-1565"> public int getFamilyPosition() {</span> |
| <span class="source-line-no">1566</span><span id="line-1566"> return 0;</span> |
| <span class="source-line-no">1567</span><span id="line-1567"> }</span> |
| <span class="source-line-no">1568</span><span id="line-1568"></span> |
| <span class="source-line-no">1569</span><span id="line-1569"> @Override</span> |
| <span class="source-line-no">1570</span><span id="line-1570"> public ByteBuffer getQualifierByteBuffer() {</span> |
| <span class="source-line-no">1571</span><span id="line-1571"> return HConstants.EMPTY_BYTE_BUFFER;</span> |
| <span class="source-line-no">1572</span><span id="line-1572"> }</span> |
| <span class="source-line-no">1573</span><span id="line-1573"></span> |
| <span class="source-line-no">1574</span><span id="line-1574"> @Override</span> |
| <span class="source-line-no">1575</span><span id="line-1575"> public int getQualifierPosition() {</span> |
| <span class="source-line-no">1576</span><span id="line-1576"> return 0;</span> |
| <span class="source-line-no">1577</span><span id="line-1577"> }</span> |
| <span class="source-line-no">1578</span><span id="line-1578"></span> |
| <span class="source-line-no">1579</span><span id="line-1579"> @Override</span> |
| <span class="source-line-no">1580</span><span id="line-1580"> public ByteBuffer getTagsByteBuffer() {</span> |
| <span class="source-line-no">1581</span><span id="line-1581"> return HConstants.EMPTY_BYTE_BUFFER;</span> |
| <span class="source-line-no">1582</span><span id="line-1582"> }</span> |
| <span class="source-line-no">1583</span><span id="line-1583"></span> |
| <span class="source-line-no">1584</span><span id="line-1584"> @Override</span> |
| <span class="source-line-no">1585</span><span id="line-1585"> public int getTagsPosition() {</span> |
| <span class="source-line-no">1586</span><span id="line-1586"> return 0;</span> |
| <span class="source-line-no">1587</span><span id="line-1587"> }</span> |
| <span class="source-line-no">1588</span><span id="line-1588"></span> |
| <span class="source-line-no">1589</span><span id="line-1589"> @Override</span> |
| <span class="source-line-no">1590</span><span id="line-1590"> public ByteBuffer getValueByteBuffer() {</span> |
| <span class="source-line-no">1591</span><span id="line-1591"> return HConstants.EMPTY_BYTE_BUFFER;</span> |
| <span class="source-line-no">1592</span><span id="line-1592"> }</span> |
| <span class="source-line-no">1593</span><span id="line-1593"></span> |
| <span class="source-line-no">1594</span><span id="line-1594"> @Override</span> |
| <span class="source-line-no">1595</span><span id="line-1595"> public int getValuePosition() {</span> |
| <span class="source-line-no">1596</span><span id="line-1596"> return 0;</span> |
| <span class="source-line-no">1597</span><span id="line-1597"> }</span> |
| <span class="source-line-no">1598</span><span id="line-1598"> }</span> |
| <span class="source-line-no">1599</span><span id="line-1599"></span> |
| <span class="source-line-no">1600</span><span id="line-1600"> private static class FirstOnRowCell extends EmptyCell {</span> |
| <span class="source-line-no">1601</span><span id="line-1601"> // @formatter:off</span> |
| <span class="source-line-no">1602</span><span id="line-1602"> private static final int FIXED_HEAPSIZE =</span> |
| <span class="source-line-no">1603</span><span id="line-1603"> ClassSize.OBJECT // object</span> |
| <span class="source-line-no">1604</span><span id="line-1604"> + ClassSize.REFERENCE // row array</span> |
| <span class="source-line-no">1605</span><span id="line-1605"> + Bytes.SIZEOF_INT // row offset</span> |
| <span class="source-line-no">1606</span><span id="line-1606"> + Bytes.SIZEOF_SHORT; // row length</span> |
| <span class="source-line-no">1607</span><span id="line-1607"> // @formatter:on</span> |
| <span class="source-line-no">1608</span><span id="line-1608"> private final byte[] rowArray;</span> |
| <span class="source-line-no">1609</span><span id="line-1609"> private final int roffset;</span> |
| <span class="source-line-no">1610</span><span id="line-1610"> private final short rlength;</span> |
| <span class="source-line-no">1611</span><span id="line-1611"></span> |
| <span class="source-line-no">1612</span><span id="line-1612"> public FirstOnRowCell(final byte[] row, int roffset, short rlength) {</span> |
| <span class="source-line-no">1613</span><span id="line-1613"> this.rowArray = row;</span> |
| <span class="source-line-no">1614</span><span id="line-1614"> this.roffset = roffset;</span> |
| <span class="source-line-no">1615</span><span id="line-1615"> this.rlength = rlength;</span> |
| <span class="source-line-no">1616</span><span id="line-1616"> }</span> |
| <span class="source-line-no">1617</span><span id="line-1617"></span> |
| <span class="source-line-no">1618</span><span id="line-1618"> @Override</span> |
| <span class="source-line-no">1619</span><span id="line-1619"> public long heapSize() {</span> |
| <span class="source-line-no">1620</span><span id="line-1620"> return ClassSize.align(FIXED_HEAPSIZE)</span> |
| <span class="source-line-no">1621</span><span id="line-1621"> // array overhead</span> |
| <span class="source-line-no">1622</span><span id="line-1622"> + (rlength == 0 ? ClassSize.sizeOfByteArray(rlength) : rlength);</span> |
| <span class="source-line-no">1623</span><span id="line-1623"> }</span> |
| <span class="source-line-no">1624</span><span id="line-1624"></span> |
| <span class="source-line-no">1625</span><span id="line-1625"> @Override</span> |
| <span class="source-line-no">1626</span><span id="line-1626"> public byte[] getRowArray() {</span> |
| <span class="source-line-no">1627</span><span id="line-1627"> return this.rowArray;</span> |
| <span class="source-line-no">1628</span><span id="line-1628"> }</span> |
| <span class="source-line-no">1629</span><span id="line-1629"></span> |
| <span class="source-line-no">1630</span><span id="line-1630"> @Override</span> |
| <span class="source-line-no">1631</span><span id="line-1631"> public int getRowOffset() {</span> |
| <span class="source-line-no">1632</span><span id="line-1632"> return this.roffset;</span> |
| <span class="source-line-no">1633</span><span id="line-1633"> }</span> |
| <span class="source-line-no">1634</span><span id="line-1634"></span> |
| <span class="source-line-no">1635</span><span id="line-1635"> @Override</span> |
| <span class="source-line-no">1636</span><span id="line-1636"> public short getRowLength() {</span> |
| <span class="source-line-no">1637</span><span id="line-1637"> return this.rlength;</span> |
| <span class="source-line-no">1638</span><span id="line-1638"> }</span> |
| <span class="source-line-no">1639</span><span id="line-1639"></span> |
| <span class="source-line-no">1640</span><span id="line-1640"> @Override</span> |
| <span class="source-line-no">1641</span><span id="line-1641"> public long getTimestamp() {</span> |
| <span class="source-line-no">1642</span><span id="line-1642"> return HConstants.LATEST_TIMESTAMP;</span> |
| <span class="source-line-no">1643</span><span id="line-1643"> }</span> |
| <span class="source-line-no">1644</span><span id="line-1644"></span> |
| <span class="source-line-no">1645</span><span id="line-1645"> @Override</span> |
| <span class="source-line-no">1646</span><span id="line-1646"> public byte getTypeByte() {</span> |
| <span class="source-line-no">1647</span><span id="line-1647"> return KeyValue.Type.Maximum.getCode();</span> |
| <span class="source-line-no">1648</span><span id="line-1648"> }</span> |
| <span class="source-line-no">1649</span><span id="line-1649"></span> |
| <span class="source-line-no">1650</span><span id="line-1650"> @Override</span> |
| <span class="source-line-no">1651</span><span id="line-1651"> public Cell.Type getType() {</span> |
| <span class="source-line-no">1652</span><span id="line-1652"> throw new UnsupportedOperationException();</span> |
| <span class="source-line-no">1653</span><span id="line-1653"> }</span> |
| <span class="source-line-no">1654</span><span id="line-1654"> }</span> |
| <span class="source-line-no">1655</span><span id="line-1655"></span> |
| <span class="source-line-no">1656</span><span id="line-1656"> private static class FirstOnRowByteBufferExtendedCell extends EmptyByteBufferExtendedCell {</span> |
| <span class="source-line-no">1657</span><span id="line-1657"> // @formatter:off</span> |
| <span class="source-line-no">1658</span><span id="line-1658"> private static final int FIXED_OVERHEAD =</span> |
| <span class="source-line-no">1659</span><span id="line-1659"> ClassSize.OBJECT // object</span> |
| <span class="source-line-no">1660</span><span id="line-1660"> + ClassSize.REFERENCE // row buffer</span> |
| <span class="source-line-no">1661</span><span id="line-1661"> + Bytes.SIZEOF_INT // row offset</span> |
| <span class="source-line-no">1662</span><span id="line-1662"> + Bytes.SIZEOF_SHORT; // row length</span> |
| <span class="source-line-no">1663</span><span id="line-1663"> // @formatter:on</span> |
| <span class="source-line-no">1664</span><span id="line-1664"> private final ByteBuffer rowBuff;</span> |
| <span class="source-line-no">1665</span><span id="line-1665"> private final int roffset;</span> |
| <span class="source-line-no">1666</span><span id="line-1666"> private final short rlength;</span> |
| <span class="source-line-no">1667</span><span id="line-1667"></span> |
| <span class="source-line-no">1668</span><span id="line-1668"> public FirstOnRowByteBufferExtendedCell(final ByteBuffer row, int roffset, short rlength) {</span> |
| <span class="source-line-no">1669</span><span id="line-1669"> this.rowBuff = row;</span> |
| <span class="source-line-no">1670</span><span id="line-1670"> this.roffset = roffset;</span> |
| <span class="source-line-no">1671</span><span id="line-1671"> this.rlength = rlength;</span> |
| <span class="source-line-no">1672</span><span id="line-1672"> }</span> |
| <span class="source-line-no">1673</span><span id="line-1673"></span> |
| <span class="source-line-no">1674</span><span id="line-1674"> @Override</span> |
| <span class="source-line-no">1675</span><span id="line-1675"> public long heapSize() {</span> |
| <span class="source-line-no">1676</span><span id="line-1676"> if (this.rowBuff.hasArray()) {</span> |
| <span class="source-line-no">1677</span><span id="line-1677"> return ClassSize.align(FIXED_OVERHEAD + rlength);</span> |
| <span class="source-line-no">1678</span><span id="line-1678"> }</span> |
| <span class="source-line-no">1679</span><span id="line-1679"> return ClassSize.align(FIXED_OVERHEAD);</span> |
| <span class="source-line-no">1680</span><span id="line-1680"> }</span> |
| <span class="source-line-no">1681</span><span id="line-1681"></span> |
| <span class="source-line-no">1682</span><span id="line-1682"> @Override</span> |
| <span class="source-line-no">1683</span><span id="line-1683"> public ByteBuffer getRowByteBuffer() {</span> |
| <span class="source-line-no">1684</span><span id="line-1684"> return this.rowBuff;</span> |
| <span class="source-line-no">1685</span><span id="line-1685"> }</span> |
| <span class="source-line-no">1686</span><span id="line-1686"></span> |
| <span class="source-line-no">1687</span><span id="line-1687"> @Override</span> |
| <span class="source-line-no">1688</span><span id="line-1688"> public int getRowPosition() {</span> |
| <span class="source-line-no">1689</span><span id="line-1689"> return this.roffset;</span> |
| <span class="source-line-no">1690</span><span id="line-1690"> }</span> |
| <span class="source-line-no">1691</span><span id="line-1691"></span> |
| <span class="source-line-no">1692</span><span id="line-1692"> @Override</span> |
| <span class="source-line-no">1693</span><span id="line-1693"> public short getRowLength() {</span> |
| <span class="source-line-no">1694</span><span id="line-1694"> return this.rlength;</span> |
| <span class="source-line-no">1695</span><span id="line-1695"> }</span> |
| <span class="source-line-no">1696</span><span id="line-1696"></span> |
| <span class="source-line-no">1697</span><span id="line-1697"> @Override</span> |
| <span class="source-line-no">1698</span><span id="line-1698"> public long getTimestamp() {</span> |
| <span class="source-line-no">1699</span><span id="line-1699"> return HConstants.LATEST_TIMESTAMP;</span> |
| <span class="source-line-no">1700</span><span id="line-1700"> }</span> |
| <span class="source-line-no">1701</span><span id="line-1701"></span> |
| <span class="source-line-no">1702</span><span id="line-1702"> @Override</span> |
| <span class="source-line-no">1703</span><span id="line-1703"> public byte getTypeByte() {</span> |
| <span class="source-line-no">1704</span><span id="line-1704"> return KeyValue.Type.Maximum.getCode();</span> |
| <span class="source-line-no">1705</span><span id="line-1705"> }</span> |
| <span class="source-line-no">1706</span><span id="line-1706"></span> |
| <span class="source-line-no">1707</span><span id="line-1707"> @Override</span> |
| <span class="source-line-no">1708</span><span id="line-1708"> public Type getType() {</span> |
| <span class="source-line-no">1709</span><span id="line-1709"> throw new UnsupportedOperationException();</span> |
| <span class="source-line-no">1710</span><span id="line-1710"> }</span> |
| <span class="source-line-no">1711</span><span id="line-1711"> }</span> |
| <span class="source-line-no">1712</span><span id="line-1712"></span> |
| <span class="source-line-no">1713</span><span id="line-1713"> private static class LastOnRowByteBufferExtendedCell extends EmptyByteBufferExtendedCell {</span> |
| <span class="source-line-no">1714</span><span id="line-1714"> // @formatter:off</span> |
| <span class="source-line-no">1715</span><span id="line-1715"> private static final int FIXED_OVERHEAD = ClassSize.OBJECT // object</span> |
| <span class="source-line-no">1716</span><span id="line-1716"> + ClassSize.REFERENCE // rowBuff</span> |
| <span class="source-line-no">1717</span><span id="line-1717"> + Bytes.SIZEOF_INT // roffset</span> |
| <span class="source-line-no">1718</span><span id="line-1718"> + Bytes.SIZEOF_SHORT; // rlength</span> |
| <span class="source-line-no">1719</span><span id="line-1719"> // @formatter:on</span> |
| <span class="source-line-no">1720</span><span id="line-1720"> private final ByteBuffer rowBuff;</span> |
| <span class="source-line-no">1721</span><span id="line-1721"> private final int roffset;</span> |
| <span class="source-line-no">1722</span><span id="line-1722"> private final short rlength;</span> |
| <span class="source-line-no">1723</span><span id="line-1723"></span> |
| <span class="source-line-no">1724</span><span id="line-1724"> public LastOnRowByteBufferExtendedCell(final ByteBuffer row, int roffset, short rlength) {</span> |
| <span class="source-line-no">1725</span><span id="line-1725"> this.rowBuff = row;</span> |
| <span class="source-line-no">1726</span><span id="line-1726"> this.roffset = roffset;</span> |
| <span class="source-line-no">1727</span><span id="line-1727"> this.rlength = rlength;</span> |
| <span class="source-line-no">1728</span><span id="line-1728"> }</span> |
| <span class="source-line-no">1729</span><span id="line-1729"></span> |
| <span class="source-line-no">1730</span><span id="line-1730"> @Override</span> |
| <span class="source-line-no">1731</span><span id="line-1731"> public long heapSize() {</span> |
| <span class="source-line-no">1732</span><span id="line-1732"> if (this.rowBuff.hasArray()) {</span> |
| <span class="source-line-no">1733</span><span id="line-1733"> return ClassSize.align(FIXED_OVERHEAD + rlength);</span> |
| <span class="source-line-no">1734</span><span id="line-1734"> }</span> |
| <span class="source-line-no">1735</span><span id="line-1735"> return ClassSize.align(FIXED_OVERHEAD);</span> |
| <span class="source-line-no">1736</span><span id="line-1736"> }</span> |
| <span class="source-line-no">1737</span><span id="line-1737"></span> |
| <span class="source-line-no">1738</span><span id="line-1738"> @Override</span> |
| <span class="source-line-no">1739</span><span id="line-1739"> public ByteBuffer getRowByteBuffer() {</span> |
| <span class="source-line-no">1740</span><span id="line-1740"> return this.rowBuff;</span> |
| <span class="source-line-no">1741</span><span id="line-1741"> }</span> |
| <span class="source-line-no">1742</span><span id="line-1742"></span> |
| <span class="source-line-no">1743</span><span id="line-1743"> @Override</span> |
| <span class="source-line-no">1744</span><span id="line-1744"> public int getRowPosition() {</span> |
| <span class="source-line-no">1745</span><span id="line-1745"> return this.roffset;</span> |
| <span class="source-line-no">1746</span><span id="line-1746"> }</span> |
| <span class="source-line-no">1747</span><span id="line-1747"></span> |
| <span class="source-line-no">1748</span><span id="line-1748"> @Override</span> |
| <span class="source-line-no">1749</span><span id="line-1749"> public short getRowLength() {</span> |
| <span class="source-line-no">1750</span><span id="line-1750"> return this.rlength;</span> |
| <span class="source-line-no">1751</span><span id="line-1751"> }</span> |
| <span class="source-line-no">1752</span><span id="line-1752"></span> |
| <span class="source-line-no">1753</span><span id="line-1753"> @Override</span> |
| <span class="source-line-no">1754</span><span id="line-1754"> public long getTimestamp() {</span> |
| <span class="source-line-no">1755</span><span id="line-1755"> return PrivateConstants.OLDEST_TIMESTAMP;</span> |
| <span class="source-line-no">1756</span><span id="line-1756"> }</span> |
| <span class="source-line-no">1757</span><span id="line-1757"></span> |
| <span class="source-line-no">1758</span><span id="line-1758"> @Override</span> |
| <span class="source-line-no">1759</span><span id="line-1759"> public byte getTypeByte() {</span> |
| <span class="source-line-no">1760</span><span id="line-1760"> return KeyValue.Type.Minimum.getCode();</span> |
| <span class="source-line-no">1761</span><span id="line-1761"> }</span> |
| <span class="source-line-no">1762</span><span id="line-1762"></span> |
| <span class="source-line-no">1763</span><span id="line-1763"> @Override</span> |
| <span class="source-line-no">1764</span><span id="line-1764"> public Type getType() {</span> |
| <span class="source-line-no">1765</span><span id="line-1765"> throw new UnsupportedOperationException();</span> |
| <span class="source-line-no">1766</span><span id="line-1766"> }</span> |
| <span class="source-line-no">1767</span><span id="line-1767"> }</span> |
| <span class="source-line-no">1768</span><span id="line-1768"></span> |
| <span class="source-line-no">1769</span><span id="line-1769"> private static class FirstOnRowColByteBufferExtendedCell</span> |
| <span class="source-line-no">1770</span><span id="line-1770"> extends FirstOnRowByteBufferExtendedCell {</span> |
| <span class="source-line-no">1771</span><span id="line-1771"> // @formatter:off</span> |
| <span class="source-line-no">1772</span><span id="line-1772"> private static final int FIXED_OVERHEAD = FirstOnRowByteBufferExtendedCell.FIXED_OVERHEAD</span> |
| <span class="source-line-no">1773</span><span id="line-1773"> + ClassSize.REFERENCE * 2 // family buffer and column buffer</span> |
| <span class="source-line-no">1774</span><span id="line-1774"> + Bytes.SIZEOF_INT * 3 // famOffset, colOffset, colLength</span> |
| <span class="source-line-no">1775</span><span id="line-1775"> + Bytes.SIZEOF_BYTE; // famLength</span> |
| <span class="source-line-no">1776</span><span id="line-1776"> // @formatter:on</span> |
| <span class="source-line-no">1777</span><span id="line-1777"> private final ByteBuffer famBuff;</span> |
| <span class="source-line-no">1778</span><span id="line-1778"> private final int famOffset;</span> |
| <span class="source-line-no">1779</span><span id="line-1779"> private final byte famLength;</span> |
| <span class="source-line-no">1780</span><span id="line-1780"> private final ByteBuffer colBuff;</span> |
| <span class="source-line-no">1781</span><span id="line-1781"> private final int colOffset;</span> |
| <span class="source-line-no">1782</span><span id="line-1782"> private final int colLength;</span> |
| <span class="source-line-no">1783</span><span id="line-1783"></span> |
| <span class="source-line-no">1784</span><span id="line-1784"> public FirstOnRowColByteBufferExtendedCell(final ByteBuffer row, int roffset, short rlength,</span> |
| <span class="source-line-no">1785</span><span id="line-1785"> final ByteBuffer famBuff, final int famOffset, final byte famLength, final ByteBuffer col,</span> |
| <span class="source-line-no">1786</span><span id="line-1786"> final int colOffset, final int colLength) {</span> |
| <span class="source-line-no">1787</span><span id="line-1787"> super(row, roffset, rlength);</span> |
| <span class="source-line-no">1788</span><span id="line-1788"> this.famBuff = famBuff;</span> |
| <span class="source-line-no">1789</span><span id="line-1789"> this.famOffset = famOffset;</span> |
| <span class="source-line-no">1790</span><span id="line-1790"> this.famLength = famLength;</span> |
| <span class="source-line-no">1791</span><span id="line-1791"> this.colBuff = col;</span> |
| <span class="source-line-no">1792</span><span id="line-1792"> this.colOffset = colOffset;</span> |
| <span class="source-line-no">1793</span><span id="line-1793"> this.colLength = colLength;</span> |
| <span class="source-line-no">1794</span><span id="line-1794"> }</span> |
| <span class="source-line-no">1795</span><span id="line-1795"></span> |
| <span class="source-line-no">1796</span><span id="line-1796"> @Override</span> |
| <span class="source-line-no">1797</span><span id="line-1797"> public long heapSize() {</span> |
| <span class="source-line-no">1798</span><span id="line-1798"> if (famBuff.hasArray() && colBuff.hasArray()) {</span> |
| <span class="source-line-no">1799</span><span id="line-1799"> return ClassSize.align(FIXED_OVERHEAD + famLength + colLength);</span> |
| <span class="source-line-no">1800</span><span id="line-1800"> } else if (famBuff.hasArray()) {</span> |
| <span class="source-line-no">1801</span><span id="line-1801"> return ClassSize.align(FIXED_OVERHEAD + famLength);</span> |
| <span class="source-line-no">1802</span><span id="line-1802"> } else if (colBuff.hasArray()) {</span> |
| <span class="source-line-no">1803</span><span id="line-1803"> return ClassSize.align(FIXED_OVERHEAD + colLength);</span> |
| <span class="source-line-no">1804</span><span id="line-1804"> } else {</span> |
| <span class="source-line-no">1805</span><span id="line-1805"> return ClassSize.align(FIXED_OVERHEAD);</span> |
| <span class="source-line-no">1806</span><span id="line-1806"> }</span> |
| <span class="source-line-no">1807</span><span id="line-1807"> }</span> |
| <span class="source-line-no">1808</span><span id="line-1808"></span> |
| <span class="source-line-no">1809</span><span id="line-1809"> @Override</span> |
| <span class="source-line-no">1810</span><span id="line-1810"> public ByteBuffer getFamilyByteBuffer() {</span> |
| <span class="source-line-no">1811</span><span id="line-1811"> return this.famBuff;</span> |
| <span class="source-line-no">1812</span><span id="line-1812"> }</span> |
| <span class="source-line-no">1813</span><span id="line-1813"></span> |
| <span class="source-line-no">1814</span><span id="line-1814"> @Override</span> |
| <span class="source-line-no">1815</span><span id="line-1815"> public int getFamilyPosition() {</span> |
| <span class="source-line-no">1816</span><span id="line-1816"> return this.famOffset;</span> |
| <span class="source-line-no">1817</span><span id="line-1817"> }</span> |
| <span class="source-line-no">1818</span><span id="line-1818"></span> |
| <span class="source-line-no">1819</span><span id="line-1819"> @Override</span> |
| <span class="source-line-no">1820</span><span id="line-1820"> public byte getFamilyLength() {</span> |
| <span class="source-line-no">1821</span><span id="line-1821"> return famLength;</span> |
| <span class="source-line-no">1822</span><span id="line-1822"> }</span> |
| <span class="source-line-no">1823</span><span id="line-1823"></span> |
| <span class="source-line-no">1824</span><span id="line-1824"> @Override</span> |
| <span class="source-line-no">1825</span><span id="line-1825"> public ByteBuffer getQualifierByteBuffer() {</span> |
| <span class="source-line-no">1826</span><span id="line-1826"> return this.colBuff;</span> |
| <span class="source-line-no">1827</span><span id="line-1827"> }</span> |
| <span class="source-line-no">1828</span><span id="line-1828"></span> |
| <span class="source-line-no">1829</span><span id="line-1829"> @Override</span> |
| <span class="source-line-no">1830</span><span id="line-1830"> public int getQualifierPosition() {</span> |
| <span class="source-line-no">1831</span><span id="line-1831"> return this.colOffset;</span> |
| <span class="source-line-no">1832</span><span id="line-1832"> }</span> |
| <span class="source-line-no">1833</span><span id="line-1833"></span> |
| <span class="source-line-no">1834</span><span id="line-1834"> @Override</span> |
| <span class="source-line-no">1835</span><span id="line-1835"> public int getQualifierLength() {</span> |
| <span class="source-line-no">1836</span><span id="line-1836"> return this.colLength;</span> |
| <span class="source-line-no">1837</span><span id="line-1837"> }</span> |
| <span class="source-line-no">1838</span><span id="line-1838"> }</span> |
| <span class="source-line-no">1839</span><span id="line-1839"></span> |
| <span class="source-line-no">1840</span><span id="line-1840"> private static class FirstOnRowColCell extends FirstOnRowCell {</span> |
| <span class="source-line-no">1841</span><span id="line-1841"> // @formatter:off</span> |
| <span class="source-line-no">1842</span><span id="line-1842"> private static final long FIXED_HEAPSIZE = (long) FirstOnRowCell.FIXED_HEAPSIZE</span> |
| <span class="source-line-no">1843</span><span id="line-1843"> + Bytes.SIZEOF_BYTE // flength</span> |
| <span class="source-line-no">1844</span><span id="line-1844"> + Bytes.SIZEOF_INT * 3 // foffset, qoffset, qlength</span> |
| <span class="source-line-no">1845</span><span id="line-1845"> + ClassSize.REFERENCE * 2; // fArray, qArray</span> |
| <span class="source-line-no">1846</span><span id="line-1846"> // @formatter:on</span> |
| <span class="source-line-no">1847</span><span id="line-1847"> private final byte[] fArray;</span> |
| <span class="source-line-no">1848</span><span id="line-1848"> private final int foffset;</span> |
| <span class="source-line-no">1849</span><span id="line-1849"> private final byte flength;</span> |
| <span class="source-line-no">1850</span><span id="line-1850"> private final byte[] qArray;</span> |
| <span class="source-line-no">1851</span><span id="line-1851"> private final int qoffset;</span> |
| <span class="source-line-no">1852</span><span id="line-1852"> private final int qlength;</span> |
| <span class="source-line-no">1853</span><span id="line-1853"></span> |
| <span class="source-line-no">1854</span><span id="line-1854"> public FirstOnRowColCell(byte[] rArray, int roffset, short rlength, byte[] fArray, int foffset,</span> |
| <span class="source-line-no">1855</span><span id="line-1855"> byte flength, byte[] qArray, int qoffset, int qlength) {</span> |
| <span class="source-line-no">1856</span><span id="line-1856"> super(rArray, roffset, rlength);</span> |
| <span class="source-line-no">1857</span><span id="line-1857"> this.fArray = fArray;</span> |
| <span class="source-line-no">1858</span><span id="line-1858"> this.foffset = foffset;</span> |
| <span class="source-line-no">1859</span><span id="line-1859"> this.flength = flength;</span> |
| <span class="source-line-no">1860</span><span id="line-1860"> this.qArray = qArray;</span> |
| <span class="source-line-no">1861</span><span id="line-1861"> this.qoffset = qoffset;</span> |
| <span class="source-line-no">1862</span><span id="line-1862"> this.qlength = qlength;</span> |
| <span class="source-line-no">1863</span><span id="line-1863"> }</span> |
| <span class="source-line-no">1864</span><span id="line-1864"></span> |
| <span class="source-line-no">1865</span><span id="line-1865"> @Override</span> |
| <span class="source-line-no">1866</span><span id="line-1866"> public long heapSize() {</span> |
| <span class="source-line-no">1867</span><span id="line-1867"> return ClassSize.align(FIXED_HEAPSIZE)</span> |
| <span class="source-line-no">1868</span><span id="line-1868"> // array overhead</span> |
| <span class="source-line-no">1869</span><span id="line-1869"> + (flength == 0 ? ClassSize.sizeOfByteArray(flength) : flength)</span> |
| <span class="source-line-no">1870</span><span id="line-1870"> + (qlength == 0 ? ClassSize.sizeOfByteArray(qlength) : qlength);</span> |
| <span class="source-line-no">1871</span><span id="line-1871"> }</span> |
| <span class="source-line-no">1872</span><span id="line-1872"></span> |
| <span class="source-line-no">1873</span><span id="line-1873"> @Override</span> |
| <span class="source-line-no">1874</span><span id="line-1874"> public byte[] getFamilyArray() {</span> |
| <span class="source-line-no">1875</span><span id="line-1875"> return this.fArray;</span> |
| <span class="source-line-no">1876</span><span id="line-1876"> }</span> |
| <span class="source-line-no">1877</span><span id="line-1877"></span> |
| <span class="source-line-no">1878</span><span id="line-1878"> @Override</span> |
| <span class="source-line-no">1879</span><span id="line-1879"> public int getFamilyOffset() {</span> |
| <span class="source-line-no">1880</span><span id="line-1880"> return this.foffset;</span> |
| <span class="source-line-no">1881</span><span id="line-1881"> }</span> |
| <span class="source-line-no">1882</span><span id="line-1882"></span> |
| <span class="source-line-no">1883</span><span id="line-1883"> @Override</span> |
| <span class="source-line-no">1884</span><span id="line-1884"> public byte getFamilyLength() {</span> |
| <span class="source-line-no">1885</span><span id="line-1885"> return this.flength;</span> |
| <span class="source-line-no">1886</span><span id="line-1886"> }</span> |
| <span class="source-line-no">1887</span><span id="line-1887"></span> |
| <span class="source-line-no">1888</span><span id="line-1888"> @Override</span> |
| <span class="source-line-no">1889</span><span id="line-1889"> public byte[] getQualifierArray() {</span> |
| <span class="source-line-no">1890</span><span id="line-1890"> return this.qArray;</span> |
| <span class="source-line-no">1891</span><span id="line-1891"> }</span> |
| <span class="source-line-no">1892</span><span id="line-1892"></span> |
| <span class="source-line-no">1893</span><span id="line-1893"> @Override</span> |
| <span class="source-line-no">1894</span><span id="line-1894"> public int getQualifierOffset() {</span> |
| <span class="source-line-no">1895</span><span id="line-1895"> return this.qoffset;</span> |
| <span class="source-line-no">1896</span><span id="line-1896"> }</span> |
| <span class="source-line-no">1897</span><span id="line-1897"></span> |
| <span class="source-line-no">1898</span><span id="line-1898"> @Override</span> |
| <span class="source-line-no">1899</span><span id="line-1899"> public int getQualifierLength() {</span> |
| <span class="source-line-no">1900</span><span id="line-1900"> return this.qlength;</span> |
| <span class="source-line-no">1901</span><span id="line-1901"> }</span> |
| <span class="source-line-no">1902</span><span id="line-1902"> }</span> |
| <span class="source-line-no">1903</span><span id="line-1903"></span> |
| <span class="source-line-no">1904</span><span id="line-1904"> private static class FirstOnRowColTSCell extends FirstOnRowColCell {</span> |
| <span class="source-line-no">1905</span><span id="line-1905"> // @formatter:off</span> |
| <span class="source-line-no">1906</span><span id="line-1906"> private static final long FIXED_HEAPSIZE = FirstOnRowColCell.FIXED_HEAPSIZE</span> |
| <span class="source-line-no">1907</span><span id="line-1907"> + Bytes.SIZEOF_LONG; // ts</span> |
| <span class="source-line-no">1908</span><span id="line-1908"> private long ts;</span> |
| <span class="source-line-no">1909</span><span id="line-1909"> // @formatter:on</span> |
| <span class="source-line-no">1910</span><span id="line-1910"></span> |
| <span class="source-line-no">1911</span><span id="line-1911"> public FirstOnRowColTSCell(byte[] rArray, int roffset, short rlength, byte[] fArray,</span> |
| <span class="source-line-no">1912</span><span id="line-1912"> int foffset, byte flength, byte[] qArray, int qoffset, int qlength, long ts) {</span> |
| <span class="source-line-no">1913</span><span id="line-1913"> super(rArray, roffset, rlength, fArray, foffset, flength, qArray, qoffset, qlength);</span> |
| <span class="source-line-no">1914</span><span id="line-1914"> this.ts = ts;</span> |
| <span class="source-line-no">1915</span><span id="line-1915"> }</span> |
| <span class="source-line-no">1916</span><span id="line-1916"></span> |
| <span class="source-line-no">1917</span><span id="line-1917"> @Override</span> |
| <span class="source-line-no">1918</span><span id="line-1918"> public long getTimestamp() {</span> |
| <span class="source-line-no">1919</span><span id="line-1919"> return this.ts;</span> |
| <span class="source-line-no">1920</span><span id="line-1920"> }</span> |
| <span class="source-line-no">1921</span><span id="line-1921"></span> |
| <span class="source-line-no">1922</span><span id="line-1922"> @Override</span> |
| <span class="source-line-no">1923</span><span id="line-1923"> public long heapSize() {</span> |
| <span class="source-line-no">1924</span><span id="line-1924"> return ClassSize.align(FIXED_HEAPSIZE);</span> |
| <span class="source-line-no">1925</span><span id="line-1925"> }</span> |
| <span class="source-line-no">1926</span><span id="line-1926"> }</span> |
| <span class="source-line-no">1927</span><span id="line-1927"></span> |
| <span class="source-line-no">1928</span><span id="line-1928"> private static class FirstOnRowColTSByteBufferExtendedCell</span> |
| <span class="source-line-no">1929</span><span id="line-1929"> extends FirstOnRowColByteBufferExtendedCell {</span> |
| <span class="source-line-no">1930</span><span id="line-1930"> // @formatter:off</span> |
| <span class="source-line-no">1931</span><span id="line-1931"> private static final int FIXED_OVERHEAD = FirstOnRowColByteBufferExtendedCell.FIXED_OVERHEAD</span> |
| <span class="source-line-no">1932</span><span id="line-1932"> + Bytes.SIZEOF_LONG; // ts</span> |
| <span class="source-line-no">1933</span><span id="line-1933"> private long ts;</span> |
| <span class="source-line-no">1934</span><span id="line-1934"> // @formatter:on</span> |
| <span class="source-line-no">1935</span><span id="line-1935"></span> |
| <span class="source-line-no">1936</span><span id="line-1936"> public FirstOnRowColTSByteBufferExtendedCell(ByteBuffer rBuffer, int roffset, short rlength,</span> |
| <span class="source-line-no">1937</span><span id="line-1937"> ByteBuffer fBuffer, int foffset, byte flength, ByteBuffer qBuffer, int qoffset, int qlength,</span> |
| <span class="source-line-no">1938</span><span id="line-1938"> long ts) {</span> |
| <span class="source-line-no">1939</span><span id="line-1939"> super(rBuffer, roffset, rlength, fBuffer, foffset, flength, qBuffer, qoffset, qlength);</span> |
| <span class="source-line-no">1940</span><span id="line-1940"> this.ts = ts;</span> |
| <span class="source-line-no">1941</span><span id="line-1941"> }</span> |
| <span class="source-line-no">1942</span><span id="line-1942"></span> |
| <span class="source-line-no">1943</span><span id="line-1943"> @Override</span> |
| <span class="source-line-no">1944</span><span id="line-1944"> public long getTimestamp() {</span> |
| <span class="source-line-no">1945</span><span id="line-1945"> return this.ts;</span> |
| <span class="source-line-no">1946</span><span id="line-1946"> }</span> |
| <span class="source-line-no">1947</span><span id="line-1947"></span> |
| <span class="source-line-no">1948</span><span id="line-1948"> @Override</span> |
| <span class="source-line-no">1949</span><span id="line-1949"> public long heapSize() {</span> |
| <span class="source-line-no">1950</span><span id="line-1950"> return ClassSize.align(FIXED_OVERHEAD + super.heapSize());</span> |
| <span class="source-line-no">1951</span><span id="line-1951"> }</span> |
| <span class="source-line-no">1952</span><span id="line-1952"> }</span> |
| <span class="source-line-no">1953</span><span id="line-1953"></span> |
| <span class="source-line-no">1954</span><span id="line-1954"> private static class LastOnRowCell extends EmptyCell {</span> |
| <span class="source-line-no">1955</span><span id="line-1955"> // @formatter:off</span> |
| <span class="source-line-no">1956</span><span id="line-1956"> private static final int FIXED_OVERHEAD = ClassSize.OBJECT // object</span> |
| <span class="source-line-no">1957</span><span id="line-1957"> + ClassSize.REFERENCE // row array</span> |
| <span class="source-line-no">1958</span><span id="line-1958"> + Bytes.SIZEOF_INT // row offset</span> |
| <span class="source-line-no">1959</span><span id="line-1959"> + Bytes.SIZEOF_SHORT; // row length</span> |
| <span class="source-line-no">1960</span><span id="line-1960"> // @formatter:on</span> |
| <span class="source-line-no">1961</span><span id="line-1961"> private final byte[] rowArray;</span> |
| <span class="source-line-no">1962</span><span id="line-1962"> private final int roffset;</span> |
| <span class="source-line-no">1963</span><span id="line-1963"> private final short rlength;</span> |
| <span class="source-line-no">1964</span><span id="line-1964"></span> |
| <span class="source-line-no">1965</span><span id="line-1965"> public LastOnRowCell(byte[] row, int roffset, short rlength) {</span> |
| <span class="source-line-no">1966</span><span id="line-1966"> this.rowArray = row;</span> |
| <span class="source-line-no">1967</span><span id="line-1967"> this.roffset = roffset;</span> |
| <span class="source-line-no">1968</span><span id="line-1968"> this.rlength = rlength;</span> |
| <span class="source-line-no">1969</span><span id="line-1969"> }</span> |
| <span class="source-line-no">1970</span><span id="line-1970"></span> |
| <span class="source-line-no">1971</span><span id="line-1971"> @Override</span> |
| <span class="source-line-no">1972</span><span id="line-1972"> public long heapSize() {</span> |
| <span class="source-line-no">1973</span><span id="line-1973"> return ClassSize.align(FIXED_OVERHEAD)</span> |
| <span class="source-line-no">1974</span><span id="line-1974"> // array overhead</span> |
| <span class="source-line-no">1975</span><span id="line-1975"> + (rlength == 0 ? ClassSize.sizeOfByteArray(rlength) : rlength);</span> |
| <span class="source-line-no">1976</span><span id="line-1976"> }</span> |
| <span class="source-line-no">1977</span><span id="line-1977"></span> |
| <span class="source-line-no">1978</span><span id="line-1978"> @Override</span> |
| <span class="source-line-no">1979</span><span id="line-1979"> public byte[] getRowArray() {</span> |
| <span class="source-line-no">1980</span><span id="line-1980"> return this.rowArray;</span> |
| <span class="source-line-no">1981</span><span id="line-1981"> }</span> |
| <span class="source-line-no">1982</span><span id="line-1982"></span> |
| <span class="source-line-no">1983</span><span id="line-1983"> @Override</span> |
| <span class="source-line-no">1984</span><span id="line-1984"> public int getRowOffset() {</span> |
| <span class="source-line-no">1985</span><span id="line-1985"> return this.roffset;</span> |
| <span class="source-line-no">1986</span><span id="line-1986"> }</span> |
| <span class="source-line-no">1987</span><span id="line-1987"></span> |
| <span class="source-line-no">1988</span><span id="line-1988"> @Override</span> |
| <span class="source-line-no">1989</span><span id="line-1989"> public short getRowLength() {</span> |
| <span class="source-line-no">1990</span><span id="line-1990"> return this.rlength;</span> |
| <span class="source-line-no">1991</span><span id="line-1991"> }</span> |
| <span class="source-line-no">1992</span><span id="line-1992"></span> |
| <span class="source-line-no">1993</span><span id="line-1993"> @Override</span> |
| <span class="source-line-no">1994</span><span id="line-1994"> public long getTimestamp() {</span> |
| <span class="source-line-no">1995</span><span id="line-1995"> return PrivateConstants.OLDEST_TIMESTAMP;</span> |
| <span class="source-line-no">1996</span><span id="line-1996"> }</span> |
| <span class="source-line-no">1997</span><span id="line-1997"></span> |
| <span class="source-line-no">1998</span><span id="line-1998"> @Override</span> |
| <span class="source-line-no">1999</span><span id="line-1999"> public byte getTypeByte() {</span> |
| <span class="source-line-no">2000</span><span id="line-2000"> return KeyValue.Type.Minimum.getCode();</span> |
| <span class="source-line-no">2001</span><span id="line-2001"> }</span> |
| <span class="source-line-no">2002</span><span id="line-2002"></span> |
| <span class="source-line-no">2003</span><span id="line-2003"> @Override</span> |
| <span class="source-line-no">2004</span><span id="line-2004"> public Type getType() {</span> |
| <span class="source-line-no">2005</span><span id="line-2005"> throw new UnsupportedOperationException();</span> |
| <span class="source-line-no">2006</span><span id="line-2006"> }</span> |
| <span class="source-line-no">2007</span><span id="line-2007"> }</span> |
| <span class="source-line-no">2008</span><span id="line-2008"></span> |
| <span class="source-line-no">2009</span><span id="line-2009"> private static class LastOnRowColCell extends LastOnRowCell {</span> |
| <span class="source-line-no">2010</span><span id="line-2010"> // @formatter:off</span> |
| <span class="source-line-no">2011</span><span id="line-2011"> private static final long FIXED_OVERHEAD = (long) LastOnRowCell.FIXED_OVERHEAD</span> |
| <span class="source-line-no">2012</span><span id="line-2012"> + ClassSize.REFERENCE * 2 // fArray and qArray</span> |
| <span class="source-line-no">2013</span><span id="line-2013"> + Bytes.SIZEOF_INT * 3 // foffset, qoffset, qlength</span> |
| <span class="source-line-no">2014</span><span id="line-2014"> + Bytes.SIZEOF_BYTE; // flength</span> |
| <span class="source-line-no">2015</span><span id="line-2015"> // @formatter:on</span> |
| <span class="source-line-no">2016</span><span id="line-2016"> private final byte[] fArray;</span> |
| <span class="source-line-no">2017</span><span id="line-2017"> private final int foffset;</span> |
| <span class="source-line-no">2018</span><span id="line-2018"> private final byte flength;</span> |
| <span class="source-line-no">2019</span><span id="line-2019"> private final byte[] qArray;</span> |
| <span class="source-line-no">2020</span><span id="line-2020"> private final int qoffset;</span> |
| <span class="source-line-no">2021</span><span id="line-2021"> private final int qlength;</span> |
| <span class="source-line-no">2022</span><span id="line-2022"></span> |
| <span class="source-line-no">2023</span><span id="line-2023"> public LastOnRowColCell(byte[] rArray, int roffset, short rlength, byte[] fArray, int foffset,</span> |
| <span class="source-line-no">2024</span><span id="line-2024"> byte flength, byte[] qArray, int qoffset, int qlength) {</span> |
| <span class="source-line-no">2025</span><span id="line-2025"> super(rArray, roffset, rlength);</span> |
| <span class="source-line-no">2026</span><span id="line-2026"> this.fArray = fArray;</span> |
| <span class="source-line-no">2027</span><span id="line-2027"> this.foffset = foffset;</span> |
| <span class="source-line-no">2028</span><span id="line-2028"> this.flength = flength;</span> |
| <span class="source-line-no">2029</span><span id="line-2029"> this.qArray = qArray;</span> |
| <span class="source-line-no">2030</span><span id="line-2030"> this.qoffset = qoffset;</span> |
| <span class="source-line-no">2031</span><span id="line-2031"> this.qlength = qlength;</span> |
| <span class="source-line-no">2032</span><span id="line-2032"> }</span> |
| <span class="source-line-no">2033</span><span id="line-2033"></span> |
| <span class="source-line-no">2034</span><span id="line-2034"> @Override</span> |
| <span class="source-line-no">2035</span><span id="line-2035"> public long heapSize() {</span> |
| <span class="source-line-no">2036</span><span id="line-2036"> return ClassSize.align(FIXED_OVERHEAD)</span> |
| <span class="source-line-no">2037</span><span id="line-2037"> // array overhead</span> |
| <span class="source-line-no">2038</span><span id="line-2038"> + (flength == 0 ? ClassSize.sizeOfByteArray(flength) : flength)</span> |
| <span class="source-line-no">2039</span><span id="line-2039"> + (qlength == 0 ? ClassSize.sizeOfByteArray(qlength) : qlength);</span> |
| <span class="source-line-no">2040</span><span id="line-2040"> }</span> |
| <span class="source-line-no">2041</span><span id="line-2041"></span> |
| <span class="source-line-no">2042</span><span id="line-2042"> @Override</span> |
| <span class="source-line-no">2043</span><span id="line-2043"> public byte[] getFamilyArray() {</span> |
| <span class="source-line-no">2044</span><span id="line-2044"> return this.fArray;</span> |
| <span class="source-line-no">2045</span><span id="line-2045"> }</span> |
| <span class="source-line-no">2046</span><span id="line-2046"></span> |
| <span class="source-line-no">2047</span><span id="line-2047"> @Override</span> |
| <span class="source-line-no">2048</span><span id="line-2048"> public int getFamilyOffset() {</span> |
| <span class="source-line-no">2049</span><span id="line-2049"> return this.foffset;</span> |
| <span class="source-line-no">2050</span><span id="line-2050"> }</span> |
| <span class="source-line-no">2051</span><span id="line-2051"></span> |
| <span class="source-line-no">2052</span><span id="line-2052"> @Override</span> |
| <span class="source-line-no">2053</span><span id="line-2053"> public byte getFamilyLength() {</span> |
| <span class="source-line-no">2054</span><span id="line-2054"> return this.flength;</span> |
| <span class="source-line-no">2055</span><span id="line-2055"> }</span> |
| <span class="source-line-no">2056</span><span id="line-2056"></span> |
| <span class="source-line-no">2057</span><span id="line-2057"> @Override</span> |
| <span class="source-line-no">2058</span><span id="line-2058"> public byte[] getQualifierArray() {</span> |
| <span class="source-line-no">2059</span><span id="line-2059"> return this.qArray;</span> |
| <span class="source-line-no">2060</span><span id="line-2060"> }</span> |
| <span class="source-line-no">2061</span><span id="line-2061"></span> |
| <span class="source-line-no">2062</span><span id="line-2062"> @Override</span> |
| <span class="source-line-no">2063</span><span id="line-2063"> public int getQualifierOffset() {</span> |
| <span class="source-line-no">2064</span><span id="line-2064"> return this.qoffset;</span> |
| <span class="source-line-no">2065</span><span id="line-2065"> }</span> |
| <span class="source-line-no">2066</span><span id="line-2066"></span> |
| <span class="source-line-no">2067</span><span id="line-2067"> @Override</span> |
| <span class="source-line-no">2068</span><span id="line-2068"> public int getQualifierLength() {</span> |
| <span class="source-line-no">2069</span><span id="line-2069"> return this.qlength;</span> |
| <span class="source-line-no">2070</span><span id="line-2070"> }</span> |
| <span class="source-line-no">2071</span><span id="line-2071"> }</span> |
| <span class="source-line-no">2072</span><span id="line-2072"></span> |
| <span class="source-line-no">2073</span><span id="line-2073"> private static class LastOnRowColByteBufferExtendedCell extends LastOnRowByteBufferExtendedCell {</span> |
| <span class="source-line-no">2074</span><span id="line-2074"> // @formatter:off</span> |
| <span class="source-line-no">2075</span><span id="line-2075"> private static final int FIXED_OVERHEAD = LastOnRowByteBufferExtendedCell.FIXED_OVERHEAD</span> |
| <span class="source-line-no">2076</span><span id="line-2076"> + ClassSize.REFERENCE * 2 // fBuffer and qBuffer</span> |
| <span class="source-line-no">2077</span><span id="line-2077"> + Bytes.SIZEOF_INT * 3 // foffset, qoffset, qlength</span> |
| <span class="source-line-no">2078</span><span id="line-2078"> + Bytes.SIZEOF_BYTE; // flength</span> |
| <span class="source-line-no">2079</span><span id="line-2079"> // @formatter:on</span> |
| <span class="source-line-no">2080</span><span id="line-2080"> private final ByteBuffer fBuffer;</span> |
| <span class="source-line-no">2081</span><span id="line-2081"> private final int foffset;</span> |
| <span class="source-line-no">2082</span><span id="line-2082"> private final byte flength;</span> |
| <span class="source-line-no">2083</span><span id="line-2083"> private final ByteBuffer qBuffer;</span> |
| <span class="source-line-no">2084</span><span id="line-2084"> private final int qoffset;</span> |
| <span class="source-line-no">2085</span><span id="line-2085"> private final int qlength;</span> |
| <span class="source-line-no">2086</span><span id="line-2086"></span> |
| <span class="source-line-no">2087</span><span id="line-2087"> public LastOnRowColByteBufferExtendedCell(ByteBuffer rBuffer, int roffset, short rlength,</span> |
| <span class="source-line-no">2088</span><span id="line-2088"> ByteBuffer fBuffer, int foffset, byte flength, ByteBuffer qBuffer, int qoffset, int qlength) {</span> |
| <span class="source-line-no">2089</span><span id="line-2089"> super(rBuffer, roffset, rlength);</span> |
| <span class="source-line-no">2090</span><span id="line-2090"> this.fBuffer = fBuffer;</span> |
| <span class="source-line-no">2091</span><span id="line-2091"> this.foffset = foffset;</span> |
| <span class="source-line-no">2092</span><span id="line-2092"> this.flength = flength;</span> |
| <span class="source-line-no">2093</span><span id="line-2093"> this.qBuffer = qBuffer;</span> |
| <span class="source-line-no">2094</span><span id="line-2094"> this.qoffset = qoffset;</span> |
| <span class="source-line-no">2095</span><span id="line-2095"> this.qlength = qlength;</span> |
| <span class="source-line-no">2096</span><span id="line-2096"> }</span> |
| <span class="source-line-no">2097</span><span id="line-2097"></span> |
| <span class="source-line-no">2098</span><span id="line-2098"> @Override</span> |
| <span class="source-line-no">2099</span><span id="line-2099"> public long heapSize() {</span> |
| <span class="source-line-no">2100</span><span id="line-2100"> if (fBuffer.hasArray() && qBuffer.hasArray()) {</span> |
| <span class="source-line-no">2101</span><span id="line-2101"> return ClassSize.align(FIXED_OVERHEAD + flength + qlength);</span> |
| <span class="source-line-no">2102</span><span id="line-2102"> } else if (fBuffer.hasArray()) {</span> |
| <span class="source-line-no">2103</span><span id="line-2103"> return ClassSize.align(FIXED_OVERHEAD + flength);</span> |
| <span class="source-line-no">2104</span><span id="line-2104"> } else if (qBuffer.hasArray()) {</span> |
| <span class="source-line-no">2105</span><span id="line-2105"> return ClassSize.align(FIXED_OVERHEAD + qlength);</span> |
| <span class="source-line-no">2106</span><span id="line-2106"> } else {</span> |
| <span class="source-line-no">2107</span><span id="line-2107"> return ClassSize.align(FIXED_OVERHEAD);</span> |
| <span class="source-line-no">2108</span><span id="line-2108"> }</span> |
| <span class="source-line-no">2109</span><span id="line-2109"> }</span> |
| <span class="source-line-no">2110</span><span id="line-2110"></span> |
| <span class="source-line-no">2111</span><span id="line-2111"> @Override</span> |
| <span class="source-line-no">2112</span><span id="line-2112"> public ByteBuffer getFamilyByteBuffer() {</span> |
| <span class="source-line-no">2113</span><span id="line-2113"> return this.fBuffer;</span> |
| <span class="source-line-no">2114</span><span id="line-2114"> }</span> |
| <span class="source-line-no">2115</span><span id="line-2115"></span> |
| <span class="source-line-no">2116</span><span id="line-2116"> @Override</span> |
| <span class="source-line-no">2117</span><span id="line-2117"> public int getFamilyPosition() {</span> |
| <span class="source-line-no">2118</span><span id="line-2118"> return this.foffset;</span> |
| <span class="source-line-no">2119</span><span id="line-2119"> }</span> |
| <span class="source-line-no">2120</span><span id="line-2120"></span> |
| <span class="source-line-no">2121</span><span id="line-2121"> @Override</span> |
| <span class="source-line-no">2122</span><span id="line-2122"> public byte getFamilyLength() {</span> |
| <span class="source-line-no">2123</span><span id="line-2123"> return this.flength;</span> |
| <span class="source-line-no">2124</span><span id="line-2124"> }</span> |
| <span class="source-line-no">2125</span><span id="line-2125"></span> |
| <span class="source-line-no">2126</span><span id="line-2126"> @Override</span> |
| <span class="source-line-no">2127</span><span id="line-2127"> public ByteBuffer getQualifierByteBuffer() {</span> |
| <span class="source-line-no">2128</span><span id="line-2128"> return this.qBuffer;</span> |
| <span class="source-line-no">2129</span><span id="line-2129"> }</span> |
| <span class="source-line-no">2130</span><span id="line-2130"></span> |
| <span class="source-line-no">2131</span><span id="line-2131"> @Override</span> |
| <span class="source-line-no">2132</span><span id="line-2132"> public int getQualifierPosition() {</span> |
| <span class="source-line-no">2133</span><span id="line-2133"> return this.qoffset;</span> |
| <span class="source-line-no">2134</span><span id="line-2134"> }</span> |
| <span class="source-line-no">2135</span><span id="line-2135"></span> |
| <span class="source-line-no">2136</span><span id="line-2136"> @Override</span> |
| <span class="source-line-no">2137</span><span id="line-2137"> public int getQualifierLength() {</span> |
| <span class="source-line-no">2138</span><span id="line-2138"> return this.qlength;</span> |
| <span class="source-line-no">2139</span><span id="line-2139"> }</span> |
| <span class="source-line-no">2140</span><span id="line-2140"> }</span> |
| <span class="source-line-no">2141</span><span id="line-2141"></span> |
| <span class="source-line-no">2142</span><span id="line-2142"> private static class FirstOnRowDeleteFamilyCell extends EmptyCell {</span> |
| <span class="source-line-no">2143</span><span id="line-2143"> // @formatter:off</span> |
| <span class="source-line-no">2144</span><span id="line-2144"> private static final int FIXED_OVERHEAD = ClassSize.OBJECT // object</span> |
| <span class="source-line-no">2145</span><span id="line-2145"> + ClassSize.REFERENCE * 2 // fBuffer and qBuffer</span> |
| <span class="source-line-no">2146</span><span id="line-2146"> + Bytes.SIZEOF_INT * 3 // foffset, qoffset, qlength</span> |
| <span class="source-line-no">2147</span><span id="line-2147"> + Bytes.SIZEOF_BYTE; // flength</span> |
| <span class="source-line-no">2148</span><span id="line-2148"> // @formatter:on</span> |
| <span class="source-line-no">2149</span><span id="line-2149"> private final byte[] row;</span> |
| <span class="source-line-no">2150</span><span id="line-2150"> private final byte[] fam;</span> |
| <span class="source-line-no">2151</span><span id="line-2151"></span> |
| <span class="source-line-no">2152</span><span id="line-2152"> public FirstOnRowDeleteFamilyCell(byte[] row, byte[] fam) {</span> |
| <span class="source-line-no">2153</span><span id="line-2153"> this.row = row;</span> |
| <span class="source-line-no">2154</span><span id="line-2154"> this.fam = fam;</span> |
| <span class="source-line-no">2155</span><span id="line-2155"> }</span> |
| <span class="source-line-no">2156</span><span id="line-2156"></span> |
| <span class="source-line-no">2157</span><span id="line-2157"> @Override</span> |
| <span class="source-line-no">2158</span><span id="line-2158"> public long heapSize() {</span> |
| <span class="source-line-no">2159</span><span id="line-2159"> return ClassSize.align(FIXED_OVERHEAD)</span> |
| <span class="source-line-no">2160</span><span id="line-2160"> // array overhead</span> |
| <span class="source-line-no">2161</span><span id="line-2161"> + (getRowLength() == 0 ? ClassSize.sizeOfByteArray(getRowLength()) : getRowLength())</span> |
| <span class="source-line-no">2162</span><span id="line-2162"> + (getFamilyLength() == 0</span> |
| <span class="source-line-no">2163</span><span id="line-2163"> ? ClassSize.sizeOfByteArray(getFamilyLength())</span> |
| <span class="source-line-no">2164</span><span id="line-2164"> : getFamilyLength());</span> |
| <span class="source-line-no">2165</span><span id="line-2165"> }</span> |
| <span class="source-line-no">2166</span><span id="line-2166"></span> |
| <span class="source-line-no">2167</span><span id="line-2167"> @Override</span> |
| <span class="source-line-no">2168</span><span id="line-2168"> public byte[] getRowArray() {</span> |
| <span class="source-line-no">2169</span><span id="line-2169"> return this.row;</span> |
| <span class="source-line-no">2170</span><span id="line-2170"> }</span> |
| <span class="source-line-no">2171</span><span id="line-2171"></span> |
| <span class="source-line-no">2172</span><span id="line-2172"> @Override</span> |
| <span class="source-line-no">2173</span><span id="line-2173"> public short getRowLength() {</span> |
| <span class="source-line-no">2174</span><span id="line-2174"> return (short) this.row.length;</span> |
| <span class="source-line-no">2175</span><span id="line-2175"> }</span> |
| <span class="source-line-no">2176</span><span id="line-2176"></span> |
| <span class="source-line-no">2177</span><span id="line-2177"> @Override</span> |
| <span class="source-line-no">2178</span><span id="line-2178"> public byte[] getFamilyArray() {</span> |
| <span class="source-line-no">2179</span><span id="line-2179"> return this.fam;</span> |
| <span class="source-line-no">2180</span><span id="line-2180"> }</span> |
| <span class="source-line-no">2181</span><span id="line-2181"></span> |
| <span class="source-line-no">2182</span><span id="line-2182"> @Override</span> |
| <span class="source-line-no">2183</span><span id="line-2183"> public byte getFamilyLength() {</span> |
| <span class="source-line-no">2184</span><span id="line-2184"> return (byte) this.fam.length;</span> |
| <span class="source-line-no">2185</span><span id="line-2185"> }</span> |
| <span class="source-line-no">2186</span><span id="line-2186"></span> |
| <span class="source-line-no">2187</span><span id="line-2187"> @Override</span> |
| <span class="source-line-no">2188</span><span id="line-2188"> public long getTimestamp() {</span> |
| <span class="source-line-no">2189</span><span id="line-2189"> return HConstants.LATEST_TIMESTAMP;</span> |
| <span class="source-line-no">2190</span><span id="line-2190"> }</span> |
| <span class="source-line-no">2191</span><span id="line-2191"></span> |
| <span class="source-line-no">2192</span><span id="line-2192"> @Override</span> |
| <span class="source-line-no">2193</span><span id="line-2193"> public byte getTypeByte() {</span> |
| <span class="source-line-no">2194</span><span id="line-2194"> return KeyValue.Type.DeleteFamily.getCode();</span> |
| <span class="source-line-no">2195</span><span id="line-2195"> }</span> |
| <span class="source-line-no">2196</span><span id="line-2196"></span> |
| <span class="source-line-no">2197</span><span id="line-2197"> @Override</span> |
| <span class="source-line-no">2198</span><span id="line-2198"> public Type getType() {</span> |
| <span class="source-line-no">2199</span><span id="line-2199"> return Type.DeleteFamily;</span> |
| <span class="source-line-no">2200</span><span id="line-2200"> }</span> |
| <span class="source-line-no">2201</span><span id="line-2201"> }</span> |
| <span class="source-line-no">2202</span><span id="line-2202"></span> |
| <span class="source-line-no">2203</span><span id="line-2203"> /**</span> |
| <span class="source-line-no">2204</span><span id="line-2204"> * 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">2205</span><span id="line-2205"> * 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">2206</span><span id="line-2206"> * timestamp&gt;&lt;1 byte type&gt;</span> |
| <span class="source-line-no">2207</span><span id="line-2207"> */</span> |
| <span class="source-line-no">2208</span><span id="line-2208"> public static void writeFlatKey(ExtendedCell cell, DataOutput out) throws IOException {</span> |
| <span class="source-line-no">2209</span><span id="line-2209"> short rowLen = cell.getRowLength();</span> |
| <span class="source-line-no">2210</span><span id="line-2210"> byte fLen = cell.getFamilyLength();</span> |
| <span class="source-line-no">2211</span><span id="line-2211"> int qLen = cell.getQualifierLength();</span> |
| <span class="source-line-no">2212</span><span id="line-2212"> // Using just one if/else loop instead of every time checking before writing every</span> |
| <span class="source-line-no">2213</span><span id="line-2213"> // component of cell</span> |
| <span class="source-line-no">2214</span><span id="line-2214"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2215</span><span id="line-2215"> out.writeShort(rowLen);</span> |
| <span class="source-line-no">2216</span><span id="line-2216"> ByteBufferUtils.copyBufferToStream(out, ((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2217</span><span id="line-2217"> ((ByteBufferExtendedCell) cell).getRowPosition(), 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"> ByteBufferUtils.copyBufferToStream(out, ((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),</span> |
| <span class="source-line-no">2220</span><span id="line-2220"> ((ByteBufferExtendedCell) cell).getFamilyPosition(), fLen);</span> |
| <span class="source-line-no">2221</span><span id="line-2221"> ByteBufferUtils.copyBufferToStream(out,</span> |
| <span class="source-line-no">2222</span><span id="line-2222"> ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">2223</span><span id="line-2223"> ((ByteBufferExtendedCell) cell).getQualifierPosition(), qLen);</span> |
| <span class="source-line-no">2224</span><span id="line-2224"> } else {</span> |
| <span class="source-line-no">2225</span><span id="line-2225"> out.writeShort(rowLen);</span> |
| <span class="source-line-no">2226</span><span id="line-2226"> out.write(cell.getRowArray(), cell.getRowOffset(), rowLen);</span> |
| <span class="source-line-no">2227</span><span id="line-2227"> out.writeByte(fLen);</span> |
| <span class="source-line-no">2228</span><span id="line-2228"> out.write(cell.getFamilyArray(), cell.getFamilyOffset(), fLen);</span> |
| <span class="source-line-no">2229</span><span id="line-2229"> out.write(cell.getQualifierArray(), cell.getQualifierOffset(), qLen);</span> |
| <span class="source-line-no">2230</span><span id="line-2230"> }</span> |
| <span class="source-line-no">2231</span><span id="line-2231"> out.writeLong(cell.getTimestamp());</span> |
| <span class="source-line-no">2232</span><span id="line-2232"> out.writeByte(cell.getTypeByte());</span> |
| <span class="source-line-no">2233</span><span id="line-2233"> }</span> |
| <span class="source-line-no">2234</span><span id="line-2234"></span> |
| <span class="source-line-no">2235</span><span id="line-2235"> public static int writeFlatKey(ExtendedCell cell, OutputStream out) throws IOException {</span> |
| <span class="source-line-no">2236</span><span id="line-2236"> short rowLen = cell.getRowLength();</span> |
| <span class="source-line-no">2237</span><span id="line-2237"> byte fLen = cell.getFamilyLength();</span> |
| <span class="source-line-no">2238</span><span id="line-2238"> int qLen = cell.getQualifierLength();</span> |
| <span class="source-line-no">2239</span><span id="line-2239"> // Using just one if/else loop instead of every time checking before writing every</span> |
| <span class="source-line-no">2240</span><span id="line-2240"> // component of cell</span> |
| <span class="source-line-no">2241</span><span id="line-2241"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2242</span><span id="line-2242"> StreamUtils.writeShort(out, rowLen);</span> |
| <span class="source-line-no">2243</span><span id="line-2243"> ByteBufferUtils.copyBufferToStream(out, ((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2244</span><span id="line-2244"> ((ByteBufferExtendedCell) cell).getRowPosition(), rowLen);</span> |
| <span class="source-line-no">2245</span><span id="line-2245"> out.write(fLen);</span> |
| <span class="source-line-no">2246</span><span id="line-2246"> ByteBufferUtils.copyBufferToStream(out, ((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),</span> |
| <span class="source-line-no">2247</span><span id="line-2247"> ((ByteBufferExtendedCell) cell).getFamilyPosition(), fLen);</span> |
| <span class="source-line-no">2248</span><span id="line-2248"> ByteBufferUtils.copyBufferToStream(out,</span> |
| <span class="source-line-no">2249</span><span id="line-2249"> ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">2250</span><span id="line-2250"> ((ByteBufferExtendedCell) cell).getQualifierPosition(), qLen);</span> |
| <span class="source-line-no">2251</span><span id="line-2251"> } else {</span> |
| <span class="source-line-no">2252</span><span id="line-2252"> StreamUtils.writeShort(out, rowLen);</span> |
| <span class="source-line-no">2253</span><span id="line-2253"> out.write(cell.getRowArray(), cell.getRowOffset(), rowLen);</span> |
| <span class="source-line-no">2254</span><span id="line-2254"> out.write(fLen);</span> |
| <span class="source-line-no">2255</span><span id="line-2255"> out.write(cell.getFamilyArray(), cell.getFamilyOffset(), fLen);</span> |
| <span class="source-line-no">2256</span><span id="line-2256"> out.write(cell.getQualifierArray(), cell.getQualifierOffset(), qLen);</span> |
| <span class="source-line-no">2257</span><span id="line-2257"> }</span> |
| <span class="source-line-no">2258</span><span id="line-2258"> StreamUtils.writeLong(out, cell.getTimestamp());</span> |
| <span class="source-line-no">2259</span><span id="line-2259"> out.write(cell.getTypeByte());</span> |
| <span class="source-line-no">2260</span><span id="line-2260"> return Bytes.SIZEOF_SHORT + rowLen + Bytes.SIZEOF_BYTE + fLen + qLen + Bytes.SIZEOF_LONG</span> |
| <span class="source-line-no">2261</span><span id="line-2261"> + Bytes.SIZEOF_BYTE;</span> |
| <span class="source-line-no">2262</span><span id="line-2262"> }</span> |
| <span class="source-line-no">2263</span><span id="line-2263"></span> |
| <span class="source-line-no">2264</span><span id="line-2264"> /**</span> |
| <span class="source-line-no">2265</span><span id="line-2265"> * 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">2266</span><span id="line-2266"> * sequenceid is an internal implementation detail not for general public use.</span> |
| <span class="source-line-no">2267</span><span id="line-2267"> * @throws IOException when the passed cell is not of type {@link ExtendedCell}</span> |
| <span class="source-line-no">2268</span><span id="line-2268"> */</span> |
| <span class="source-line-no">2269</span><span id="line-2269"> public static void setSequenceId(Cell cell, long seqId) throws IOException {</span> |
| <span class="source-line-no">2270</span><span id="line-2270"> if (cell instanceof ExtendedCell) {</span> |
| <span class="source-line-no">2271</span><span id="line-2271"> ((ExtendedCell) cell).setSequenceId(seqId);</span> |
| <span class="source-line-no">2272</span><span id="line-2272"> } else {</span> |
| <span class="source-line-no">2273</span><span id="line-2273"> throw new IOException(</span> |
| <span class="source-line-no">2274</span><span id="line-2274"> new UnsupportedOperationException("Cell is not of type " + ExtendedCell.class.getName()));</span> |
| <span class="source-line-no">2275</span><span id="line-2275"> }</span> |
| <span class="source-line-no">2276</span><span id="line-2276"> }</span> |
| <span class="source-line-no">2277</span><span id="line-2277"></span> |
| <span class="source-line-no">2278</span><span id="line-2278"> /**</span> |
| <span class="source-line-no">2279</span><span id="line-2279"> * Sets the given timestamp to the cell.</span> |
| <span class="source-line-no">2280</span><span id="line-2280"> * @throws IOException when the passed cell is not of type {@link ExtendedCell}</span> |
| <span class="source-line-no">2281</span><span id="line-2281"> */</span> |
| <span class="source-line-no">2282</span><span id="line-2282"> public static void setTimestamp(Cell cell, long ts) throws IOException {</span> |
| <span class="source-line-no">2283</span><span id="line-2283"> if (cell instanceof ExtendedCell) {</span> |
| <span class="source-line-no">2284</span><span id="line-2284"> ((ExtendedCell) cell).setTimestamp(ts);</span> |
| <span class="source-line-no">2285</span><span id="line-2285"> } else {</span> |
| <span class="source-line-no">2286</span><span id="line-2286"> throw new IOException(</span> |
| <span class="source-line-no">2287</span><span id="line-2287"> new UnsupportedOperationException("Cell is not of type " + ExtendedCell.class.getName()));</span> |
| <span class="source-line-no">2288</span><span id="line-2288"> }</span> |
| <span class="source-line-no">2289</span><span id="line-2289"> }</span> |
| <span class="source-line-no">2290</span><span id="line-2290"></span> |
| <span class="source-line-no">2291</span><span id="line-2291"> /**</span> |
| <span class="source-line-no">2292</span><span id="line-2292"> * Sets the given timestamp to the cell.</span> |
| <span class="source-line-no">2293</span><span id="line-2293"> * @throws IOException when the passed cell is not of type {@link ExtendedCell}</span> |
| <span class="source-line-no">2294</span><span id="line-2294"> */</span> |
| <span class="source-line-no">2295</span><span id="line-2295"> public static void setTimestamp(Cell cell, byte[] ts) throws IOException {</span> |
| <span class="source-line-no">2296</span><span id="line-2296"> if (cell instanceof ExtendedCell) {</span> |
| <span class="source-line-no">2297</span><span id="line-2297"> ((ExtendedCell) cell).setTimestamp(ts);</span> |
| <span class="source-line-no">2298</span><span id="line-2298"> } else {</span> |
| <span class="source-line-no">2299</span><span id="line-2299"> throw new IOException(</span> |
| <span class="source-line-no">2300</span><span id="line-2300"> new UnsupportedOperationException("Cell is not of type " + ExtendedCell.class.getName()));</span> |
| <span class="source-line-no">2301</span><span id="line-2301"> }</span> |
| <span class="source-line-no">2302</span><span id="line-2302"> }</span> |
| <span class="source-line-no">2303</span><span id="line-2303"></span> |
| <span class="source-line-no">2304</span><span id="line-2304"> /**</span> |
| <span class="source-line-no">2305</span><span id="line-2305"> * Sets the given timestamp to the cell iff current timestamp is</span> |
| <span class="source-line-no">2306</span><span id="line-2306"> * {@link HConstants#LATEST_TIMESTAMP}.</span> |
| <span class="source-line-no">2307</span><span id="line-2307"> * @return True if cell timestamp is modified.</span> |
| <span class="source-line-no">2308</span><span id="line-2308"> * @throws IOException when the passed cell is not of type {@link ExtendedCell}</span> |
| <span class="source-line-no">2309</span><span id="line-2309"> */</span> |
| <span class="source-line-no">2310</span><span id="line-2310"> public static boolean updateLatestStamp(ExtendedCell cell, long ts) throws IOException {</span> |
| <span class="source-line-no">2311</span><span id="line-2311"> if (cell.getTimestamp() == HConstants.LATEST_TIMESTAMP) {</span> |
| <span class="source-line-no">2312</span><span id="line-2312"> cell.setTimestamp(ts);</span> |
| <span class="source-line-no">2313</span><span id="line-2313"> return true;</span> |
| <span class="source-line-no">2314</span><span id="line-2314"> }</span> |
| <span class="source-line-no">2315</span><span id="line-2315"> return false;</span> |
| <span class="source-line-no">2316</span><span id="line-2316"> }</span> |
| <span class="source-line-no">2317</span><span id="line-2317"></span> |
| <span class="source-line-no">2318</span><span id="line-2318"> /**</span> |
| <span class="source-line-no">2319</span><span id="line-2319"> * Sets the given timestamp to the cell iff current timestamp is</span> |
| <span class="source-line-no">2320</span><span id="line-2320"> * {@link HConstants#LATEST_TIMESTAMP}.</span> |
| <span class="source-line-no">2321</span><span id="line-2321"> * @return True if cell timestamp is modified.</span> |
| <span class="source-line-no">2322</span><span id="line-2322"> * @throws IOException when the passed cell is not of type {@link ExtendedCell}</span> |
| <span class="source-line-no">2323</span><span id="line-2323"> */</span> |
| <span class="source-line-no">2324</span><span id="line-2324"> public static boolean updateLatestStamp(Cell cell, byte[] ts) throws IOException {</span> |
| <span class="source-line-no">2325</span><span id="line-2325"> if (cell.getTimestamp() == HConstants.LATEST_TIMESTAMP) {</span> |
| <span class="source-line-no">2326</span><span id="line-2326"> setTimestamp(cell, ts);</span> |
| <span class="source-line-no">2327</span><span id="line-2327"> return true;</span> |
| <span class="source-line-no">2328</span><span id="line-2328"> }</span> |
| <span class="source-line-no">2329</span><span id="line-2329"> return false;</span> |
| <span class="source-line-no">2330</span><span id="line-2330"> }</span> |
| <span class="source-line-no">2331</span><span id="line-2331"></span> |
| <span class="source-line-no">2332</span><span id="line-2332"> /**</span> |
| <span class="source-line-no">2333</span><span id="line-2333"> * Writes the row from the given cell to the output stream</span> |
| <span class="source-line-no">2334</span><span id="line-2334"> * @param out The outputstream to which the data has to be written</span> |
| <span class="source-line-no">2335</span><span id="line-2335"> * @param cell The cell whose contents has to be written</span> |
| <span class="source-line-no">2336</span><span id="line-2336"> * @param rlength the row length</span> |
| <span class="source-line-no">2337</span><span id="line-2337"> */</span> |
| <span class="source-line-no">2338</span><span id="line-2338"> public static void writeRow(OutputStream out, Cell cell, short rlength) throws IOException {</span> |
| <span class="source-line-no">2339</span><span id="line-2339"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2340</span><span id="line-2340"> ByteBufferUtils.copyBufferToStream(out, ((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2341</span><span id="line-2341"> ((ByteBufferExtendedCell) cell).getRowPosition(), rlength);</span> |
| <span class="source-line-no">2342</span><span id="line-2342"> } else {</span> |
| <span class="source-line-no">2343</span><span id="line-2343"> out.write(cell.getRowArray(), cell.getRowOffset(), rlength);</span> |
| <span class="source-line-no">2344</span><span id="line-2344"> }</span> |
| <span class="source-line-no">2345</span><span id="line-2345"> }</span> |
| <span class="source-line-no">2346</span><span id="line-2346"></span> |
| <span class="source-line-no">2347</span><span id="line-2347"> /**</span> |
| <span class="source-line-no">2348</span><span id="line-2348"> * Writes the family from the given cell to the output stream</span> |
| <span class="source-line-no">2349</span><span id="line-2349"> * @param out The outputstream to which the data has to be written</span> |
| <span class="source-line-no">2350</span><span id="line-2350"> * @param cell The cell whose contents has to be written</span> |
| <span class="source-line-no">2351</span><span id="line-2351"> * @param flength the family length</span> |
| <span class="source-line-no">2352</span><span id="line-2352"> */</span> |
| <span class="source-line-no">2353</span><span id="line-2353"> public static void writeFamily(OutputStream out, Cell cell, byte flength) throws IOException {</span> |
| <span class="source-line-no">2354</span><span id="line-2354"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2355</span><span id="line-2355"> ByteBufferUtils.copyBufferToStream(out, ((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),</span> |
| <span class="source-line-no">2356</span><span id="line-2356"> ((ByteBufferExtendedCell) cell).getFamilyPosition(), flength);</span> |
| <span class="source-line-no">2357</span><span id="line-2357"> } else {</span> |
| <span class="source-line-no">2358</span><span id="line-2358"> out.write(cell.getFamilyArray(), cell.getFamilyOffset(), flength);</span> |
| <span class="source-line-no">2359</span><span id="line-2359"> }</span> |
| <span class="source-line-no">2360</span><span id="line-2360"> }</span> |
| <span class="source-line-no">2361</span><span id="line-2361"></span> |
| <span class="source-line-no">2362</span><span id="line-2362"> /**</span> |
| <span class="source-line-no">2363</span><span id="line-2363"> * Writes the qualifier from the given cell to the output stream</span> |
| <span class="source-line-no">2364</span><span id="line-2364"> * @param out The outputstream to which the data has to be written</span> |
| <span class="source-line-no">2365</span><span id="line-2365"> * @param cell The cell whose contents has to be written</span> |
| <span class="source-line-no">2366</span><span id="line-2366"> * @param qlength the qualifier length</span> |
| <span class="source-line-no">2367</span><span id="line-2367"> */</span> |
| <span class="source-line-no">2368</span><span id="line-2368"> public static void writeQualifier(OutputStream out, Cell cell, int qlength) throws IOException {</span> |
| <span class="source-line-no">2369</span><span id="line-2369"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2370</span><span id="line-2370"> ByteBufferUtils.copyBufferToStream(out,</span> |
| <span class="source-line-no">2371</span><span id="line-2371"> ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">2372</span><span id="line-2372"> ((ByteBufferExtendedCell) cell).getQualifierPosition(), qlength);</span> |
| <span class="source-line-no">2373</span><span id="line-2373"> } else {</span> |
| <span class="source-line-no">2374</span><span id="line-2374"> out.write(cell.getQualifierArray(), cell.getQualifierOffset(), qlength);</span> |
| <span class="source-line-no">2375</span><span id="line-2375"> }</span> |
| <span class="source-line-no">2376</span><span id="line-2376"> }</span> |
| <span class="source-line-no">2377</span><span id="line-2377"></span> |
| <span class="source-line-no">2378</span><span id="line-2378"> /**</span> |
| <span class="source-line-no">2379</span><span id="line-2379"> * Writes the qualifier from the given cell to the output stream excluding the common prefix</span> |
| <span class="source-line-no">2380</span><span id="line-2380"> * @param out The dataoutputstream to which the data has to be written</span> |
| <span class="source-line-no">2381</span><span id="line-2381"> * @param cell The cell whose contents has to be written</span> |
| <span class="source-line-no">2382</span><span id="line-2382"> * @param qlength the qualifier length</span> |
| <span class="source-line-no">2383</span><span id="line-2383"> */</span> |
| <span class="source-line-no">2384</span><span id="line-2384"> public static void writeQualifierSkippingBytes(DataOutputStream out, Cell cell, int qlength,</span> |
| <span class="source-line-no">2385</span><span id="line-2385"> int commonPrefix) throws IOException {</span> |
| <span class="source-line-no">2386</span><span id="line-2386"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2387</span><span id="line-2387"> ByteBufferUtils.copyBufferToStream((DataOutput) out,</span> |
| <span class="source-line-no">2388</span><span id="line-2388"> ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">2389</span><span id="line-2389"> ((ByteBufferExtendedCell) cell).getQualifierPosition() + commonPrefix,</span> |
| <span class="source-line-no">2390</span><span id="line-2390"> qlength - commonPrefix);</span> |
| <span class="source-line-no">2391</span><span id="line-2391"> } else {</span> |
| <span class="source-line-no">2392</span><span id="line-2392"> out.write(cell.getQualifierArray(), cell.getQualifierOffset() + commonPrefix,</span> |
| <span class="source-line-no">2393</span><span id="line-2393"> qlength - commonPrefix);</span> |
| <span class="source-line-no">2394</span><span id="line-2394"> }</span> |
| <span class="source-line-no">2395</span><span id="line-2395"> }</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"> * Writes the value from the given cell to the output stream</span> |
| <span class="source-line-no">2399</span><span id="line-2399"> * @param out The outputstream to which the data has to be written</span> |
| <span class="source-line-no">2400</span><span id="line-2400"> * @param cell The cell whose contents has to be written</span> |
| <span class="source-line-no">2401</span><span id="line-2401"> * @param vlength the value length</span> |
| <span class="source-line-no">2402</span><span id="line-2402"> */</span> |
| <span class="source-line-no">2403</span><span id="line-2403"> public static void writeValue(OutputStream out, ExtendedCell cell, int vlength)</span> |
| <span class="source-line-no">2404</span><span id="line-2404"> throws IOException {</span> |
| <span class="source-line-no">2405</span><span id="line-2405"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2406</span><span id="line-2406"> ByteBufferUtils.copyBufferToStream(out, ((ByteBufferExtendedCell) cell).getValueByteBuffer(),</span> |
| <span class="source-line-no">2407</span><span id="line-2407"> ((ByteBufferExtendedCell) cell).getValuePosition(), vlength);</span> |
| <span class="source-line-no">2408</span><span id="line-2408"> } else {</span> |
| <span class="source-line-no">2409</span><span id="line-2409"> out.write(cell.getValueArray(), cell.getValueOffset(), vlength);</span> |
| <span class="source-line-no">2410</span><span id="line-2410"> }</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"> * Writes the tag from the given cell to the output stream</span> |
| <span class="source-line-no">2415</span><span id="line-2415"> * @param out The outputstream to which the data has to be written</span> |
| <span class="source-line-no">2416</span><span id="line-2416"> * @param cell The cell whose contents has to be written</span> |
| <span class="source-line-no">2417</span><span id="line-2417"> * @param tagsLength the tag length</span> |
| <span class="source-line-no">2418</span><span id="line-2418"> */</span> |
| <span class="source-line-no">2419</span><span id="line-2419"> public static void writeTags(OutputStream out, ExtendedCell cell, int tagsLength)</span> |
| <span class="source-line-no">2420</span><span id="line-2420"> 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, ((ByteBufferExtendedCell) cell).getTagsByteBuffer(),</span> |
| <span class="source-line-no">2423</span><span id="line-2423"> ((ByteBufferExtendedCell) cell).getTagsPosition(), tagsLength);</span> |
| <span class="source-line-no">2424</span><span id="line-2424"> } else {</span> |
| <span class="source-line-no">2425</span><span id="line-2425"> out.write(cell.getTagsArray(), cell.getTagsOffset(), tagsLength);</span> |
| <span class="source-line-no">2426</span><span id="line-2426"> }</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"> * special case for Cell.equals</span> |
| <span class="source-line-no">2431</span><span id="line-2431"> */</span> |
| <span class="source-line-no">2432</span><span id="line-2432"> public static boolean equalsIgnoreMvccVersion(ExtendedCell a, ExtendedCell b) {</span> |
| <span class="source-line-no">2433</span><span id="line-2433"> // row</span> |
| <span class="source-line-no">2434</span><span id="line-2434"> boolean res = CellUtil.matchingRows(a, b);</span> |
| <span class="source-line-no">2435</span><span id="line-2435"> if (!res) {</span> |
| <span class="source-line-no">2436</span><span id="line-2436"> return res;</span> |
| <span class="source-line-no">2437</span><span id="line-2437"> }</span> |
| <span class="source-line-no">2438</span><span id="line-2438"></span> |
| <span class="source-line-no">2439</span><span id="line-2439"> // family</span> |
| <span class="source-line-no">2440</span><span id="line-2440"> res = CellUtil.matchingColumn(a, b);</span> |
| <span class="source-line-no">2441</span><span id="line-2441"> if (!res) {</span> |
| <span class="source-line-no">2442</span><span id="line-2442"> return res;</span> |
| <span class="source-line-no">2443</span><span id="line-2443"> }</span> |
| <span class="source-line-no">2444</span><span id="line-2444"></span> |
| <span class="source-line-no">2445</span><span id="line-2445"> // timestamp: later sorts first</span> |
| <span class="source-line-no">2446</span><span id="line-2446"> if (!CellUtil.matchingTimestamp(a, b)) {</span> |
| <span class="source-line-no">2447</span><span id="line-2447"> return false;</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"> // type</span> |
| <span class="source-line-no">2451</span><span id="line-2451"> int c = (0xff & b.getTypeByte()) - (0xff & a.getTypeByte());</span> |
| <span class="source-line-no">2452</span><span id="line-2452"> if (c != 0) {</span> |
| <span class="source-line-no">2453</span><span id="line-2453"> return false;</span> |
| <span class="source-line-no">2454</span><span id="line-2454"> } else {</span> |
| <span class="source-line-no">2455</span><span id="line-2455"> return true;</span> |
| <span class="source-line-no">2456</span><span id="line-2456"> }</span> |
| <span class="source-line-no">2457</span><span id="line-2457"> }</span> |
| <span class="source-line-no">2458</span><span id="line-2458"></span> |
| <span class="source-line-no">2459</span><span id="line-2459"> /**</span> |
| <span class="source-line-no">2460</span><span id="line-2460"> * Converts the rowkey bytes of the given cell into an int value</span> |
| <span class="source-line-no">2461</span><span id="line-2461"> * @return rowkey as int</span> |
| <span class="source-line-no">2462</span><span id="line-2462"> */</span> |
| <span class="source-line-no">2463</span><span id="line-2463"> public static int getRowAsInt(Cell cell) {</span> |
| <span class="source-line-no">2464</span><span id="line-2464"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2465</span><span id="line-2465"> return ByteBufferUtils.toInt(((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2466</span><span id="line-2466"> ((ByteBufferExtendedCell) cell).getRowPosition());</span> |
| <span class="source-line-no">2467</span><span id="line-2467"> }</span> |
| <span class="source-line-no">2468</span><span id="line-2468"> return Bytes.toInt(cell.getRowArray(), cell.getRowOffset());</span> |
| <span class="source-line-no">2469</span><span id="line-2469"> }</span> |
| <span class="source-line-no">2470</span><span id="line-2470"></span> |
| <span class="source-line-no">2471</span><span id="line-2471"> /**</span> |
| <span class="source-line-no">2472</span><span id="line-2472"> * Converts the value bytes of the given cell into a long value</span> |
| <span class="source-line-no">2473</span><span id="line-2473"> * @return value as long</span> |
| <span class="source-line-no">2474</span><span id="line-2474"> */</span> |
| <span class="source-line-no">2475</span><span id="line-2475"> public static long getValueAsLong(Cell cell) {</span> |
| <span class="source-line-no">2476</span><span id="line-2476"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2477</span><span id="line-2477"> return ByteBufferUtils.toLong(((ByteBufferExtendedCell) cell).getValueByteBuffer(),</span> |
| <span class="source-line-no">2478</span><span id="line-2478"> ((ByteBufferExtendedCell) cell).getValuePosition());</span> |
| <span class="source-line-no">2479</span><span id="line-2479"> }</span> |
| <span class="source-line-no">2480</span><span id="line-2480"> return Bytes.toLong(cell.getValueArray(), cell.getValueOffset());</span> |
| <span class="source-line-no">2481</span><span id="line-2481"> }</span> |
| <span class="source-line-no">2482</span><span id="line-2482"></span> |
| <span class="source-line-no">2483</span><span id="line-2483"> /**</span> |
| <span class="source-line-no">2484</span><span id="line-2484"> * Converts the value bytes of the given cell into a int value</span> |
| <span class="source-line-no">2485</span><span id="line-2485"> * @return value as int</span> |
| <span class="source-line-no">2486</span><span id="line-2486"> */</span> |
| <span class="source-line-no">2487</span><span id="line-2487"> public static int getValueAsInt(Cell cell) {</span> |
| <span class="source-line-no">2488</span><span id="line-2488"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2489</span><span id="line-2489"> return ByteBufferUtils.toInt(((ByteBufferExtendedCell) cell).getValueByteBuffer(),</span> |
| <span class="source-line-no">2490</span><span id="line-2490"> ((ByteBufferExtendedCell) cell).getValuePosition());</span> |
| <span class="source-line-no">2491</span><span id="line-2491"> }</span> |
| <span class="source-line-no">2492</span><span id="line-2492"> return Bytes.toInt(cell.getValueArray(), cell.getValueOffset());</span> |
| <span class="source-line-no">2493</span><span id="line-2493"> }</span> |
| <span class="source-line-no">2494</span><span id="line-2494"></span> |
| <span class="source-line-no">2495</span><span id="line-2495"> /**</span> |
| <span class="source-line-no">2496</span><span id="line-2496"> * Converts the value bytes of the given cell into a double value</span> |
| <span class="source-line-no">2497</span><span id="line-2497"> * @return value as double</span> |
| <span class="source-line-no">2498</span><span id="line-2498"> */</span> |
| <span class="source-line-no">2499</span><span id="line-2499"> public static double getValueAsDouble(Cell cell) {</span> |
| <span class="source-line-no">2500</span><span id="line-2500"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2501</span><span id="line-2501"> return ByteBufferUtils.toDouble(((ByteBufferExtendedCell) cell).getValueByteBuffer(),</span> |
| <span class="source-line-no">2502</span><span id="line-2502"> ((ByteBufferExtendedCell) cell).getValuePosition());</span> |
| <span class="source-line-no">2503</span><span id="line-2503"> }</span> |
| <span class="source-line-no">2504</span><span id="line-2504"> return Bytes.toDouble(cell.getValueArray(), cell.getValueOffset());</span> |
| <span class="source-line-no">2505</span><span id="line-2505"> }</span> |
| <span class="source-line-no">2506</span><span id="line-2506"></span> |
| <span class="source-line-no">2507</span><span id="line-2507"> /**</span> |
| <span class="source-line-no">2508</span><span id="line-2508"> * Converts the value bytes of the given cell into a BigDecimal</span> |
| <span class="source-line-no">2509</span><span id="line-2509"> * @return value as BigDecimal</span> |
| <span class="source-line-no">2510</span><span id="line-2510"> */</span> |
| <span class="source-line-no">2511</span><span id="line-2511"> public static BigDecimal getValueAsBigDecimal(Cell cell) {</span> |
| <span class="source-line-no">2512</span><span id="line-2512"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2513</span><span id="line-2513"> return ByteBufferUtils.toBigDecimal(((ByteBufferExtendedCell) cell).getValueByteBuffer(),</span> |
| <span class="source-line-no">2514</span><span id="line-2514"> ((ByteBufferExtendedCell) cell).getValuePosition(), cell.getValueLength());</span> |
| <span class="source-line-no">2515</span><span id="line-2515"> }</span> |
| <span class="source-line-no">2516</span><span id="line-2516"> return Bytes.toBigDecimal(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());</span> |
| <span class="source-line-no">2517</span><span id="line-2517"> }</span> |
| <span class="source-line-no">2518</span><span id="line-2518"></span> |
| <span class="source-line-no">2519</span><span id="line-2519"> /**</span> |
| <span class="source-line-no">2520</span><span id="line-2520"> * Compresses the tags to the given outputstream using the TagcompressionContext</span> |
| <span class="source-line-no">2521</span><span id="line-2521"> * @param out the outputstream to which the compression should happen</span> |
| <span class="source-line-no">2522</span><span id="line-2522"> * @param cell the cell which has tags</span> |
| <span class="source-line-no">2523</span><span id="line-2523"> * @param tagCompressionContext the TagCompressionContext</span> |
| <span class="source-line-no">2524</span><span id="line-2524"> * @throws IOException can throw IOException if the compression encounters issue</span> |
| <span class="source-line-no">2525</span><span id="line-2525"> */</span> |
| <span class="source-line-no">2526</span><span id="line-2526"> public static void compressTags(OutputStream out, ExtendedCell cell,</span> |
| <span class="source-line-no">2527</span><span id="line-2527"> TagCompressionContext tagCompressionContext) throws IOException {</span> |
| <span class="source-line-no">2528</span><span id="line-2528"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2529</span><span id="line-2529"> tagCompressionContext.compressTags(out, ((ByteBufferExtendedCell) cell).getTagsByteBuffer(),</span> |
| <span class="source-line-no">2530</span><span id="line-2530"> ((ByteBufferExtendedCell) cell).getTagsPosition(), cell.getTagsLength());</span> |
| <span class="source-line-no">2531</span><span id="line-2531"> } else {</span> |
| <span class="source-line-no">2532</span><span id="line-2532"> tagCompressionContext.compressTags(out, cell.getTagsArray(), cell.getTagsOffset(),</span> |
| <span class="source-line-no">2533</span><span id="line-2533"> cell.getTagsLength());</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"> public static void compressRow(OutputStream out, Cell cell, Dictionary dict) throws IOException {</span> |
| <span class="source-line-no">2538</span><span id="line-2538"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2539</span><span id="line-2539"> Dictionary.write(out, ((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2540</span><span id="line-2540"> ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength(), dict);</span> |
| <span class="source-line-no">2541</span><span id="line-2541"> } else {</span> |
| <span class="source-line-no">2542</span><span id="line-2542"> Dictionary.write(out, cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(), dict);</span> |
| <span class="source-line-no">2543</span><span id="line-2543"> }</span> |
| <span class="source-line-no">2544</span><span id="line-2544"> }</span> |
| <span class="source-line-no">2545</span><span id="line-2545"></span> |
| <span class="source-line-no">2546</span><span id="line-2546"> public static void compressFamily(OutputStream out, Cell cell, Dictionary dict)</span> |
| <span class="source-line-no">2547</span><span id="line-2547"> throws IOException {</span> |
| <span class="source-line-no">2548</span><span id="line-2548"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2549</span><span id="line-2549"> Dictionary.write(out, ((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),</span> |
| <span class="source-line-no">2550</span><span id="line-2550"> ((ByteBufferExtendedCell) cell).getFamilyPosition(), cell.getFamilyLength(), dict);</span> |
| <span class="source-line-no">2551</span><span id="line-2551"> } else {</span> |
| <span class="source-line-no">2552</span><span id="line-2552"> Dictionary.write(out, cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength(),</span> |
| <span class="source-line-no">2553</span><span id="line-2553"> dict);</span> |
| <span class="source-line-no">2554</span><span id="line-2554"> }</span> |
| <span class="source-line-no">2555</span><span id="line-2555"> }</span> |
| <span class="source-line-no">2556</span><span id="line-2556"></span> |
| <span class="source-line-no">2557</span><span id="line-2557"> public static void compressQualifier(OutputStream out, Cell cell, Dictionary dict)</span> |
| <span class="source-line-no">2558</span><span id="line-2558"> throws IOException {</span> |
| <span class="source-line-no">2559</span><span id="line-2559"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2560</span><span id="line-2560"> Dictionary.write(out, ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">2561</span><span id="line-2561"> ((ByteBufferExtendedCell) cell).getQualifierPosition(), cell.getQualifierLength(), dict);</span> |
| <span class="source-line-no">2562</span><span id="line-2562"> } else {</span> |
| <span class="source-line-no">2563</span><span id="line-2563"> Dictionary.write(out, cell.getQualifierArray(), cell.getQualifierOffset(),</span> |
| <span class="source-line-no">2564</span><span id="line-2564"> cell.getQualifierLength(), dict);</span> |
| <span class="source-line-no">2565</span><span id="line-2565"> }</span> |
| <span class="source-line-no">2566</span><span id="line-2566"> }</span> |
| <span class="source-line-no">2567</span><span id="line-2567"></span> |
| <span class="source-line-no">2568</span><span id="line-2568"> /**</span> |
| <span class="source-line-no">2569</span><span id="line-2569"> * 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">2570</span><span id="line-2570"> * the index block, bloom keys from the bloom blocks This byte[] is expected to be serialized in</span> |
| <span class="source-line-no">2571</span><span id="line-2571"> * the KeyValue serialization format If the KeyValue (Cell's) serialization format changes this</span> |
| <span class="source-line-no">2572</span><span id="line-2572"> * method cannot be used.</span> |
| <span class="source-line-no">2573</span><span id="line-2573"> * @param comparator the {@link CellComparator} to use for comparison</span> |
| <span class="source-line-no">2574</span><span id="line-2574"> * @param left the cell to be compared</span> |
| <span class="source-line-no">2575</span><span id="line-2575"> * @param key the serialized key part of a KeyValue</span> |
| <span class="source-line-no">2576</span><span id="line-2576"> * @param offset the offset in the key byte[]</span> |
| <span class="source-line-no">2577</span><span id="line-2577"> * @param length the length of the key byte[]</span> |
| <span class="source-line-no">2578</span><span id="line-2578"> * @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">2579</span><span id="line-2579"> * than right equal to 0 if left is equal to right</span> |
| <span class="source-line-no">2580</span><span id="line-2580"> */</span> |
| <span class="source-line-no">2581</span><span id="line-2581"> public static final int compare(CellComparator comparator, ExtendedCell left, byte[] key,</span> |
| <span class="source-line-no">2582</span><span id="line-2582"> int offset, int length) {</span> |
| <span class="source-line-no">2583</span><span id="line-2583"> // row</span> |
| <span class="source-line-no">2584</span><span id="line-2584"> short rrowlength = Bytes.toShort(key, offset);</span> |
| <span class="source-line-no">2585</span><span id="line-2585"> int c = comparator.compareRows(left, key, offset + Bytes.SIZEOF_SHORT, rrowlength);</span> |
| <span class="source-line-no">2586</span><span id="line-2586"> if (c != 0) return c;</span> |
| <span class="source-line-no">2587</span><span id="line-2587"></span> |
| <span class="source-line-no">2588</span><span id="line-2588"> // Compare the rest of the two KVs without making any assumptions about</span> |
| <span class="source-line-no">2589</span><span id="line-2589"> // the common prefix. This function will not compare rows anyway, so we</span> |
| <span class="source-line-no">2590</span><span id="line-2590"> // don't need to tell it that the common prefix includes the row.</span> |
| <span class="source-line-no">2591</span><span id="line-2591"> return compareWithoutRow(comparator, left, key, offset, length, rrowlength);</span> |
| <span class="source-line-no">2592</span><span id="line-2592"> }</span> |
| <span class="source-line-no">2593</span><span id="line-2593"></span> |
| <span class="source-line-no">2594</span><span id="line-2594"> /**</span> |
| <span class="source-line-no">2595</span><span id="line-2595"> * Compare columnFamily, qualifier, timestamp, and key type (everything except the row). This</span> |
| <span class="source-line-no">2596</span><span id="line-2596"> * method is used both in the normal comparator and the "same-prefix" comparator. Note that we are</span> |
| <span class="source-line-no">2597</span><span id="line-2597"> * assuming that row portions of both KVs have already been parsed and found identical, and we</span> |
| <span class="source-line-no">2598</span><span id="line-2598"> * don't validate that assumption here.</span> |
| <span class="source-line-no">2599</span><span id="line-2599"> * @param comparator the {@link CellComparator} to use for comparison</span> |
| <span class="source-line-no">2600</span><span id="line-2600"> * @param left the cell to be compared</span> |
| <span class="source-line-no">2601</span><span id="line-2601"> * @param right the serialized key part of a key-value</span> |
| <span class="source-line-no">2602</span><span id="line-2602"> * @param roffset the offset in the key byte[]</span> |
| <span class="source-line-no">2603</span><span id="line-2603"> * @param rlength the length of the key byte[]</span> |
| <span class="source-line-no">2604</span><span id="line-2604"> * @param rowlength the row length</span> |
| <span class="source-line-no">2605</span><span id="line-2605"> * @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">2606</span><span id="line-2606"> * cells are equal</span> |
| <span class="source-line-no">2607</span><span id="line-2607"> */</span> |
| <span class="source-line-no">2608</span><span id="line-2608"> static final int compareWithoutRow(CellComparator comparator, ExtendedCell left, byte[] right,</span> |
| <span class="source-line-no">2609</span><span id="line-2609"> int roffset, int rlength, short rowlength) {</span> |
| <span class="source-line-no">2610</span><span id="line-2610"> /***</span> |
| <span class="source-line-no">2611</span><span id="line-2611"> * KeyValue Format and commonLength:</span> |
| <span class="source-line-no">2612</span><span id="line-2612"> * |_keyLen_|_valLen_|_rowLen_|_rowKey_|_famiLen_|_fami_|_Quali_|....</span> |
| <span class="source-line-no">2613</span><span id="line-2613"> * ------------------|-------commonLength--------|--------------</span> |
| <span class="source-line-no">2614</span><span id="line-2614"> */</span> |
| <span class="source-line-no">2615</span><span id="line-2615"> int commonLength = KeyValue.ROW_LENGTH_SIZE + KeyValue.FAMILY_LENGTH_SIZE + rowlength;</span> |
| <span class="source-line-no">2616</span><span id="line-2616"></span> |
| <span class="source-line-no">2617</span><span id="line-2617"> // commonLength + TIMESTAMP_TYPE_SIZE</span> |
| <span class="source-line-no">2618</span><span id="line-2618"> int commonLengthWithTSAndType = KeyValue.TIMESTAMP_TYPE_SIZE + commonLength;</span> |
| <span class="source-line-no">2619</span><span id="line-2619"> // ColumnFamily + Qualifier length.</span> |
| <span class="source-line-no">2620</span><span id="line-2620"> int lcolumnlength = left.getFamilyLength() + left.getQualifierLength();</span> |
| <span class="source-line-no">2621</span><span id="line-2621"> int rcolumnlength = rlength - commonLengthWithTSAndType;</span> |
| <span class="source-line-no">2622</span><span id="line-2622"></span> |
| <span class="source-line-no">2623</span><span id="line-2623"> byte ltype = left.getTypeByte();</span> |
| <span class="source-line-no">2624</span><span id="line-2624"> byte rtype = right[roffset + (rlength - 1)];</span> |
| <span class="source-line-no">2625</span><span id="line-2625"></span> |
| <span class="source-line-no">2626</span><span id="line-2626"> // If the column is not specified, the "minimum" key type appears the</span> |
| <span class="source-line-no">2627</span><span id="line-2627"> // latest in the sorted order, regardless of the timestamp. This is used</span> |
| <span class="source-line-no">2628</span><span id="line-2628"> // for specifying the last key/value in a given row, because there is no</span> |
| <span class="source-line-no">2629</span><span id="line-2629"> // "lexicographically last column" (it would be infinitely long). The</span> |
| <span class="source-line-no">2630</span><span id="line-2630"> // "maximum" key type does not need this behavior.</span> |
| <span class="source-line-no">2631</span><span id="line-2631"> if (lcolumnlength == 0 && ltype == KeyValue.Type.Minimum.getCode()) {</span> |
| <span class="source-line-no">2632</span><span id="line-2632"> // left is "bigger", i.e. it appears later in the sorted order</span> |
| <span class="source-line-no">2633</span><span id="line-2633"> return 1;</span> |
| <span class="source-line-no">2634</span><span id="line-2634"> }</span> |
| <span class="source-line-no">2635</span><span id="line-2635"> if (rcolumnlength == 0 && rtype == KeyValue.Type.Minimum.getCode()) {</span> |
| <span class="source-line-no">2636</span><span id="line-2636"> return -1;</span> |
| <span class="source-line-no">2637</span><span id="line-2637"> }</span> |
| <span class="source-line-no">2638</span><span id="line-2638"></span> |
| <span class="source-line-no">2639</span><span id="line-2639"> int rfamilyoffset = commonLength + roffset;</span> |
| <span class="source-line-no">2640</span><span id="line-2640"></span> |
| <span class="source-line-no">2641</span><span id="line-2641"> // Column family length.</span> |
| <span class="source-line-no">2642</span><span id="line-2642"> int lfamilylength = left.getFamilyLength();</span> |
| <span class="source-line-no">2643</span><span id="line-2643"> int rfamilylength = right[rfamilyoffset - 1];</span> |
| <span class="source-line-no">2644</span><span id="line-2644"> // If left family size is not equal to right family size, we need not</span> |
| <span class="source-line-no">2645</span><span id="line-2645"> // compare the qualifiers.</span> |
| <span class="source-line-no">2646</span><span id="line-2646"> boolean sameFamilySize = (lfamilylength == rfamilylength);</span> |
| <span class="source-line-no">2647</span><span id="line-2647"> if (!sameFamilySize) {</span> |
| <span class="source-line-no">2648</span><span id="line-2648"> // comparing column family is enough.</span> |
| <span class="source-line-no">2649</span><span id="line-2649"> return CellUtil.compareFamilies(left, right, rfamilyoffset, rfamilylength);</span> |
| <span class="source-line-no">2650</span><span id="line-2650"> }</span> |
| <span class="source-line-no">2651</span><span id="line-2651"> // Compare family & qualifier together.</span> |
| <span class="source-line-no">2652</span><span id="line-2652"> // Families are same. Compare on qualifiers.</span> |
| <span class="source-line-no">2653</span><span id="line-2653"> int comparison = CellUtil.compareColumns(left, right, rfamilyoffset, rfamilylength,</span> |
| <span class="source-line-no">2654</span><span id="line-2654"> rfamilyoffset + rfamilylength, (rcolumnlength - rfamilylength));</span> |
| <span class="source-line-no">2655</span><span id="line-2655"> if (comparison != 0) {</span> |
| <span class="source-line-no">2656</span><span id="line-2656"> return comparison;</span> |
| <span class="source-line-no">2657</span><span id="line-2657"> }</span> |
| <span class="source-line-no">2658</span><span id="line-2658"></span> |
| <span class="source-line-no">2659</span><span id="line-2659"> // //</span> |
| <span class="source-line-no">2660</span><span id="line-2660"> // Next compare timestamps.</span> |
| <span class="source-line-no">2661</span><span id="line-2661"> long rtimestamp = Bytes.toLong(right, roffset + (rlength - KeyValue.TIMESTAMP_TYPE_SIZE));</span> |
| <span class="source-line-no">2662</span><span id="line-2662"> int compare = comparator.compareTimestamps(left.getTimestamp(), rtimestamp);</span> |
| <span class="source-line-no">2663</span><span id="line-2663"> if (compare != 0) {</span> |
| <span class="source-line-no">2664</span><span id="line-2664"> return compare;</span> |
| <span class="source-line-no">2665</span><span id="line-2665"> }</span> |
| <span class="source-line-no">2666</span><span id="line-2666"></span> |
| <span class="source-line-no">2667</span><span id="line-2667"> // Compare types. Let the delete types sort ahead of puts; i.e. types</span> |
| <span class="source-line-no">2668</span><span id="line-2668"> // of higher numbers sort before those of lesser numbers. Maximum (255)</span> |
| <span class="source-line-no">2669</span><span id="line-2669"> // appears ahead of everything, and minimum (0) appears after</span> |
| <span class="source-line-no">2670</span><span id="line-2670"> // everything.</span> |
| <span class="source-line-no">2671</span><span id="line-2671"> return (0xff & rtype) - (0xff & ltype);</span> |
| <span class="source-line-no">2672</span><span id="line-2672"> }</span> |
| <span class="source-line-no">2673</span><span id="line-2673"></span> |
| <span class="source-line-no">2674</span><span id="line-2674"> /**</span> |
| <span class="source-line-no">2675</span><span id="line-2675"> * Return a new cell is located following input cell. If both of type and timestamp are minimum,</span> |
| <span class="source-line-no">2676</span><span id="line-2676"> * the input cell will be returned directly.</span> |
| <span class="source-line-no">2677</span><span id="line-2677"> */</span> |
| <span class="source-line-no">2678</span><span id="line-2678"> public static ExtendedCell createNextOnRowCol(ExtendedCell cell) {</span> |
| <span class="source-line-no">2679</span><span id="line-2679"> long ts = cell.getTimestamp();</span> |
| <span class="source-line-no">2680</span><span id="line-2680"> byte type = cell.getTypeByte();</span> |
| <span class="source-line-no">2681</span><span id="line-2681"> if (type != KeyValue.Type.Minimum.getCode()) {</span> |
| <span class="source-line-no">2682</span><span id="line-2682"> type = KeyValue.Type.values()[KeyValue.Type.codeToType(type).ordinal() - 1].getCode();</span> |
| <span class="source-line-no">2683</span><span id="line-2683"> } else if (ts != PrivateConstants.OLDEST_TIMESTAMP) {</span> |
| <span class="source-line-no">2684</span><span id="line-2684"> ts = ts - 1;</span> |
| <span class="source-line-no">2685</span><span id="line-2685"> type = KeyValue.Type.Maximum.getCode();</span> |
| <span class="source-line-no">2686</span><span id="line-2686"> } else {</span> |
| <span class="source-line-no">2687</span><span id="line-2687"> return cell;</span> |
| <span class="source-line-no">2688</span><span id="line-2688"> }</span> |
| <span class="source-line-no">2689</span><span id="line-2689"> return createNextOnRowCol(cell, ts, type);</span> |
| <span class="source-line-no">2690</span><span id="line-2690"> }</span> |
| <span class="source-line-no">2691</span><span id="line-2691"></span> |
| <span class="source-line-no">2692</span><span id="line-2692"> static ExtendedCell createNextOnRowCol(ExtendedCell cell, long ts, byte type) {</span> |
| <span class="source-line-no">2693</span><span id="line-2693"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2694</span><span id="line-2694"> return new LastOnRowColByteBufferExtendedCell(</span> |
| <span class="source-line-no">2695</span><span id="line-2695"> ((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2696</span><span id="line-2696"> ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength(),</span> |
| <span class="source-line-no">2697</span><span id="line-2697"> ((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),</span> |
| <span class="source-line-no">2698</span><span id="line-2698"> ((ByteBufferExtendedCell) cell).getFamilyPosition(), cell.getFamilyLength(),</span> |
| <span class="source-line-no">2699</span><span id="line-2699"> ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">2700</span><span id="line-2700"> ((ByteBufferExtendedCell) cell).getQualifierPosition(), cell.getQualifierLength()) {</span> |
| <span class="source-line-no">2701</span><span id="line-2701"> @Override</span> |
| <span class="source-line-no">2702</span><span id="line-2702"> public long getTimestamp() {</span> |
| <span class="source-line-no">2703</span><span id="line-2703"> return ts;</span> |
| <span class="source-line-no">2704</span><span id="line-2704"> }</span> |
| <span class="source-line-no">2705</span><span id="line-2705"></span> |
| <span class="source-line-no">2706</span><span id="line-2706"> @Override</span> |
| <span class="source-line-no">2707</span><span id="line-2707"> public byte getTypeByte() {</span> |
| <span class="source-line-no">2708</span><span id="line-2708"> return type;</span> |
| <span class="source-line-no">2709</span><span id="line-2709"> }</span> |
| <span class="source-line-no">2710</span><span id="line-2710"> };</span> |
| <span class="source-line-no">2711</span><span id="line-2711"> }</span> |
| <span class="source-line-no">2712</span><span id="line-2712"> return new LastOnRowColCell(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(),</span> |
| <span class="source-line-no">2713</span><span id="line-2713"> cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength(),</span> |
| <span class="source-line-no">2714</span><span id="line-2714"> cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()) {</span> |
| <span class="source-line-no">2715</span><span id="line-2715"> @Override</span> |
| <span class="source-line-no">2716</span><span id="line-2716"> public long getTimestamp() {</span> |
| <span class="source-line-no">2717</span><span id="line-2717"> return ts;</span> |
| <span class="source-line-no">2718</span><span id="line-2718"> }</span> |
| <span class="source-line-no">2719</span><span id="line-2719"></span> |
| <span class="source-line-no">2720</span><span id="line-2720"> @Override</span> |
| <span class="source-line-no">2721</span><span id="line-2721"> public byte getTypeByte() {</span> |
| <span class="source-line-no">2722</span><span id="line-2722"> return type;</span> |
| <span class="source-line-no">2723</span><span id="line-2723"> }</span> |
| <span class="source-line-no">2724</span><span id="line-2724"> };</span> |
| <span class="source-line-no">2725</span><span id="line-2725"> }</span> |
| <span class="source-line-no">2726</span><span id="line-2726"></span> |
| <span class="source-line-no">2727</span><span id="line-2727"> /**</span> |
| <span class="source-line-no">2728</span><span id="line-2728"> * Estimate based on keyvalue's serialization format in the RPC layer. Note that there is an extra</span> |
| <span class="source-line-no">2729</span><span id="line-2729"> * SIZEOF_INT added to the size here that indicates the actual length of the cell for cases where</span> |
| <span class="source-line-no">2730</span><span id="line-2730"> * cell's are serialized in a contiguous format (For eg in RPCs).</span> |
| <span class="source-line-no">2731</span><span id="line-2731"> * @return Estimate of the <code>cell</code> size in bytes plus an extra SIZEOF_INT indicating the</span> |
| <span class="source-line-no">2732</span><span id="line-2732"> * actual cell length.</span> |
| <span class="source-line-no">2733</span><span id="line-2733"> */</span> |
| <span class="source-line-no">2734</span><span id="line-2734"> public static int estimatedSerializedSizeOf(final Cell cell) {</span> |
| <span class="source-line-no">2735</span><span id="line-2735"> return cell.getSerializedSize() + Bytes.SIZEOF_INT;</span> |
| <span class="source-line-no">2736</span><span id="line-2736"> }</span> |
| <span class="source-line-no">2737</span><span id="line-2737"></span> |
| <span class="source-line-no">2738</span><span id="line-2738"> /**</span> |
| <span class="source-line-no">2739</span><span id="line-2739"> * Calculates the serialized key size. We always serialize in the KeyValue's serialization format.</span> |
| <span class="source-line-no">2740</span><span id="line-2740"> * @param cell the cell for which the key size has to be calculated.</span> |
| <span class="source-line-no">2741</span><span id="line-2741"> * @return the key size</span> |
| <span class="source-line-no">2742</span><span id="line-2742"> */</span> |
| <span class="source-line-no">2743</span><span id="line-2743"> public static int estimatedSerializedSizeOfKey(final Cell cell) {</span> |
| <span class="source-line-no">2744</span><span id="line-2744"> if (cell instanceof KeyValue) return ((KeyValue) cell).getKeyLength();</span> |
| <span class="source-line-no">2745</span><span id="line-2745"> return cell.getRowLength() + cell.getFamilyLength() + cell.getQualifierLength()</span> |
| <span class="source-line-no">2746</span><span id="line-2746"> + KeyValue.KEY_INFRASTRUCTURE_SIZE;</span> |
| <span class="source-line-no">2747</span><span id="line-2747"> }</span> |
| <span class="source-line-no">2748</span><span id="line-2748"></span> |
| <span class="source-line-no">2749</span><span id="line-2749"> /**</span> |
| <span class="source-line-no">2750</span><span id="line-2750"> * This method exists just to encapsulate how we serialize keys. To be replaced by a factory that</span> |
| <span class="source-line-no">2751</span><span id="line-2751"> * we query to figure what the Cell implementation is and then, what serialization engine to use</span> |
| <span class="source-line-no">2752</span><span id="line-2752"> * and further, how to serialize the key for inclusion in hfile index. TODO.</span> |
| <span class="source-line-no">2753</span><span id="line-2753"> * @return The key portion of the Cell serialized in the old-school KeyValue way or null if passed</span> |
| <span class="source-line-no">2754</span><span id="line-2754"> * a null <code>cell</code></span> |
| <span class="source-line-no">2755</span><span id="line-2755"> */</span> |
| <span class="source-line-no">2756</span><span id="line-2756"> public static byte[] getCellKeySerializedAsKeyValueKey(final ExtendedCell cell) {</span> |
| <span class="source-line-no">2757</span><span id="line-2757"> if (cell == null) return null;</span> |
| <span class="source-line-no">2758</span><span id="line-2758"> byte[] b = new byte[KeyValueUtil.keyLength(cell)];</span> |
| <span class="source-line-no">2759</span><span id="line-2759"> KeyValueUtil.appendKeyTo(cell, b, 0);</span> |
| <span class="source-line-no">2760</span><span id="line-2760"> return b;</span> |
| <span class="source-line-no">2761</span><span id="line-2761"> }</span> |
| <span class="source-line-no">2762</span><span id="line-2762"></span> |
| <span class="source-line-no">2763</span><span id="line-2763"> /**</span> |
| <span class="source-line-no">2764</span><span id="line-2764"> * Create a Cell that is smaller than all other possible Cells for the given Cell's row.</span> |
| <span class="source-line-no">2765</span><span id="line-2765"> * @return First possible Cell on passed Cell's row.</span> |
| <span class="source-line-no">2766</span><span id="line-2766"> */</span> |
| <span class="source-line-no">2767</span><span id="line-2767"> public static ExtendedCell createFirstOnRow(final Cell cell) {</span> |
| <span class="source-line-no">2768</span><span id="line-2768"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2769</span><span id="line-2769"> return new FirstOnRowByteBufferExtendedCell(</span> |
| <span class="source-line-no">2770</span><span id="line-2770"> ((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2771</span><span id="line-2771"> ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength());</span> |
| <span class="source-line-no">2772</span><span id="line-2772"> }</span> |
| <span class="source-line-no">2773</span><span id="line-2773"> return new FirstOnRowCell(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());</span> |
| <span class="source-line-no">2774</span><span id="line-2774"> }</span> |
| <span class="source-line-no">2775</span><span id="line-2775"></span> |
| <span class="source-line-no">2776</span><span id="line-2776"> public static ExtendedCell createFirstOnRow(final byte[] row, int roffset, short rlength) {</span> |
| <span class="source-line-no">2777</span><span id="line-2777"> return new FirstOnRowCell(row, roffset, rlength);</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"> public static ExtendedCell createFirstOnRow(final byte[] row, final byte[] family,</span> |
| <span class="source-line-no">2781</span><span id="line-2781"> final byte[] col) {</span> |
| <span class="source-line-no">2782</span><span id="line-2782"> return createFirstOnRow(row, 0, (short) row.length, family, 0, (byte) family.length, col, 0,</span> |
| <span class="source-line-no">2783</span><span id="line-2783"> col.length);</span> |
| <span class="source-line-no">2784</span><span id="line-2784"> }</span> |
| <span class="source-line-no">2785</span><span id="line-2785"></span> |
| <span class="source-line-no">2786</span><span id="line-2786"> public static ExtendedCell createFirstOnRow(final byte[] row, int roffset, short rlength,</span> |
| <span class="source-line-no">2787</span><span id="line-2787"> final byte[] family, int foffset, byte flength, final byte[] col, int coffset, int clength) {</span> |
| <span class="source-line-no">2788</span><span id="line-2788"> return new FirstOnRowColCell(row, roffset, rlength, family, foffset, flength, col, coffset,</span> |
| <span class="source-line-no">2789</span><span id="line-2789"> clength);</span> |
| <span class="source-line-no">2790</span><span id="line-2790"> }</span> |
| <span class="source-line-no">2791</span><span id="line-2791"></span> |
| <span class="source-line-no">2792</span><span id="line-2792"> public static ExtendedCell createFirstOnRow(final byte[] row) {</span> |
| <span class="source-line-no">2793</span><span id="line-2793"> return createFirstOnRow(row, 0, (short) row.length);</span> |
| <span class="source-line-no">2794</span><span id="line-2794"> }</span> |
| <span class="source-line-no">2795</span><span id="line-2795"></span> |
| <span class="source-line-no">2796</span><span id="line-2796"> public static ExtendedCell createFirstOnRowFamily(Cell cell, byte[] fArray, int foff, int flen) {</span> |
| <span class="source-line-no">2797</span><span id="line-2797"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2798</span><span id="line-2798"> return new FirstOnRowColByteBufferExtendedCell(</span> |
| <span class="source-line-no">2799</span><span id="line-2799"> ((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2800</span><span id="line-2800"> ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength(),</span> |
| <span class="source-line-no">2801</span><span id="line-2801"> ByteBuffer.wrap(fArray), foff, (byte) flen, HConstants.EMPTY_BYTE_BUFFER, 0, 0);</span> |
| <span class="source-line-no">2802</span><span id="line-2802"> }</span> |
| <span class="source-line-no">2803</span><span id="line-2803"> return new FirstOnRowColCell(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(),</span> |
| <span class="source-line-no">2804</span><span id="line-2804"> fArray, foff, (byte) flen, HConstants.EMPTY_BYTE_ARRAY, 0, 0);</span> |
| <span class="source-line-no">2805</span><span id="line-2805"> }</span> |
| <span class="source-line-no">2806</span><span id="line-2806"></span> |
| <span class="source-line-no">2807</span><span id="line-2807"> public static ExtendedCell createFirstOnRowCol(final Cell cell) {</span> |
| <span class="source-line-no">2808</span><span id="line-2808"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2809</span><span id="line-2809"> return new FirstOnRowColByteBufferExtendedCell(</span> |
| <span class="source-line-no">2810</span><span id="line-2810"> ((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2811</span><span id="line-2811"> ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength(),</span> |
| <span class="source-line-no">2812</span><span id="line-2812"> HConstants.EMPTY_BYTE_BUFFER, 0, (byte) 0,</span> |
| <span class="source-line-no">2813</span><span id="line-2813"> ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">2814</span><span id="line-2814"> ((ByteBufferExtendedCell) cell).getQualifierPosition(), cell.getQualifierLength());</span> |
| <span class="source-line-no">2815</span><span id="line-2815"> }</span> |
| <span class="source-line-no">2816</span><span id="line-2816"> return new FirstOnRowColCell(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(),</span> |
| <span class="source-line-no">2817</span><span id="line-2817"> HConstants.EMPTY_BYTE_ARRAY, 0, (byte) 0, cell.getQualifierArray(), cell.getQualifierOffset(),</span> |
| <span class="source-line-no">2818</span><span id="line-2818"> cell.getQualifierLength());</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 createFirstOnNextRow(final Cell cell) {</span> |
| <span class="source-line-no">2822</span><span id="line-2822"> byte[] nextRow = new byte[cell.getRowLength() + 1];</span> |
| <span class="source-line-no">2823</span><span id="line-2823"> CellUtil.copyRowTo(cell, nextRow, 0);</span> |
| <span class="source-line-no">2824</span><span id="line-2824"> nextRow[nextRow.length - 1] = 0;// maybe not necessary</span> |
| <span class="source-line-no">2825</span><span id="line-2825"> return new FirstOnRowCell(nextRow, 0, (short) nextRow.length);</span> |
| <span class="source-line-no">2826</span><span id="line-2826"> }</span> |
| <span class="source-line-no">2827</span><span id="line-2827"></span> |
| <span class="source-line-no">2828</span><span id="line-2828"> /**</span> |
| <span class="source-line-no">2829</span><span id="line-2829"> * 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">2830</span><span id="line-2830"> * passed qualifier.</span> |
| <span class="source-line-no">2831</span><span id="line-2831"> * @return Last possible Cell on passed Cell's rk:cf and passed qualifier.</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 createFirstOnRowCol(final Cell cell, byte[] qArray, int qoffest,</span> |
| <span class="source-line-no">2834</span><span id="line-2834"> int qlength) {</span> |
| <span class="source-line-no">2835</span><span id="line-2835"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2836</span><span id="line-2836"> return new FirstOnRowColByteBufferExtendedCell(</span> |
| <span class="source-line-no">2837</span><span id="line-2837"> ((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2838</span><span id="line-2838"> ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength(),</span> |
| <span class="source-line-no">2839</span><span id="line-2839"> ((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),</span> |
| <span class="source-line-no">2840</span><span id="line-2840"> ((ByteBufferExtendedCell) cell).getFamilyPosition(), cell.getFamilyLength(),</span> |
| <span class="source-line-no">2841</span><span id="line-2841"> ByteBuffer.wrap(qArray), qoffest, qlength);</span> |
| <span class="source-line-no">2842</span><span id="line-2842"> }</span> |
| <span class="source-line-no">2843</span><span id="line-2843"> return new FirstOnRowColCell(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(),</span> |
| <span class="source-line-no">2844</span><span id="line-2844"> cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength(), qArray, qoffest,</span> |
| <span class="source-line-no">2845</span><span id="line-2845"> qlength);</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"> /**</span> |
| <span class="source-line-no">2849</span><span id="line-2849"> * Creates the first cell with the row/family/qualifier of this cell and the given timestamp. Uses</span> |
| <span class="source-line-no">2850</span><span id="line-2850"> * the "maximum" type that guarantees that the new cell is the lowest possible for this</span> |
| <span class="source-line-no">2851</span><span id="line-2851"> * combination of row, family, qualifier, and timestamp. This cell's own timestamp is ignored.</span> |
| <span class="source-line-no">2852</span><span id="line-2852"> * @param cell - cell</span> |
| <span class="source-line-no">2853</span><span id="line-2853"> */</span> |
| <span class="source-line-no">2854</span><span id="line-2854"> public static ExtendedCell createFirstOnRowColTS(Cell cell, long ts) {</span> |
| <span class="source-line-no">2855</span><span id="line-2855"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2856</span><span id="line-2856"> return new FirstOnRowColTSByteBufferExtendedCell(</span> |
| <span class="source-line-no">2857</span><span id="line-2857"> ((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2858</span><span id="line-2858"> ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength(),</span> |
| <span class="source-line-no">2859</span><span id="line-2859"> ((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),</span> |
| <span class="source-line-no">2860</span><span id="line-2860"> ((ByteBufferExtendedCell) cell).getFamilyPosition(), cell.getFamilyLength(),</span> |
| <span class="source-line-no">2861</span><span id="line-2861"> ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">2862</span><span id="line-2862"> ((ByteBufferExtendedCell) cell).getQualifierPosition(), cell.getQualifierLength(), ts);</span> |
| <span class="source-line-no">2863</span><span id="line-2863"> }</span> |
| <span class="source-line-no">2864</span><span id="line-2864"> return new FirstOnRowColTSCell(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(),</span> |
| <span class="source-line-no">2865</span><span id="line-2865"> cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength(),</span> |
| <span class="source-line-no">2866</span><span id="line-2866"> cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength(), ts);</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 larger than all other possible Cells for the given Cell's row.</span> |
| <span class="source-line-no">2871</span><span id="line-2871"> * @return Last possible Cell on passed Cell's row.</span> |
| <span class="source-line-no">2872</span><span id="line-2872"> */</span> |
| <span class="source-line-no">2873</span><span id="line-2873"> public static ExtendedCell createLastOnRow(final Cell cell) {</span> |
| <span class="source-line-no">2874</span><span id="line-2874"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2875</span><span id="line-2875"> return new LastOnRowByteBufferExtendedCell(((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2876</span><span id="line-2876"> ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength());</span> |
| <span class="source-line-no">2877</span><span id="line-2877"> }</span> |
| <span class="source-line-no">2878</span><span id="line-2878"> return new LastOnRowCell(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());</span> |
| <span class="source-line-no">2879</span><span id="line-2879"> }</span> |
| <span class="source-line-no">2880</span><span id="line-2880"></span> |
| <span class="source-line-no">2881</span><span id="line-2881"> public static ExtendedCell createLastOnRow(final byte[] row) {</span> |
| <span class="source-line-no">2882</span><span id="line-2882"> return new LastOnRowCell(row, 0, (short) row.length);</span> |
| <span class="source-line-no">2883</span><span id="line-2883"> }</span> |
| <span class="source-line-no">2884</span><span id="line-2884"></span> |
| <span class="source-line-no">2885</span><span id="line-2885"> /**</span> |
| <span class="source-line-no">2886</span><span id="line-2886"> * 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">2887</span><span id="line-2887"> * in creating "fake keys" for the multi-column Bloom filter optimization to skip the row/column</span> |
| <span class="source-line-no">2888</span><span id="line-2888"> * we already know is not in the file.</span> |
| <span class="source-line-no">2889</span><span id="line-2889"> * @return Last possible Cell on passed Cell's rk:cf:q.</span> |
| <span class="source-line-no">2890</span><span id="line-2890"> */</span> |
| <span class="source-line-no">2891</span><span id="line-2891"> public static ExtendedCell createLastOnRowCol(final Cell cell) {</span> |
| <span class="source-line-no">2892</span><span id="line-2892"> if (cell instanceof ByteBufferExtendedCell) {</span> |
| <span class="source-line-no">2893</span><span id="line-2893"> return new LastOnRowColByteBufferExtendedCell(</span> |
| <span class="source-line-no">2894</span><span id="line-2894"> ((ByteBufferExtendedCell) cell).getRowByteBuffer(),</span> |
| <span class="source-line-no">2895</span><span id="line-2895"> ((ByteBufferExtendedCell) cell).getRowPosition(), cell.getRowLength(),</span> |
| <span class="source-line-no">2896</span><span id="line-2896"> ((ByteBufferExtendedCell) cell).getFamilyByteBuffer(),</span> |
| <span class="source-line-no">2897</span><span id="line-2897"> ((ByteBufferExtendedCell) cell).getFamilyPosition(), cell.getFamilyLength(),</span> |
| <span class="source-line-no">2898</span><span id="line-2898"> ((ByteBufferExtendedCell) cell).getQualifierByteBuffer(),</span> |
| <span class="source-line-no">2899</span><span id="line-2899"> ((ByteBufferExtendedCell) cell).getQualifierPosition(), cell.getQualifierLength());</span> |
| <span class="source-line-no">2900</span><span id="line-2900"> }</span> |
| <span class="source-line-no">2901</span><span id="line-2901"> return new LastOnRowColCell(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(),</span> |
| <span class="source-line-no">2902</span><span id="line-2902"> cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength(),</span> |
| <span class="source-line-no">2903</span><span id="line-2903"> cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());</span> |
| <span class="source-line-no">2904</span><span id="line-2904"> }</span> |
| <span class="source-line-no">2905</span><span id="line-2905"></span> |
| <span class="source-line-no">2906</span><span id="line-2906"> /**</span> |
| <span class="source-line-no">2907</span><span id="line-2907"> * Create a Delete Family Cell for the specified row and family that would be smaller than all</span> |
| <span class="source-line-no">2908</span><span id="line-2908"> * other possible Delete Family KeyValues that have the same row and family. Used for seeking.</span> |
| <span class="source-line-no">2909</span><span id="line-2909"> * @param row - row key (arbitrary byte array)</span> |
| <span class="source-line-no">2910</span><span id="line-2910"> * @param fam - family name</span> |
| <span class="source-line-no">2911</span><span id="line-2911"> * @return First Delete Family possible key on passed <code>row</code>.</span> |
| <span class="source-line-no">2912</span><span id="line-2912"> */</span> |
| <span class="source-line-no">2913</span><span id="line-2913"> public static ExtendedCell createFirstDeleteFamilyCellOnRow(final byte[] row, final byte[] fam) {</span> |
| <span class="source-line-no">2914</span><span id="line-2914"> return new FirstOnRowDeleteFamilyCell(row, fam);</span> |
| <span class="source-line-no">2915</span><span id="line-2915"> }</span> |
| <span class="source-line-no">2916</span><span id="line-2916"></span> |
| <span class="source-line-no">2917</span><span id="line-2917"> /**</span> |
| <span class="source-line-no">2918</span><span id="line-2918"> * In fact, in HBase, all {@link Cell}s are {@link ExtendedCell}s. We do not expect users to</span> |
| <span class="source-line-no">2919</span><span id="line-2919"> * implement their own {@link Cell} types, except some special projects like Phoenix, where they</span> |
| <span class="source-line-no">2920</span><span id="line-2920"> * just use {@link org.apache.hadoop.hbase.KeyValue} and {@link ExtendedCell} directly.</span> |
| <span class="source-line-no">2921</span><span id="line-2921"> * @return the original {@code cell} which has already been cast to an {@link ExtendedCell}.</span> |
| <span class="source-line-no">2922</span><span id="line-2922"> * @throws IllegalArgumentException if the given {@code cell} is not an {@link ExtendedCell}.</span> |
| <span class="source-line-no">2923</span><span id="line-2923"> */</span> |
| <span class="source-line-no">2924</span><span id="line-2924"> public static ExtendedCell ensureExtendedCell(Cell cell) {</span> |
| <span class="source-line-no">2925</span><span id="line-2925"> if (cell == null) {</span> |
| <span class="source-line-no">2926</span><span id="line-2926"> return null;</span> |
| <span class="source-line-no">2927</span><span id="line-2927"> }</span> |
| <span class="source-line-no">2928</span><span id="line-2928"> Preconditions.checkArgument(cell instanceof ExtendedCell, "Unsupported cell type: %s",</span> |
| <span class="source-line-no">2929</span><span id="line-2929"> cell.getClass().getName());</span> |
| <span class="source-line-no">2930</span><span id="line-2930"> return (ExtendedCell) cell;</span> |
| <span class="source-line-no">2931</span><span id="line-2931"> }</span> |
| <span class="source-line-no">2932</span><span id="line-2932"></span> |
| <span class="source-line-no">2933</span><span id="line-2933"> public static boolean equals(ExtendedCell a, ExtendedCell b) {</span> |
| <span class="source-line-no">2934</span><span id="line-2934"> return CellUtil.matchingRows(a, b) && CellUtil.matchingFamily(a, b)</span> |
| <span class="source-line-no">2935</span><span id="line-2935"> && CellUtil.matchingQualifier(a, b) && CellUtil.matchingTimestamp(a, b)</span> |
| <span class="source-line-no">2936</span><span id="line-2936"> && PrivateCellUtil.matchingType(a, b);</span> |
| <span class="source-line-no">2937</span><span id="line-2937"> }</span> |
| <span class="source-line-no">2938</span><span id="line-2938"></span> |
| <span class="source-line-no">2939</span><span id="line-2939"> /** Returns ExtendedCellScanner interface over <code>cellIterables</code> */</span> |
| <span class="source-line-no">2940</span><span id="line-2940"> public static ExtendedCellScanner</span> |
| <span class="source-line-no">2941</span><span id="line-2941"> createExtendedCellScanner(final List<? extends ExtendedCellScannable> cellScannerables) {</span> |
| <span class="source-line-no">2942</span><span id="line-2942"> return new ExtendedCellScanner() {</span> |
| <span class="source-line-no">2943</span><span id="line-2943"> private final Iterator<? extends ExtendedCellScannable> iterator =</span> |
| <span class="source-line-no">2944</span><span id="line-2944"> cellScannerables.iterator();</span> |
| <span class="source-line-no">2945</span><span id="line-2945"> private ExtendedCellScanner cellScanner = null;</span> |
| <span class="source-line-no">2946</span><span id="line-2946"></span> |
| <span class="source-line-no">2947</span><span id="line-2947"> @Override</span> |
| <span class="source-line-no">2948</span><span id="line-2948"> public ExtendedCell current() {</span> |
| <span class="source-line-no">2949</span><span id="line-2949"> return this.cellScanner != null ? this.cellScanner.current() : null;</span> |
| <span class="source-line-no">2950</span><span id="line-2950"> }</span> |
| <span class="source-line-no">2951</span><span id="line-2951"></span> |
| <span class="source-line-no">2952</span><span id="line-2952"> @Override</span> |
| <span class="source-line-no">2953</span><span id="line-2953"> public boolean advance() throws IOException {</span> |
| <span class="source-line-no">2954</span><span id="line-2954"> while (true) {</span> |
| <span class="source-line-no">2955</span><span id="line-2955"> if (this.cellScanner == null) {</span> |
| <span class="source-line-no">2956</span><span id="line-2956"> if (!this.iterator.hasNext()) {</span> |
| <span class="source-line-no">2957</span><span id="line-2957"> return false;</span> |
| <span class="source-line-no">2958</span><span id="line-2958"> }</span> |
| <span class="source-line-no">2959</span><span id="line-2959"> this.cellScanner = this.iterator.next().cellScanner();</span> |
| <span class="source-line-no">2960</span><span id="line-2960"> }</span> |
| <span class="source-line-no">2961</span><span id="line-2961"> if (this.cellScanner.advance()) {</span> |
| <span class="source-line-no">2962</span><span id="line-2962"> return true;</span> |
| <span class="source-line-no">2963</span><span id="line-2963"> }</span> |
| <span class="source-line-no">2964</span><span id="line-2964"> this.cellScanner = null;</span> |
| <span class="source-line-no">2965</span><span id="line-2965"> }</span> |
| <span class="source-line-no">2966</span><span id="line-2966"> }</span> |
| <span class="source-line-no">2967</span><span id="line-2967"> };</span> |
| <span class="source-line-no">2968</span><span id="line-2968"> }</span> |
| <span class="source-line-no">2969</span><span id="line-2969"></span> |
| <span class="source-line-no">2970</span><span id="line-2970"> /**</span> |
| <span class="source-line-no">2971</span><span id="line-2971"> * Flatten the map of cells out under the ExtendedCellScanner</span> |
| <span class="source-line-no">2972</span><span id="line-2972"> * @param map Map of Cell Lists; for example, the map of families to ExtendedCells that is used</span> |
| <span class="source-line-no">2973</span><span id="line-2973"> * inside Put, etc., keeping Cells organized by family.</span> |
| <span class="source-line-no">2974</span><span id="line-2974"> * @return ExtendedCellScanner interface over <code>cellIterable</code></span> |
| <span class="source-line-no">2975</span><span id="line-2975"> */</span> |
| <span class="source-line-no">2976</span><span id="line-2976"> public static ExtendedCellScanner</span> |
| <span class="source-line-no">2977</span><span id="line-2977"> createExtendedCellScanner(final NavigableMap<byte[], List<ExtendedCell>> map) {</span> |
| <span class="source-line-no">2978</span><span id="line-2978"> return new ExtendedCellScanner() {</span> |
| <span class="source-line-no">2979</span><span id="line-2979"> private final Iterator<Entry<byte[], List<ExtendedCell>>> entries = map.entrySet().iterator();</span> |
| <span class="source-line-no">2980</span><span id="line-2980"> private Iterator<ExtendedCell> currentIterator = null;</span> |
| <span class="source-line-no">2981</span><span id="line-2981"> private ExtendedCell currentCell;</span> |
| <span class="source-line-no">2982</span><span id="line-2982"></span> |
| <span class="source-line-no">2983</span><span id="line-2983"> @Override</span> |
| <span class="source-line-no">2984</span><span id="line-2984"> public ExtendedCell current() {</span> |
| <span class="source-line-no">2985</span><span id="line-2985"> return this.currentCell;</span> |
| <span class="source-line-no">2986</span><span id="line-2986"> }</span> |
| <span class="source-line-no">2987</span><span id="line-2987"></span> |
| <span class="source-line-no">2988</span><span id="line-2988"> @Override</span> |
| <span class="source-line-no">2989</span><span id="line-2989"> public boolean advance() {</span> |
| <span class="source-line-no">2990</span><span id="line-2990"> while (true) {</span> |
| <span class="source-line-no">2991</span><span id="line-2991"> if (this.currentIterator == null) {</span> |
| <span class="source-line-no">2992</span><span id="line-2992"> if (!this.entries.hasNext()) {</span> |
| <span class="source-line-no">2993</span><span id="line-2993"> return false;</span> |
| <span class="source-line-no">2994</span><span id="line-2994"> }</span> |
| <span class="source-line-no">2995</span><span id="line-2995"> this.currentIterator = this.entries.next().getValue().iterator();</span> |
| <span class="source-line-no">2996</span><span id="line-2996"> }</span> |
| <span class="source-line-no">2997</span><span id="line-2997"> if (this.currentIterator.hasNext()) {</span> |
| <span class="source-line-no">2998</span><span id="line-2998"> this.currentCell = this.currentIterator.next();</span> |
| <span class="source-line-no">2999</span><span id="line-2999"> return true;</span> |
| <span class="source-line-no">3000</span><span id="line-3000"> }</span> |
| <span class="source-line-no">3001</span><span id="line-3001"> this.currentCell = null;</span> |
| <span class="source-line-no">3002</span><span id="line-3002"> this.currentIterator = null;</span> |
| <span class="source-line-no">3003</span><span id="line-3003"> }</span> |
| <span class="source-line-no">3004</span><span id="line-3004"> }</span> |
| <span class="source-line-no">3005</span><span id="line-3005"> };</span> |
| <span class="source-line-no">3006</span><span id="line-3006"> }</span> |
| <span class="source-line-no">3007</span><span id="line-3007"></span> |
| <span class="source-line-no">3008</span><span id="line-3008"> /** Returns CellScanner interface over <code>cellArray</code> */</span> |
| <span class="source-line-no">3009</span><span id="line-3009"> public static ExtendedCellScanner createExtendedCellScanner(final ExtendedCell[] cellArray) {</span> |
| <span class="source-line-no">3010</span><span id="line-3010"> return new ExtendedCellScanner() {</span> |
| <span class="source-line-no">3011</span><span id="line-3011"> private final ExtendedCell[] cells = cellArray;</span> |
| <span class="source-line-no">3012</span><span id="line-3012"> private int index = -1;</span> |
| <span class="source-line-no">3013</span><span id="line-3013"></span> |
| <span class="source-line-no">3014</span><span id="line-3014"> @Override</span> |
| <span class="source-line-no">3015</span><span id="line-3015"> public ExtendedCell current() {</span> |
| <span class="source-line-no">3016</span><span id="line-3016"> if (cells == null) {</span> |
| <span class="source-line-no">3017</span><span id="line-3017"> return null;</span> |
| <span class="source-line-no">3018</span><span id="line-3018"> }</span> |
| <span class="source-line-no">3019</span><span id="line-3019"> return (index < 0) ? null : this.cells[index];</span> |
| <span class="source-line-no">3020</span><span id="line-3020"> }</span> |
| <span class="source-line-no">3021</span><span id="line-3021"></span> |
| <span class="source-line-no">3022</span><span id="line-3022"> @Override</span> |
| <span class="source-line-no">3023</span><span id="line-3023"> public boolean advance() {</span> |
| <span class="source-line-no">3024</span><span id="line-3024"> if (cells == null) {</span> |
| <span class="source-line-no">3025</span><span id="line-3025"> return false;</span> |
| <span class="source-line-no">3026</span><span id="line-3026"> }</span> |
| <span class="source-line-no">3027</span><span id="line-3027"> return ++index < this.cells.length;</span> |
| <span class="source-line-no">3028</span><span id="line-3028"> }</span> |
| <span class="source-line-no">3029</span><span id="line-3029"> };</span> |
| <span class="source-line-no">3030</span><span id="line-3030"> }</span> |
| <span class="source-line-no">3031</span><span id="line-3031"></span> |
| <span class="source-line-no">3032</span><span id="line-3032"> /** Returns ExtendedCellScanner interface over <code>cellIterable</code> */</span> |
| <span class="source-line-no">3033</span><span id="line-3033"> public static ExtendedCellScanner</span> |
| <span class="source-line-no">3034</span><span id="line-3034"> createExtendedCellScanner(final Iterable<ExtendedCell> cellIterable) {</span> |
| <span class="source-line-no">3035</span><span id="line-3035"> if (cellIterable == null) {</span> |
| <span class="source-line-no">3036</span><span id="line-3036"> return null;</span> |
| <span class="source-line-no">3037</span><span id="line-3037"> }</span> |
| <span class="source-line-no">3038</span><span id="line-3038"> return createExtendedCellScanner(cellIterable.iterator());</span> |
| <span class="source-line-no">3039</span><span id="line-3039"> }</span> |
| <span class="source-line-no">3040</span><span id="line-3040"></span> |
| <span class="source-line-no">3041</span><span id="line-3041"> /**</span> |
| <span class="source-line-no">3042</span><span id="line-3042"> * Returns ExtendedCellScanner interface over <code>cellIterable</code> or null if</span> |
| <span class="source-line-no">3043</span><span id="line-3043"> * <code>cells</code> is null</span> |
| <span class="source-line-no">3044</span><span id="line-3044"> */</span> |
| <span class="source-line-no">3045</span><span id="line-3045"> public static ExtendedCellScanner createExtendedCellScanner(final Iterator<ExtendedCell> cells) {</span> |
| <span class="source-line-no">3046</span><span id="line-3046"> if (cells == null) {</span> |
| <span class="source-line-no">3047</span><span id="line-3047"> return null;</span> |
| <span class="source-line-no">3048</span><span id="line-3048"> }</span> |
| <span class="source-line-no">3049</span><span id="line-3049"> return new ExtendedCellScanner() {</span> |
| <span class="source-line-no">3050</span><span id="line-3050"> private final Iterator<ExtendedCell> iterator = cells;</span> |
| <span class="source-line-no">3051</span><span id="line-3051"> private ExtendedCell current = null;</span> |
| <span class="source-line-no">3052</span><span id="line-3052"></span> |
| <span class="source-line-no">3053</span><span id="line-3053"> @Override</span> |
| <span class="source-line-no">3054</span><span id="line-3054"> public ExtendedCell current() {</span> |
| <span class="source-line-no">3055</span><span id="line-3055"> return this.current;</span> |
| <span class="source-line-no">3056</span><span id="line-3056"> }</span> |
| <span class="source-line-no">3057</span><span id="line-3057"></span> |
| <span class="source-line-no">3058</span><span id="line-3058"> @Override</span> |
| <span class="source-line-no">3059</span><span id="line-3059"> public boolean advance() {</span> |
| <span class="source-line-no">3060</span><span id="line-3060"> boolean hasNext = this.iterator.hasNext();</span> |
| <span class="source-line-no">3061</span><span id="line-3061"> this.current = hasNext ? this.iterator.next() : null;</span> |
| <span class="source-line-no">3062</span><span id="line-3062"> return hasNext;</span> |
| <span class="source-line-no">3063</span><span id="line-3063"> }</span> |
| <span class="source-line-no">3064</span><span id="line-3064"> };</span> |
| <span class="source-line-no">3065</span><span id="line-3065"> }</span> |
| <span class="source-line-no">3066</span><span id="line-3066"></span> |
| <span class="source-line-no">3067</span><span id="line-3067"> private static final Cell.Type[] CELL_TYPE_CODE_ARRAY = new Cell.Type[256];</span> |
| <span class="source-line-no">3068</span><span id="line-3068"></span> |
| <span class="source-line-no">3069</span><span id="line-3069"> static {</span> |
| <span class="source-line-no">3070</span><span id="line-3070"> for (Cell.Type t : Cell.Type.values()) {</span> |
| <span class="source-line-no">3071</span><span id="line-3071"> CELL_TYPE_CODE_ARRAY[t.getCode() & 0xff] = t;</span> |
| <span class="source-line-no">3072</span><span id="line-3072"> }</span> |
| <span class="source-line-no">3073</span><span id="line-3073"> }</span> |
| <span class="source-line-no">3074</span><span id="line-3074"></span> |
| <span class="source-line-no">3075</span><span id="line-3075"> public static Cell.Type code2Type(byte code) {</span> |
| <span class="source-line-no">3076</span><span id="line-3076"> Cell.Type t = CELL_TYPE_CODE_ARRAY[code & 0xff];</span> |
| <span class="source-line-no">3077</span><span id="line-3077"> if (t != null) {</span> |
| <span class="source-line-no">3078</span><span id="line-3078"> return t;</span> |
| <span class="source-line-no">3079</span><span id="line-3079"> }</span> |
| <span class="source-line-no">3080</span><span id="line-3080"> throw new UnsupportedOperationException("Invalid type of cell " + code);</span> |
| <span class="source-line-no">3081</span><span id="line-3081"> }</span> |
| <span class="source-line-no">3082</span><span id="line-3082"></span> |
| <span class="source-line-no">3083</span><span id="line-3083"> public static byte getTypeByte(Cell c) {</span> |
| <span class="source-line-no">3084</span><span id="line-3084"> if (c instanceof ExtendedCell) {</span> |
| <span class="source-line-no">3085</span><span id="line-3085"> return ((ExtendedCell) c).getTypeByte();</span> |
| <span class="source-line-no">3086</span><span id="line-3086"> } else {</span> |
| <span class="source-line-no">3087</span><span id="line-3087"> return c.getType().getCode();</span> |
| <span class="source-line-no">3088</span><span id="line-3088"> }</span> |
| <span class="source-line-no">3089</span><span id="line-3089"> }</span> |
| <span class="source-line-no">3090</span><span id="line-3090"></span> |
| <span class="source-line-no">3091</span><span id="line-3091"> public static long getSequenceId(Cell c) {</span> |
| <span class="source-line-no">3092</span><span id="line-3092"> if (c instanceof ExtendedCell) {</span> |
| <span class="source-line-no">3093</span><span id="line-3093"> return ((ExtendedCell) c).getSequenceId();</span> |
| <span class="source-line-no">3094</span><span id="line-3094"> } else {</span> |
| <span class="source-line-no">3095</span><span id="line-3095"> return HConstants.NO_SEQNUM;</span> |
| <span class="source-line-no">3096</span><span id="line-3096"> }</span> |
| <span class="source-line-no">3097</span><span id="line-3097"> }</span> |
| <span class="source-line-no">3098</span><span id="line-3098">}</span> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| </pre> |
| </div> |
| </main> |
| </body> |
| </html> |