github.com/artisanhe/tools@v1.0.1-0.20210607022958-19a8fef2eb04/sqlx/gen/model_data_and_table.go (about) 1 package gen 2 3 import ( 4 "bytes" 5 "sort" 6 7 "github.com/artisanhe/tools/godash" 8 "github.com/artisanhe/tools/sqlx/builder" 9 ) 10 11 func (m *Model) dataAndTable() string { 12 buf := &bytes.Buffer{} 13 14 if m.WithTableInterfaces { 15 m.ParseTo(buf, ` 16 var {{ .StructName }}Table *{{ use "github.com/artisanhe/tools/sqlx/builder" }}.Table 17 18 func init() { 19 {{ .StructName }}Table = {{ .Database }}.Register(&{{ .StructName }}{}) 20 } 21 22 func ({{ var .StructName }} *{{ .StructName }}) D() *{{ use "github.com/artisanhe/tools/sqlx" }}.Database { 23 return {{ .Database }} 24 } 25 26 27 func ({{ var .StructName }} *{{ .StructName }}) T() *{{ use "github.com/artisanhe/tools/sqlx/builder" }}.Table { 28 return {{ .StructName }}Table 29 } 30 31 func ({{ var .StructName }} *{{ .StructName }}) TableName() string { 32 return "{{ .TableName }}" 33 } 34 `) 35 } 36 37 m.ParseTo(buf, ` 38 {{ $structName := .StructName }} 39 40 // Deprecated use *.Field*() instead 41 type {{ .StructName }}Fields struct { 42 {{ range $k, $field := ( .FieldNames ) }}{{ print $field }} *{{ use "github.com/artisanhe/tools/sqlx/builder" }}.Column 43 {{ end }} 44 } 45 46 // Deprecated use *.FieldKey*() instead 47 var {{ $structName }}Field = struct { 48 {{ range $k, $field := ( .FieldNames ) }}{{ print $field }} string 49 {{ end }} 50 }{ 51 {{ range $k, $field := ( .FieldNames ) }}{{ print $field }}: "{{ print $field }}", 52 {{ end }} 53 } 54 55 // Deprecated use *.Field*() instead 56 func ({{ var .StructName }} *{{ .StructName }}) Fields() *{{ .StructName }}Fields { 57 table := {{ var .StructName }}.T() 58 59 return &{{ .StructName }}Fields{ 60 {{ range $k, $field := ( .FieldNames ) }}{{ print $field }}: table.F({{ var $structName }}.FieldKey{{ print $field }}()), 61 {{ end }} 62 } 63 } 64 65 {{ range $k, $field := ( .FieldNames ) }} 66 func ({{ $structName }}) FieldKey{{ print $field }}() string { 67 return "{{ print $field }}" 68 } 69 70 func ({{ var $structName }} *{{ $structName }}) Field{{ print $field }}() *{{ use "github.com/artisanhe/tools/sqlx/builder" }}.Column { 71 return {{ var $structName }}.T().F({{ var $structName }}.FieldKey{{ print $field }}()) 72 } 73 {{ end }} 74 75 func ({{ var .StructName }} *{{ .StructName }}) IndexFieldNames() []string { 76 return {{ dump .IndexFieldNames }} 77 } 78 79 func ({{ var .StructName }} *{{ .StructName }}) ConditionByStruct() *{{ use "github.com/artisanhe/tools/sqlx/builder" }}.Condition { 80 table := {{ var .StructName }}.T() 81 82 fieldValues := {{ use "github.com/artisanhe/tools/sqlx" }}.FieldValuesFromStructByNonZero({{ var .StructName }}) 83 84 conditions := []*{{ use "github.com/artisanhe/tools/sqlx/builder" }}.Condition{} 85 86 for _, fieldName := range {{ var .StructName }}.IndexFieldNames() { 87 if v, exists := fieldValues[fieldName]; exists { 88 conditions = append(conditions, table.F(fieldName).Eq(v)) 89 delete(fieldValues, fieldName) 90 } 91 } 92 93 if len(conditions) == 0 { 94 panic(fmt.Errorf("at least one of field for indexes has value")) 95 } 96 97 for fieldName, v := range fieldValues { 98 conditions = append(conditions, table.F(fieldName).Eq(v)) 99 } 100 101 condition := {{ use "github.com/artisanhe/tools/sqlx/builder" }}.And(conditions...) 102 103 {{ if .HasSoftDelete }} 104 condition = {{ use "github.com/artisanhe/tools/sqlx/builder" }}.And(condition, table.F("{{ .FieldSoftDelete }}").Eq({{ use .ConstSoftDeleteTrue }})) 105 {{ end }} 106 return condition 107 } 108 `) 109 110 return buf.String() 111 } 112 113 func (m *Model) IndexFieldNames() []string { 114 indexedFields := []string{} 115 116 m.Table.Keys.Range(func(key *builder.Key, idx int) { 117 fieldNames := key.Columns.FieldNames() 118 indexedFields = append(indexedFields, fieldNames...) 119 }) 120 121 indexedFields = godash.StringUniq(indexedFields) 122 123 indexedFields = godash.StringFilter(indexedFields, func(item string, i int) bool { 124 if m.HasSoftDelete { 125 return item != m.FieldSoftDelete 126 } 127 return true 128 }) 129 130 sort.Strings(indexedFields) 131 return indexedFields 132 }