funcs_aggregate.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. package xsql
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. type AggregateFunctionValuer struct{
  7. Data AggregateData
  8. }
  9. func (v AggregateFunctionValuer) Value(key string) (interface{}, bool) {
  10. return nil, false
  11. }
  12. func (v AggregateFunctionValuer) Call(name string, args []interface{}) (interface{}, bool) {
  13. lowerName := strings.ToLower(name)
  14. switch lowerName {
  15. case "avg":
  16. arg0 := args[0].([]interface{})
  17. if len(arg0) > 0{
  18. v := getFirstValidArg(arg0)
  19. switch v.(type){
  20. case int:
  21. return sliceIntTotal(arg0)/len(arg0), true
  22. case int64:
  23. return sliceIntTotal(arg0)/len(arg0), true
  24. case float64:
  25. return sliceFloatTotal(arg0)/float64(len(arg0)), true
  26. default:
  27. return fmt.Errorf("invalid data type for avg function"), false
  28. }
  29. }
  30. return 0, true
  31. case "count":
  32. arg0 := args[0].([]interface{})
  33. return len(arg0), true
  34. case "max":
  35. arg0 := args[0].([]interface{})
  36. if len(arg0) > 0{
  37. v := getFirstValidArg(arg0)
  38. switch t := v.(type){
  39. case int:
  40. return sliceIntMax(arg0, t), true
  41. case int64:
  42. return sliceIntMax(arg0, int(t)), true
  43. case float64:
  44. return sliceFloatMax(arg0, t), true
  45. case string:
  46. return sliceStringMax(arg0, t), true
  47. default:
  48. return fmt.Errorf("unsupported data type for avg function"), false
  49. }
  50. }
  51. return fmt.Errorf("empty data for max function"), false
  52. case "min":
  53. arg0 := args[0].([]interface{})
  54. if len(arg0) > 0{
  55. v := getFirstValidArg(arg0)
  56. switch t := v.(type){
  57. case int:
  58. return sliceIntMin(arg0, t), true
  59. case int64:
  60. return sliceIntMin(arg0, int(t)), true
  61. case float64:
  62. return sliceFloatMin(arg0, t), true
  63. case string:
  64. return sliceStringMin(arg0, t), true
  65. default:
  66. return fmt.Errorf("unsupported data type for avg function"), false
  67. }
  68. }
  69. return fmt.Errorf("empty data for max function"), false
  70. case "sum":
  71. arg0 := args[0].([]interface{})
  72. if len(arg0) > 0{
  73. v := getFirstValidArg(arg0)
  74. switch v.(type){
  75. case int:
  76. return sliceIntTotal(arg0), true
  77. case int64:
  78. return sliceIntTotal(arg0), true
  79. case float64:
  80. return sliceFloatTotal(arg0), true
  81. default:
  82. return fmt.Errorf("invalid data type for sum function"), false
  83. }
  84. }
  85. return 0, true
  86. default:
  87. return nil, false
  88. }
  89. }
  90. func (v *AggregateFunctionValuer) GetAllTuples() AggregateData {
  91. return v.Data
  92. }
  93. func getFirstValidArg(s []interface{}) interface{}{
  94. for _, v := range s{
  95. if v != nil{
  96. return v
  97. }
  98. }
  99. return nil
  100. }
  101. func sliceIntTotal(s []interface{}) int{
  102. var total int
  103. for _, v := range s{
  104. if v, ok := v.(int); ok {
  105. total += v
  106. }
  107. }
  108. return total
  109. }
  110. func sliceFloatTotal(s []interface{}) float64{
  111. var total float64
  112. for _, v := range s{
  113. if v, ok := v.(float64); ok {
  114. total += v
  115. }
  116. }
  117. return total
  118. }
  119. func sliceIntMax(s []interface{}, max int) int{
  120. for _, v := range s{
  121. if v, ok := v.(int); ok {
  122. if max < v {
  123. max = v
  124. }
  125. }
  126. }
  127. return max
  128. }
  129. func sliceFloatMax(s []interface{}, max float64) float64{
  130. for _, v := range s{
  131. if v, ok := v.(float64); ok {
  132. if max < v {
  133. max = v
  134. }
  135. }
  136. }
  137. return max
  138. }
  139. func sliceStringMax(s []interface{}, max string) string{
  140. for _, v := range s{
  141. if v, ok := v.(string); ok {
  142. if max < v {
  143. max = v
  144. }
  145. }
  146. }
  147. return max
  148. }
  149. func sliceIntMin(s []interface{}, min int) int{
  150. for _, v := range s{
  151. if v, ok := v.(int); ok {
  152. if min > v {
  153. min = v
  154. }
  155. }
  156. }
  157. return min
  158. }
  159. func sliceFloatMin(s []interface{}, min float64) float64{
  160. for _, v := range s{
  161. if v, ok := v.(float64); ok {
  162. if min > v {
  163. min = v
  164. }
  165. }
  166. }
  167. return min
  168. }
  169. func sliceStringMin(s []interface{}, min string) string{
  170. for _, v := range s{
  171. if v, ok := v.(string); ok {
  172. if min < v {
  173. min = v
  174. }
  175. }
  176. }
  177. return min
  178. }