query_rule.go 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. package query_rule
  2. import (
  3. "encoding/json"
  4. "git.sxidc.com/go-framework/baize/convenient/domain/query_rule/definition"
  5. "git.sxidc.com/go-framework/baize/convenient/domain/query_rule/rule"
  6. "git.sxidc.com/go-framework/baize/framework/binding"
  7. "git.sxidc.com/go-framework/baize/framework/core/api"
  8. "git.sxidc.com/go-framework/baize/framework/core/api/request"
  9. "git.sxidc.com/go-framework/baize/framework/core/api/response"
  10. "git.sxidc.com/go-framework/baize/framework/core/application"
  11. "git.sxidc.com/go-framework/baize/framework/core/domain"
  12. "git.sxidc.com/go-framework/baize/framework/core/domain/entity"
  13. "git.sxidc.com/go-framework/baize/framework/core/infrastructure"
  14. "git.sxidc.com/go-framework/baize/framework/core/infrastructure/database"
  15. "git.sxidc.com/go-framework/baize/framework/core/infrastructure/database/clause"
  16. "git.sxidc.com/go-framework/baize/framework/core/infrastructure/database/sql"
  17. "git.sxidc.com/go-tools/utils/strutils"
  18. "github.com/pkg/errors"
  19. )
  20. // Simple Bind参数
  21. type Simple struct {
  22. // schema
  23. Schema string
  24. // 关闭记录查询规则
  25. DisableRecordRule bool
  26. }
  27. func (simple *Simple) bind(binder *binding.Binder) {
  28. (&definition.Simple{Schema: simple.Schema}).Bind(binder)
  29. if !simple.DisableRecordRule {
  30. (&rule.Simple{Schema: simple.Schema}).Bind(binder)
  31. }
  32. }
  33. func Bind(app *application.App, simple *Simple) {
  34. binder := binding.NewBinder(app.Api().ChooseRouter(api.RouterPrefix, ""), app.Infrastructure())
  35. simple.bind(binder)
  36. }
  37. type AdvanceQueryParams interface {
  38. GetRuleConditions() (string, []any)
  39. GetPageNo() int
  40. GetPageSize() int
  41. }
  42. type BaseAdvanceQueryParams struct {
  43. RuleClause string `json:"ruleClause" assign:"-"`
  44. RuleClauseArgs []any `json:"ruleClauseArgs" assign:"-"`
  45. PageNo int `json:"pageNo" assign:"-"`
  46. PageSize int `json:"pageSize" assign:"-"`
  47. }
  48. func (queryParams *BaseAdvanceQueryParams) GetRuleConditions() (string, []any) {
  49. return queryParams.RuleClause, queryParams.RuleClauseArgs
  50. }
  51. func (queryParams *BaseAdvanceQueryParams) GetPageNo() int {
  52. return queryParams.PageNo
  53. }
  54. func (queryParams *BaseAdvanceQueryParams) GetPageSize() int {
  55. return queryParams.PageSize
  56. }
  57. type FormAdditionalSelectClausesFunc func(queryParams AdvanceQueryParams) ([]string, error)
  58. type FormAdditionalFromFunc func(queryParams AdvanceQueryParams) ([]clause.Clause, error)
  59. type FormAdditionalConditionsFunc func(queryParams AdvanceQueryParams) (clause.Clause, error)
  60. type FormOtherClausesFunc func(queryParams AdvanceQueryParams) ([]clause.Clause, error)
  61. type PostQueryFunc[O any] func(queryParams AdvanceQueryParams, infos []O, i *infrastructure.Infrastructure) ([]O, error)
  62. type AddUseQueryRuleQueryRouteParams[O any] struct {
  63. DBSchema string
  64. QueryParams AdvanceQueryParams
  65. FormAdditionalSelectClausesFunc FormAdditionalSelectClausesFunc
  66. FormAdditionalFromFunc FormAdditionalFromFunc
  67. FormAdditionalConditionsFunc FormAdditionalConditionsFunc
  68. FormOtherClausesFunc FormOtherClausesFunc
  69. PostQueryFunc PostQueryFunc[O]
  70. Object domain.Object
  71. QueryMiddlewares []binding.Middleware
  72. }
  73. func (params *AddUseQueryRuleQueryRouteParams[O]) check() error {
  74. if params.DBSchema == "" {
  75. return errors.New("没有传递DBSchema")
  76. }
  77. if params.Object == nil {
  78. return errors.New("没有传递Object")
  79. }
  80. return nil
  81. }
  82. func AddUseQueryRuleQueryRoute[O any](binder *binding.Binder, addParams *AddUseQueryRuleQueryRouteParams[O]) error {
  83. err := addParams.check()
  84. if err != nil {
  85. return err
  86. }
  87. domainPath := domain.RelativeDomainPath(addParams.Object)
  88. var queryParams AdvanceQueryParams
  89. queryParams = new(BaseAdvanceQueryParams)
  90. if addParams.QueryParams != nil {
  91. queryParams = addParams.QueryParams
  92. }
  93. binding.PostBind(binder, &binding.SimpleBindItem[response.InfosData[O]]{
  94. Path: domainPath + "/advancedQuery",
  95. SendResponseFunc: response.SendInfosResponse[O],
  96. RequestParams: queryParams,
  97. Objects: []domain.Object{addParams.Object},
  98. ServiceFunc: func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (response.InfosData[O], error) {
  99. errResponse := response.InfosData[O]{
  100. Infos: make([]O, 0),
  101. }
  102. if params == nil {
  103. return errResponse, errors.New("请求参数为空")
  104. }
  105. object := objects[0]
  106. if object == nil {
  107. return errResponse, errors.New("领域实体为空")
  108. }
  109. advanceQueryParams, ok := params.(AdvanceQueryParams)
  110. if !ok {
  111. return errResponse, errors.New("请求参数不是Query接口")
  112. }
  113. e, ok := objects[0].(entity.Entity)
  114. if !ok {
  115. return errResponse, errors.New("需要传递领域对象应该为实体")
  116. }
  117. var selectClause *clause.Select
  118. var countClause *clause.Select
  119. var fromClause *clause.From
  120. var additionalConditions clause.Clause
  121. selectClauses := make([]string, 0)
  122. fromClauses := []clause.Clause{clause.TableName(domain.TableName(addParams.DBSchema, e))}
  123. selectOtherClauses := make([]clause.Clause, 0)
  124. countOtherClauses := make([]clause.Clause, 0)
  125. if addParams.FormAdditionalSelectClausesFunc != nil {
  126. additionalSelectClauses, err := addParams.FormAdditionalSelectClausesFunc(advanceQueryParams)
  127. if err != nil {
  128. return errResponse, err
  129. }
  130. selectClauses = additionalSelectClauses
  131. }
  132. if addParams.FormAdditionalFromFunc != nil {
  133. additionalFromClauses, err := addParams.FormAdditionalFromFunc(advanceQueryParams)
  134. if err != nil {
  135. return errResponse, err
  136. }
  137. fromClauses = append(fromClauses, additionalFromClauses...)
  138. }
  139. fromClause = clause.NewFrom(fromClauses)
  140. limitClause := clause.NewLimit(advanceQueryParams.GetPageNo(), advanceQueryParams.GetPageSize())
  141. if addParams.FormAdditionalConditionsFunc != nil {
  142. conditions, err := addParams.FormAdditionalConditionsFunc(advanceQueryParams)
  143. if err != nil {
  144. return errResponse, err
  145. }
  146. additionalConditions = conditions
  147. }
  148. ruleClause, ruleClauseArgs := advanceQueryParams.GetRuleConditions()
  149. if strutils.IsStringEmpty(ruleClause) {
  150. if additionalConditions != nil {
  151. selectOtherClauses = append(selectOtherClauses, clause.NewWhere(additionalConditions), limitClause)
  152. countOtherClauses = append(countOtherClauses, clause.NewWhere(additionalConditions))
  153. } else {
  154. selectOtherClauses = append(selectOtherClauses, limitClause)
  155. }
  156. } else {
  157. var conditionClause clause.Clause
  158. conditionClause = clause.NewConditions().AddCondition(ruleClause, ruleClauseArgs...).And()
  159. if additionalConditions != nil {
  160. conditionClause = clause.NewConditionJoin(conditionClause, additionalConditions).And()
  161. }
  162. selectOtherClauses = append(selectOtherClauses, clause.NewWhere(conditionClause), limitClause)
  163. countOtherClauses = append(countOtherClauses, clause.NewWhere(conditionClause))
  164. }
  165. if addParams.FormOtherClausesFunc != nil {
  166. otherClauses, err := addParams.FormOtherClausesFunc(advanceQueryParams)
  167. if err != nil {
  168. return errResponse, err
  169. }
  170. selectOtherClauses = append(selectOtherClauses, otherClauses...)
  171. countOtherClauses = append(countOtherClauses, otherClauses...)
  172. }
  173. selectClause = clause.NewSelect(selectClauses, fromClause, selectOtherClauses...)
  174. countClause = clause.NewSelect([]string{"COUNT(*) AS total"}, fromClause, countOtherClauses...)
  175. selectClauseStr, err := selectClause.Clause()
  176. if err != nil {
  177. return errResponse, err
  178. }
  179. results, err := database.ExecuteRawSql(i.DBExecutor(), selectClauseStr, selectClause.Args()...)
  180. if err != nil {
  181. return errResponse, err
  182. }
  183. countClauseStr, err := countClause.Clause()
  184. if err != nil {
  185. return errResponse, err
  186. }
  187. countResults, err := database.ExecuteRawSql(i.DBExecutor(), countClauseStr, countClause.Args()...)
  188. if err != nil {
  189. return errResponse, err
  190. }
  191. infos := make([]O, 0)
  192. err = sql.ParseSqlResult(results, &infos)
  193. if err != nil {
  194. return errResponse, err
  195. }
  196. if addParams.PostQueryFunc != nil {
  197. innerInfos, err := addParams.PostQueryFunc(queryParams, infos, i)
  198. if err != nil {
  199. return errResponse, err
  200. }
  201. infos = innerInfos
  202. }
  203. return response.InfosData[O]{
  204. Infos: infos,
  205. TotalCount: countResults[0].ColumnValueInt64("total"),
  206. PageNo: advanceQueryParams.GetPageNo(),
  207. }, nil
  208. },
  209. }, addParams.QueryMiddlewares...)
  210. return nil
  211. }
  212. type QueryRuleParseJsonBody struct {
  213. Rule string `json:"rule" assign:"-"`
  214. }
  215. type AddUseQueryRuleParseRouteParams struct {
  216. Object domain.Object
  217. }
  218. func (params *AddUseQueryRuleParseRouteParams) check() error {
  219. if params.Object == nil {
  220. return errors.New("没有传递Object")
  221. }
  222. return nil
  223. }
  224. func AddUseQueryRuleParseRoute(binder *binding.Binder, addParams *AddUseQueryRuleParseRouteParams) error {
  225. err := addParams.check()
  226. if err != nil {
  227. return err
  228. }
  229. domainPath := domain.RelativeDomainPath(addParams.Object)
  230. binding.PostBind(binder, &binding.SimpleBindItem[map[string]any]{
  231. Path: domainPath + "/queryRule/parse",
  232. SendResponseFunc: response.SendMapResponse,
  233. RequestParams: &QueryRuleParseJsonBody{},
  234. ServiceFunc: func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (map[string]any, error) {
  235. errResponse := map[string]any{
  236. "ruleClause": "",
  237. "ruleClauseArgs": make([]any, 0),
  238. }
  239. jsonBody, err := request.ToConcrete[*QueryRuleParseJsonBody](params)
  240. if err != nil {
  241. return errResponse, err
  242. }
  243. r := new(rule.Rule)
  244. err = json.Unmarshal([]byte(jsonBody.Rule), r)
  245. if err != nil {
  246. return errResponse, err
  247. }
  248. ruleConditionClause, err := rule.FormConditionClauseByRule(addParams.Object.DomainCamelName(), *r, nil)
  249. if err != nil {
  250. return errResponse, err
  251. }
  252. ruleConditionClauseStr, err := ruleConditionClause.Clause()
  253. if err != nil {
  254. return errResponse, err
  255. }
  256. return map[string]any{
  257. "ruleClause": ruleConditionClauseStr,
  258. "ruleClauseArgs": ruleConditionClause.Args(),
  259. }, nil
  260. },
  261. })
  262. return nil
  263. }