diff options
author | Alan Pearce | 2025-03-12 22:39:51 +0100 |
---|---|---|
committer | Alan Pearce | 2025-03-12 22:39:51 +0100 |
commit | 9015baf955c94a806c01b3dcd5648c8e68ad2685 (patch) | |
tree | 5f59386c2ab31b6e45b85576e45a1fc8ae448ae0 /internal/index | |
parent | 7bb77ff5729cc9434afee895a470fd3b4c12e6d1 (diff) | |
download | searchix-9015baf955c94a806c01b3dcd5648c8e68ad2685.tar.lz searchix-9015baf955c94a806c01b3dcd5648c8e68ad2685.tar.zst searchix-9015baf955c94a806c01b3dcd5648c8e68ad2685.zip |
Diffstat (limited to 'internal/index')
-rw-r--r-- | internal/index/index_meta.go | 18 | ||||
-rw-r--r-- | internal/index/indexer.go | 59 | ||||
-rw-r--r-- | internal/index/search.go | 12 |
3 files changed, 43 insertions, 46 deletions
diff --git a/internal/index/index_meta.go b/internal/index/index_meta.go index 336bae0..635965a 100644 --- a/internal/index/index_meta.go +++ b/internal/index/index_meta.go @@ -8,7 +8,7 @@ import ( "go.alanpearce.eu/searchix/internal/file" "go.alanpearce.eu/x/log" - "github.com/pkg/errors" + "gitlab.com/tozd/go/errors" ) const CurrentSchemaVersion = 3 @@ -31,7 +31,7 @@ type Meta struct { data } -func createMeta(path string, log *log.Logger) (*Meta, error) { +func createMeta(path string, log *log.Logger) (*Meta, errors.E) { exists, err := file.Exists(path) if err != nil { return nil, errors.WithMessage(err, "could not check for existence of index metadata") @@ -49,7 +49,7 @@ func createMeta(path string, log *log.Logger) (*Meta, error) { }, nil } -func openMeta(path string, log *log.Logger) (*Meta, error) { +func openMeta(path string, log *log.Logger) (*Meta, errors.E) { exists, err := file.Exists(path) if err != nil { return nil, errors.WithMessage(err, "could not check for existence of index metadata") @@ -58,16 +58,16 @@ func openMeta(path string, log *log.Logger) (*Meta, error) { return createMeta(path, log) } - j, err := os.ReadFile(path) - if err != nil { - return nil, errors.WithMessage(err, "could not open index metadata file") + j, baseErr := os.ReadFile(path) + if baseErr != nil { + return nil, errors.WithMessage(baseErr, "could not open index metadata file") } meta := Meta{ path: path, log: log, } - err = json.Unmarshal(j, &meta.data) - if err != nil { + + if err := json.Unmarshal(j, &meta.data); err != nil { return nil, errors.WithMessage(err, "index metadata is corrupt, try replacing the index") } @@ -88,7 +88,7 @@ func (i *Meta) checkSchemaVersion() { } } -func (i *Meta) Save() error { +func (i *Meta) Save() errors.E { i.SchemaVersion = CurrentSchemaVersion j, err := json.Marshal(i.data) if err != nil { diff --git a/internal/index/indexer.go b/internal/index/indexer.go index 6a1dcf0..6000358 100644 --- a/internal/index/indexer.go +++ b/internal/index/indexer.go @@ -26,7 +26,7 @@ import ( "github.com/blevesearch/bleve/v2/document" "github.com/blevesearch/bleve/v2/mapping" indexAPI "github.com/blevesearch/bleve_index_api" - "github.com/pkg/errors" + "gitlab.com/tozd/go/errors" ) type WriteIndex struct { @@ -36,16 +36,16 @@ type WriteIndex struct { } type BatchError struct { - error + errors.E } func (e *BatchError) Error() string { - return e.error.Error() + return e.E.Error() } var batchSize = 10_000 -func createIndexMapping() (mapping.IndexMapping, error) { +func createIndexMapping() (mapping.IndexMapping, errors.E) { indexMapping := bleve.NewIndexMapping() indexMapping.StoreDynamic = false indexMapping.IndexDynamic = false @@ -124,7 +124,7 @@ func createIndexMapping() (mapping.IndexMapping, error) { return indexMapping, nil } -func createIndex(indexPath string, options *Options) (bleve.Index, error) { +func createIndex(indexPath string, options *Options) (bleve.Index, errors.E) { indexMapping, err := createIndexMapping() if err != nil { return nil, err @@ -136,15 +136,15 @@ func createIndex(indexPath string, options *Options) (bleve.Index, error) { "PersisterNapUnderNumFiles": 500, } } - idx, err := bleve.NewUsing( + idx, baseErr := bleve.NewUsing( indexPath, indexMapping, bleve.Config.DefaultIndexType, bleve.Config.DefaultKVStore, kvconfig, ) - if err != nil { - return nil, errors.WithMessagef(err, "unable to create index at path %s", indexPath) + if baseErr != nil { + return nil, errors.WithMessagef(baseErr, "unable to create index at path %s", indexPath) } return idx, nil @@ -162,7 +162,7 @@ var expectedDataFiles = []string{ "nixpkgs-programs.db", } -func deleteIndex(dataRoot string) error { +func deleteIndex(dataRoot string) errors.E { dir, err := os.ReadDir(dataRoot) if err != nil { return errors.WithMessagef(err, "could not read data directory %s", dataRoot) @@ -195,8 +195,8 @@ func OpenOrCreate( dataRoot string, force bool, options *Options, -) (*ReadIndex, *WriteIndex, bool, error) { - var err error +) (*ReadIndex, *WriteIndex, bool, errors.E) { + var err errors.E bleve.SetLog(zap.NewStdLog(options.Logger.Named("bleve").GetLogger())) indexPath := path.Join(dataRoot, indexBaseName) @@ -231,9 +231,10 @@ func OpenOrCreate( } } else { - idx, err = bleve.Open(indexPath) - if err != nil { - return nil, nil, exists, errors.WithMessagef(err, "could not open index at path %s", indexPath) + var baseErr error + idx, baseErr = bleve.Open(indexPath) + if baseErr != nil { + return nil, nil, exists, errors.WithMessagef(baseErr, "could not open index at path %s", indexPath) } meta, err = openMeta(metaPath, options.Logger) @@ -260,16 +261,16 @@ func OpenOrCreate( nil } -func (i *WriteIndex) SaveMeta() error { +func (i *WriteIndex) SaveMeta() errors.E { return i.Meta.Save() } func (i *WriteIndex) Import( ctx context.Context, objects <-chan nix.Importable, -) <-chan error { - var err error - errs := make(chan error) +) <-chan errors.E { + var err errors.E + errs := make(chan errors.E) go func() { defer close(errs) @@ -288,8 +289,7 @@ func (i *WriteIndex) Import( } doc := document.NewDocument(nix.GetKey(obj)) - err = indexMapping.MapDocument(doc, obj) - if err != nil { + if err := indexMapping.MapDocument(doc, obj); err != nil { errs <- errors.WithMessagef(err, "could not map document for object: %s", obj.GetName()) continue @@ -297,8 +297,7 @@ func (i *WriteIndex) Import( var data bytes.Buffer enc := gob.NewEncoder(&data) - err = enc.Encode(&obj) - if err != nil { + if err := enc.Encode(&obj); err != nil { errs <- errors.WithMessage(err, "could not store object in search index") continue @@ -307,9 +306,7 @@ func (i *WriteIndex) Import( newDoc := doc.AddField(field) // log.Debug("adding object to index", "name", opt.Name) - err = batch.IndexAdvanced(newDoc) - - if err != nil { + if err := batch.IndexAdvanced(newDoc); err != nil { errs <- errors.WithMessagef(err, "could not index object %s", obj.GetName()) continue @@ -334,11 +331,11 @@ func (i *WriteIndex) Import( return errs } -func (i *WriteIndex) Flush(batch *bleve.Batch) error { +func (i *WriteIndex) Flush(batch *bleve.Batch) errors.E { size := batch.Size() if size == 0 { return &BatchError{ - error: errors.New("no documents to flush"), + E: errors.New("no documents to flush"), } } i.log.Debug("flushing batch", "size", size) @@ -346,7 +343,7 @@ func (i *WriteIndex) Flush(batch *bleve.Batch) error { err := i.index.Batch(batch) if err != nil { return &BatchError{ - error: errors.WithMessagef(err, "could not flush batch"), + E: errors.WithMessagef(err, "could not flush batch"), } } @@ -355,7 +352,7 @@ func (i *WriteIndex) Flush(batch *bleve.Batch) error { return nil } -func (i *WriteIndex) Close() (err error) { +func (i *WriteIndex) Close() (err errors.E) { if e := i.Meta.Save(); e != nil { // index needs to be closed anyway err = errors.WithMessage(e, "could not save metadata") @@ -368,7 +365,7 @@ func (i *WriteIndex) Close() (err error) { return err } -func (i *WriteIndex) DeleteBySource(source string) error { +func (i *WriteIndex) DeleteBySource(source string) errors.E { query := bleve.NewTermQuery(source) search := bleve.NewSearchRequest(query) search.Size = math.MaxInt @@ -392,7 +389,7 @@ func (i *WriteIndex) DeleteBySource(source string) error { } err = i.Flush(batch) if err != nil { - return err + return errors.WithStack(err) } if uint64(search.Size) < results.Total { diff --git a/internal/index/search.go b/internal/index/search.go index 50a5ce2..3f9c13a 100644 --- a/internal/index/search.go +++ b/internal/index/search.go @@ -12,7 +12,7 @@ import ( "github.com/blevesearch/bleve/v2" "github.com/blevesearch/bleve/v2/search" "github.com/blevesearch/bleve/v2/search/query" - "github.com/pkg/errors" + "gitlab.com/tozd/go/errors" ) const DefaultPageSize = 100 @@ -33,7 +33,7 @@ type ReadIndex struct { meta *Meta } -func (index *ReadIndex) GetEnabledSources() ([]string, error) { +func (index *ReadIndex) GetEnabledSources() ([]string, errors.E) { facet := bleve.NewFacetRequest("Source", 100) query := bleve.NewMatchAllQuery() search := bleve.NewSearchRequest(query) @@ -64,13 +64,13 @@ func setField[T query.FieldableQuery]( func (index *ReadIndex) search( ctx context.Context, request *bleve.SearchRequest, -) (*Result, error) { +) (*Result, errors.E) { request.Fields = []string{"_data", "Source"} bleveResult, err := index.index.SearchInContext(ctx, request) select { case <-ctx.Done(): - return nil, ctx.Err() + return nil, errors.WithStack(ctx.Err()) default: if err != nil { return nil, errors.WithMessage(err, "failed to execute search query") @@ -104,7 +104,7 @@ func (index *ReadIndex) Search( keyword string, from int, pageSize int, -) (*Result, error) { +) (*Result, errors.E) { query := bleve.NewBooleanQuery() // match the user's query in any field ... @@ -157,7 +157,7 @@ func (index *ReadIndex) GetDocument( ctx context.Context, source *config.Source, id string, -) (*nix.Importable, error) { +) (*nix.Importable, errors.E) { key := nix.MakeKey(source, id) query := bleve.NewDocIDQuery([]string{key}) search := bleve.NewSearchRequest(query) |