github.com/tsuna/gohbase@v0.0.0-20250731002811-4ffcadfba63e/filter/filter.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 filterPath = "org.apache.hadoop.hbase.filter."
    16  
    17  // ListOperator is TODO
    18  type ListOperator int32
    19  
    20  func (o ListOperator) isValid() bool {
    21  	return o >= 1 && o <= 2
    22  }
    23  
    24  func (o ListOperator) toPB() *pb.FilterList_Operator {
    25  	op := pb.FilterList_Operator(o)
    26  	return &op
    27  }
    28  
    29  // Constants is TODO
    30  const (
    31  	MustPassAll ListOperator = 1
    32  	MustPassOne ListOperator = 2
    33  )
    34  
    35  // CompareType is TODO
    36  type CompareType int32
    37  
    38  func (c CompareType) isValid() bool {
    39  	return c >= 0 && c <= 6
    40  }
    41  
    42  // Constants is TODO
    43  const (
    44  	Less           CompareType = 0
    45  	LessOrEqual    CompareType = 1
    46  	Equal          CompareType = 2
    47  	NotEqual       CompareType = 3
    48  	GreaterOrEqual CompareType = 4
    49  	Greater        CompareType = 5
    50  	NoOp           CompareType = 6
    51  )
    52  
    53  // Ensure our types implement Filter correctly.
    54  var _ Filter = (*List)(nil)
    55  var _ Filter = (*ColumnCountGetFilter)(nil)
    56  var _ Filter = (*ColumnPaginationFilter)(nil)
    57  var _ Filter = (*ColumnPrefixFilter)(nil)
    58  var _ Filter = (*ColumnRangeFilter)(nil)
    59  var _ Filter = (*CompareFilter)(nil)
    60  var _ Filter = (*DependentColumnFilter)(nil)
    61  var _ Filter = (*FamilyFilter)(nil)
    62  var _ Filter = (*Wrapper)(nil)
    63  var _ Filter = (*FirstKeyOnlyFilter)(nil)
    64  var _ Filter = (*FirstKeyValueMatchingQualifiersFilter)(nil)
    65  var _ Filter = (*FuzzyRowFilter)(nil)
    66  var _ Filter = (*InclusiveStopFilter)(nil)
    67  var _ Filter = (*KeyOnlyFilter)(nil)
    68  var _ Filter = (*MultipleColumnPrefixFilter)(nil)
    69  var _ Filter = (*PageFilter)(nil)
    70  var _ Filter = (*PrefixFilter)(nil)
    71  var _ Filter = (*QualifierFilter)(nil)
    72  var _ Filter = (*RandomRowFilter)(nil)
    73  var _ Filter = (*RowFilter)(nil)
    74  var _ Filter = (*SingleColumnValueFilter)(nil)
    75  var _ Filter = (*SingleColumnValueExcludeFilter)(nil)
    76  var _ Filter = (*SkipFilter)(nil)
    77  var _ Filter = (*TimestampsFilter)(nil)
    78  var _ Filter = (*ValueFilter)(nil)
    79  var _ Filter = (*WhileMatchFilter)(nil)
    80  var _ Filter = (*AllFilter)(nil)
    81  var _ Filter = (*RowRange)(nil)
    82  var _ Filter = (*MultiRowRangeFilter)(nil)
    83  
    84  // Filter is TODO
    85  type Filter interface {
    86  	// ConstructPBFilter creates and returns the filter encoded in a pb.Filter type
    87  	//	- For most filters this just involves creating the special filter object,
    88  	//	  serializing it, and then creating a standard Filter object with the name and
    89  	//	  serialization inside.
    90  	//	- For FilterLists this requires creating the protobuf FilterList which contains
    91  	//	  an array []*pb.Filter (meaning we have to create, serialize, create all objects
    92  	//	  in that array), serialize the newly created pb.FilterList and then create a
    93  	//	  pb.Filter object containing that new serialization.
    94  	ConstructPBFilter() (*pb.Filter, error)
    95  }
    96  
    97  // BytesBytesPair is a type used in FuzzyRowFilter. Want to avoid users having
    98  // to interact directly with the protobuf generated file so exposing here.
    99  type BytesBytesPair pb.BytesBytesPair
   100  
   101  // NewBytesBytesPair is TODO
   102  func NewBytesBytesPair(first []byte, second []byte) *BytesBytesPair {
   103  	return &BytesBytesPair{
   104  		First:  first,
   105  		Second: second,
   106  	}
   107  }
   108  
   109  /*
   110      Each filter below has three primary methods/declarations, each of which can be summarized
   111      as follows -
   112  
   113  	1. Type declaration. Create a new type for each filter. A 'Name' field is required but
   114  	   you can create as many other fields as you like. These are purely local and will be
   115  	   transcribed into a pb.Filter type by ConstructPBFilter()
   116  	2. Constructor. Given a few parameters create the above type and return it to the callee.
   117  	3. ConstructPBFilter. Take our local representation of a filter object and create the
   118  	   appropriate pb.Filter object. Return the pb.Filter object.
   119  
   120  	You may define any additional methods you like (see FilterList) but be aware that as soon
   121  	as the returned object is type casted to a Filter (e.g. appending it to an array of Filters)
   122  	it loses the ability to call those additional functions.
   123  */
   124  
   125  // List is TODO
   126  type List pb.FilterList
   127  
   128  // NewList is TODO
   129  func NewList(operator ListOperator, filters ...Filter) *List {
   130  	f := &List{
   131  		Operator: operator.toPB(),
   132  	}
   133  	f.AddFilters(filters...)
   134  	return f
   135  }
   136  
   137  // AddFilters is TODO
   138  func (f *List) AddFilters(filters ...Filter) {
   139  	for _, filter := range filters {
   140  		fpb, err := filter.ConstructPBFilter()
   141  		if err != nil {
   142  			panic(err)
   143  		}
   144  		f.Filters = append(f.Filters, fpb)
   145  	}
   146  }
   147  
   148  // ConstructPBFilter is TODO
   149  func (f *List) ConstructPBFilter() (*pb.Filter, error) {
   150  	if !ListOperator(*f.Operator).isValid() {
   151  		return nil, errors.New("invalid operator specified")
   152  	}
   153  
   154  	serializedFilter, err := proto.Marshal((*pb.FilterList)(f))
   155  	if err != nil {
   156  		return nil, err
   157  	}
   158  	filter := &pb.Filter{
   159  		Name:             proto.String(filterPath + "FilterList"),
   160  		SerializedFilter: serializedFilter,
   161  	}
   162  	return filter, nil
   163  }
   164  
   165  // ColumnCountGetFilter is TODO
   166  type ColumnCountGetFilter pb.ColumnCountGetFilter
   167  
   168  // NewColumnCountGetFilter is TODO
   169  func NewColumnCountGetFilter(limit int32) *ColumnCountGetFilter {
   170  	return &ColumnCountGetFilter{
   171  		Limit: proto.Int32(limit),
   172  	}
   173  }
   174  
   175  // ConstructPBFilter is TODO
   176  func (f *ColumnCountGetFilter) ConstructPBFilter() (*pb.Filter, error) {
   177  	serializedFilter, err := proto.Marshal((*pb.ColumnCountGetFilter)(f))
   178  	if err != nil {
   179  		return nil, err
   180  	}
   181  	filter := &pb.Filter{
   182  		Name:             proto.String(filterPath + "ColumnCountGetFilter"),
   183  		SerializedFilter: serializedFilter,
   184  	}
   185  	return filter, nil
   186  }
   187  
   188  // ColumnPaginationFilter is TODO
   189  type ColumnPaginationFilter pb.ColumnPaginationFilter
   190  
   191  // NewColumnPaginationFilter is TODO
   192  func NewColumnPaginationFilter(limit, offset int32, columnOffset []byte) *ColumnPaginationFilter {
   193  	return &ColumnPaginationFilter{
   194  		Limit:        proto.Int32(limit),
   195  		Offset:       proto.Int32(offset),
   196  		ColumnOffset: columnOffset,
   197  	}
   198  }
   199  
   200  // ConstructPBFilter is TODO
   201  func (f *ColumnPaginationFilter) ConstructPBFilter() (*pb.Filter, error) {
   202  	serializedFilter, err := proto.Marshal((*pb.ColumnPaginationFilter)(f))
   203  	if err != nil {
   204  		return nil, err
   205  	}
   206  	filter := &pb.Filter{
   207  		Name:             proto.String(filterPath + "ColumnPaginationFilter"),
   208  		SerializedFilter: serializedFilter,
   209  	}
   210  	return filter, nil
   211  }
   212  
   213  // ColumnPrefixFilter is TODO
   214  type ColumnPrefixFilter pb.ColumnPrefixFilter
   215  
   216  // NewColumnPrefixFilter is TODO
   217  func NewColumnPrefixFilter(prefix []byte) *ColumnPrefixFilter {
   218  	return &ColumnPrefixFilter{
   219  		Prefix: prefix,
   220  	}
   221  }
   222  
   223  // ConstructPBFilter is TODO
   224  func (f *ColumnPrefixFilter) ConstructPBFilter() (*pb.Filter, error) {
   225  	serializedFilter, err := proto.Marshal((*pb.ColumnPrefixFilter)(f))
   226  	if err != nil {
   227  		return nil, err
   228  	}
   229  	filter := &pb.Filter{
   230  		Name:             proto.String(filterPath + "ColumnPrefixFilter"),
   231  		SerializedFilter: serializedFilter,
   232  	}
   233  	return filter, nil
   234  }
   235  
   236  // ColumnRangeFilter is TODO
   237  type ColumnRangeFilter pb.ColumnRangeFilter
   238  
   239  // NewColumnRangeFilter is TODO
   240  func NewColumnRangeFilter(minColumn, maxColumn []byte,
   241  	minColumnInclusive, maxColumnInclusive bool) *ColumnRangeFilter {
   242  	return &ColumnRangeFilter{
   243  		MinColumn:          minColumn,
   244  		MaxColumn:          maxColumn,
   245  		MinColumnInclusive: proto.Bool(minColumnInclusive),
   246  		MaxColumnInclusive: proto.Bool(maxColumnInclusive),
   247  	}
   248  }
   249  
   250  // ConstructPBFilter is TODO
   251  func (f *ColumnRangeFilter) ConstructPBFilter() (*pb.Filter, error) {
   252  	serializedFilter, err := proto.Marshal((*pb.ColumnRangeFilter)(f))
   253  	if err != nil {
   254  		return nil, err
   255  	}
   256  	filter := &pb.Filter{
   257  		Name:             proto.String(filterPath + "ColumnRangeFilter"),
   258  		SerializedFilter: serializedFilter,
   259  	}
   260  	return filter, nil
   261  }
   262  
   263  // CompareFilter is TODO
   264  type CompareFilter pb.CompareFilter
   265  
   266  // NewCompareFilter is TODO
   267  func NewCompareFilter(compareOp CompareType, comparatorObj Comparator) *CompareFilter {
   268  	op := pb.CompareType(compareOp)
   269  	obj, err := comparatorObj.ConstructPBComparator()
   270  	if err != nil {
   271  		panic(err)
   272  	}
   273  	return &CompareFilter{
   274  		CompareOp:  &op,
   275  		Comparator: obj,
   276  	}
   277  }
   278  
   279  // ConstructPBFilter is TODO
   280  func (f *CompareFilter) ConstructPBFilter() (*pb.Filter, error) {
   281  	serializedFilter, err := proto.Marshal((*pb.CompareFilter)(f))
   282  	if err != nil {
   283  		return nil, err
   284  	}
   285  	filter := &pb.Filter{
   286  		Name:             proto.String(filterPath + "CompareFilter"),
   287  		SerializedFilter: serializedFilter,
   288  	}
   289  	return filter, nil
   290  }
   291  
   292  // DependentColumnFilter is TODO
   293  type DependentColumnFilter pb.DependentColumnFilter
   294  
   295  // NewDependentColumnFilter is TODO
   296  func NewDependentColumnFilter(compareFilter *CompareFilter, columnFamily, columnQualifier []byte,
   297  	dropDependentColumn bool) *DependentColumnFilter {
   298  	return &DependentColumnFilter{
   299  		CompareFilter:       (*pb.CompareFilter)(compareFilter),
   300  		ColumnFamily:        columnFamily,
   301  		ColumnQualifier:     columnQualifier,
   302  		DropDependentColumn: proto.Bool(dropDependentColumn),
   303  	}
   304  }
   305  
   306  // ConstructPBFilter is TODO
   307  func (f *DependentColumnFilter) ConstructPBFilter() (*pb.Filter, error) {
   308  	serializedFilter, err := proto.Marshal((*pb.DependentColumnFilter)(f))
   309  	if err != nil {
   310  		return nil, err
   311  	}
   312  	filter := &pb.Filter{
   313  		Name:             proto.String(filterPath + "DependentColumnFilter"),
   314  		SerializedFilter: serializedFilter,
   315  	}
   316  	return filter, nil
   317  }
   318  
   319  // FamilyFilter is TODO
   320  type FamilyFilter pb.FamilyFilter
   321  
   322  // NewFamilyFilter is TODO
   323  func NewFamilyFilter(compareFilter *CompareFilter) *FamilyFilter {
   324  	return &FamilyFilter{
   325  		CompareFilter: (*pb.CompareFilter)(compareFilter),
   326  	}
   327  }
   328  
   329  // ConstructPBFilter is TODO
   330  func (f *FamilyFilter) ConstructPBFilter() (*pb.Filter, error) {
   331  	serializedFilter, err := proto.Marshal((*pb.FamilyFilter)(f))
   332  	if err != nil {
   333  		return nil, err
   334  	}
   335  	filter := &pb.Filter{
   336  		Name:             proto.String(filterPath + "FamilyFilter"),
   337  		SerializedFilter: serializedFilter,
   338  	}
   339  	return filter, nil
   340  }
   341  
   342  // Wrapper is TODO
   343  type Wrapper pb.FilterWrapper
   344  
   345  // NewWrapper is TODO
   346  func NewWrapper(wrappedFilter Filter) *Wrapper {
   347  	f, err := wrappedFilter.ConstructPBFilter()
   348  	if err != nil {
   349  		panic(err)
   350  	}
   351  	return &Wrapper{
   352  		Filter: f,
   353  	}
   354  }
   355  
   356  // ConstructPBFilter is TODO
   357  func (f *Wrapper) ConstructPBFilter() (*pb.Filter, error) {
   358  	serializedFilter, err := proto.Marshal((*pb.FilterWrapper)(f))
   359  	if err != nil {
   360  		return nil, err
   361  	}
   362  	filter := &pb.Filter{
   363  		Name:             proto.String(filterPath + "FilterWrapper"),
   364  		SerializedFilter: serializedFilter,
   365  	}
   366  	return filter, nil
   367  }
   368  
   369  // FirstKeyOnlyFilter is TODO
   370  type FirstKeyOnlyFilter struct{}
   371  
   372  // NewFirstKeyOnlyFilter is TODO
   373  func NewFirstKeyOnlyFilter() FirstKeyOnlyFilter {
   374  	return FirstKeyOnlyFilter{}
   375  }
   376  
   377  // ConstructPBFilter is TODO
   378  func (f FirstKeyOnlyFilter) ConstructPBFilter() (*pb.Filter, error) {
   379  	return &pb.Filter{
   380  		Name:             proto.String(filterPath + "FirstKeyOnlyFilter"),
   381  		SerializedFilter: pb.MustMarshal(&pb.FirstKeyOnlyFilter{}),
   382  	}, nil
   383  }
   384  
   385  // FirstKeyValueMatchingQualifiersFilter is TODO
   386  type FirstKeyValueMatchingQualifiersFilter pb.FirstKeyValueMatchingQualifiersFilter
   387  
   388  // NewFirstKeyValueMatchingQualifiersFilter is TODO
   389  func NewFirstKeyValueMatchingQualifiersFilter(
   390  	qualifiers [][]byte) *FirstKeyValueMatchingQualifiersFilter {
   391  	return &FirstKeyValueMatchingQualifiersFilter{
   392  		Qualifiers: qualifiers,
   393  	}
   394  }
   395  
   396  // ConstructPBFilter is TODO
   397  func (f *FirstKeyValueMatchingQualifiersFilter) ConstructPBFilter() (*pb.Filter, error) {
   398  	serializedFilter, err := proto.Marshal((*pb.FirstKeyValueMatchingQualifiersFilter)(f))
   399  	if err != nil {
   400  		return nil, err
   401  	}
   402  	filter := &pb.Filter{
   403  		Name:             proto.String(filterPath + "FirstKeyValueMatchingQualifiersFilter"),
   404  		SerializedFilter: serializedFilter,
   405  	}
   406  	return filter, nil
   407  }
   408  
   409  // FuzzyRowFilter is TODO
   410  type FuzzyRowFilter pb.FuzzyRowFilter
   411  
   412  // NewFuzzyRowFilter is TODO
   413  func NewFuzzyRowFilter(pairs []*BytesBytesPair) *FuzzyRowFilter {
   414  	p := make([]*pb.BytesBytesPair, len(pairs))
   415  	for i, pair := range pairs {
   416  		p[i] = (*pb.BytesBytesPair)(pair)
   417  	}
   418  	return &FuzzyRowFilter{
   419  		FuzzyKeysData: p,
   420  	}
   421  }
   422  
   423  // ConstructPBFilter is TODO
   424  func (f *FuzzyRowFilter) ConstructPBFilter() (*pb.Filter, error) {
   425  	serializedFilter, err := proto.Marshal((*pb.FuzzyRowFilter)(f))
   426  	if err != nil {
   427  		return nil, err
   428  	}
   429  	filter := &pb.Filter{
   430  		Name:             proto.String(filterPath + "FuzzyRowFilter"),
   431  		SerializedFilter: serializedFilter,
   432  	}
   433  	return filter, nil
   434  }
   435  
   436  // InclusiveStopFilter is TODO
   437  type InclusiveStopFilter pb.InclusiveStopFilter
   438  
   439  // NewInclusiveStopFilter is TODO
   440  func NewInclusiveStopFilter(stopRowKey []byte) *InclusiveStopFilter {
   441  	return &InclusiveStopFilter{
   442  		StopRowKey: stopRowKey,
   443  	}
   444  }
   445  
   446  // ConstructPBFilter is TODO
   447  func (f *InclusiveStopFilter) ConstructPBFilter() (*pb.Filter, error) {
   448  	serializedFilter, err := proto.Marshal((*pb.InclusiveStopFilter)(f))
   449  	if err != nil {
   450  		return nil, err
   451  	}
   452  	filter := &pb.Filter{
   453  		Name:             proto.String(filterPath + "InclusiveStopFilter"),
   454  		SerializedFilter: serializedFilter,
   455  	}
   456  	return filter, nil
   457  }
   458  
   459  // KeyOnlyFilter is TODO
   460  type KeyOnlyFilter pb.KeyOnlyFilter
   461  
   462  // NewKeyOnlyFilter is TODO
   463  func NewKeyOnlyFilter(lenAsVal bool) *KeyOnlyFilter {
   464  	return &KeyOnlyFilter{
   465  		LenAsVal: proto.Bool(lenAsVal),
   466  	}
   467  }
   468  
   469  // ConstructPBFilter is TODO
   470  func (f *KeyOnlyFilter) ConstructPBFilter() (*pb.Filter, error) {
   471  	serializedFilter, err := proto.Marshal((*pb.KeyOnlyFilter)(f))
   472  	if err != nil {
   473  		return nil, err
   474  	}
   475  	filter := &pb.Filter{
   476  		Name:             proto.String(filterPath + "KeyOnlyFilter"),
   477  		SerializedFilter: serializedFilter,
   478  	}
   479  	return filter, nil
   480  }
   481  
   482  // MultipleColumnPrefixFilter is TODO
   483  type MultipleColumnPrefixFilter pb.MultipleColumnPrefixFilter
   484  
   485  // NewMultipleColumnPrefixFilter is TODO
   486  func NewMultipleColumnPrefixFilter(sortedPrefixes [][]byte) *MultipleColumnPrefixFilter {
   487  	return &MultipleColumnPrefixFilter{
   488  		SortedPrefixes: sortedPrefixes,
   489  	}
   490  }
   491  
   492  // ConstructPBFilter is TODO
   493  func (f *MultipleColumnPrefixFilter) ConstructPBFilter() (*pb.Filter, error) {
   494  	serializedFilter, err := proto.Marshal((*pb.MultipleColumnPrefixFilter)(f))
   495  	if err != nil {
   496  		return nil, err
   497  	}
   498  	filter := &pb.Filter{
   499  		Name:             proto.String(filterPath + "MultipleColumnPrefixFilter"),
   500  		SerializedFilter: serializedFilter,
   501  	}
   502  	return filter, nil
   503  }
   504  
   505  // PageFilter is TODO
   506  type PageFilter pb.PageFilter
   507  
   508  // NewPageFilter is TODO
   509  func NewPageFilter(pageSize int64) *PageFilter {
   510  	return &PageFilter{
   511  		PageSize: proto.Int64(pageSize),
   512  	}
   513  }
   514  
   515  // ConstructPBFilter is TODO
   516  func (f *PageFilter) ConstructPBFilter() (*pb.Filter, error) {
   517  	serializedFilter, err := proto.Marshal((*pb.PageFilter)(f))
   518  	if err != nil {
   519  		return nil, err
   520  	}
   521  	filter := &pb.Filter{
   522  		Name:             proto.String(filterPath + "PageFilter"),
   523  		SerializedFilter: serializedFilter,
   524  	}
   525  	return filter, nil
   526  }
   527  
   528  // PrefixFilter is TODO
   529  type PrefixFilter pb.PrefixFilter
   530  
   531  // NewPrefixFilter is TODO
   532  func NewPrefixFilter(prefix []byte) *PrefixFilter {
   533  	return &PrefixFilter{
   534  		Prefix: prefix,
   535  	}
   536  }
   537  
   538  // ConstructPBFilter is TODO
   539  func (f *PrefixFilter) ConstructPBFilter() (*pb.Filter, error) {
   540  	serializedFilter, err := proto.Marshal((*pb.PrefixFilter)(f))
   541  	if err != nil {
   542  		return nil, err
   543  	}
   544  	filter := &pb.Filter{
   545  		Name:             proto.String(filterPath + "PrefixFilter"),
   546  		SerializedFilter: serializedFilter,
   547  	}
   548  	return filter, nil
   549  }
   550  
   551  // QualifierFilter is TODO
   552  type QualifierFilter pb.QualifierFilter
   553  
   554  // NewQualifierFilter is TODO
   555  func NewQualifierFilter(compareFilter *CompareFilter) *QualifierFilter {
   556  	return &QualifierFilter{
   557  		CompareFilter: (*pb.CompareFilter)(compareFilter),
   558  	}
   559  }
   560  
   561  // ConstructPBFilter is TODO
   562  func (f *QualifierFilter) ConstructPBFilter() (*pb.Filter, error) {
   563  	serializedFilter, err := proto.Marshal((*pb.QualifierFilter)(f))
   564  	if err != nil {
   565  		return nil, err
   566  	}
   567  	filter := &pb.Filter{
   568  		Name:             proto.String(filterPath + "QualifierFilter"),
   569  		SerializedFilter: serializedFilter,
   570  	}
   571  	return filter, nil
   572  }
   573  
   574  // RandomRowFilter is TODO
   575  type RandomRowFilter pb.RandomRowFilter
   576  
   577  // NewRandomRowFilter is TODO
   578  func NewRandomRowFilter(chance float32) *RandomRowFilter {
   579  	return &RandomRowFilter{
   580  		Chance: proto.Float32(chance),
   581  	}
   582  }
   583  
   584  // ConstructPBFilter is TODO
   585  func (f *RandomRowFilter) ConstructPBFilter() (*pb.Filter, error) {
   586  	serializedFilter, err := proto.Marshal((*pb.RandomRowFilter)(f))
   587  	if err != nil {
   588  		return nil, err
   589  	}
   590  	filter := &pb.Filter{
   591  		Name:             proto.String(filterPath + "RandomRowFilter"),
   592  		SerializedFilter: serializedFilter,
   593  	}
   594  	return filter, nil
   595  }
   596  
   597  // RowFilter is TODO
   598  type RowFilter pb.RowFilter
   599  
   600  // NewRowFilter is TODO
   601  func NewRowFilter(compareFilter *CompareFilter) *RowFilter {
   602  	return &RowFilter{
   603  		CompareFilter: (*pb.CompareFilter)(compareFilter),
   604  	}
   605  }
   606  
   607  // ConstructPBFilter is TODO
   608  func (f *RowFilter) ConstructPBFilter() (*pb.Filter, error) {
   609  	serializedFilter, err := proto.Marshal((*pb.RowFilter)(f))
   610  	if err != nil {
   611  		return nil, err
   612  	}
   613  	filter := &pb.Filter{
   614  		Name:             proto.String(filterPath + "RowFilter"),
   615  		SerializedFilter: serializedFilter,
   616  	}
   617  	return filter, nil
   618  }
   619  
   620  // SingleColumnValueFilter is TODO
   621  type SingleColumnValueFilter pb.SingleColumnValueFilter
   622  
   623  // NewSingleColumnValueFilter is TODO
   624  func NewSingleColumnValueFilter(columnFamily, columnQualifier []byte, compareOp CompareType,
   625  	comparatorObj Comparator, filterIfMissing, latestVersionOnly bool) *SingleColumnValueFilter {
   626  	obj, err := comparatorObj.ConstructPBComparator()
   627  	if err != nil {
   628  		panic(err)
   629  	}
   630  	return &SingleColumnValueFilter{
   631  		ColumnFamily:      columnFamily,
   632  		ColumnQualifier:   columnQualifier,
   633  		CompareOp:         (*pb.CompareType)(&compareOp),
   634  		Comparator:        obj,
   635  		FilterIfMissing:   proto.Bool(filterIfMissing),
   636  		LatestVersionOnly: proto.Bool(latestVersionOnly),
   637  	}
   638  }
   639  
   640  // ConstructPB is TODO
   641  func (f *SingleColumnValueFilter) ConstructPB() (*pb.SingleColumnValueFilter, error) {
   642  	if !CompareType(*f.CompareOp).isValid() {
   643  		return nil, errors.New("invalid compare operation specified")
   644  	}
   645  
   646  	return (*pb.SingleColumnValueFilter)(f), nil
   647  }
   648  
   649  // ConstructPBFilter is TODO
   650  func (f *SingleColumnValueFilter) ConstructPBFilter() (*pb.Filter, error) {
   651  	serializedFilter, err := proto.Marshal((*pb.SingleColumnValueFilter)(f))
   652  	if err != nil {
   653  		return nil, err
   654  	}
   655  	filter := &pb.Filter{
   656  		Name:             proto.String(filterPath + "SingleColumnValueFilter"),
   657  		SerializedFilter: serializedFilter,
   658  	}
   659  	return filter, nil
   660  }
   661  
   662  // SingleColumnValueExcludeFilter is TODO
   663  type SingleColumnValueExcludeFilter pb.SingleColumnValueExcludeFilter
   664  
   665  // NewSingleColumnValueExcludeFilter is TODO
   666  func NewSingleColumnValueExcludeFilter(
   667  	filter *SingleColumnValueFilter) *SingleColumnValueExcludeFilter {
   668  	return &SingleColumnValueExcludeFilter{
   669  		SingleColumnValueFilter: (*pb.SingleColumnValueFilter)(filter),
   670  	}
   671  }
   672  
   673  // ConstructPBFilter is TODO
   674  func (f *SingleColumnValueExcludeFilter) ConstructPBFilter() (*pb.Filter, error) {
   675  	serializedFilter, err := proto.Marshal((*pb.SingleColumnValueExcludeFilter)(f))
   676  	if err != nil {
   677  		return nil, err
   678  	}
   679  	filter := &pb.Filter{
   680  		Name:             proto.String(filterPath + "SingleColumnValueExcludeFilter"),
   681  		SerializedFilter: serializedFilter,
   682  	}
   683  	return filter, nil
   684  }
   685  
   686  // SkipFilter is TODO
   687  type SkipFilter pb.SkipFilter
   688  
   689  // NewSkipFilter is TODO
   690  func NewSkipFilter(skippingFilter Filter) *SkipFilter {
   691  	f, err := skippingFilter.ConstructPBFilter()
   692  	if err != nil {
   693  		panic(err)
   694  	}
   695  	return &SkipFilter{
   696  		Filter: f,
   697  	}
   698  }
   699  
   700  // ConstructPBFilter is TODO
   701  func (f *SkipFilter) ConstructPBFilter() (*pb.Filter, error) {
   702  	serializedFilter, err := proto.Marshal((*pb.SkipFilter)(f))
   703  	if err != nil {
   704  		return nil, err
   705  	}
   706  	filter := &pb.Filter{
   707  		Name:             proto.String(filterPath + "SkipFilter"),
   708  		SerializedFilter: serializedFilter,
   709  	}
   710  	return filter, nil
   711  }
   712  
   713  // TimestampsFilter is TODO
   714  type TimestampsFilter pb.TimestampsFilter
   715  
   716  // NewTimestampsFilter is TODO
   717  func NewTimestampsFilter(timestamps []int64) *TimestampsFilter {
   718  	return &TimestampsFilter{
   719  		Timestamps: timestamps,
   720  	}
   721  }
   722  
   723  // ConstructPBFilter is TODO
   724  func (f *TimestampsFilter) ConstructPBFilter() (*pb.Filter, error) {
   725  	serializedFilter, err := proto.Marshal((*pb.TimestampsFilter)(f))
   726  	if err != nil {
   727  		return nil, err
   728  	}
   729  	filter := &pb.Filter{
   730  		Name:             proto.String(filterPath + "TimestampsFilter"),
   731  		SerializedFilter: serializedFilter,
   732  	}
   733  	return filter, nil
   734  }
   735  
   736  // ValueFilter is TODO
   737  type ValueFilter pb.ValueFilter
   738  
   739  // NewValueFilter is TODO
   740  func NewValueFilter(compareFilter *CompareFilter) *ValueFilter {
   741  	return &ValueFilter{
   742  		CompareFilter: (*pb.CompareFilter)(compareFilter),
   743  	}
   744  }
   745  
   746  // ConstructPBFilter is TODO
   747  func (f *ValueFilter) ConstructPBFilter() (*pb.Filter, error) {
   748  	serializedFilter, err := proto.Marshal((*pb.ValueFilter)(f))
   749  	if err != nil {
   750  		return nil, err
   751  	}
   752  	filter := &pb.Filter{
   753  		Name:             proto.String(filterPath + "ValueFilter"),
   754  		SerializedFilter: serializedFilter,
   755  	}
   756  	return filter, nil
   757  }
   758  
   759  // WhileMatchFilter is TODO
   760  type WhileMatchFilter pb.WhileMatchFilter
   761  
   762  // NewWhileMatchFilter is TODO
   763  func NewWhileMatchFilter(matchingFilter Filter) *WhileMatchFilter {
   764  	f, err := matchingFilter.ConstructPBFilter()
   765  	if err != nil {
   766  		panic(err)
   767  	}
   768  	return &WhileMatchFilter{
   769  		Filter: f,
   770  	}
   771  }
   772  
   773  // ConstructPBFilter is TODO
   774  func (f *WhileMatchFilter) ConstructPBFilter() (*pb.Filter, error) {
   775  	serializedFilter, err := proto.Marshal((*pb.WhileMatchFilter)(f))
   776  	if err != nil {
   777  		return nil, err
   778  	}
   779  	filter := &pb.Filter{
   780  		Name:             proto.String(filterPath + "WhileMatchFilter"),
   781  		SerializedFilter: serializedFilter,
   782  	}
   783  	return filter, nil
   784  }
   785  
   786  // AllFilter is TODO
   787  type AllFilter struct{}
   788  
   789  // NewAllFilter is TODO
   790  func NewAllFilter() AllFilter {
   791  	return AllFilter{}
   792  }
   793  
   794  // ConstructPBFilter is TODO
   795  func (f *AllFilter) ConstructPBFilter() (*pb.Filter, error) {
   796  	return &pb.Filter{
   797  		Name:             proto.String(filterPath + "FilterAllFilter"),
   798  		SerializedFilter: pb.MustMarshal(&pb.FilterAllFilter{}),
   799  	}, nil
   800  }
   801  
   802  // RowRange is TODO
   803  type RowRange pb.RowRange
   804  
   805  // NewRowRange is TODO
   806  func NewRowRange(startRow, stopRow []byte, startRowInclusive, stopRowInclusive bool) *RowRange {
   807  	return &RowRange{
   808  		StartRow:          startRow,
   809  		StartRowInclusive: proto.Bool(startRowInclusive),
   810  		StopRow:           stopRow,
   811  		StopRowInclusive:  proto.Bool(stopRowInclusive),
   812  	}
   813  }
   814  
   815  // ConstructPBFilter is TODO
   816  func (f *RowRange) ConstructPBFilter() (*pb.Filter, error) {
   817  	serializedFilter, err := proto.Marshal((*pb.RowRange)(f))
   818  	if err != nil {
   819  		return nil, err
   820  	}
   821  	filter := &pb.Filter{
   822  		Name:             proto.String(filterPath + "RowRange"),
   823  		SerializedFilter: serializedFilter,
   824  	}
   825  	return filter, nil
   826  }
   827  
   828  // MultiRowRangeFilter is TODO
   829  type MultiRowRangeFilter pb.MultiRowRangeFilter
   830  
   831  // NewMultiRowRangeFilter is TODO
   832  func NewMultiRowRangeFilter(rowRangeList []*RowRange) *MultiRowRangeFilter {
   833  	rangeList := make([]*pb.RowRange, len(rowRangeList))
   834  	for i, rr := range rowRangeList {
   835  		rangeList[i] = (*pb.RowRange)(rr)
   836  	}
   837  	return &MultiRowRangeFilter{
   838  		RowRangeList: rangeList,
   839  	}
   840  }
   841  
   842  // ConstructPBFilter is TODO
   843  func (f *MultiRowRangeFilter) ConstructPBFilter() (*pb.Filter, error) {
   844  	serializedFilter, err := proto.Marshal((*pb.MultiRowRangeFilter)(f))
   845  	if err != nil {
   846  		return nil, err
   847  	}
   848  	filter := &pb.Filter{
   849  		Name:             proto.String(filterPath + "MultiRowRangeFilter"),
   850  		SerializedFilter: serializedFilter,
   851  	}
   852  	return filter, nil
   853  }