1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.hadoop.hbase.codec.prefixtree.decode.column;
20
21 import org.apache.hadoop.classification.InterfaceAudience;
22 import org.apache.hadoop.hbase.codec.prefixtree.PrefixTreeBlockMeta;
23
24
25
26
27
28 @InterfaceAudience.Private
29 public class ColumnReader {
30
31
32
33 protected PrefixTreeBlockMeta blockMeta;
34
35 protected byte[] columnBuffer;
36 protected int columnOffset;
37 protected int columnLength;
38 protected boolean familyVsQualifier;
39
40 protected ColumnNodeReader columnNodeReader;
41
42
43
44
45 public ColumnReader(byte[] columnBuffer, boolean familyVsQualifier) {
46 this.columnBuffer = columnBuffer;
47 this.familyVsQualifier = familyVsQualifier;
48 this.columnNodeReader = new ColumnNodeReader(columnBuffer, familyVsQualifier);
49 }
50
51 public void initOnBlock(PrefixTreeBlockMeta blockMeta, byte[] block) {
52 this.blockMeta = blockMeta;
53 clearColumnBuffer();
54 columnNodeReader.initOnBlock(blockMeta, block);
55 }
56
57
58
59
60 public ColumnReader populateBuffer(int offsetIntoColumnData) {
61 clearColumnBuffer();
62 int nextRelativeOffset = offsetIntoColumnData;
63 while (true) {
64 int absoluteOffset;
65 if (familyVsQualifier) {
66 absoluteOffset = blockMeta.getAbsoluteFamilyOffset() + nextRelativeOffset;
67 } else {
68 absoluteOffset = blockMeta.getAbsoluteQualifierOffset() + nextRelativeOffset;
69 }
70 columnNodeReader.positionAt(absoluteOffset);
71 columnOffset -= columnNodeReader.getTokenLength();
72 columnLength += columnNodeReader.getTokenLength();
73 columnNodeReader.prependTokenToBuffer(columnOffset);
74 if (columnNodeReader.isRoot()) {
75 return this;
76 }
77 nextRelativeOffset = columnNodeReader.getParentStartPosition();
78 }
79 }
80
81 public byte[] copyBufferToNewArray() {
82 byte[] out = new byte[columnLength];
83 System.arraycopy(columnBuffer, columnOffset, out, 0, out.length);
84 return out;
85 }
86
87 public int getColumnLength() {
88 return columnLength;
89 }
90
91 public void clearColumnBuffer() {
92 columnOffset = columnBuffer.length;
93 columnLength = 0;
94 }
95
96
97
98
99 public int getColumnOffset() {
100 return columnOffset;
101 }
102
103 }
104