// Copyright 2021 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

//go:build !aix && !plan9
// +build !aix,!plan9

package main

import (
	"flag"
	"fmt"
	"os"

	"golang.org/x/benchmarks/sweet/benchmarks/internal/driver"

	"github.com/blevesearch/bleve"
	_ "github.com/blevesearch/bleve/analysis/analyzer/keyword"
)

var iterations int

func init() {
	flag.IntVar(&iterations, "iterations", 50, "number of times to iterate over the list of query terms")
}

func parseFlags() error {
	flag.Parse()
	if flag.NArg() != 1 {
		return fmt.Errorf("expected bleve index directory as input")
	}
	return nil
}

func run(idxdir string, iterations int) error {
	index, err := bleve.Open(idxdir)
	if err != nil {
		return err
	}
	return driver.RunBenchmark("BleveQuery", func(_ *driver.B) error {
		for j := 0; j < iterations; j++ {
			for _, term := range terms {
				query := bleve.NewTermQuery(term)
				query.SetField("Text")
				_, err := index.Search(bleve.NewSearchRequest(query))
				if err != nil {
					return err
				}
			}
		}
		return nil
	}, driver.InProcessMeasurementOptions...)
}

func main() {
	driver.SetFlags(flag.CommandLine)
	if err := parseFlags(); err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
	if err := run(flag.Arg(0), iterations); err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
}
