github.com/tsuna/gohbase@v0.0.0-20250731002811-4ffcadfba63e/filter/comparator.go (about) 1 // Copyright (C) 2015 The GoHBase Authors. All rights reserved. 2 // This file is part of GoHBase. 3 // Use of this source code is governed by the Apache License 2.0 4 // that can be found in the COPYING file. 5 6 package filter 7 8 import ( 9 "errors" 10 11 "github.com/tsuna/gohbase/pb" 12 "google.golang.org/protobuf/proto" 13 ) 14 15 const comparatorPath = "org.apache.hadoop.hbase.filter." 16 17 // BitComparatorBitwiseOp is TODO 18 type BitComparatorBitwiseOp int32 19 20 func (o BitComparatorBitwiseOp) isValid() bool { 21 return o >= 1 && o <= 3 22 } 23 24 // Constants are TODO 25 const ( 26 BitComparatorAND BitComparatorBitwiseOp = 1 27 BitComparatorOR BitComparatorBitwiseOp = 2 28 BitComparatorXOR BitComparatorBitwiseOp = 3 29 ) 30 31 // Ensure our types implement Comparator correctly. 32 var _ Comparator = (*BinaryComparator)(nil) 33 var _ Comparator = (*LongComparator)(nil) 34 var _ Comparator = (*BinaryPrefixComparator)(nil) 35 var _ Comparator = (*BitComparator)(nil) 36 var _ Comparator = (*NullComparator)(nil) 37 var _ Comparator = (*RegexStringComparator)(nil) 38 var _ Comparator = (*SubstringComparator)(nil) 39 40 // Comparator is TODO 41 type Comparator interface { 42 // ConstructPBComparator creates and returns the comparator encoded in a 43 // pb.Comparator type 44 ConstructPBComparator() (*pb.Comparator, error) 45 } 46 47 // ByteArrayComparable is used across many Comparators. 48 type ByteArrayComparable pb.ByteArrayComparable 49 50 // NewByteArrayComparable is TODO 51 func NewByteArrayComparable(value []byte) *ByteArrayComparable { 52 return &ByteArrayComparable{ 53 Value: value, 54 } 55 } 56 57 func (b *ByteArrayComparable) toPB() *pb.ByteArrayComparable { 58 return (*pb.ByteArrayComparable)(b) 59 } 60 61 // BinaryComparator is TODO 62 type BinaryComparator pb.BinaryComparator 63 64 // NewBinaryComparator is TODO 65 func NewBinaryComparator(comparable *ByteArrayComparable) *BinaryComparator { 66 return &BinaryComparator{ 67 Comparable: comparable.toPB(), 68 } 69 } 70 71 // ConstructPBComparator is TODO 72 func (c *BinaryComparator) ConstructPBComparator() (*pb.Comparator, error) { 73 serializedComparator, err := proto.Marshal((*pb.BinaryComparator)(c)) 74 if err != nil { 75 return nil, err 76 } 77 comparator := &pb.Comparator{ 78 Name: proto.String(comparatorPath + "BinaryComparator"), 79 SerializedComparator: serializedComparator, 80 } 81 return comparator, nil 82 } 83 84 // LongComparator is TODO 85 type LongComparator pb.LongComparator 86 87 // NewLongComparator is TODO 88 func NewLongComparator(comparable *ByteArrayComparable) *LongComparator { 89 return &LongComparator{ 90 Comparable: comparable.toPB(), 91 } 92 } 93 94 // ConstructPBComparator is TODO 95 func (c *LongComparator) ConstructPBComparator() (*pb.Comparator, error) { 96 serializedComparator, err := proto.Marshal((*pb.LongComparator)(c)) 97 if err != nil { 98 return nil, err 99 } 100 comparator := &pb.Comparator{ 101 Name: proto.String(comparatorPath + "LongComparator"), 102 SerializedComparator: serializedComparator, 103 } 104 return comparator, nil 105 } 106 107 // BinaryPrefixComparator is TODO 108 type BinaryPrefixComparator pb.BinaryPrefixComparator 109 110 // NewBinaryPrefixComparator is TODO 111 func NewBinaryPrefixComparator(comparable *ByteArrayComparable) *BinaryPrefixComparator { 112 return &BinaryPrefixComparator{ 113 Comparable: comparable.toPB(), 114 } 115 } 116 117 // ConstructPBComparator is TODO 118 func (c *BinaryPrefixComparator) ConstructPBComparator() (*pb.Comparator, error) { 119 serializedComparator, err := proto.Marshal((*pb.BinaryPrefixComparator)(c)) 120 if err != nil { 121 return nil, err 122 } 123 comparator := &pb.Comparator{ 124 Name: proto.String(comparatorPath + "BinaryPrefixComparator"), 125 SerializedComparator: serializedComparator, 126 } 127 return comparator, nil 128 } 129 130 // BitComparator is TODO 131 type BitComparator pb.BitComparator 132 133 // NewBitComparator is TODO 134 func NewBitComparator(bitwiseOp BitComparatorBitwiseOp, 135 comparable *ByteArrayComparable) *BitComparator { 136 op := pb.BitComparator_BitwiseOp(bitwiseOp) 137 return &BitComparator{ 138 Comparable: comparable.toPB(), 139 BitwiseOp: &op, 140 } 141 } 142 143 // ConstructPBComparator is TODO 144 func (c *BitComparator) ConstructPBComparator() (*pb.Comparator, error) { 145 if !BitComparatorBitwiseOp(*c.BitwiseOp).isValid() { 146 return nil, errors.New("Invalid bitwise operator specified") 147 } 148 serializedComparator, err := proto.Marshal((*pb.BitComparator)(c)) 149 if err != nil { 150 return nil, err 151 } 152 comparator := &pb.Comparator{ 153 Name: proto.String(comparatorPath + "BitComparator"), 154 SerializedComparator: serializedComparator, 155 } 156 return comparator, nil 157 } 158 159 // NullComparator is TODO 160 type NullComparator struct{} 161 162 // NewNullComparator is TODO 163 func NewNullComparator() NullComparator { 164 return NullComparator{} 165 } 166 167 // ConstructPBComparator is TODO 168 func (c NullComparator) ConstructPBComparator() (*pb.Comparator, error) { 169 serializedComparator, err := proto.Marshal(&pb.NullComparator{}) 170 if err != nil { 171 return nil, err 172 } 173 comparator := &pb.Comparator{ 174 Name: proto.String(comparatorPath + "NullComparator"), 175 SerializedComparator: serializedComparator, 176 } 177 return comparator, nil 178 } 179 180 // RegexStringComparator is TODO 181 type RegexStringComparator pb.RegexStringComparator 182 183 // NewRegexStringComparator is TODO 184 func NewRegexStringComparator(pattern string, patternFlags int32, 185 charset, engine string) *RegexStringComparator { 186 return &RegexStringComparator{ 187 Pattern: proto.String(pattern), 188 PatternFlags: proto.Int32(patternFlags), 189 Charset: proto.String(charset), 190 Engine: proto.String(engine), 191 } 192 } 193 194 // ConstructPBComparator is TODO 195 func (c *RegexStringComparator) ConstructPBComparator() (*pb.Comparator, error) { 196 serializedComparator, err := proto.Marshal((*pb.RegexStringComparator)(c)) 197 if err != nil { 198 return nil, err 199 } 200 comparator := &pb.Comparator{ 201 Name: proto.String(comparatorPath + "RegexStringComparator"), 202 SerializedComparator: serializedComparator, 203 } 204 return comparator, nil 205 } 206 207 // SubstringComparator is TODO 208 type SubstringComparator pb.SubstringComparator 209 210 // NewSubstringComparator is TODO 211 func NewSubstringComparator(substr string) *SubstringComparator { 212 return &SubstringComparator{ 213 Substr: proto.String(substr), 214 } 215 } 216 217 // ConstructPBComparator is TODO 218 func (c *SubstringComparator) ConstructPBComparator() (*pb.Comparator, error) { 219 serializedComparator, err := proto.Marshal((*pb.SubstringComparator)(c)) 220 if err != nil { 221 return nil, err 222 } 223 comparator := &pb.Comparator{ 224 Name: proto.String(comparatorPath + "SubstringComparator"), 225 SerializedComparator: serializedComparator, 226 } 227 return comparator, nil 228 }