Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for the "Delete by Query" API #11

Merged
merged 1 commit into from
May 27, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
63 changes: 63 additions & 0 deletions delete.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package esquery

import (
"bytes"
"encoding/json"

"github.com/elastic/go-elasticsearch/v7"
"github.com/elastic/go-elasticsearch/v7/esapi"
)

// DeleteRequest represents a request to ElasticSearch's Delete By Query API,
// described in
// https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete-by-query.html
type DeleteRequest struct {
index []string
query Mappable
}

// Delete creates a new DeleteRequest object, to be filled via method chaining.
func Delete() *DeleteRequest {
return &DeleteRequest{}
}

// Index sets the index names for the request
func (req *DeleteRequest) Index(index ...string) *DeleteRequest {
req.index = index
return req
}

// Query sets a query for the request.
func (req *DeleteRequest) Query(q Mappable) *DeleteRequest {
req.query = q
return req
}

// Run executes the request using the provided ElasticSearch client.
func (req *DeleteRequest) Run(
api *elasticsearch.Client,
o ...func(*esapi.DeleteByQueryRequest),
) (res *esapi.Response, err error) {
return req.RunDelete(api.DeleteByQuery, o...)
}

// RunDelete is the same as the Run method, except that it accepts a value of
// type esapi.DeleteByQuery (usually this is the DeleteByQuery field of an
// elasticsearch.Client object). Since the ElasticSearch client does not provide
// an interface type for its API (which would allow implementation of mock
// clients), this provides a workaround. The Delete function in the ES client is
// actually a field of a function type.
func (req *DeleteRequest) RunDelete(
del esapi.DeleteByQuery,
o ...func(*esapi.DeleteByQueryRequest),
) (res *esapi.Response, err error) {
var b bytes.Buffer
err = json.NewEncoder(&b).Encode(map[string]interface{}{
"query": req.query.Map(),
})
if err != nil {
return nil, err
}

return del(req.index, &b, o...)
}