diff --git a/internal/context.go b/internal/context.go index 98a249c..0f80b0e 100644 --- a/internal/context.go +++ b/internal/context.go @@ -57,10 +57,9 @@ type Context struct { CachedTitle string CachedContent string - Matches uint64 - Duration time.Duration - Results Results - Pager *paginator.Paginator + SearchTook time.Duration + Results Results + Pager *paginator.Paginator // Report abuse ReportURL string diff --git a/internal/handlers.go b/internal/handlers.go index e0c2dac..649545b 100644 --- a/internal/handlers.go +++ b/internal/handlers.go @@ -17,6 +17,7 @@ import ( "github.com/james4k/fmatter" "github.com/julienschmidt/httprouter" log "github.com/sirupsen/logrus" + "github.com/vcraescu/go-paginator" ) const ( @@ -196,7 +197,9 @@ func (s *Server) SearchHandler() httprouter.Handle { return } - searchResults, err := s.indexer.Search(q) + p := SafeParseInt(r.FormValue("p"), 1) + + searchResults, err := s.indexer.Search(q, p) if err != nil { log.WithError(err).Error("error performing search") ctx.Error = true @@ -220,10 +223,13 @@ func (s *Server) SearchHandler() httprouter.Handle { results = append(results, result) } + pager := paginator.New(IntAdapter{N: int(searchResults.Total)}, s.config.ResultsPerPage) + pager.SetPage(p) + + ctx.Pager = &pager ctx.SearchQuery = q ctx.Results = results - ctx.Matches = searchResults.Total - ctx.Duration = searchResults.Took.Truncate(time.Nanosecond) + ctx.SearchTook = searchResults.Took.Truncate(time.Nanosecond) s.render("search", w, ctx) } diff --git a/internal/indexer.go b/internal/indexer.go index 9a52e84..fbb285b 100644 --- a/internal/indexer.go +++ b/internal/indexer.go @@ -10,11 +10,12 @@ import ( type Indexer interface { Index(entry *Entry) error - Search(q string) (*bleve.SearchResult, error) + Search(q string, p int) (*bleve.SearchResult, error) } type indexer struct { - idx bleve.Index + conf *Config + idx bleve.Index } func NewIndexer(conf *Config) (Indexer, error) { @@ -36,18 +37,20 @@ func NewIndexer(conf *Config) (Indexer, error) { return nil, err } - return &indexer{idx: idx}, nil + return &indexer{conf: conf, idx: idx}, nil } func (i *indexer) Index(entry *Entry) error { return i.idx.Index(entry.Hash(), entry) } -func (i *indexer) Search(q string) (*bleve.SearchResult, error) { +func (i *indexer) Search(q string, p int) (*bleve.SearchResult, error) { query := bleve.NewMatchQuery(q) searchRequest := bleve.NewSearchRequest(query) searchRequest.Fields = []string{"URL", "Title", "Author", "Summary", "Length"} searchRequest.Highlight = bleve.NewHighlight() + searchRequest.Size = i.conf.ResultsPerPage + searchRequest.From = searchRequest.Size * p searchResults, err := i.idx.Search(searchRequest) if err != nil { log.WithError(err).Error("error searching index") diff --git a/internal/paginator_adapters.go b/internal/paginator_adapters.go new file mode 100644 index 0000000..5958cd5 --- /dev/null +++ b/internal/paginator_adapters.go @@ -0,0 +1,8 @@ +package internal + +type IntAdapter struct { + N int +} + +func (a IntAdapter) Nums() int { return a.N } +func (a IntAdapter) Slice(offset, length int, data interface{}) error { return nil } diff --git a/internal/templates/_partials.html b/internal/templates/_partials.html index a4439d9..a676cb3 100644 --- a/internal/templates/_partials.html +++ b/internal/templates/_partials.html @@ -1,24 +1,24 @@ {{ define "pager" }} -{{ if .HasPages }} +{{ if $.Pager.HasPages }}