aboutsummaryrefslogtreecommitdiffstats
path: root/cmd/index.go
diff options
context:
space:
mode:
authorJP Appel <jeanpierre.appel01@gmail.com>2025-06-30 17:18:45 -0400
committerJP Appel <jeanpierre.appel01@gmail.com>2025-06-30 18:54:51 -0400
commita4d86693394ba9b181b5928c1c6e8c31c9bb2b64 (patch)
tree8088d8d7c8c835b3e4c3590f1e3875d8e732d8cb /cmd/index.go
parent3168673bc2b57909213287a99b6151b4f1e0c439 (diff)
Implement compiled query execution
Diffstat (limited to 'cmd/index.go')
-rw-r--r--cmd/index.go75
1 files changed, 75 insertions, 0 deletions
diff --git a/cmd/index.go b/cmd/index.go
new file mode 100644
index 0000000..2f45f78
--- /dev/null
+++ b/cmd/index.go
@@ -0,0 +1,75 @@
+package main
+
+import (
+ "context"
+ "flag"
+ "fmt"
+ "log/slog"
+ "os"
+ "strings"
+
+ "github.com/jpappel/atlas/pkg/data"
+ "github.com/jpappel/atlas/pkg/index"
+)
+
+type IndexFlags struct {
+ Filters []index.DocFilter
+ index.ParseOpts
+}
+
+func setupIndexFlags(args []string, fs *flag.FlagSet, flags *IndexFlags) {
+ fs.BoolVar(&flags.IgnoreDateError, "ignoreBadDates", false, "ignore malformed dates while indexing")
+ fs.BoolVar(&flags.IgnoreMetaError, "ignoreMetaError", false, "ignore errors while parsing general YAML header info")
+ fs.BoolVar(&flags.ParseMeta, "parseMeta", true, "parse YAML header values other title, authors, date, tags")
+
+ customFilters := false
+ flags.Filters = index.DefaultFilters()
+ fs.Func("filter",
+ "accept or reject files from indexing, applied in supplied order"+
+ "\n(default Ext_.md, MaxSize_204800, YAMLHeader, ExcludeParent_templates)\n"+
+ index.FilterHelp,
+ func(s string) error {
+ if !customFilters {
+ flags.Filters = flags.Filters[:0]
+ }
+
+ filter, err := index.ParseFilter(s)
+ if err != nil {
+ return err
+ }
+ flags.Filters = append(flags.Filters, filter)
+
+ return nil
+ })
+
+ fs.Parse(args[1:])
+}
+
+func runIndex(gFlags GlobalFlags, iFlags IndexFlags, db *data.Query) byte {
+ idx := index.Index{Root: gFlags.IndexRoot, Filters: iFlags.Filters}
+ if slog.Default().Enabled(context.Background(), slog.LevelDebug) {
+ filterNames := make([]string, 0, len(iFlags.Filters))
+ for _, filter := range iFlags.Filters {
+ filterNames = append(filterNames, filter.Name)
+ }
+ slog.Default().Debug("index",
+ slog.String("indexRoot", gFlags.IndexRoot),
+ slog.String("filters", strings.Join(filterNames, ", ")),
+ )
+ }
+
+ traversedFiles := idx.Traverse(gFlags.NumWorkers)
+ fmt.Print("Crawled ", len(traversedFiles))
+
+ filteredFiles := idx.Filter(traversedFiles, gFlags.NumWorkers)
+ fmt.Print(", Filtered ", len(filteredFiles))
+
+ idx.Documents = index.ParseDocs(filteredFiles, gFlags.NumWorkers, iFlags.ParseOpts)
+ fmt.Print(", Parsed ", len(idx.Documents), "\n")
+
+ if err := db.Put(idx); err != nil {
+ fmt.Fprintln(os.Stderr, err)
+ return 1
+ }
+ return 0
+}