mirror of https://github.com/perkeep/perkeep.git
search: add blobref sorting, implementing sorting of results when source is unsorted
Part of upcoming blobpacked migration tool. Change-Id: Ifdc4723d4d1468eb4d2798fadb256b409cfe0555
This commit is contained in:
parent
a99dc14885
commit
e0624177cd
|
@ -26,6 +26,7 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
@ -47,6 +48,7 @@ const (
|
||||||
LastModifiedAsc
|
LastModifiedAsc
|
||||||
CreatedDesc
|
CreatedDesc
|
||||||
CreatedAsc
|
CreatedAsc
|
||||||
|
BlobRefAsc
|
||||||
maxSortType
|
maxSortType
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -55,6 +57,7 @@ var sortName = map[SortType][]byte{
|
||||||
LastModifiedAsc: []byte(`"mod"`),
|
LastModifiedAsc: []byte(`"mod"`),
|
||||||
CreatedDesc: []byte(`"-created"`),
|
CreatedDesc: []byte(`"-created"`),
|
||||||
CreatedAsc: []byte(`"created"`),
|
CreatedAsc: []byte(`"created"`),
|
||||||
|
BlobRefAsc: []byte(`"blobref"`),
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t SortType) MarshalJSON() ([]byte, error) {
|
func (t SortType) MarshalJSON() ([]byte, error) {
|
||||||
|
@ -858,7 +861,16 @@ func (h *Handler) Query(rawq *SearchQuery) (*SearchResult, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if !cands.sorted {
|
if !cands.sorted {
|
||||||
// TODO(bradfitz): sort them
|
switch q.Sort {
|
||||||
|
case UnspecifiedSort:
|
||||||
|
// Nothing to do.
|
||||||
|
case BlobRefAsc:
|
||||||
|
sort.Sort(sortSearchResultBlobs{res.Blobs, func(a, b *SearchResultBlob) bool {
|
||||||
|
return a.Blob.Less(b.Blob)
|
||||||
|
}})
|
||||||
|
default:
|
||||||
|
return nil, errors.New("TODO: unsupported sort+query combination.")
|
||||||
|
}
|
||||||
if q.Limit > 0 && len(res.Blobs) > q.Limit {
|
if q.Limit > 0 && len(res.Blobs) > q.Limit {
|
||||||
res.Blobs = res.Blobs[:q.Limit]
|
res.Blobs = res.Blobs[:q.Limit]
|
||||||
}
|
}
|
||||||
|
@ -1507,3 +1519,12 @@ func (c *DirConstraint) blobMatches(s *search, br blob.Ref, bm camtypes.BlobMeta
|
||||||
// TODO: implement
|
// TODO: implement
|
||||||
panic("TODO: implement DirConstraint.blobMatches")
|
panic("TODO: implement DirConstraint.blobMatches")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type sortSearchResultBlobs struct {
|
||||||
|
s []*SearchResultBlob
|
||||||
|
less func(a, b *SearchResultBlob) bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ss sortSearchResultBlobs) Len() int { return len(ss.s) }
|
||||||
|
func (ss sortSearchResultBlobs) Swap(i, j int) { ss.s[i], ss.s[j] = ss.s[j], ss.s[i] }
|
||||||
|
func (ss sortSearchResultBlobs) Less(i, j int) bool { return ss.less(ss.s[i], ss.s[j]) }
|
||||||
|
|
Loading…
Reference in New Issue