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  }