Files
2019-05-13 20:38:06 +03:00

147 lines
3.7 KiB
Go

// Copyright 2013 Matthew Baird
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package elastigo
import (
"encoding/json"
"fmt"
"strconv"
"strings"
)
type BaseResponse struct {
Ok bool `json:"ok"`
Index string `json:"_index,omitempty"`
Type string `json:"_type,omitempty"`
Id string `json:"_id,omitempty"`
Source *json.RawMessage `json:"_source,omitempty"` // depends on the schema you've defined
Version int `json:"_version,omitempty"`
Found bool `json:"found,omitempty"`
Exists bool `json:"exists,omitempty"`
Created bool `json:"created,omitempty"`
Matches []string `json:"matches,omitempty"` // percolate matches
}
// StatusInt is required because /_optimize, at least, returns its status as
// strings instead of integers.
type StatusInt int
func (self *StatusInt) UnmarshalJSON(b []byte) error {
s := ""
if json.Unmarshal(b, &s) == nil {
if i, err := strconv.Atoi(s); err == nil {
*self = StatusInt(i)
return nil
}
}
i := 0
err := json.Unmarshal(b, &i)
if err == nil {
*self = StatusInt(i)
}
return err
}
func (self *StatusInt) MarshalJSON() ([]byte, error) {
return json.Marshal(*self)
}
// StatusBool is required because /_optimize, at least, returns its status as
// strings instead of booleans.
type StatusBool bool
func (self *StatusBool) UnmarshalJSON(b []byte) error {
s := ""
if json.Unmarshal(b, &s) == nil {
switch s {
case "true":
*self = StatusBool(true)
return nil
case "false":
*self = StatusBool(false)
return nil
default:
}
}
b2 := false
err := json.Unmarshal(b, &b2)
if err == nil {
*self = StatusBool(b2)
}
return err
}
func (self *StatusBool) MarshalJSON() ([]byte, error) {
return json.Marshal(*self)
}
type Status struct {
Total StatusInt `json:"total"`
Successful StatusInt `json:"successful"`
Failed StatusInt `json:"failed"`
Failures []Failure `json:"failures,omitempty"`
}
type Failure struct {
Index string `json:"index"`
Shard StatusInt `json:"shard"`
Reason string `json:"reason"`
}
func (f Failure) String() string {
return fmt.Sprintf("Failed on shard %d on index %s:\n%s", f.Shard, f.Index, f.Reason)
}
// failures is a convenience type to allow []Failure formated easily in the
// library
type failures []Failure
func (f failures) String() string {
message := make([]string, len(f))
for i, failure := range f {
message[i] = failure.String()
}
return strings.Join(message, "\n")
}
type ExtendedStatus struct {
Ok StatusBool `json:"ok"`
ShardsStatus Status `json:"_shards"`
}
type MatchRes struct {
Index string `json:"_index"`
Id string `json:"_id"`
}
type Match struct {
OK bool `json:"ok"`
Matches []MatchRes `json:"matches"`
Explanation *Explanation `json:"explanation,omitempty"`
}
type Explanation struct {
Value float32 `json:"value"`
Description string `json:"description"`
Details []*Explanation `json:"details,omitempty"`
}
func ScrollDuration(duration string) string {
scrollString := ""
if duration != "" {
scrollString = "&scroll=" + duration
}
return scrollString
}
// http://www.elasticsearch.org/guide/reference/api/search/search-type/