aboutsummaryrefslogtreecommitdiffstats
path: root/cmd/query.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/query.go')
-rw-r--r--cmd/query.go50
1 files changed, 47 insertions, 3 deletions
diff --git a/cmd/query.go b/cmd/query.go
index 649b9ea..d00a792 100644
--- a/cmd/query.go
+++ b/cmd/query.go
@@ -1,9 +1,12 @@
-package main
+package cmd
import (
"flag"
"fmt"
+ "log/slog"
"os"
+ "slices"
+ "strings"
"github.com/jpappel/atlas/pkg/data"
"github.com/jpappel/atlas/pkg/index"
@@ -16,9 +19,11 @@ type QueryFlags struct {
ListSeparator string
CustomFormat string
OptimizationLevel int
+ SortBy string
+ SortDesc bool
}
-func setupQueryFlags(args []string, fs *flag.FlagSet, flags *QueryFlags, dateFormat string) {
+func SetupQueryFlags(args []string, fs *flag.FlagSet, flags *QueryFlags, dateFormat string) {
// NOTE: providing `-outFormat` before `-outCustomFormat` might ignore user specified format
fs.Func("outFormat", "output `format` for queries (default, json, pathonly, custom)",
func(arg string) error {
@@ -39,6 +44,9 @@ func setupQueryFlags(args []string, fs *flag.FlagSet, flags *QueryFlags, dateFor
}
return fmt.Errorf("Unrecognized output format: %s", arg)
})
+
+ fs.StringVar(&flags.SortBy, "sortBy", "", "category to sort by (path,title,date,filetime,meta)")
+ fs.BoolVar(&flags.SortDesc, "sortDesc", false, "sort in descending order")
fs.StringVar(&flags.CustomFormat, "outCustomFormat", query.DefaultOutputFormat, "format string for --outFormat custom, see Output Format for more details")
fs.IntVar(&flags.OptimizationLevel, "optLevel", 0, "optimization `level` for queries, 0 is automatic, <0 to disable")
fs.StringVar(&flags.DocumentSeparator, "docSeparator", "\n", "separator for custom output format")
@@ -81,7 +89,7 @@ func setupQueryFlags(args []string, fs *flag.FlagSet, flags *QueryFlags, dateFor
fs.Parse(args)
}
-func runQuery(gFlags GlobalFlags, qFlags QueryFlags, db *data.Query, searchQuery string) byte {
+func RunQuery(gFlags GlobalFlags, qFlags QueryFlags, db *data.Query, searchQuery string) byte {
tokens := query.Lex(searchQuery)
clause, err := query.Parse(tokens)
if err != nil {
@@ -114,6 +122,42 @@ func runQuery(gFlags GlobalFlags, qFlags QueryFlags, db *data.Query, searchQuery
outputableResults = append(outputableResults, v)
}
+ var docCmp func(a, b *index.Document) int
+ descMod := 1
+ if qFlags.SortDesc {
+ descMod = -1
+ }
+ switch qFlags.SortBy {
+ case "":
+ case "path":
+ docCmp = func(a, b *index.Document) int {
+ return descMod * strings.Compare(a.Path, b.Path)
+ }
+ case "title":
+ docCmp = func(a, b *index.Document) int {
+ return descMod * strings.Compare(a.Title, b.Title)
+ }
+ case "date":
+ docCmp = func(a, b *index.Document) int {
+ return descMod * a.Date.Compare(b.Date)
+ }
+ case "filetime":
+ docCmp = func(a, b *index.Document) int {
+ return descMod * a.FileTime.Compare(b.FileTime)
+ }
+ case "meta":
+ docCmp = func(a, b *index.Document) int {
+ return descMod * strings.Compare(a.OtherMeta, b.OtherMeta)
+ }
+ default:
+ slog.Error("Unrecognized category to sort by, leaving documents unsorted")
+ qFlags.SortBy = ""
+ }
+
+ if qFlags.SortBy != "" {
+ slices.SortFunc(outputableResults, docCmp)
+ }
+
_, err = qFlags.Outputer.OutputTo(os.Stdout, outputableResults)
if err != nil {
fmt.Fprintln(os.Stderr, "Error while outputting results: ", err)