query_rule_definition.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package query_rule
  2. import (
  3. "git.sxidc.com/go-framework/baize/framework/core/domain/entity"
  4. "git.sxidc.com/go-framework/baize/framework/core/tag/rule"
  5. "sync"
  6. )
  7. const (
  8. opEqual = "eq"
  9. opNotEqual = "ne"
  10. opLessThan = "lt"
  11. opLessThanOrEqual = "lte"
  12. opGreaterThan = "gt"
  13. opGreaterThanOrEqual = "gte"
  14. opIn = "in"
  15. opNotIn = "not-in"
  16. opPrefix = "prefix"
  17. opSuffix = "suffix"
  18. opContains = "contains"
  19. )
  20. func IsSupportedOperator(op string) bool {
  21. return op == opEqual || op == opNotEqual ||
  22. op == opLessThan || op == opLessThanOrEqual ||
  23. op == opGreaterThan || op == opGreaterThanOrEqual ||
  24. op == opIn || op == opNotIn ||
  25. op == opPrefix || op == opSuffix || op == opContains
  26. }
  27. var opTranslationMap = map[string]string{
  28. opEqual: "等于",
  29. opNotEqual: "不等于",
  30. opLessThan: "小于",
  31. opLessThanOrEqual: "小于等于",
  32. opGreaterThan: "大于",
  33. opGreaterThanOrEqual: "大于等于",
  34. opIn: "包含在列表",
  35. opNotIn: "不包含在列表",
  36. opPrefix: "包含前缀",
  37. opSuffix: "包含后缀",
  38. opContains: "包含",
  39. }
  40. var (
  41. operatorEqual = Operator{
  42. Name: opEqual,
  43. CNName: opTranslationMap[opEqual],
  44. }
  45. operatorNotEqual = Operator{
  46. Name: opNotEqual,
  47. CNName: opTranslationMap[opNotEqual],
  48. }
  49. operatorLessThan = Operator{
  50. Name: opLessThan,
  51. CNName: opTranslationMap[opLessThan],
  52. }
  53. operatorLessThanOrEqual = Operator{
  54. Name: opLessThanOrEqual,
  55. CNName: opTranslationMap[opLessThanOrEqual],
  56. }
  57. operatorGreaterThan = Operator{
  58. Name: opGreaterThan,
  59. CNName: opTranslationMap[opGreaterThan],
  60. }
  61. operatorGreaterThanOrEqual = Operator{
  62. Name: opGreaterThanOrEqual,
  63. CNName: opTranslationMap[opGreaterThanOrEqual],
  64. }
  65. operatorIn = Operator{
  66. Name: opIn,
  67. CNName: opTranslationMap[opIn],
  68. }
  69. operatorNotIn = Operator{
  70. Name: opNotIn,
  71. CNName: opTranslationMap[opNotIn],
  72. }
  73. operatorPrefix = Operator{
  74. Name: opPrefix,
  75. CNName: opTranslationMap[opPrefix],
  76. }
  77. operatorSuffix = Operator{
  78. Name: opSuffix,
  79. CNName: opTranslationMap[opSuffix],
  80. }
  81. operatorContains = Operator{
  82. Name: opContains,
  83. CNName: opTranslationMap[opContains],
  84. }
  85. )
  86. var operatorOfTypeMap = map[string][]Operator{
  87. rule.TypeString: {
  88. operatorEqual, operatorNotEqual, operatorIn, operatorNotIn, operatorPrefix, operatorSuffix, operatorContains,
  89. },
  90. rule.TypeTime: {
  91. operatorEqual, operatorNotEqual, operatorLessThan, operatorLessThanOrEqual, operatorGreaterThan, operatorGreaterThanOrEqual, operatorIn, operatorNotIn,
  92. },
  93. rule.TypeNumber: {
  94. operatorEqual, operatorNotEqual, operatorLessThan, operatorLessThanOrEqual, operatorGreaterThan, operatorGreaterThanOrEqual, operatorIn, operatorNotIn,
  95. },
  96. rule.TypeBool: {
  97. operatorEqual, operatorNotEqual,
  98. },
  99. }
  100. var registeredDomainMap = &sync.Map{}
  101. type Operator struct {
  102. Name string `json:"name"`
  103. CNName string `json:"cnName"`
  104. }
  105. type QueryRuleDefinitionItem struct {
  106. FieldType string `json:"fieldType"`
  107. FieldName string `json:"fieldName"`
  108. FieldCNName string `json:"fieldCNName"`
  109. ColumnName string `json:"columnName"`
  110. Operators []Operator `json:"operators"`
  111. }
  112. type RegisterQueryRuleDefinitionsByEntityItem struct {
  113. Entity entity.Entity
  114. FieldMap map[string]string
  115. }
  116. func RegisterQueryRuleDefinitionByEntity(items ...RegisterQueryRuleDefinitionsByEntityItem) error {
  117. for _, item := range items {
  118. e := item.Entity
  119. fields, err := rule.DefaultUsage(e)
  120. if err != nil {
  121. return err
  122. }
  123. definitions := make([]QueryRuleDefinitionItem, 0)
  124. for _, field := range fields {
  125. definitions = append(definitions, QueryRuleDefinitionItem{
  126. FieldType: field.Type,
  127. FieldName: field.FieldName,
  128. ColumnName: field.ColumnName,
  129. FieldCNName: item.FieldMap[field.FieldName],
  130. Operators: operatorOfTypeMap[field.Type],
  131. })
  132. }
  133. registeredDomainMap.Store(e.DomainCamelName(), definitions)
  134. }
  135. return nil
  136. }
  137. func GetQueryRuleDefinition(domainName string) []QueryRuleDefinitionItem {
  138. result, ok := registeredDomainMap.Load(domainName)
  139. if !ok {
  140. return make([]QueryRuleDefinitionItem, 0)
  141. }
  142. return result.([]QueryRuleDefinitionItem)
  143. }