github.com/cockroachdb/pebble@v0.0.0-20231214172447-ab4952c5f87b/internal/keyspan/filter_test.go (about) 1 // Copyright 2022 The LevelDB-Go and Pebble Authors. All rights reserved. Use 2 // of this source code is governed by a BSD-style license that can be found in 3 // the LICENSE file. 4 5 package keyspan 6 7 import ( 8 "fmt" 9 "strings" 10 "testing" 11 12 "github.com/cockroachdb/datadriven" 13 "github.com/cockroachdb/pebble/internal/base" 14 "github.com/cockroachdb/pebble/internal/testkeys" 15 ) 16 17 func TestFilteringIter(t *testing.T) { 18 // makeFilter returns a FilterFunc that will filter out all keys in a Span 19 // that are not of the given kind. Empty spans are skipped. 20 makeFilter := func(kind base.InternalKeyKind) FilterFunc { 21 return func(in *Span, out *Span) (keep bool) { 22 out.Start, out.End = in.Start, in.End 23 out.Keys = out.Keys[:0] 24 for _, k := range in.Keys { 25 if k.Kind() != kind { 26 continue 27 } 28 out.Keys = append(out.Keys, k) 29 } 30 return len(out.Keys) > 0 31 } 32 } 33 34 cmp := testkeys.Comparer.Compare 35 var spans []Span 36 datadriven.RunTest(t, "testdata/filtering_iter", func(t *testing.T, td *datadriven.TestData) string { 37 switch cmd := td.Cmd; cmd { 38 case "define": 39 spans = spans[:0] 40 lines := strings.Split(strings.TrimSpace(td.Input), "\n") 41 for _, line := range lines { 42 spans = append(spans, ParseSpan(line)) 43 } 44 return "" 45 46 case "iter": 47 var filter FilterFunc 48 for _, cmdArg := range td.CmdArgs { 49 switch cmdArg.Key { 50 case "filter": 51 for _, s := range cmdArg.Vals { 52 switch s { 53 case "no-op": 54 filter = nil 55 case "key-kind-set": 56 filter = makeFilter(base.InternalKeyKindRangeKeySet) 57 case "key-kind-unset": 58 filter = makeFilter(base.InternalKeyKindRangeKeyUnset) 59 case "key-kind-del": 60 filter = makeFilter(base.InternalKeyKindRangeKeyDelete) 61 default: 62 return fmt.Sprintf("unknown filter: %s", s) 63 } 64 } 65 default: 66 return fmt.Sprintf("unknown command: %s", cmdArg.Key) 67 } 68 } 69 innerIter := NewIter(cmp, spans) 70 iter := Filter(innerIter, filter, cmp) 71 defer iter.Close() 72 s := runFragmentIteratorCmd(iter, td.Input, nil) 73 return s 74 75 default: 76 return fmt.Sprintf("unknown command: %s", cmd) 77 } 78 }) 79 }