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  }