github.com/johnnyeven/libtools@v0.0.0-20191126065708-61829c1adf46/sqlx/gen/model_data_and_table.go (about) 1 package gen 2 3 import ( 4 "bytes" 5 "sort" 6 7 "github.com/johnnyeven/libtools/godash" 8 "github.com/johnnyeven/libtools/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/johnnyeven/libtools/sqlx/builder" }}.Table 17 18 func init() { 19 {{ .StructName }}Table = {{ .Database }}.Register(&{{ .StructName }}{}) 20 } 21 22 func ({{ var .StructName }} *{{ .StructName }}) D() *{{ use "github.com/johnnyeven/libtools/sqlx" }}.Database { 23 return {{ .Database }} 24 } 25 26 27 func ({{ var .StructName }} *{{ .StructName }}) T() *{{ use "github.com/johnnyeven/libtools/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 type {{ .StructName }}Fields struct { 41 {{ range $k, $field := ( .FieldNames ) }}{{ print $field }} *{{ use "github.com/johnnyeven/libtools/sqlx/builder" }}.Column 42 {{ end }} 43 } 44 45 var {{ $structName }}Field = struct { 46 {{ range $k, $field := ( .FieldNames ) }}{{ print $field }} string 47 {{ end }} 48 }{ 49 {{ range $k, $field := ( .FieldNames ) }}{{ print $field }}: "{{ print $field }}", 50 {{ end }} 51 } 52 53 func ({{ var .StructName }} *{{ .StructName }}) Fields() *{{ .StructName }}Fields { 54 table := {{ var .StructName }}.T() 55 56 return &{{ .StructName }}Fields{ 57 {{ range $k, $field := ( .FieldNames ) }}{{ print $field }}: table.F({{ $structName }}Field.{{ print $field }}), 58 {{ end }} 59 } 60 } 61 62 func ({{ var .StructName }} *{{ .StructName }}) IndexFieldNames() []string { 63 return {{ dump .IndexFieldNames }} 64 } 65 66 func ({{ var .StructName }} *{{ .StructName }}) ConditionByStruct() *{{ use "github.com/johnnyeven/libtools/sqlx/builder" }}.Condition { 67 table := {{ var .StructName }}.T() 68 69 fieldValues := {{ use "github.com/johnnyeven/libtools/sqlx" }}.FieldValuesFromStructByNonZero({{ var .StructName }}) 70 71 conditions := []*{{ use "github.com/johnnyeven/libtools/sqlx/builder" }}.Condition{} 72 73 for _, fieldName := range {{ var .StructName }}.IndexFieldNames() { 74 if v, exists := fieldValues[fieldName]; exists { 75 conditions = append(conditions, table.F(fieldName).Eq(v)) 76 delete(fieldValues, fieldName) 77 } 78 } 79 80 if len(conditions) == 0 { 81 panic(fmt.Errorf("at least one of field for indexes has value")) 82 } 83 84 for fieldName, v := range fieldValues { 85 conditions = append(conditions, table.F(fieldName).Eq(v)) 86 } 87 88 condition := {{ use "github.com/johnnyeven/libtools/sqlx/builder" }}.And(conditions...) 89 90 {{ if .HasSoftDelete }} 91 condition = {{ use "github.com/johnnyeven/libtools/sqlx/builder" }}.And(condition, table.F("{{ .FieldSoftDelete }}").Eq({{ use .ConstSoftDeleteTrue }})) 92 {{ end }} 93 return condition 94 } 95 `) 96 97 return buf.String() 98 } 99 100 func (m *Model) IndexFieldNames() []string { 101 indexedFields := []string{} 102 103 m.Table.Keys.Range(func(key *builder.Key, idx int) { 104 fieldNames := key.Columns.FieldNames() 105 indexedFields = append(indexedFields, fieldNames...) 106 }) 107 108 indexedFields = godash.StringUniq(indexedFields) 109 110 indexedFields = godash.StringFilter(indexedFields, func(item string, i int) bool { 111 if m.HasSoftDelete { 112 return item != m.FieldSoftDelete 113 } 114 return true 115 }) 116 117 sort.Strings(indexedFields) 118 return indexedFields 119 }