go__ent_demo/start/graph.go

123 lines
3.5 KiB
Go

// 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.
package main
import (
"context"
"fmt"
"log"
"time"
"code.osinet.fr/fgm/go__ent_demo/ent"
"code.osinet.fr/fgm/go__ent_demo/ent/group"
"code.osinet.fr/fgm/go__ent_demo/ent/user"
)
func CreateGraph(ctx context.Context, client *ent.Client) error {
// First create the users
a8m, err := client.User.
Create().
SetAge(30).
SetName("Ariel").
Save(ctx)
if err != nil {
return err
}
neta, err := client.User.
Create().
SetAge(28).
SetName("Neta").
SetSpouse(a8m).
AddFollowing(a8m).
AddFriends(a8m).
Save(ctx)
if err != nil {
return err
}
// The, create the cars, and attach them to the users in the creation.
if err = client.Car.Create().SetModel("Tesla").
SetRegisteredAt(time.Now()). // Ignore the time in the graph
SetOwner(a8m). // Attach this graph to Ariel
Exec(ctx); err != nil {
return err
}
if err = client.Car.Create().SetModel("Mazda").
SetRegisteredAt(time.Now()). // Ignore the time in the graph
SetOwner(a8m).
Exec(ctx); err != nil {
return err
}
if err = client.Car.Create().SetModel("Ford").
SetRegisteredAt(time.Now()). // Ignore the time in the graph
SetOwner(neta).
Exec(ctx); err != nil {
return err
}
// Create the groups, and add their users in the creation
if err = client.Group.Create().SetName("GitLab").AddUsers(neta, a8m).Exec(ctx); err != nil {
return err
}
if err = client.Group.Create().SetName("GitHub").AddUsers(a8m).Exec(ctx); err != nil {
return err
}
log.Println("The graph was created successfully")
return nil
}
// QueryGithub gets all user's cars within the group named "GitHub":
func QueryGithub(ctx context.Context, client *ent.Client) error {
cars, err := client.Group.
Query().
Where(group.Name("GitHub")). // (Group(Name=GitHub),)
QueryUsers(). // (User(Name=Ariel, Age=30),)
QueryCars(). // (Car(Model=Tesla, RegisteredAt=<Time>), Car(Model=Mazda, RegisteredAt=<Time>),
All(ctx)
if err != nil {
return fmt.Errorf("failed getting cars for users in group GitHub: %w", err)
}
log.Println("cars in group GitHub: ", cars)
return nil
}
func QueryArielCars(ctx context.Context, client *ent.Client) error {
cars, err := client.User.
Query().
Where(
user.HasCars(),
user.Name("Ariel"),
user.HasSpouse(),
).Only(ctx)
if err != nil {
return fmt.Errorf("failed getting cars for Ariel: %w", err)
}
log.Println("Ariel's cars: ", cars)
a8m := client.User.Query().Where(user.HasSpouseWith(user.Name("Neta"))).OnlyX(ctx)
log.Println("Query user who is the spouse of user named Neta: ", a8m)
a8m = client.User.Query().Where(user.Name("Neta")).QuerySpouse().OnlyX(ctx)
neta := client.User.Query().Where(user.Name("Neta")).OnlyX(ctx)
log.Println("Query spouse of user named Neta: ", a8m)
log.Printf("Followers for Ariel: %v, for Neta: %v",
a8m.QueryFollowers().AllX(ctx),
neta.QueryFollowers().AllX(ctx),
)
log.Printf("Following for Ariel: %v, for Neta: %v",
a8m.QueryFollowing().AllX(ctx),
neta.QueryFollowing().AllX(ctx),
)
log.Printf("Neta's friends: %v", neta.QueryFriends().AllX(ctx))
return nil
}
func QueryGroupWithUsers(ctx context.Context, client *ent.Client) error {
groups, err := client.Group.
Query().
Where(group.HasUsers()).
All(ctx)
if err != nil {
return fmt.Errorf("failed getting groups with users: %w", err)
}
log.Println("Groups with users: ", groups)
return nil
}