View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
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  import org.apache.hadoop.hbase.codec.prefixtree.encode.other.ColumnNodeType;
24  
25  /**
26   * Position one of these appropriately in the data block and you can call its methods to retrieve
27   * the family or qualifier at the current position.
28   */
29  @InterfaceAudience.Private
30  public class ColumnReader {
31  
32    /****************** fields *************************/
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    /******************** construct *******************/
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    /********************* methods *******************/
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() {// for testing
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   /****************************** get/set *************************************/
101 
102   public int getColumnOffset() {
103     return columnOffset;
104   }
105 
106 }
107