Albirew/nyaa-pantsu
Albirew
/
nyaa-pantsu
Archivé
1
0
Bifurcation 0
Ce dépôt a été archivé le 2022-05-07. Vous pouvez voir ses fichiers ou le cloner, mais pas ouvrir de ticket ou de demandes d'ajout, ni soumettre de changements.
nyaa-pantsu/utils/search/query.go

89 lignes
2.2 KiB
Go

package search
import (
"errors"
"strings"
"github.com/NyaaPantsu/nyaa/config"
"gopkg.in/olivere/elastic.v5"
)
// Query Type for outputing
type Query struct {
text []string
TorrentParam *TorrentParam
where []interface{}
}
// String convert a query to string
func (q *Query) String() string {
return strings.Join(q.text, " ")
}
// ToESQuery convert a query to use with ES search
// TODO add a test for this function
func (q *Query) ToESQuery(client *elastic.Client) (*elastic.SearchService, error) {
if q.TorrentParam == nil {
return nil, errors.New("You have to define TorrentParam before using ToESQuery")
}
var query elastic.Query
if q.TorrentParam.NameLike == "" {
query = elastic.NewMatchAllQuery()
}
query = elastic.NewSimpleQueryStringQuery(q.TorrentParam.NameLike).
Field("name").
Analyzer(config.Get().Search.ElasticsearchAnalyzer).
DefaultOperator("AND")
search := client.Search().
Index(config.Get().Search.ElasticsearchIndex).
Query(query).
Type(config.Get().Search.ElasticsearchType).
From(int((q.TorrentParam.Offset-1)*uint32(q.TorrentParam.Max))).
Size(int(q.TorrentParam.Max)).
Sort(q.TorrentParam.Sort.ToESField(), q.TorrentParam.Order).
Sort("_score", false)
if len(q.text) > 0 {
filterQuery := elastic.NewQueryStringQuery(strings.Join(q.text, " ")).
DefaultOperator("AND")
search = search.PostFilter(filterQuery)
}
return search, nil
}
// ToDBQuery convert a query to use with PG search
func (q *Query) ToDBQuery() (string, []interface{}) {
return strings.Join(q.text, " AND "), q.where
}
// Append a string to query
func (q *Query) Append(s string, args ...interface{}) {
if s != "" {
if len(args) > 0 {
q.where = append(q.where, args...)
if !strings.Contains(s, "?") && !strings.Contains(s, "=") {
q.text = append(q.text, s+" = ?")
return
}
}
q.text = append(q.text, s)
}
}
// Prepend a string to query
func (q *Query) Prepend(s string, args ...interface{}) {
if s != "" {
if len(args) > 0 {
q.where = append(args, q.where...)
if !strings.Contains(s, "?") && !strings.Contains(s, "=") {
sarr := []string{s + " = ?"}
q.text = append(sarr, q.text...)
return
}
}
sarr := []string{s}
q.text = append(sarr, q.text...)
}
}