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 }