mirror of
https://github.com/ent/ent.git
synced 2026-05-22 09:31:45 +03:00
@@ -200,9 +200,13 @@ func (g *Graph) addIndexes(schema *load.Schema) {
|
||||
// addEdges adds the node edges to the graph.
|
||||
func (g *Graph) addEdges(schema *load.Schema) {
|
||||
t, _ := g.typ(schema.Name)
|
||||
seen := make(map[string]struct{}, len(schema.Edges))
|
||||
for _, e := range schema.Edges {
|
||||
typ, ok := g.typ(e.Type)
|
||||
expect(ok, "type %q does not exist for edge", e.Type)
|
||||
_, ok = seen[e.Name]
|
||||
expect(!ok, "%s schema contains multiple %q edges", schema.Name, e.Name)
|
||||
seen[e.Name] = struct{}{}
|
||||
switch {
|
||||
// Assoc only.
|
||||
case !e.Inverse:
|
||||
|
||||
@@ -178,6 +178,25 @@ func TestNewGraphBadInverse(t *testing.T) {
|
||||
require.Errorf(t, err, "mismatch type for back-reference")
|
||||
}
|
||||
|
||||
func TestNewGraphDuplicateEdges(t *testing.T) {
|
||||
_, err := NewGraph(&Config{Package: "entc/gen", Storage: drivers[0]},
|
||||
&load.Schema{
|
||||
Name: "User",
|
||||
Edges: []*load.Edge{
|
||||
{Name: "groups", Type: "Group"},
|
||||
{Name: "groups", Type: "Group", RefName: "owner", Inverse: true},
|
||||
},
|
||||
},
|
||||
&load.Schema{
|
||||
Name: "Group",
|
||||
Edges: []*load.Edge{
|
||||
{Name: "users", Type: "User", RefName: "groups", Inverse: true},
|
||||
{Name: "owner", Type: "User", Unique: true},
|
||||
},
|
||||
})
|
||||
require.EqualError(t, err, `entc/gen: User schema contains multiple "groups" edges`)
|
||||
}
|
||||
|
||||
func TestRelation(t *testing.T) {
|
||||
require := require.New(t)
|
||||
_, err := NewGraph(&Config{Package: "entc/gen", Storage: drivers[0]}, T1)
|
||||
|
||||
@@ -239,11 +239,11 @@ func (t Type) Receiver() string {
|
||||
return receiver(t.Name)
|
||||
}
|
||||
|
||||
// HasAssoc returns true if this type has an assoc edge with the given name.
|
||||
// faster than map access for most cases.
|
||||
// HasAssoc returns true if this type has an assoc-edge (non-inverse)
|
||||
// with the given name. faster than map access for most cases.
|
||||
func (t Type) HasAssoc(name string) (*Edge, bool) {
|
||||
for _, e := range t.Edges {
|
||||
if name == e.Name {
|
||||
if name == e.Name && !e.IsInverse() {
|
||||
return e, true
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user