go_study/go-for-study/library/database/elastic/update.go

109 lines
2.4 KiB
Go

package elastic
import (
"context"
"encoding/json"
"fmt"
"net/url"
"strings"
"time"
"go-common/library/ecode"
)
// Update elastic upsert
type Update struct {
*Elastic
business string
data map[string][]interface{}
insert bool
}
// NewUpdate new a request every update
func (e *Elastic) NewUpdate(business string) *Update {
return &Update{
Elastic: e,
business: business,
data: make(map[string][]interface{}),
}
}
// IndexByMod index by mod
func (us *Update) IndexByMod(prefix string, val, mod int64) string {
tmp := mod - 1
var digit int
for tmp > 0 {
tmp /= 10
digit++
}
format := fmt.Sprintf("%s_%%0%dd", prefix, digit)
return fmt.Sprintf(format, val%mod)
}
// IndexByTime index by time
func (us *Update) IndexByTime(prefix string, typ indexType, t time.Time) (index string) {
year := t.Format("2006")
month := t.Format("01")
switch typ {
case IndexTypeYear:
index = strings.Join([]string{prefix, year}, "_")
case IndexTypeMonth:
index = strings.Join([]string{prefix, year, month}, "_")
case IndexTypeDay:
day := t.Format("02")
index = strings.Join([]string{prefix, year, month, day}, "_")
case IndexTypeWeek:
index = strings.Join([]string{prefix, year, month, weeks[t.Day()/8]}, "_")
}
return
}
// AddData add data items to request 'data' param
func (us *Update) AddData(index string, data interface{}) *Update {
if data == nil {
return us
}
us.data[index] = append(us.data[index], data)
return us
}
// HasData weather data is empty or not
func (us *Update) HasData() bool {
if us.data == nil {
return false
}
return len(us.data) > 0
}
// Insert set insert flag, it means 'replace'
func (us *Update) Insert() *Update {
us.insert = true
return us
}
// Do post a request
func (us *Update) Do(ctx context.Context) (err error) {
data, err := json.Marshal(us.data)
if err != nil {
return
}
params := url.Values{}
params.Add("business", us.business)
params.Add("data", string(data))
params.Add("insert", fmt.Sprintf("%t", us.insert))
response := new(response)
if err = us.client.Post(ctx, us.c.Host+_pathUpsert, "", params, &response); err != nil {
return
}
if !ecode.Int(response.Code).Equal(ecode.OK) {
err = ecode.Int(response.Code)
}
return
}
// Params get query parameters
func (us *Update) Params() string {
data, _ := json.Marshal(us.data)
return fmt.Sprintf("business=%s&insert=%t&data=%s", us.business, us.insert, data)
}