dialect/sql: add neighbors function (#140)

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

This part of the effort of moving logic from Go templates to shared packages.
Next diffs will migrate the neighbors-set and predicates as well.

Dedicated tests for `sql/dialect/graph.go` will be added in a follow-up diff.

Reviewed By: alexsn

Differential Revision: D18304531

fbshipit-source-id: 93e9cf2636b5b4525eb27305bd2708122cfd6e40
This commit is contained in:
Ariel Mashraki
2019-11-05 13:07:38 -08:00
committed by Facebook Github Bot
parent a5d6a9e8b8
commit 930a17b767
17 changed files with 758 additions and 443 deletions

View File

@@ -130,31 +130,16 @@ func ({{ $receiver }} *{{ $builder }}) sqlQuery() *sql.Selector {
{{- $n := $ }} {{/* the node we start the query from. */}}
{{- $e := $.Scope.Edge }} {{/* the edge we need to genegrate the path to. */}}
{{- $receiver := $.Scope.Receiver -}}
id := {{ $receiver }}.{{- if $n.ID.IsString }}id(){{ else }}ID{{ end }}
builder := sql.Dialect({{ $receiver }}.driver.Dialect())
{{- if $e.M2M }}
{{ $i := 1 }}{{ $j := 0 }}{{- if $e.IsInverse }}{{ $i = 0 }}{{ $j = 1 }}{{ end -}}
t1 := builder.Table({{ $e.Type.Package }}.Table)
t2 := builder.Table({{ $n.Package }}.Table)
t3 := builder.Table({{ $n.Package }}.{{ $e.TableConstant }})
t4 := builder.Select(t3.C({{ $n.Package }}.{{ $e.PKConstant }}[{{ $i }}])).
From(t3).
Join(t2).
On(t3.C({{ $n.Package }}.{{ $e.PKConstant }}[{{ $j }}]), t2.C({{ $n.Package }}.{{ $n.ID.Constant }})).
Where(sql.EQ(t2.C({{ $n.Package }}.{{ $n.ID.Constant }}), id))
query.sql = builder.Select().
From(t1).
Join(t4).
On(t1.C({{ $e.Type.Package }}.{{ $e.Type.ID.Constant }}), t4.C({{ $n.Package }}.{{ $e.PKConstant }}[{{ $i }}]))
{{- else if or $e.M2O (and $e.O2O $e.IsInverse) }}{{/* M2O || (O2O with inverse edge) */}}
t1 := builder.Table({{ $e.Type.Package }}.Table)
t2 := builder.Select({{ $n.Package }}.{{ $e.ColumnConstant }}).
From(builder.Table({{ $n.Package }}.{{ $e.TableConstant }})).
Where(sql.EQ({{ $n.Package }}.{{ $n.ID.Constant }}, id))
query.sql = builder.Select().From(t1).Join(t2).On(t1.C({{ $e.Type.Package }}.{{ $e.Type.ID.Constant }}), t2.C({{ $n.Package }}.{{ $e.ColumnConstant }}))
{{- else }}{{/* O2M || (O2O with assoc edge) */}}
query.sql = builder.Select().From(builder.Table({{ $e.Type.Package }}.Table)).
Where(sql.EQ({{ $n.Package }}.{{ $e.ColumnConstant }}, id))
{{- end }}
step := &sql.Step{}
step.From.V = id
step.From.Table = {{ $n.Package }}.Table
step.From.Column = {{ $n.Package }}.{{ $n.ID.Constant }}
step.To.Table = {{ $e.Type.Package }}.Table
step.To.Column = {{ $e.Type.Package }}.{{ $e.Type.ID.Constant }}
step.Edge.Rel = sql.{{ $e.Rel.Type }}
step.Edge.Inverse = {{ $e.IsInverse }}
step.Edge.Table = {{ $n.Package }}.{{ $e.TableConstant }}
step.Edge.Columns = append(step.Edge.Columns, {{ if $e.M2M }}{{ $n.Package }}.{{ $e.PKConstant }}...{{ else }}{{ $n.Package }}.{{ $e.ColumnConstant }}{{ end }})
query.sql = sql.Neighbors({{ $receiver }}.driver.Dialect(), step)
{{ end }}