about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAlan Pearce2024-05-09 18:47:37 +0200
committerAlan Pearce2024-05-09 19:28:13 +0200
commit0986e8699e87addccbef43c0ce30a466988fed15 (patch)
treefa40d9609b8764966c7c477fb91ef3c01113635d
parent1db7c2a1630c3d80c3c696c8fabaa5476eb2184e (diff)
downloadsearchix-0986e8699e87addccbef43c0ce30a466988fed15.tar.lz
searchix-0986e8699e87addccbef43c0ce30a466988fed15.tar.zst
searchix-0986e8699e87addccbef43c0ce30a466988fed15.zip
feat: enable index path to be configured
-rw-r--r--import/main.go3
-rw-r--r--internal/search/indexer.go29
-rw-r--r--internal/search/search.go6
-rw-r--r--internal/server/server.go3
4 files changed, 28 insertions, 13 deletions
diff --git a/import/main.go b/import/main.go
index 90f2b74..db899e2 100644
--- a/import/main.go
+++ b/import/main.go
@@ -22,6 +22,7 @@ type Config struct {
 	LogLevel   slog.Level    `conf:"default:INFO"`
 	Timeout    time.Duration `conf:"default:30m,help:maximum time to wait for all fetchers and importers combined"`
 	Replace    bool          `conf:"default:false,help:whether to remove existing database, if exists"`
+	IndexPath  string        `conf:"default:data/index.bleve"`
 }
 
 func main() {
@@ -50,7 +51,7 @@ func main() {
 		return
 	}
 
-	indexer, err := search.NewIndexer(cfg.DataPath, runtimeConfig.Replace)
+	indexer, err := search.NewIndexer(runtimeConfig.IndexPath, runtimeConfig.Replace)
 	if err != nil {
 		log.Fatalf("Failed to create indexer: %v", err)
 	}
diff --git a/internal/search/indexer.go b/internal/search/indexer.go
index fc0214b..ad891ff 100644
--- a/internal/search/indexer.go
+++ b/internal/search/indexer.go
@@ -29,19 +29,33 @@ type WriteIndex struct {
 	indexMapping *mapping.IndexMappingImpl
 }
 
-func NewIndexer(dir string, force bool) (*WriteIndex, error) {
+const ExpectedIndexExtension = ".bleve"
+
+func NewIndexer(indexPath string, force bool) (*WriteIndex, error) {
 	var err error
 	bleve.SetLog(log.Default())
 
-	indexPath := path.Join(dir, indexFilename)
-
 	exists, err := file.Exists(indexPath)
 	if err != nil {
-		return nil, errors.WithMessagef(err, "could not check if index exists at path %s", indexPath)
+		return nil, errors.WithMessagef(
+			err,
+			"could not check if index exists at path %s",
+			indexPath,
+		)
 	}
 	if exists {
 		if !force {
-			return nil, errors.Errorf("index file %s already exists (use --force to replace)", indexPath)
+			return nil, errors.Errorf(
+				"index file %s already exists (use --force to replace)",
+				indexPath,
+			)
+		}
+		if path.Ext(indexPath) != ExpectedIndexExtension {
+			return nil, errors.Errorf(
+				"cowardly refusing to delete path %s (it doesn't end in '%s')",
+				indexPath,
+				ExpectedIndexExtension,
+			)
 		}
 		err := os.RemoveAll(indexPath)
 		if err != nil {
@@ -130,7 +144,10 @@ func NewIndexer(dir string, force bool) (*WriteIndex, error) {
 	}, nil
 }
 
-func (i *WriteIndex) ImportOptions(ctx context.Context, objects <-chan *options.NixOption) <-chan error {
+func (i *WriteIndex) ImportOptions(
+	ctx context.Context,
+	objects <-chan *options.NixOption,
+) <-chan error {
 	var err error
 	errs := make(chan error)
 
diff --git a/internal/search/search.go b/internal/search/search.go
index 92afdfb..9766294 100644
--- a/internal/search/search.go
+++ b/internal/search/search.go
@@ -4,7 +4,6 @@ import (
 	"bytes"
 	"context"
 	"encoding/gob"
-	"path"
 	"searchix/internal/options"
 
 	"github.com/blevesearch/bleve/v2"
@@ -13,7 +12,6 @@ import (
 )
 
 const ResultsPerPage = 20
-const indexFilename = "index.bleve"
 
 type DocumentMatch struct {
 	search.DocumentMatch
@@ -29,9 +27,7 @@ type ReadIndex struct {
 	index bleve.Index
 }
 
-func Open(dir string) (*ReadIndex, error) {
-	indexPath := path.Join(dir, indexFilename)
-
+func Open(indexPath string) (*ReadIndex, error) {
 	idx, err := bleve.Open(indexPath)
 	if err != nil {
 		return nil, errors.WithMessagef(err, "unable to open index at path %s", indexPath)
diff --git a/internal/server/server.go b/internal/server/server.go
index 1611a7a..8252b8e 100644
--- a/internal/server/server.go
+++ b/internal/server/server.go
@@ -45,6 +45,7 @@ type Config struct {
 	BaseURL       cfg.URL    `conf:"default:http://localhost:3000,short:b"`
 	ConfigFile    string     `conf:"short:c"`
 	LogLevel      slog.Level `conf:"default:INFO"`
+	IndexPath     string     `conf:"default:data/index.bleve"`
 }
 
 type HTTPError struct {
@@ -89,7 +90,7 @@ func New(runtimeConfig *Config) (*Server, error) {
 	}
 
 	slog.Debug("loading index")
-	index, err := search.Open(config.DataPath)
+	index, err := search.Open(runtimeConfig.IndexPath)
 	slog.Debug("loaded index")
 	if err != nil {
 		log.Fatalf("could not open search index, error: %#v", err)