File: create.tmpl

package info (click to toggle)
golang-github-facebook-ent 0.5.4-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 14,284 kB
  • sloc: javascript: 349; makefile: 8
file content (80 lines) | stat: -rw-r--r-- 2,738 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
{{/*
Copyright 2019-present Facebook Inc. All rights reserved.
This source code is licensed under the Apache 2.0 license found
in the LICENSE file in the root directory of this source tree.
*/}}

{{ define "dialect/gremlin/create" }}
{{ $builder := pascal $.Scope.Builder }}
{{ $receiver := receiver $builder }}
{{ $mutation := print $receiver ".mutation"  }}

func ({{ $receiver }} *{{ $builder }}) gremlinSave(ctx context.Context) (*{{ $.Name }}, error) {
	res := &gremlin.Response{}
	query, bindings := {{ $receiver }}.gremlin().Query()
	if err := {{ $receiver }}.driver.Exec(ctx, query, bindings, res); err != nil {
		return nil, err
	}
	if err, ok := isConstantError(res); ok {
		return nil, err
	}
	{{ $.Receiver }} := &{{ $.Name }}{config: {{ $receiver }}.config}
	if err := {{ $.Receiver }}.FromResponse(res); err != nil {
		return nil, err
	}
	return {{ $.Receiver }}, nil
}

func ({{ $receiver }} *{{ $builder }}) gremlin() *dsl.Traversal {
	{{- with .NumConstraint }}
		type constraint struct {
			pred *dsl.Traversal // constraint predicate.
			test *dsl.Traversal // test matches and its constant.
		}
		constraints := make([]*constraint, 0, {{ . }})
	{{- end }}
	v := g.AddV({{ $.Package }}.Label)
	{{- range $_, $f := $.Fields }}
		if value, ok := {{ $mutation }}.{{ $f.MutationGet }}(); ok {
			{{- if $f.Unique }}
				constraints = append(constraints, &constraint{
					pred: g.V().Has({{ $.Package }}.Label, {{ $.Package }}.{{ $f.Constant }}, value).Count(),
					test: __.Is(p.NEQ(0)).Constant(NewErrUniqueField({{ $.Package }}.Label, {{ $.Package }}.{{ $f.Constant }}, value)),
				})
			{{- end }}
			v.Property(dsl.Single, {{ $.Package }}.{{ $f.Constant }}, value)
		}
	{{- end }}
	{{- range $_, $e := $.Edges }}
		{{- $direction := "In" }}
		{{- $name := printf "%s.%s" $.Package $e.LabelConstant }}
		for _, id := range {{ $mutation }}.{{ $e.StructField }}IDs() {
			{{- if $e.IsInverse }}
				{{- $direction = "Out" }}
				{{- $name = printf "%s.%s" $e.Type.Package $e.LabelConstant }}
				v.AddE({{ $name }}).From(g.V(id)).InV()
			{{- else }}
				v.AddE({{ $name }}).To(g.V(id)).OutV()
			{{- end }}
			{{- if $e.HasConstraint }}
				constraints = append(constraints, &constraint{
					pred: g.E().HasLabel({{ $name }}).{{ $direction }}V().HasID(id).Count(),
					test: __.Is(p.NEQ(0)).Constant(NewErrUniqueEdge({{ $.Package }}.Label, {{ $name }}, id)),
				})
			{{- end }}
		}
	{{- end }}
	{{- with .NumConstraint }}
		if len(constraints) == 0 {
			return v.ValueMap(true)
		}
		tr := constraints[0].pred.Coalesce(constraints[0].test, v.ValueMap(true))
		for _, cr := range constraints[1:] {
			tr = cr.pred.Coalesce(cr.test, tr)
		}
		return tr
	{{- else }}
		return v.ValueMap(true)
	{{- end }}
}
{{ end }}