2016-07-24 01:51:12 -04:00
|
|
|
// 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 (
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
// -- Bulk delete request --
|
|
|
|
|
Add `access` format support for Elasticsearch notification target (#4006)
This change adds `access` format support for notifications to a
Elasticsearch server, and it refactors `namespace` format support.
In the case of `access` format, for each event in Minio, a JSON
document is inserted into Elasticsearch with its timestamp set to the
event's timestamp, and with the ID generated automatically by
elasticsearch. No events are modified or deleted in this mode.
In the case of `namespace` format, for each event in Minio, a JSON
document is keyed together by the bucket and object name is updated in
Elasticsearch. In the case of an object being created or over-written
in Minio, a new document or an existing document is inserted into the
Elasticsearch index. If an object is deleted in Minio, the
corresponding document is deleted from the Elasticsearch index.
Additionally, this change upgrades Elasticsearch support to the 5.x
series. This is a breaking change, and users of previous elasticsearch
versions should upgrade.
Also updates documentation on Elasticsearch notification target usage
and has a link to an elasticsearch upgrade guide.
This is the last patch that finally resolves #3928.
2017-03-31 17:11:27 -04:00
|
|
|
// BulkDeleteRequest is a request to remove a document from Elasticsearch.
|
2016-07-24 01:51:12 -04:00
|
|
|
//
|
Add `access` format support for Elasticsearch notification target (#4006)
This change adds `access` format support for notifications to a
Elasticsearch server, and it refactors `namespace` format support.
In the case of `access` format, for each event in Minio, a JSON
document is inserted into Elasticsearch with its timestamp set to the
event's timestamp, and with the ID generated automatically by
elasticsearch. No events are modified or deleted in this mode.
In the case of `namespace` format, for each event in Minio, a JSON
document is keyed together by the bucket and object name is updated in
Elasticsearch. In the case of an object being created or over-written
in Minio, a new document or an existing document is inserted into the
Elasticsearch index. If an object is deleted in Minio, the
corresponding document is deleted from the Elasticsearch index.
Additionally, this change upgrades Elasticsearch support to the 5.x
series. This is a breaking change, and users of previous elasticsearch
versions should upgrade.
Also updates documentation on Elasticsearch notification target usage
and has a link to an elasticsearch upgrade guide.
This is the last patch that finally resolves #3928.
2017-03-31 17:11:27 -04:00
|
|
|
// See https://www.elastic.co/guide/en/elasticsearch/reference/5.2/docs-bulk.html
|
2016-07-24 01:51:12 -04:00
|
|
|
// for details.
|
|
|
|
type BulkDeleteRequest struct {
|
|
|
|
BulkableRequest
|
|
|
|
index string
|
|
|
|
typ string
|
|
|
|
id string
|
|
|
|
parent string
|
|
|
|
routing string
|
|
|
|
version int64 // default is MATCH_ANY
|
|
|
|
versionType string // default is "internal"
|
|
|
|
|
|
|
|
source []string
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewBulkDeleteRequest returns a new BulkDeleteRequest.
|
|
|
|
func NewBulkDeleteRequest() *BulkDeleteRequest {
|
|
|
|
return &BulkDeleteRequest{}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Index specifies the Elasticsearch index to use for this delete request.
|
|
|
|
// If unspecified, the index set on the BulkService will be used.
|
|
|
|
func (r *BulkDeleteRequest) Index(index string) *BulkDeleteRequest {
|
|
|
|
r.index = index
|
|
|
|
r.source = nil
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
// Type specifies the Elasticsearch type to use for this delete request.
|
|
|
|
// If unspecified, the type set on the BulkService will be used.
|
|
|
|
func (r *BulkDeleteRequest) Type(typ string) *BulkDeleteRequest {
|
|
|
|
r.typ = typ
|
|
|
|
r.source = nil
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
// Id specifies the identifier of the document to delete.
|
|
|
|
func (r *BulkDeleteRequest) Id(id string) *BulkDeleteRequest {
|
|
|
|
r.id = id
|
|
|
|
r.source = nil
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
// Parent specifies the parent of the request, which is used in parent/child
|
|
|
|
// mappings.
|
|
|
|
func (r *BulkDeleteRequest) Parent(parent string) *BulkDeleteRequest {
|
|
|
|
r.parent = parent
|
|
|
|
r.source = nil
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
// Routing specifies a routing value for the request.
|
|
|
|
func (r *BulkDeleteRequest) Routing(routing string) *BulkDeleteRequest {
|
|
|
|
r.routing = routing
|
|
|
|
r.source = nil
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
// Version indicates the version to be deleted as part of an optimistic
|
|
|
|
// concurrency model.
|
|
|
|
func (r *BulkDeleteRequest) Version(version int64) *BulkDeleteRequest {
|
|
|
|
r.version = version
|
|
|
|
r.source = nil
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
// VersionType can be "internal" (default), "external", "external_gte",
|
|
|
|
// "external_gt", or "force".
|
|
|
|
func (r *BulkDeleteRequest) VersionType(versionType string) *BulkDeleteRequest {
|
|
|
|
r.versionType = versionType
|
|
|
|
r.source = nil
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
|
|
|
// String returns the on-wire representation of the delete request,
|
|
|
|
// concatenated as a single string.
|
|
|
|
func (r *BulkDeleteRequest) String() string {
|
|
|
|
lines, err := r.Source()
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Sprintf("error: %v", err)
|
|
|
|
}
|
|
|
|
return strings.Join(lines, "\n")
|
|
|
|
}
|
|
|
|
|
|
|
|
// Source returns the on-wire representation of the delete request,
|
|
|
|
// split into an action-and-meta-data line and an (optional) source line.
|
Add `access` format support for Elasticsearch notification target (#4006)
This change adds `access` format support for notifications to a
Elasticsearch server, and it refactors `namespace` format support.
In the case of `access` format, for each event in Minio, a JSON
document is inserted into Elasticsearch with its timestamp set to the
event's timestamp, and with the ID generated automatically by
elasticsearch. No events are modified or deleted in this mode.
In the case of `namespace` format, for each event in Minio, a JSON
document is keyed together by the bucket and object name is updated in
Elasticsearch. In the case of an object being created or over-written
in Minio, a new document or an existing document is inserted into the
Elasticsearch index. If an object is deleted in Minio, the
corresponding document is deleted from the Elasticsearch index.
Additionally, this change upgrades Elasticsearch support to the 5.x
series. This is a breaking change, and users of previous elasticsearch
versions should upgrade.
Also updates documentation on Elasticsearch notification target usage
and has a link to an elasticsearch upgrade guide.
This is the last patch that finally resolves #3928.
2017-03-31 17:11:27 -04:00
|
|
|
// See https://www.elastic.co/guide/en/elasticsearch/reference/5.2/docs-bulk.html
|
2016-07-24 01:51:12 -04:00
|
|
|
// for details.
|
|
|
|
func (r *BulkDeleteRequest) Source() ([]string, error) {
|
|
|
|
if r.source != nil {
|
|
|
|
return r.source, nil
|
|
|
|
}
|
|
|
|
lines := make([]string, 1)
|
|
|
|
|
|
|
|
source := make(map[string]interface{})
|
|
|
|
deleteCommand := make(map[string]interface{})
|
|
|
|
if r.index != "" {
|
|
|
|
deleteCommand["_index"] = r.index
|
|
|
|
}
|
|
|
|
if r.typ != "" {
|
|
|
|
deleteCommand["_type"] = r.typ
|
|
|
|
}
|
|
|
|
if r.id != "" {
|
|
|
|
deleteCommand["_id"] = r.id
|
|
|
|
}
|
|
|
|
if r.parent != "" {
|
|
|
|
deleteCommand["_parent"] = r.parent
|
|
|
|
}
|
|
|
|
if r.routing != "" {
|
|
|
|
deleteCommand["_routing"] = r.routing
|
|
|
|
}
|
|
|
|
if r.version > 0 {
|
|
|
|
deleteCommand["_version"] = r.version
|
|
|
|
}
|
|
|
|
if r.versionType != "" {
|
|
|
|
deleteCommand["_version_type"] = r.versionType
|
|
|
|
}
|
|
|
|
source["delete"] = deleteCommand
|
|
|
|
|
|
|
|
body, err := json.Marshal(source)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
lines[0] = string(body)
|
|
|
|
r.source = lines
|
|
|
|
|
|
|
|
return lines, nil
|
|
|
|
}
|