dialect/sql/sqlgraph: handle edge-schema in M2O/O2Oi calls entql

This commit is contained in:
Ariel Mashraki
2022-10-29 00:00:11 +03:00
committed by Ariel Mashraki
parent 521f9b57bc
commit 35d0d4c3db
12 changed files with 84 additions and 15 deletions

View File

@@ -46,7 +46,6 @@ type (
//
// g.AddE("pets", spec, "user", "pet")
// g.AddE("friends", spec, "user", "user")
//
func (g *Schema) AddE(name string, spec *EdgeSpec, from, to string) error {
var fromT, toT *Node
for i := range g.Nodes {
@@ -244,7 +243,7 @@ func (e *state) evalBinary(expr *entql.BinaryExpr) *sql.Predicate {
func (e *state) evalEdge(name string, exprs ...entql.Expr) *sql.Predicate {
edge, ok := e.context.Edges[name]
expect(ok, "edge %q was not found for node %q", name, e.context.Type)
var toC string
var fromC, toC string
switch {
case edge.To.ID != nil:
toC = edge.To.ID.Column
@@ -257,8 +256,17 @@ func (e *state) evalEdge(name string, exprs ...entql.Expr) *sql.Predicate {
default:
panic(evalError{fmt.Sprintf("expect id definition for edge %q", name)})
}
switch {
case e.context.ID != nil:
fromC = e.context.ID.Column
case e.context.CompositeID != nil && (edge.Spec.Rel == M2O || (edge.Spec.Rel == O2O && edge.Spec.Inverse)):
// An edge-schema with a composite id can query
// only edges that it owns (holds the foreign-key).
default:
panic(evalError{fmt.Sprintf("unexpected edge-query from an edge-schema %q", e.context.Type)})
}
step := NewStep(
From(e.context.Table, e.context.ID.Column),
From(e.context.Table, fromC),
To(edge.To.Table, toC),
Edge(edge.Spec.Rel, edge.Spec.Inverse, edge.Spec.Table, edge.Spec.Columns...),
)