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.hbase.classification.InterfaceAudience;
22 import org.apache.hadoop.hbase.codec.prefixtree.PrefixTreeBlockMeta;
23 import org.apache.hadoop.hbase.codec.prefixtree.encode.other.ColumnNodeType;
24
25
26
27
28
29 @InterfaceAudience.Private
30 public class ColumnReader {
31
32
33
34 protected PrefixTreeBlockMeta blockMeta;
35
36 protected byte[] columnBuffer;
37 protected int columnOffset;
38 protected int columnLength;
39 protected ColumnNodeType nodeType;
40
41 protected ColumnNodeReader columnNodeReader;
42
43
44
45
46 public ColumnReader(byte[] columnBuffer, ColumnNodeType nodeType) {
47 this.columnBuffer = columnBuffer;
48 this.nodeType = nodeType;
49 this.columnNodeReader = new ColumnNodeReader(columnBuffer, nodeType);
50 }
51
52 public void initOnBlock(PrefixTreeBlockMeta blockMeta, byte[] block) {
53 this.blockMeta = blockMeta;
54 clearColumnBuffer();
55 columnNodeReader.initOnBlock(blockMeta, block);
56 }
57
58
59
60
61 public ColumnReader populateBuffer(int offsetIntoColumnData) {
62 clearColumnBuffer();
63 int nextRelativeOffset = offsetIntoColumnData;
64 while (true) {
65 int absoluteOffset = 0;
66 if (nodeType == ColumnNodeType.FAMILY) {
67 absoluteOffset = blockMeta.getAbsoluteFamilyOffset() + nextRelativeOffset;
68 } else if (nodeType == ColumnNodeType.QUALIFIER) {
69 absoluteOffset = blockMeta.getAbsoluteQualifierOffset() + nextRelativeOffset;
70 } else {
71 absoluteOffset = blockMeta.getAbsoluteTagsOffset() + nextRelativeOffset;
72 }
73 columnNodeReader.positionAt(absoluteOffset);
74 columnOffset -= columnNodeReader.getTokenLength();
75 columnLength += columnNodeReader.getTokenLength();
76 columnNodeReader.prependTokenToBuffer(columnOffset);
77 if (columnNodeReader.isRoot()) {
78 return this;
79 }
80 nextRelativeOffset = columnNodeReader.getParentStartPosition();
81 }
82 }
83
84 public byte[] copyBufferToNewArray() {
85 byte[] out = new byte[columnLength];
86 System.arraycopy(columnBuffer, columnOffset, out, 0, out.length);
87 return out;
88 }
89
90 public int getColumnLength() {
91 return columnLength;
92 }
93
94 public void clearColumnBuffer() {
95 columnOffset = columnBuffer.length;
96 columnLength = 0;
97 }
98
99
100
101
102 public int getColumnOffset() {
103 return columnOffset;
104 }
105
106 }
107