Merge pull request #19 from marinbek/master
Support for PutMapping, Update and IndicesExist APIs
This commit is contained in:
commit
63cef24bc9
1
.gitignore
vendored
1
.gitignore
vendored
@ -1 +1,2 @@
|
|||||||
*.test
|
*.test
|
||||||
|
*.swp
|
||||||
|
71
goes.go
71
goes.go
@ -345,9 +345,14 @@ func (req *Request) Run() (Response, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
esResp := new(Response)
|
esResp := new(Response)
|
||||||
err = json.Unmarshal(body, &esResp)
|
if req.method == "HEAD" {
|
||||||
if err != nil {
|
esResp.Status = uint64(resp.StatusCode)
|
||||||
return Response{}, err
|
} else {
|
||||||
|
err = json.Unmarshal(body, &esResp)
|
||||||
|
if err != nil {
|
||||||
|
return Response{}, err
|
||||||
|
}
|
||||||
|
json.Unmarshal(body, &esResp.Raw)
|
||||||
}
|
}
|
||||||
|
|
||||||
if req.api == "_bulk" && esResp.Errors {
|
if req.api == "_bulk" && esResp.Errors {
|
||||||
@ -377,7 +382,7 @@ func (r *Request) Url() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// XXX : for indexing documents using the normal (non bulk) API
|
// XXX : for indexing documents using the normal (non bulk) API
|
||||||
if len(r.api) == 0 && len(r.id) > 0 {
|
if len(r.id) > 0 {
|
||||||
path += "/" + r.id
|
path += "/" + r.id
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -423,3 +428,61 @@ func (b Bucket) Aggregation(name string) Aggregation {
|
|||||||
return Aggregation{}
|
return Aggregation{}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PutMapping registers a specific mapping for one or more types in one or more indexes
|
||||||
|
func (c *Connection) PutMapping(typeName string, mapping map[string]interface{}, indexes []string) (Response, error) {
|
||||||
|
|
||||||
|
r := Request{
|
||||||
|
Conn: c,
|
||||||
|
Query: mapping,
|
||||||
|
IndexList: indexes,
|
||||||
|
method: "PUT",
|
||||||
|
api: "_mappings/" + typeName,
|
||||||
|
}
|
||||||
|
|
||||||
|
return r.Run()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Connection) GetMapping(types []string, indexes []string) (Response, error) {
|
||||||
|
|
||||||
|
r := Request{
|
||||||
|
Conn: c,
|
||||||
|
IndexList: indexes,
|
||||||
|
method: "GET",
|
||||||
|
api: "_mapping/" + strings.Join(types, ","),
|
||||||
|
}
|
||||||
|
|
||||||
|
return r.Run()
|
||||||
|
}
|
||||||
|
|
||||||
|
// IndicesExist checks whether index (or indices) exist on the server
|
||||||
|
func (c *Connection) IndicesExist(indexes []string) (bool, error) {
|
||||||
|
|
||||||
|
r := Request{
|
||||||
|
Conn: c,
|
||||||
|
IndexList: indexes,
|
||||||
|
method: "HEAD",
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := r.Run()
|
||||||
|
|
||||||
|
return resp.Status == 200, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Connection) Update(d Document, query map[string]interface{}, extraArgs url.Values) (Response, error) {
|
||||||
|
r := Request{
|
||||||
|
Conn: c,
|
||||||
|
Query: query,
|
||||||
|
IndexList: []string{d.Index.(string)},
|
||||||
|
TypeList: []string{d.Type},
|
||||||
|
ExtraArgs: extraArgs,
|
||||||
|
method: "POST",
|
||||||
|
api: "_update",
|
||||||
|
}
|
||||||
|
|
||||||
|
if d.Id != nil {
|
||||||
|
r.id = d.Id.(string)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r.Run()
|
||||||
|
}
|
||||||
|
190
goes_test.go
190
goes_test.go
@ -9,6 +9,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@ -171,6 +172,7 @@ func (s *GoesTestSuite) TestDeleteIndexExistingIndex(c *C) {
|
|||||||
|
|
||||||
expectedResponse := Response{}
|
expectedResponse := Response{}
|
||||||
expectedResponse.Acknowledged = true
|
expectedResponse.Acknowledged = true
|
||||||
|
resp.Raw = nil
|
||||||
c.Assert(resp, DeepEquals, expectedResponse)
|
c.Assert(resp, DeepEquals, expectedResponse)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -361,6 +363,7 @@ func (s *GoesTestSuite) TestIndexWithFieldsInStruct(c *C) {
|
|||||||
Version: 1,
|
Version: 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
response.Raw = nil
|
||||||
c.Assert(response, DeepEquals, expectedResponse)
|
c.Assert(response, DeepEquals, expectedResponse)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -425,6 +428,7 @@ func (s *GoesTestSuite) TestIndexIdDefined(c *C) {
|
|||||||
Version: 1,
|
Version: 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
response.Raw = nil
|
||||||
c.Assert(response, DeepEquals, expectedResponse)
|
c.Assert(response, DeepEquals, expectedResponse)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -494,6 +498,7 @@ func (s *GoesTestSuite) TestDelete(c *C) {
|
|||||||
// XXX : even after a DELETE the version number seems to be incremented
|
// XXX : even after a DELETE the version number seems to be incremented
|
||||||
Version: 2,
|
Version: 2,
|
||||||
}
|
}
|
||||||
|
response.Raw = nil
|
||||||
c.Assert(response, DeepEquals, expectedResponse)
|
c.Assert(response, DeepEquals, expectedResponse)
|
||||||
|
|
||||||
response, err = conn.Delete(d, url.Values{})
|
response, err = conn.Delete(d, url.Values{})
|
||||||
@ -507,6 +512,7 @@ func (s *GoesTestSuite) TestDelete(c *C) {
|
|||||||
// XXX : even after a DELETE the version number seems to be incremented
|
// XXX : even after a DELETE the version number seems to be incremented
|
||||||
Version: 3,
|
Version: 3,
|
||||||
}
|
}
|
||||||
|
response.Raw = nil
|
||||||
c.Assert(response, DeepEquals, expectedResponse)
|
c.Assert(response, DeepEquals, expectedResponse)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -566,6 +572,7 @@ func (s *GoesTestSuite) TestDeleteByQuery(c *C) {
|
|||||||
Id: "",
|
Id: "",
|
||||||
Version: 0,
|
Version: 0,
|
||||||
}
|
}
|
||||||
|
response.Raw = nil
|
||||||
c.Assert(response, DeepEquals, expectedResponse)
|
c.Assert(response, DeepEquals, expectedResponse)
|
||||||
|
|
||||||
//should be 0 docs after delete by query
|
//should be 0 docs after delete by query
|
||||||
@ -612,6 +619,7 @@ func (s *GoesTestSuite) TestGet(c *C) {
|
|||||||
Source: source,
|
Source: source,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
response.Raw = nil
|
||||||
c.Assert(response, DeepEquals, expectedResponse)
|
c.Assert(response, DeepEquals, expectedResponse)
|
||||||
|
|
||||||
fields := make(url.Values, 1)
|
fields := make(url.Values, 1)
|
||||||
@ -630,6 +638,7 @@ func (s *GoesTestSuite) TestGet(c *C) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
response.Raw = nil
|
||||||
c.Assert(response, DeepEquals, expectedResponse)
|
c.Assert(response, DeepEquals, expectedResponse)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -970,3 +979,184 @@ func (s *GoesTestSuite) TestAggregations(c *C) {
|
|||||||
c.Assert(age["count"], Equals, 2.0)
|
c.Assert(age["count"], Equals, 2.0)
|
||||||
c.Assert(age["sum"], Equals, 25.0+30.0)
|
c.Assert(age["sum"], Equals, 25.0+30.0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *GoesTestSuite) TestPutMapping(c *C) {
|
||||||
|
indexName := "testputmapping"
|
||||||
|
docType := "tweet"
|
||||||
|
|
||||||
|
conn := NewConnection(ES_HOST, ES_PORT)
|
||||||
|
// just in case
|
||||||
|
conn.DeleteIndex(indexName)
|
||||||
|
|
||||||
|
_, err := conn.CreateIndex(indexName, map[string]interface{}{})
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
defer conn.DeleteIndex(indexName)
|
||||||
|
|
||||||
|
d := Document{
|
||||||
|
Index: indexName,
|
||||||
|
Type: docType,
|
||||||
|
Fields: map[string]interface{}{
|
||||||
|
"user": "foo",
|
||||||
|
"message": "bar",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
response, err := conn.Index(d, url.Values{})
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
|
||||||
|
mapping := map[string]interface{}{
|
||||||
|
"tweet": map[string]interface{}{
|
||||||
|
"properties": map[string]interface{}{
|
||||||
|
"count": map[string]interface{}{
|
||||||
|
"type": "integer",
|
||||||
|
"index": "not_analyzed",
|
||||||
|
"store": true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
response, err = conn.PutMapping("tweet", mapping, []string{indexName})
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
|
||||||
|
c.Assert(response.Acknowledged, Equals, true)
|
||||||
|
c.Assert(response.TimedOut, Equals, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *GoesTestSuite) TestIndicesExist(c *C) {
|
||||||
|
indices := []string{"testindicesexist"}
|
||||||
|
|
||||||
|
conn := NewConnection(ES_HOST, ES_PORT)
|
||||||
|
// just in case
|
||||||
|
conn.DeleteIndex(indices[0])
|
||||||
|
|
||||||
|
exists, err := conn.IndicesExist(indices)
|
||||||
|
c.Assert(exists, Equals, false)
|
||||||
|
|
||||||
|
_, err = conn.CreateIndex(indices[0], map[string]interface{}{})
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
defer conn.DeleteIndex(indices[0])
|
||||||
|
time.Sleep(200 * time.Millisecond)
|
||||||
|
|
||||||
|
exists, err = conn.IndicesExist(indices)
|
||||||
|
c.Assert(exists, Equals, true)
|
||||||
|
|
||||||
|
indices = append(indices, "nonexistent")
|
||||||
|
exists, err = conn.IndicesExist(indices)
|
||||||
|
c.Assert(exists, Equals, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *GoesTestSuite) TestUpdate(c *C) {
|
||||||
|
indexName := "testupdate"
|
||||||
|
docType := "tweet"
|
||||||
|
docId := "1234"
|
||||||
|
|
||||||
|
conn := NewConnection(ES_HOST, ES_PORT)
|
||||||
|
// just in case
|
||||||
|
conn.DeleteIndex(indexName)
|
||||||
|
|
||||||
|
_, err := conn.CreateIndex(indexName, map[string]interface{}{})
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
defer conn.DeleteIndex(indexName)
|
||||||
|
|
||||||
|
d := Document{
|
||||||
|
Index: indexName,
|
||||||
|
Type: docType,
|
||||||
|
Id: docId,
|
||||||
|
Fields: map[string]interface{}{
|
||||||
|
"user": "foo",
|
||||||
|
"message": "bar",
|
||||||
|
"counter": 1,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
extraArgs := make(url.Values, 1)
|
||||||
|
response, err := conn.Index(d, extraArgs)
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
time.Sleep(200 * time.Millisecond)
|
||||||
|
|
||||||
|
expectedResponse := Response{
|
||||||
|
Index: indexName,
|
||||||
|
Id: docId,
|
||||||
|
Type: docType,
|
||||||
|
Version: 1,
|
||||||
|
}
|
||||||
|
|
||||||
|
response.Raw = nil
|
||||||
|
c.Assert(response, DeepEquals, expectedResponse)
|
||||||
|
|
||||||
|
// Now that we have an ordinary document indexed, try updating it
|
||||||
|
query := map[string]interface{}{
|
||||||
|
"script": "ctx._source.counter += count",
|
||||||
|
"params": map[string]interface{}{
|
||||||
|
"count": 5,
|
||||||
|
},
|
||||||
|
"upsert": map[string]interface{}{
|
||||||
|
"message": "candybar",
|
||||||
|
"user": "admin",
|
||||||
|
"counter": 1,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
response, err = conn.Update(d, query, extraArgs)
|
||||||
|
if err != nil && strings.Contains(err.(*SearchError).Msg, "dynamic scripting disabled") {
|
||||||
|
c.Skip("Scripting is disabled on server, skipping this test")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
time.Sleep(200 * time.Millisecond)
|
||||||
|
|
||||||
|
c.Assert(err, Equals, nil)
|
||||||
|
|
||||||
|
response, err = conn.Get(indexName, docType, docId, url.Values{})
|
||||||
|
c.Assert(err, Equals, nil)
|
||||||
|
c.Assert(response.Source["counter"], Equals, float64(6))
|
||||||
|
c.Assert(response.Source["user"], Equals, "foo")
|
||||||
|
c.Assert(response.Source["message"], Equals, "bar")
|
||||||
|
|
||||||
|
// Test another document, non-existent
|
||||||
|
docId = "555"
|
||||||
|
d.Id = docId
|
||||||
|
response, err = conn.Update(d, query, extraArgs)
|
||||||
|
c.Assert(err, Equals, nil)
|
||||||
|
time.Sleep(200 * time.Millisecond)
|
||||||
|
|
||||||
|
response, err = conn.Get(indexName, docType, docId, url.Values{})
|
||||||
|
c.Assert(err, Equals, nil)
|
||||||
|
c.Assert(response.Source["user"], Equals, "admin")
|
||||||
|
c.Assert(response.Source["message"], Equals, "candybar")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *GoesTestSuite) TestGetMapping(c *C) {
|
||||||
|
indexName := "testmapping"
|
||||||
|
docType := "tweet"
|
||||||
|
|
||||||
|
conn := NewConnection(ES_HOST, ES_PORT)
|
||||||
|
// just in case
|
||||||
|
conn.DeleteIndex(indexName)
|
||||||
|
|
||||||
|
_, err := conn.CreateIndex(indexName, map[string]interface{}{})
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
defer conn.DeleteIndex(indexName)
|
||||||
|
|
||||||
|
time.Sleep(300 * time.Millisecond)
|
||||||
|
|
||||||
|
response, err := conn.GetMapping([]string{docType}, []string{indexName})
|
||||||
|
c.Assert(err, Equals, nil)
|
||||||
|
c.Assert(len(response.Raw), Equals, 0)
|
||||||
|
|
||||||
|
d := Document{
|
||||||
|
Index: indexName,
|
||||||
|
Type: docType,
|
||||||
|
Fields: map[string]interface{}{
|
||||||
|
"user": "foo",
|
||||||
|
"message": "bar",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
response, err = conn.Index(d, url.Values{})
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
time.Sleep(200 * time.Millisecond)
|
||||||
|
|
||||||
|
response, err = conn.GetMapping([]string{docType}, []string{indexName})
|
||||||
|
c.Assert(err, Equals, nil)
|
||||||
|
c.Assert(len(response.Raw), Not(Equals), 0)
|
||||||
|
}
|
||||||
|
@ -88,6 +88,8 @@ type Response struct {
|
|||||||
ScrollId string `json:"_scroll_id"`
|
ScrollId string `json:"_scroll_id"`
|
||||||
|
|
||||||
Aggregations map[string]Aggregation `json:"aggregations,omitempty"`
|
Aggregations map[string]Aggregation `json:"aggregations,omitempty"`
|
||||||
|
|
||||||
|
Raw map[string]interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Represents an aggregation from response
|
// Represents an aggregation from response
|
||||||
|
Loading…
Reference in New Issue
Block a user