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  }