diff options
Diffstat (limited to 'cmd/query.go')
| -rw-r--r-- | cmd/query.go | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/cmd/query.go b/cmd/query.go new file mode 100644 index 0000000..40c9e58 --- /dev/null +++ b/cmd/query.go @@ -0,0 +1,84 @@ +package main + +import ( + "flag" + "fmt" + "os" + + "github.com/jpappel/atlas/pkg/data" + "github.com/jpappel/atlas/pkg/index" + "github.com/jpappel/atlas/pkg/query" +) + +type QueryFlags struct { + Outputer query.Outputer + CustomFormat string + OptimizationLevel int +} + +func setupQueryFlags(args []string, fs *flag.FlagSet, flags *QueryFlags) { + // NOTE: providing `-outFormat` before `-outCustomFormat` might ignore user specified format + fs.Func("outFormat", "output `format` for queries (default, json, custom)", + func(arg string) error { + switch arg { + case "default": + flags.Outputer = query.DefaultOutput{} + return nil + case "json": + flags.Outputer = query.JsonOutput{} + return nil + case "custom": + var err error + flags.Outputer, err = query.NewCustomOutput(flags.CustomFormat, dateFormat) + return err + } + return fmt.Errorf("Unrecognized output format: %s", arg) + }) + fs.StringVar(&flags.CustomFormat, "outCustomFormat", query.DefaultOutputFormat, "format string for --outFormat custom, see EXAMPLES for more details") + fs.IntVar(&flags.OptimizationLevel, "optLevel", 0, "optimization `level` for queries, 0 is automatic, <0 to disable") + + fs.Parse(args[1:]) +} + +func runQuery(gFlags GlobalFlags, qFlags QueryFlags, db *data.Query, searchQuery string) byte { + tokens := query.Lex(searchQuery) + clause, err := query.Parse(tokens) + if err != nil { + fmt.Fprintln(os.Stderr, "Failed to parse query: ", err) + return 1 + } + + o := query.NewOptimizer(clause, gFlags.NumWorkers) + o.Optimize(qFlags.OptimizationLevel) + + artifact, err := clause.Compile() + if err != nil { + fmt.Fprintln(os.Stderr, "Failed to compile query: ", err) + return 1 + } + + results, err := db.Execute(artifact) + if err != nil { + fmt.Fprintln(os.Stderr, "Failed to execute query: ", err) + return 1 + } + + if len(results) == 0 { + fmt.Println("No results.") + return 0 + } + + outputableResults := make([]*index.Document, 0, len(results)) + for _, v := range results { + outputableResults = append(outputableResults, v) + } + + s, err := qFlags.Outputer.Output(outputableResults) + if err != nil { + fmt.Fprintln(os.Stderr, "Failed to output results: ", err) + return 1 + } + + fmt.Println(s) + return 0 +} |
