首页 > 其他分享 >go esWebClient基于泛型的通用ES客户端eswebrequest封装

go esWebClient基于泛型的通用ES客户端eswebrequest封装

时间:2024-10-25 08:49:51浏览次数:3  
标签:return self var esWebClient go result func 泛型 id

go1.20 自动完成结构体转换。

测试用例

package eswebrequest

import (
    "fmt"
    "git.ichub.com/general/webcli120/goconfig/ichubconfig"
    "git.ichub.com/general/webcli120/goconfig/ichublog/golog"
    "git.ichub.com/general/webcli120/goweb/pagees/esconst"

    "git.ichub.com/general/webcli120/goweb/pagereqcli"
    "github.com/agiledragon/gomonkey"
    "github.com/olivere/elastic/v7"
    "github.com/sirupsen/logrus"
    "github.com/stretchr/testify/suite"

    "reflect"
    "testing"
)

type TestCmsWebRequestSuite struct {
    suite.Suite

    rootdir string
    dbtype  string
    cfg     *ichubconfig.IchubConfig
}

func TestCmsWebRequestSuites(t *testing.T) {
    suite.Run(t, new(TestCmsWebRequestSuite))
}

var patches *gomonkey.Patches // = gomonkey.ApplyGlobalVar(&common.Env, "test")

func (suite *TestCmsWebRequestSuite) SetupSuite() {
    logrus.Info(" setup suite")

    // patches = gomonkey.ApplyGlobalVar(&common.Env, "test")
    // defer patches.Reset()
}

func (suite *TestCmsWebRequestSuite) TearDownSuite() {
    logrus.Info(" teardown suite")
    // patches.Reset()

}
func (suite *TestCmsWebRequestSuite) SetupTest() {
    logrus.Info(" setup test")
}

func (suite *TestCmsWebRequestSuite) TearDownTest() {
    logrus.Info(" teardown test")
}

 

type MyStruct struct{}

func (ms *MyStruct) MethodToMock() string {
    return "original"
}

func (this *TestCmsWebRequestSuite) Test102_MockStructMethod() {
    var ms *MyStruct
    patches := gomonkey.ApplyMethod(reflect.TypeOf(ms), "MethodToMock", func(_ *MyStruct) string {
       return "mocked"
    })
    defer patches.Reset()

    // 现在 ms.MethodToMock() 将返回 "mocked"
    result := ms.MethodToMock()
    if result != "mocked" {
       logrus.Errorf("Expected 'mocked', got '%s'", result)
       return
    }

    golog.Info("ok")
}

func (this *TestCmsWebRequestSuite) Test103_MakeQuery() {

    var q = pagereqcli.Default()
    q.CmdType = esconst.ES_HTTPCLI_QUERY
    q.IndexName = "dev_wms_orderlist"
    q.RestTotalHitsAsInt = true
    var query = elastic.NewBoolQuery().Must(elastic.NewTermQuery("id", 919932898974433283))
    q.Query(query)

    golog.Info(q)

}
func (this *TestCmsWebRequestSuite) Test104_WebReques() {

    var q = DefaultOf[*CmsListEs](elastic.NewMatchAllQuery())
    q.SetPageSize(2)

    var result = q.GeneralQuery()

    golog.Info(result)
}
func (this *TestCmsWebRequestSuite) Test105_WebRequest() {

    var q = Default[*CmsListEs]()
    q.Query(elastic.NewTermQuery("content_id", 895864411552153601))
    q.SetPageSize(2)
    var result = q.GeneralQuery()

    golog.Info(result)
}

func (this *TestCmsWebRequestSuite) Test106_WebRequest() {

    var cmd = DefaultCmd[*CmsListEs]()
    cmd.EsMust().EsTerm("content_id", 895864411552153601)
    scriptString := fmt.Sprintf("ctx._source.user_name=params.user_name;")
    updateInfo := make(map[string]interface{})
    updateInfo["user_name"] = "abc"
    var result = cmd.UpdateByQuery(scriptString, updateInfo)
    var result1 = cmd.UpdateByQueryParam(updateInfo)
    if result.IsFailed() {
       golog.Error(result, result1)
    }

}通用

查询

package eswebrequest

import (
    "git.ichub.com/general/webcli120/goconfig/base/baseiface"
    "git.ichub.com/general/webcli120/goconfig/base/jsonutils"
    "git.ichub.com/general/webcli120/goweb/page"
    "git.ichub.com/general/webcli120/goweb/pagees/esconst"
    "git.ichub.com/general/webcli120/goweb/pagemodel"
    "git.ichub.com/general/webcli120/goweb/pagereq"
    "git.ichub.com/general/webcli120/goweb/pagereqcli"
    "git.ichub.com/general/webcli120/goweb/webclient/eswebclient"
    "github.com/gogf/gf/util/gconv"
    "github.com/olivere/elastic/v7"
    "gorm.io/gorm/schema"

    "reflect"
)

// result, *result.Data.(*[]*model.CmsColumnEs)
type WebRequest[T schema.Tabler] struct {
    *pagereqcli.HttpCliQuery
    Records     []T `json:"records"`
    EsWebClient *eswebclient.EsWebClient
}

func Default[T schema.Tabler]() *WebRequest[T] {
    var q = &WebRequest[T]{
       HttpCliQuery: pagereqcli.Default(),
       EsWebClient:  eswebclient.FindBeanEsWebClient(),
    }

    q.Records = []T{}
    q.SetModels(&q.Records)
    q.SetIndexTable(NewOfTablerType[T]())
    return q
}
func DefaultOf[T schema.Tabler](generalQ elastic.Query) *WebRequest[T] {
    var q = Default[T]()
    q.Query(generalQ)
    return q
}
func (self *WebRequest[T]) Query(q elastic.Query) *WebRequest[T] {

    self.HttpCliQuery.Query(q)
    return self
}
func (self *WebRequest[T]) SetModels(models any) *WebRequest[T] {
    self.HttpCliQuery.SetModels(models)
    return self
}

// get
func (self *WebRequest[T]) Get(ids any) *pagemodel.PageResult[T] {
    var result = self.CmsGet(self.IndexTable(), ids) //HttpCliQuery) //    result.Data = self.Records
    var pageResult = pagemodel.NewPageResult[T]()
    pageResult.ValueOfPageResult(result) //    pageResult.Data = *self.Records
    pageResult.PageResult.Data = self.Records

    return pageResult
}
func (self *WebRequest[T]) CmsGet(indexTable baseiface.IIndexTable, ids any) *page.PageResult {
    var id = gconv.String(ids)
    var q = self.cms2QueryReq(indexTable, id)
    q.CmdType = esconst.ES_QUERY_TYPE_GET

    var result = self.EsWebClient.Get(self.IndexTable().TableName(), id)
    if result.IsSuccess() {
       jsonutils.FromJson(jsonutils.ToJsonStr(result.Data), indexTable)
       result.Data = self.IndexTable()
    }
    return result

}
func (self *WebRequest[T]) cms2QueryReq(indexTable baseiface.IIndexTable, id string) *pagereq.QueryRequest {
    var q = pagereq.Default()
    q.IndexName = indexTable.TableName()
    q.Id = id

    return q
}

func (self *WebRequest[T]) GeneralQuery() *pagemodel.PageResult[T] {
    var result = self.EsWebClient.GeneralQuerySource(self.HttpCliQuery) // result.Data = self.Records
    var pageResult = pagemodel.NewPageResult[T]()
    pageResult.ValueOfPageResult(result) //    pageResult.Data = *self.Records
    pageResult.PageResult.Data = self.Records

    return pageResult
}
func (self *WebRequest[T]) GeneralQueryMax() *pagemodel.PageResult[T] {
    self.SetPageSize(10000)
    return self.GeneralQuery()
}

func (self *WebRequest[T]) Result2List(result *page.PageResult) []T {
    return *result.Data.(*[]T)
}
func (self *WebRequest[T]) Result2Tablers(result *pagemodel.PageResult[T]) []schema.Tabler {

    var rs = make([]schema.Tabler, 0)
    for _, i := range result.Data {
       rs = append(rs, i)
    }
    return rs
}
func (self *WebRequest[T]) Stru2Filter(result *pagemodel.PageResult[T]) []any {

    var rs = self.Result2Tablers(result)
    return pagemodel.Stru2Filter(rs, self.Source)

}
func NewOfTablerType[T schema.Tabler]() T {
    var t T
    var typeOf = reflect.TypeOf(t)
    if typeOf.Kind() == reflect.Ptr {
       typeOf = typeOf.Elem()
    }
    var value = reflect.New(typeOf)
    return value.Interface().(T)
}

func (self *WebRequest[T]) CmsExistId(id string) *page.PageResult {

    var q = self.cms2QueryReq(self.IndexTable(), id)
    q.CmdType = esconst.ES_QUERY_TYPE_EXISTS_ID

    return self.EsWebClient.ExistId(q)

}更新

修改

package eswebrequest

import (
    "errors"
    "fmt"
    "git.ichub.com/general/webcli120/goconfig/base/basedto"
    "git.ichub.com/general/webcli120/goconfig/base/baseiface"
    "git.ichub.com/general/webcli120/goconfig/base/jsonutils"
    "git.ichub.com/general/webcli120/goconfig/ichublog/golog"
    "git.ichub.com/general/webcli120/goweb/page"
    "git.ichub.com/general/webcli120/goweb/pagees/esconst"
    "git.ichub.com/general/webcli120/goweb/pagereq"
    "git.ichub.com/general/webcli120/goweb/webclient/eswebclient"
    "github.com/gogf/gf/util/gconv"
    "gorm.io/gorm/schema"
)

type CmdRequest[T schema.Tabler] struct {
    *pagereq.CmdRequest
    EsWebClient *eswebclient.EsWebClient
}

func DefaultCmd[T schema.Tabler]() *CmdRequest[T] {
    var q = &CmdRequest[T]{
       CmdRequest:  pagereq.DefaultCmd(),
       EsWebClient: eswebclient.FindBeanEsWebClient(),
    }

    q.SetIndexTable(NewOfTablerType[T]())
    return q
}
func (self *CmdRequest[T]) WebSaveIndex(id any) *basedto.IchubResult {
    var result = self.insertIfNoIndex(id)
    if result.IsFailed() {
       golog.Error(result)
    }
    return result

}

func (self *CmdRequest[T]) SaveIndex(id any, doc map[string]any) *basedto.IchubResult {

    //return self.insertIfNoIndex(id)
    var cmd = self.cms2CmdReq(self.IndexTable(), gconv.String(id), doc)
    cmd.CmdType = esconst.ES_CMD_TYPE_INSERT_IF_NOTEXISTS
    return self.EsWebClient.InsertIfNotExists(cmd)

}
func (self *CmdRequest[T]) SaveIndexStru(id any, stru any) *basedto.IchubResult {
    return self.SaveIndex(id, jsonutils.Stru2Map(stru))
}

func (self *CmdRequest[T]) insertIfNoIndex(id any) *basedto.IchubResult {

    var cmd = self.cms2CmdReq(self.IndexTable(), gconv.String(id), self.IndexTable())
    cmd.CmdType = esconst.ES_CMD_TYPE_INSERT_IF_NOTEXISTS
    var result = self.EsWebClient.InsertIfNotExists(cmd)
    if result.IsFailed() {
       golog.Error("[CmsInsertIfNoIndex] ", result)
    }
    return result
}
func (self *CmdRequest[T]) cms2CmdReq(indexTable baseiface.IIndexTable, id string, some any) *pagereq.CmdRequest {
    var cmd = pagereq.DefaultCmd()
    cmd.IndexName = indexTable.TableName()
    cmd.Id = id
    if some != nil {
       cmd.Doc = jsonutils.Stru2Map(some)
    }
    return cmd
}
func (self *CmdRequest[T]) CmsExistId(id string) *page.PageResult {

    var q = self.cms2QueryReq(self.IndexTable(), id)
    q.CmdType = esconst.ES_QUERY_TYPE_EXISTS_ID

    return self.EsWebClient.ExistId(q)

}
func (self *CmdRequest[T]) cms2QueryReq(indexTable baseiface.IIndexTable, id string) *pagereq.QueryRequest {
    var q = pagereq.Default()
    q.IndexName = indexTable.TableName()
    q.Id = id

    return q
}
func (self *CmdRequest[T]) SaveIndexAny(indexTable eswebclient.IndexMapping) *basedto.IchubResult {

    return nil //self.SaveIndex(indexTable.TablePkeyValue(), jsonutils.Stru2Map(indexTable))

}

func (self *CmdRequest[T]) UpdataParam2Script(fieldAsParams map[string]interface{}) string {
    var scriptString string
    for key := range fieldAsParams {
       scriptString += fmt.Sprintf("ctx._source.%s=params.%s;", key, key)
    }
    return scriptString
}

func (self *CmdRequest[T]) BulkUpsert() *basedto.IchubResult {
    return self.EsWebClient.BulkUpsert(self.CmdRequest)
}

// 参数名=字段名
func (self *CmdRequest[T]) UpdateByQueryParam(fieldAsParams map[string]any) *basedto.IchubResult {
    var script = self.UpdataParam2Script(fieldAsParams)
    return self.UpdateByQuery(script, fieldAsParams)
}
func (self *CmdRequest[T]) UpdateByQuery(updateClause string, fieldParams map[string]any) *basedto.IchubResult {
    if len(fieldParams) == 0 {
       golog.Info("no params")
       return nil
    }
    var cmd = self.CmdRequest
    cmd.SetIndexTable(self.IndexTable())
    cmd.ScriptAs(updateClause, fieldParams)
    cmd.CmdType = esconst.ES_CMD_TYPE_UPDATEBYQUERY
    var result = self.EsWebClient.Cmd(cmd)
    if !result.IsSuccess() {
       golog.Error("[UpdateByQuery] ", result)
    }
    return result
}
func (self *CmdRequest[T]) Update(ids any, doc map[string]any) *basedto.IchubResult {
    var id = gconv.String(ids)
    var cmd = self.cms2CmdReq(self.IndexTable(), id, doc)
    cmd.SetIndexTable(self.IndexTable())
    cmd.CmdType = esconst.ES_CMD_TYPE_UPDATE
    var result = self.EsWebClient.Cmd(cmd)
    if !result.IsSuccess() {
       golog.Error("[Update] ", result)
    }

    return result
}
func (self *CmdRequest[T]) Update2Err(id string, doc map[string]any) error {
    var result = self.Update(id, doc)
    if result.IsSuccess() {
       return nil
    }
    golog.Error("Update", result)
    return errors.New(result.Msg)
}

func (self *CmdRequest[T]) DeleteByQuery() *basedto.IchubResult {
    return self.EsWebClient.DeleteByQuery(self.CmdRequest)
}
func (self *CmdRequest[T]) Delete(id any) *basedto.IchubResult {
    return self.EsWebClient.Delete(self.IndexTable(), id)
}
func (self *CmdRequest[T]) BulkDelete(ids ...any) *basedto.IchubResult {
    return self.EsWebClient.BulkDelete(self.IndexTable(), ids...)
}

元数据
package eswebrequest

import (
    "git.ichub.com/general/webcli120/goconfig/base/basedto"
    "git.ichub.com/general/webcli120/goweb/pagereq"
    "git.ichub.com/general/webcli120/goweb/webclient/eswebclient"

    "reflect"
)

type MetaRequest[T eswebclient.IndexMapping] struct {
    *pagereq.MetadataRequest
    EsWebClient *eswebclient.EsWebClient
    index       eswebclient.IndexMapping
}

func (self *MetaRequest[T]) Index() eswebclient.IndexMapping {
    return self.index
}

func (self *MetaRequest[T]) SetIndex(index eswebclient.IndexMapping) {
    self.index = index
}

func NewOfIndexType[T eswebclient.IndexMapping]() T {
    var t T
    var typeOf = reflect.TypeOf(t)
    if typeOf.Kind() == reflect.Ptr {
       typeOf = typeOf.Elem()
    }
    var value = reflect.New(typeOf)
    return value.Interface().(T)
}
func DefaultMeta[T eswebclient.IndexMapping]() *MetaRequest[T] {
    var q = &MetaRequest[T]{
       MetadataRequest: pagereq.DefaultMetadata(),
       EsWebClient:     eswebclient.FindBeanEsWebClient(),
    }
    q.index = NewOfIndexType[T]()
    q.SetIndexTable(q.index)
    return q
}
func (self *MetaRequest[T]) MetaDropIndex() *basedto.IchubResult {
    return self.EsWebClient.MetaDropIndex(self.IndexTable())
}
func (self *MetaRequest[T]) MetaCreateIndex() *basedto.IchubResult {
    return self.EsWebClient.MetaCreateIndex(self.index)
}
func (self *MetaRequest[T]) MetaIndexExists() *basedto.IchubResult {
    return self.EsWebClient.MetaIndexExists(self.IndexTable())
}

func (self *MetaRequest[T]) CreateIndexIfNotExist() *basedto.IchubResult {
    return self.EsWebClient.CreateIndexIfNotExist(self.index)
}
func (self *MetaRequest[T]) CreateIndexesIfNotExist() *basedto.IchubResult {
    return self.EsWebClient.CreateIndexesIfNotExist(self.index)
}
func (self *MetaRequest[T]) MetaGetMapping() *basedto.IchubResult {
    return self.EsWebClient.MetaGetMapping(self.index)
}

标签:return,self,var,esWebClient,go,result,func,泛型,id
From: https://blog.csdn.net/leijmdas/article/details/143212029

相关文章

  • 网站模板修改上传图片?模板如何修改网站logo?
    确定图片上传的位置确定在网站的哪个部分需要添加图片上传功能,例如用户资料页面、产品详情页等。HTML表单设置在需要上传图片的地方添加一个表单,使用 <form> 标签,并确保 enctype 属性设置为 multipart/form-data,这允许文件数据被正确编码。<formaction="/up......
  • Hero Age v5.6.10 MOD APK (Menu/One Hit, God Mode)
    HeroAgev5.6.10MODAPK(Menu/OneHit,GodMode)October18,2024(42secondsago)HeroAgeModAPKisasimpleandfun-filledofflinerole-playinggame.Youwillfighttheenemiesandbecomethestrongestheroamongthoseplayers. AppNameHeroA......
  • Study Plan For Algorithms - Part49
    1.交错字符串给定三个字符串s1、s2、s3,请验证s3是否是由s1和s2交错组成的。两个字符串s和t交错的定义与过程如下,其中每个字符串都会被分割成若干非空子字符串:s=s1+s2+...+snt=t1+t2+...+tm|n-m|<=1交错是s1+t1+s2+t2+s3+t3......
  • 面试华为遇到了经典动态规划题 - 怎么用go、C++进行编程解决
    华为的知名很大程度上源自于在经历过被美国的制裁和打压后不仅撑住了,而且还做出了相对于自己来说技术进步程度很大的芯片​。这是一个不小的成绩​。从个人的角度上来说,华为是最难进的一家大公司之一,它的面试标准很严格​。这不仅是筛选人才,在某种程度上来说也是由于求职市场......
  • MongoDB-Plus
    MongoDB-Plus是一款功能强大的数据库工具,它基于MongoDB,提供了更丰富的功能和更便捷的操作方式。以下是一篇关于MongoDB-Plus轻松上手的详细指南,旨在帮助初学者快速掌握其安装、配置和基础操作。一、MongoDB-Plus概述MongoDB是一款由C++编写的分布式文档数据库,自2007年发......
  • MongoDB-Plus概述
    MongoDB-Plus是一款功能强大的数据库工具,它基于MongoDB,提供了更丰富的功能和更便捷的操作方式。以下是一篇关于MongoDB-Plus轻松上手的详细指南,旨在帮助初学者快速掌握其安装、配置和基础操作。一、MongoDB-Plus概述MongoDB是一款由C++编写的分布式文档数据库,自2007年发......
  • Go中的接口
    是的,接口是Go语言中实现多态的关键机制。通过接口,Go可以让不同类型共享相同的行为,而无需关心这些类型的具体实现。这种机制称为多态性,它允许使用不同的类型以统一的方式进行操作。1.什么是接口(Interface)?在Go语言中,接口(interface)是一种类型,它定义了一组方法的集合。任何......
  • Go:大小写区别
    在Go语言中,标识符的大小写不仅仅是书写上的区别,它直接关系到可见性和访问权限,即是否可以在包外部(跨包)访问某个标识符(变量、常量、函数、结构体、方法等)。1.大小写与可见性规则Go使用了一种简单而直接的机制来控制标识符的访问权限:首字母大写:标识符对其他包(package)可见,称为......
  • [Go] 如何妥善处理 TCP 代理中连接的关闭
    如何妥善处理TCP代理中连接的关闭相比较于直接关闭TCP连接,只关闭TCP连接读写使用单工连接的场景较少,但通用的TCP代理也需要考虑这部分场景。背景今天在看老代码的时候,发现一个TCP代理的核心函数实现的比较粗糙,收到EOF后直接粗暴关闭两条TCP连接。funcConnCat(u......
  • 如何用反射调用泛型类的方法
    例子一:泛型类不含构造函数usingSystem;usingSystem.Reflection;namespace使用反射调用泛型类的方法{classProgram{staticvoidMain(string[]args){//定义要使用的类型参数(就是调用方法时要传入的参数类型,例如int)......