89 lignes
2,2 Kio
Go
89 lignes
2,2 Kio
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...)
|
||
|
}
|
||
|
}
|