Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions config.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ import (
"io"
"log"

"github.com/RoaringBitmap/roaring"
segment "github.com/blugelabs/bluge_segment_api"

"github.com/blugelabs/bluge/analysis"
"github.com/blugelabs/bluge/analysis/analyzer"
"github.com/blugelabs/bluge/index"
Expand Down Expand Up @@ -78,6 +81,11 @@ func (config Config) WithSearchStartFunc(f func(size uint64) error) Config {
return config
}

func (config Config) WithPrepareMergeCallback(f func(src []*roaring.Bitmap, segments []segment.Segment, id uint64) (dest []*roaring.Bitmap, err error)) Config {
config.indexConfig.PrepareMergeFunc = f
return config
}

func DefaultConfig(path string) Config {
indexConfig := index.DefaultConfig(path)
return defaultConfig(indexConfig)
Expand Down
5 changes: 5 additions & 0 deletions index/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ import (

"github.com/blugelabs/bluge/index/mergeplan"
"github.com/blugelabs/ice"

"github.com/RoaringBitmap/roaring"
)

type Config struct {
Expand Down Expand Up @@ -80,6 +82,9 @@ type Config struct {
virtualFields map[string][]segment.Field

CacheMaxBytes int

// PerFieldSimilarity allows specifying a custom callback before merge operation
PrepareMergeFunc func(src []*roaring.Bitmap, segments []segment.Segment, id uint64) (dest []*roaring.Bitmap, err error)
}

func (config Config) WithSegmentType(typ string) Config {
Expand Down
12 changes: 11 additions & 1 deletion index/merge.go
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,7 @@ func (s *Writer) executeMergeTask(merges chan *segmentMerge, task *mergeplan.Mer
// decrement the ref counts on skipping introduction.
// FIXME stale file that won't get cleaned up
_ = seg.Close()
_ = s.directory.Remove(ItemKindSegment, newSegmentID)
}
}

Expand Down Expand Up @@ -363,9 +364,18 @@ func (s *Writer) mergeSegmentBases(merges chan *segmentMerge, snapshot *Snapshot

func (s *Writer) merge(segments []segment.Segment, drops []*roaring.Bitmap, id uint64) (
[][]uint64, error) {
var err error
if s.config.PrepareMergeFunc != nil {
// call the prepare merge function
drops, err = s.config.PrepareMergeFunc(drops, segments, id)
if err != nil {
return nil, fmt.Errorf("prepare merge failed: %w", err)
}
}

merger := s.segPlugin.Merge(segments, drops, s.config.MergeBufferSize)

err := s.directory.Persist(ItemKindSegment, id, merger, s.closeCh)
err = s.directory.Persist(ItemKindSegment, id, merger, s.closeCh)
if err != nil {
return nil, err
}
Expand Down
Loading