helper.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package callbacks
  2. import (
  3. "sort"
  4. "github.com/jinzhu/gorm"
  5. "github.com/jinzhu/gorm/clause"
  6. )
  7. // SelectAndOmitColumns get select and omit columns, select -> true, omit -> false
  8. func SelectAndOmitColumns(stmt *gorm.Statement) (map[string]bool, bool) {
  9. results := map[string]bool{}
  10. // select columns
  11. for _, column := range stmt.Selects {
  12. if field := stmt.Schema.LookUpField(column); field != nil {
  13. results[field.DBName] = true
  14. } else {
  15. results[column] = true
  16. }
  17. }
  18. // omit columns
  19. for _, omit := range stmt.Omits {
  20. if field := stmt.Schema.LookUpField(omit); field != nil {
  21. results[field.DBName] = false
  22. } else {
  23. results[omit] = false
  24. }
  25. }
  26. return results, len(stmt.Selects) > 0
  27. }
  28. // ConvertMapToValues convert map to values
  29. func ConvertMapToValues(stmt *gorm.Statement, mapValue map[string]interface{}) (values clause.Values) {
  30. columns := make([]string, 0, len(mapValue))
  31. selectColumns, restricted := SelectAndOmitColumns(stmt)
  32. var keys []string
  33. for k, _ := range mapValue {
  34. keys = append(keys, k)
  35. }
  36. sort.Strings(keys)
  37. for _, k := range keys {
  38. if field := stmt.Schema.LookUpField(k); field != nil {
  39. k = field.DBName
  40. }
  41. if v, ok := selectColumns[k]; (ok && v) || (!ok && !restricted) {
  42. columns = append(columns, k)
  43. values.Values[0] = append(values.Values[0], mapValue[k])
  44. }
  45. }
  46. return
  47. }
  48. // ConvertSliceOfMapToValues convert slice of map to values
  49. func ConvertSliceOfMapToValues(stmt *gorm.Statement, mapValues []map[string]interface{}) (values clause.Values) {
  50. var (
  51. columns = []string{}
  52. result = map[string][]interface{}{}
  53. selectColumns, restricted = SelectAndOmitColumns(stmt)
  54. )
  55. for idx, mapValue := range mapValues {
  56. for k, v := range mapValue {
  57. if field := stmt.Schema.LookUpField(k); field != nil {
  58. k = field.DBName
  59. }
  60. if _, ok := result[k]; !ok {
  61. if v, ok := selectColumns[k]; (ok && v) || (!ok && !restricted) {
  62. result[k] = make([]interface{}, len(mapValues))
  63. columns = append(columns, k)
  64. } else {
  65. continue
  66. }
  67. }
  68. result[k][idx] = v
  69. }
  70. }
  71. sort.Strings(columns)
  72. values.Values = make([][]interface{}, len(mapValues))
  73. for idx, column := range columns {
  74. for i, v := range result[column] {
  75. if i == 0 {
  76. values.Values[i] = make([]interface{}, len(columns))
  77. }
  78. values.Values[i][idx] = v
  79. }
  80. }
  81. return
  82. }