schema/field: json type support (#38)

Summary:
Pull Request resolved: https://github.com/facebookincubator/ent/pull/38

Only `IsNil` and `NotNil` predicates are supported this moment

Reviewed By: alexsn

Differential Revision: D17444976

fbshipit-source-id: 37336fa0bc7749af995933baee2e23bb7366dd78
This commit is contained in:
Ariel Mashraki
2019-09-19 04:58:21 -07:00
committed by Facebook Github Bot
parent 83d0063437
commit c3955a08f1
214 changed files with 4005 additions and 1296 deletions

View File

@@ -19,9 +19,17 @@ func ({{ $receiver }} *{{ $builder }}) sqlSave(ctx context.Context) (*{{ $.Name
}
builder := sql.Insert({{ $.Package }}.Table).Default({{ $receiver }}.driver.Dialect())
{{- range $_, $f := $.Fields }}
if {{ $receiver }}.{{- $f.StructField }} != nil {
builder.Set({{ $.Package }}.{{ $f.Constant }}, *{{ $receiver }}.{{ $f.StructField }})
{{ $.Receiver }}.{{ pascal $f.Name }} = {{ if not $f.Nillable }}*{{ end }}{{ $receiver }}.{{ $f.StructField }}
if value := {{ $receiver }}.{{- $f.StructField }}; value != nil {
{{- if $f.IsJSON }}
buf, err := json.Marshal(*value)
if err != nil {
return nil, err
}
builder.Set({{ $.Package }}.{{ $f.Constant }}, buf)
{{- else }}
builder.Set({{ $.Package }}.{{ $f.Constant }}, *value)
{{- end }}
{{ $.Receiver }}.{{ pascal $f.Name }} = {{ if not $f.Nillable }}*{{ end }}value
}
{{- end }}
query, args := builder.Query()

View File

@@ -27,7 +27,13 @@ func ({{ $receiver }} *{{ $.Name }}) FromRows(rows *sql.Rows) error {
}
{{ $receiver }}.ID = {{ if $.ID.IsString }}strconv.Itoa({{ $scan }}.ID){{ else }}{{ $scan }}.ID{{ end }}
{{- range $_, $f := $.Fields }}
{{- if $f.Nillable }}
{{- if $f.IsJSON }}
if value := {{ $scan }}.{{ pascal $f.Name }}; len(value) > 0 {
if err := json.Unmarshal(value, &{{ $receiver }}.{{ pascal $f.Name }}); err != nil {
return fmt.Errorf("unmarshal field {{ $f.Name }}: %v", err)
}
}
{{- else if $f.Nillable }}
{{- if $f.IsTime }}
{{ $receiver }}.{{ pascal $f.Name }} = &{{ $scan }}.{{ pascal $f.Name }}
{{- else }}

View File

@@ -62,26 +62,27 @@ func ({{ $receiver }} *{{ $builder }}) sqlSave(ctx context.Context) ({{ $ret }}
}
{{- if $.Fields }}
var (
update bool
res sql.Result
builder = sql.Update({{ $.Package }}.Table).Where(sql.InInts({{ $.Package }}.{{ $.ID.Constant }}, ids...))
)
{{- range $_, $f := $.Fields }}
{{- if or (not $f.Immutable) $f.UpdateDefault }}
if value := {{ $receiver }}.{{ $f.StructField }}; value != nil {
update = true
builder.Set({{ $.Package }}.{{ $f.Constant }}, *value)
{{- if $f.IsJSON }}
buf, err := json.Marshal(*value)
if err != nil {
return {{ $zero }}, err
}
builder.Set({{ $.Package }}.{{ $f.Constant }}, buf)
{{- else }}
builder.Set({{ $.Package }}.{{ $f.Constant }}, *value)
{{- end }}
{{- if $one }}
{{- if $f.Nillable }}
{{ $.Receiver }}.{{ pascal $f.Name }} = value
{{- else }}
{{ $.Receiver }}.{{ pascal $f.Name }} = *value
{{- end }}
{{ $.Receiver }}.{{ pascal $f.Name }} = {{ if not $f.Nillable }}*{{ end }}value
{{- end }}
}
{{- if $f.Type.Numeric }}
if value := {{ $receiver }}.add{{ $f.StructField }}; value != nil {
update = true
builder.Add({{ $.Package }}.{{ $f.Constant }}, *value)
{{- if $one }}
{{- if $f.Nillable }}
@@ -99,7 +100,6 @@ func ({{ $receiver }} *{{ $builder }}) sqlSave(ctx context.Context) ({{ $ret }}
{{- end }}
{{- if $f.Optional }}
if {{ $receiver }}.clear{{ $f.StructField }} {
update = true
{{- if $one }}
{{- if $f.Nillable }}
{{ $.Receiver }}.{{ pascal $f.Name }} = nil
@@ -112,7 +112,7 @@ func ({{ $receiver }} *{{ $builder }}) sqlSave(ctx context.Context) ({{ $ret }}
}
{{- end }}
{{- end }}
if update {
if !builder.Empty() {
query, args := builder.Query()
if err := tx.Exec(ctx, query, args, &res); err != nil {
return {{ $zero }}, rollback(tx, err)