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 package org.apache.hadoop.hbase.types;
19
20 import org.apache.hadoop.classification.InterfaceAudience;
21 import org.apache.hadoop.classification.InterfaceStability;
22 import org.apache.hadoop.hbase.util.Order;
23 import org.apache.hadoop.hbase.util.PositionedByteRange;
24 import org.apache.hadoop.io.Writable;
25
26 /**
27 * <p>
28 * {@code DataType} is the base class for all HBase data types. Data
29 * type implementations are designed to be serialized to and deserialized from
30 * byte[]. Serialized representations can retain the natural sort ordering of
31 * the source object, when a suitable encoding is supported by the underlying
32 * implementation. This is a desirable feature for use in rowkeys and column
33 * qualifiers.
34 * </p>
35 * <p>
36 * {@code DataType}s are different from Hadoop {@link Writable}s in two
37 * significant ways. First, {@code DataType} describes how to serialize a
38 * value, it does not encapsulate a serialized value. Second, {@code DataType}
39 * implementations provide hints to consumers about relationships between the
40 * POJOs they represent and richness of the encoded representation.
41 * </p>
42 * <p>
43 * Data type instances are designed to be stateless, thread-safe, and reused.
44 * Implementations should provide {@code static final} instances corresponding
45 * to each variation on configurable parameters. This is to encourage and
46 * simplify instance reuse. For instance, order-preserving types should provide
47 * static ASCENDING and DESCENDING instances. It is also encouraged for
48 * implementations operating on Java primitive types to provide primitive
49 * implementations of the {@code encode} and {@code decode} methods. This
50 * advice is a performance consideration to clients reading and writing values
51 * in tight loops.
52 * </p>
53 */
54 @InterfaceAudience.Public
55 @InterfaceStability.Evolving
56 public interface DataType<T> {
57
58 /**
59 * Indicates whether this instance writes encoded {@code byte[]}'s
60 * which preserve the natural sort order of the unencoded value.
61 * @return {@code true} when natural order is preserved,
62 * {@code false} otherwise.
63 */
64 public boolean isOrderPreserving();
65
66 /**
67 * Retrieve the sort {@link Order} imposed by this data type, or null when
68 * natural ordering is not preserved. Value is either ascending or
69 * descending. Default is assumed to be {@link Order#ASCENDING}.
70 */
71 public Order getOrder();
72
73 /**
74 * Indicates whether this instance supports encoding null values. This
75 * depends on the implementation details of the encoding format. All
76 * {@code DataType}s that support null should treat null as comparing
77 * less than any non-null value for default sort ordering purposes.
78 * @return {@code true} when null is supported, {@code false} otherwise.
79 */
80 public boolean isNullable();
81
82 /**
83 * Indicates whether this instance is able to skip over it's encoded value.
84 * {@code DataType}s that are not skippable can only be used as the
85 * right-most field of a {@link Struct}.
86 */
87 public boolean isSkippable();
88
89 /**
90 * Inform consumers how long the encoded {@code byte[]} will be.
91 * @param val The value to check.
92 * @return the number of bytes required to encode {@code val}.a
93 */
94 public int encodedLength(T val);
95
96 /**
97 * Inform consumers over what type this {@code DataType} operates. Useful
98 * when working with bare {@code DataType} instances.
99 */
100 public Class<T> encodedClass();
101
102 /**
103 * Skip {@code src}'s position forward over one encoded value.
104 * @param src the buffer containing the encoded value.
105 * @return number of bytes skipped.
106 */
107 public int skip(PositionedByteRange src);
108
109 /**
110 * Read an instance of {@code T} from the buffer {@code src}.
111 * @param src the buffer containing the encoded value.
112 */
113 public T decode(PositionedByteRange src);
114
115 /**
116 * Write instance {@code val} into buffer {@code dst}.
117 * @param dst the buffer containing the encoded value.
118 * @param val the value to encode onto {@code dst}.
119 * @return number of bytes written.
120 */
121 public int encode(PositionedByteRange dst, T val);
122 }