mirror of
https://github.com/go-gitea/gitea
synced 2024-09-27 14:54:05 +00:00
5dbf36f356
* Issue search support elasticsearch * Fix lint * Add indexer name on app.ini * add a warnning on SearchIssuesByKeyword * improve code
122 lines
3.1 KiB
Go
Vendored
122 lines
3.1 KiB
Go
Vendored
// Copyright 2012-present Oliver Eilhard. All rights reserved.
|
|
// Use of this source code is governed by a MIT-license.
|
|
// See http://olivere.mit-license.org/license.txt for details.
|
|
|
|
package elastic
|
|
|
|
import "errors"
|
|
|
|
// GeoBoundingBoxQuery allows to filter hits based on a point location using
|
|
// a bounding box.
|
|
//
|
|
// For more details, see:
|
|
// https://www.elastic.co/guide/en/elasticsearch/reference/7.0/query-dsl-geo-bounding-box-query.html
|
|
type GeoBoundingBoxQuery struct {
|
|
name string
|
|
top *float64
|
|
left *float64
|
|
bottom *float64
|
|
right *float64
|
|
typ string
|
|
queryName string
|
|
}
|
|
|
|
// NewGeoBoundingBoxQuery creates and initializes a new GeoBoundingBoxQuery.
|
|
func NewGeoBoundingBoxQuery(name string) *GeoBoundingBoxQuery {
|
|
return &GeoBoundingBoxQuery{
|
|
name: name,
|
|
}
|
|
}
|
|
|
|
func (q *GeoBoundingBoxQuery) TopLeft(top, left float64) *GeoBoundingBoxQuery {
|
|
q.top = &top
|
|
q.left = &left
|
|
return q
|
|
}
|
|
|
|
func (q *GeoBoundingBoxQuery) TopLeftFromGeoPoint(point *GeoPoint) *GeoBoundingBoxQuery {
|
|
return q.TopLeft(point.Lat, point.Lon)
|
|
}
|
|
|
|
func (q *GeoBoundingBoxQuery) BottomRight(bottom, right float64) *GeoBoundingBoxQuery {
|
|
q.bottom = &bottom
|
|
q.right = &right
|
|
return q
|
|
}
|
|
|
|
func (q *GeoBoundingBoxQuery) BottomRightFromGeoPoint(point *GeoPoint) *GeoBoundingBoxQuery {
|
|
return q.BottomRight(point.Lat, point.Lon)
|
|
}
|
|
|
|
func (q *GeoBoundingBoxQuery) BottomLeft(bottom, left float64) *GeoBoundingBoxQuery {
|
|
q.bottom = &bottom
|
|
q.left = &left
|
|
return q
|
|
}
|
|
|
|
func (q *GeoBoundingBoxQuery) BottomLeftFromGeoPoint(point *GeoPoint) *GeoBoundingBoxQuery {
|
|
return q.BottomLeft(point.Lat, point.Lon)
|
|
}
|
|
|
|
func (q *GeoBoundingBoxQuery) TopRight(top, right float64) *GeoBoundingBoxQuery {
|
|
q.top = &top
|
|
q.right = &right
|
|
return q
|
|
}
|
|
|
|
func (q *GeoBoundingBoxQuery) TopRightFromGeoPoint(point *GeoPoint) *GeoBoundingBoxQuery {
|
|
return q.TopRight(point.Lat, point.Lon)
|
|
}
|
|
|
|
// Type sets the type of executing the geo bounding box. It can be either
|
|
// memory or indexed. It defaults to memory.
|
|
func (q *GeoBoundingBoxQuery) Type(typ string) *GeoBoundingBoxQuery {
|
|
q.typ = typ
|
|
return q
|
|
}
|
|
|
|
func (q *GeoBoundingBoxQuery) QueryName(queryName string) *GeoBoundingBoxQuery {
|
|
q.queryName = queryName
|
|
return q
|
|
}
|
|
|
|
// Source returns JSON for the function score query.
|
|
func (q *GeoBoundingBoxQuery) Source() (interface{}, error) {
|
|
// {
|
|
// "geo_bounding_box" : {
|
|
// ...
|
|
// }
|
|
// }
|
|
|
|
if q.top == nil {
|
|
return nil, errors.New("geo_bounding_box requires top latitude to be set")
|
|
}
|
|
if q.bottom == nil {
|
|
return nil, errors.New("geo_bounding_box requires bottom latitude to be set")
|
|
}
|
|
if q.right == nil {
|
|
return nil, errors.New("geo_bounding_box requires right longitude to be set")
|
|
}
|
|
if q.left == nil {
|
|
return nil, errors.New("geo_bounding_box requires left longitude to be set")
|
|
}
|
|
|
|
source := make(map[string]interface{})
|
|
params := make(map[string]interface{})
|
|
source["geo_bounding_box"] = params
|
|
|
|
box := make(map[string]interface{})
|
|
box["top_left"] = []float64{*q.left, *q.top}
|
|
box["bottom_right"] = []float64{*q.right, *q.bottom}
|
|
params[q.name] = box
|
|
|
|
if q.typ != "" {
|
|
params["type"] = q.typ
|
|
}
|
|
if q.queryName != "" {
|
|
params["_name"] = q.queryName
|
|
}
|
|
|
|
return source, nil
|
|
}
|