Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
238 changes: 238 additions & 0 deletions benchmarks/enterprise-benchmark_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,238 @@
package benchmarks_test

import (
"context"
"fmt"
"github.com/FournyP/go-orm-benchmarks/enterprise/models"
"testing"
)

func BenchmarkEnterpriseCreate(b *testing.B) {
client, err := GetEnterpriseClient()
if err != nil {
b.Fatalf("Error getting Enterprise client: %v", err)
}

err = TruncateEnterpriseDatabase(client)
if err != nil {
b.Fatalf("Error truncating Enterprise database: %v", err)
}

b.ResetTimer()
for i := 0; i < b.N; i++ {
user := models.NewUsers(context.TODO(), client)
user.SetName(fmt.Sprintf("User%d", i))
user.SetEmail(fmt.Sprintf("user%[email protected]", i))
err = user.Create()
if err != nil {
b.Error(err)
continue
}

post := models.NewPosts(context.TODO(), client)
post.SetUserID(user.GetID())
post.SetTitle(fmt.Sprintf("Post%d", i))
post.SetContent(fmt.Sprintf("Body of post %d", i))
err = post.Create()
if err != nil {
b.Error(err)
continue
}

comment := models.NewComments(context.TODO(), client)
comment.SetPostID(post.GetID())
comment.SetText(fmt.Sprintf("Comment on post %d", i))
err = comment.Create()
if err != nil {
b.Error(err)
continue
}
}
}

func BenchmarkEnterpriseUpdate(b *testing.B) {
client, err := GetEnterpriseClient()
if err != nil {
b.Fatalf("Error getting Enterprise client: %v", err)
}

err = TruncateEnterpriseDatabase(client)
if err != nil {
b.Fatalf("Error truncating Enterprise database: %v", err)
}

user := models.NewUsers(context.Background(), client)
user.SetName("User%d")
user.SetEmail("user%[email protected]")
err = user.Create()
if err != nil {
b.Fatalf("Error creating user entity: %v", err)
}

b.ResetTimer()

for i := 0; i < b.N; i++ {
user.SetName(fmt.Sprintf("User%d", i))
user.SetEmail(fmt.Sprintf("user%[email protected]", i))
err = user.Update()
if err != nil {
b.Error(err)
}
}
}

func BenchmarkEnterpriseDelete(b *testing.B) {
db, err := GetEnterpriseClient()
if err != nil {
b.Fatalf("Error getting Enterprise client: %v", err)
}

err = TruncateEnterpriseDatabase(db)
if err != nil {
b.Fatalf("Error truncating GORM database: %v", err)
}

users := make([]*models.Users, b.N)

for i := 0; i < b.N; i++ {
user := models.NewUsers(context.TODO(), db)
user.SetName(fmt.Sprintf("User%d", i))
user.SetEmail(fmt.Sprintf("user%[email protected]", i))
err = user.Create()
if err != nil {
b.Error(err)
continue
}

if err != nil {
b.Fatalf("Error creating user entity: %v", err)
}

users[i] = user
}

b.ResetTimer()

for i := 0; i < b.N; i++ {
err := users[i].Delete()
if err != nil {
b.Error(err)
}
}
}

func BenchmarkEnterpriseRead(b *testing.B) {
client, err := GetEnterpriseClient()
if err != nil {
b.Fatalf("Error getting Enterprise client: %v", err)
}

err = TruncateEnterpriseDatabase(client)
if err != nil {
b.Fatalf("Error truncating Enterprise database: %v", err)
}

user := models.NewUsers(context.Background(), client)
user.SetName("User")
user.SetEmail("user%[email protected]")
err = user.Create()
if err != nil {
b.Fatalf("Error creating user entity: %v", err)
}

b.ResetTimer()

for i := 0; i < b.N; i++ {
newUser := models.NewUsers(context.Background(), client)
newUser.Where(newUser.IsNameEqual("User"))
err, _ = newUser.Get()
if err != nil {
b.Error(err)
}
}
}

func BenchmarkEnterpriseReadWithRelations(b *testing.B) {
client, err := GetEnterpriseClient()
if err != nil {
b.Fatalf("Error getting Enterprise client: %v", err)
}

err = TruncateEnterpriseDatabase(client)
if err != nil {
b.Fatalf("Error truncating Enterprise database: %v", err)
}

user := models.NewUsers(context.TODO(), client)
user.SetName("User")
user.SetEmail("[email protected]")
err = user.Create()
if err != nil {
b.Fatalf("Error creating user entity: %v", err)
}

post := models.NewPosts(context.TODO(), client)
post.SetUserID(1)
post.SetTitle("Post")
post.SetContent("Body of post")
err = post.Create()
if err != nil {
b.Fatalf("Error creating post entity: %v", err)
}

comment := models.NewComments(context.TODO(), client)
comment.SetPostID(1)
comment.SetText("Comment")
err = comment.Create()
if err != nil {
b.Fatalf("Error creating comment entity: %v", err)
}

b.ResetTimer()

for i := 0; i < b.N; i++ {
newUser := models.NewUsers(context.Background(), client)
newUser.Where(newUser.IsNameEqual("User"))
newUser.WithPostsList(func(postList *models.PostsList) {
postList.WithCommentsList()
})
err, _ = newUser.Get()
if err != nil {
b.Error(err)
}
}
}

func BenchmarkEnterpriseReadSingleField(b *testing.B) {
db, err := GetEnterpriseClient() // Assume this gets your *gorm.DB
if err != nil {
b.Fatalf("Error getting Enterprise client: %v", err)
}

// Truncate and setup database as before
err = TruncateEnterpriseDatabase(db)
if err != nil {
b.Fatalf("Error truncating Enterprise database: %v", err)
}

// Create a user entity
user := models.NewUsers(context.TODO(), db)
user.SetName("User")
user.SetEmail("[email protected]")
err = user.Create()
if err != nil {
b.Fatalf("Error creating user entity: %v", err)
}

b.ResetTimer()

for i := 0; i < b.N; i++ {
// Query for the 'name' field of the user
newUser := models.NewUsers(context.TODO(), db)
newUser.Where(newUser.IsEmailEqual("[email protected]"))
newUser.GetSelector().SelectName()
if err, _ := newUser.Get(); err != nil {
b.Error(err)
}
}
}
42 changes: 40 additions & 2 deletions benchmarks/init_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@ package benchmarks_test
import (
"context"
"fmt"

"github.com/FournyP/go-orm-benchmarks/ent"
"github.com/FournyP/go-orm-benchmarks/enterprise/db_models"
"github.com/FournyP/go-orm-benchmarks/enterprise/models"
"github.com/FournyP/go-orm-benchmarks/gormmodels"
"github.com/FournyP/go-orm-benchmarks/sqlxmodels"
"github.com/MrSametBurgazoglu/enterprise/migrate"
"github.com/jmoiron/sqlx"
_ "github.com/lib/pq"
"gorm.io/driver/postgres"
Expand Down Expand Up @@ -47,7 +49,7 @@ func GetGORMClient() (*gorm.DB, error) {
return nil, err
}

err = db.AutoMigrate(&gormmodels.User{}, &gormmodels.Post{}, &gormmodels.Comment{})
err = db.AutoMigrate(gormmodels.User{}, gormmodels.Post{}, gormmodels.Comment{})
if err != nil {
return nil, fmt.Errorf("failed creating schema resources: %v", err)
}
Expand All @@ -71,6 +73,24 @@ func GetSqlxClient() (*sqlx.DB, error) {
return db, nil
}

func GetEnterpriseClient() (models.IDatabase, error) {
dbUrl := "postgresql://root:[email protected]:5435/main?search_path=public&sslmode=disable"
db, err := models.NewDB(dbUrl)
if err != nil {
panic(err)
}
err = DeleteEnterpriseDatabase(db)
if err != nil {
panic(err)
}
migrate.AutoApplyMigration(context.TODO(), dbUrl, "migration",
db_models.Post(),
db_models.Comment(),
db_models.User())

return db, nil
}

func TruncateEntDatabase(client *ent.Client) error {
_, err := client.Comment.Delete().Exec(context.Background())
if err != nil {
Expand Down Expand Up @@ -107,3 +127,21 @@ func TruncateSqlxDatabase(db *sqlx.DB) error {

return nil
}

func TruncateEnterpriseDatabase(db models.IDatabase) error {
_, err := db.Exec(context.TODO(), "TRUNCATE TABLE \"comments\", \"posts\", \"users\"")
if err != nil {
return err
}

return nil
}

func DeleteEnterpriseDatabase(db models.IDatabase) error {
_, err := db.Exec(context.TODO(), "DROP TABLE \"comments\", \"posts\", \"users\"")
if err != nil {
return err
}

return nil
}
22 changes: 17 additions & 5 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ version: "3.7"

services:
ent-postgres:
image: postgres:15.4
image: postgres:16.4
environment:
POSTGRES_USER: root
POSTGRES_PASSWORD: root
Expand All @@ -13,28 +13,40 @@ services:
- ent_postgres_data:/var/lib/postgresql/data

gorm-postgres:
image: postgres:15.4
image: postgres:16.4
environment:
POSTGRES_USER: root
POSTGRES_PASSWORD: root
POSTGRES_DB: main
ports:
- "5434:5432"
- "5433:5432"
volumes:
- gorm_postgres_data:/var/lib/postgresql/data

sqlx-postgres:
image: postgres:15.4
image: postgres:16.4
environment:
POSTGRES_USER: root
POSTGRES_PASSWORD: root
POSTGRES_DB: main
ports:
- "5433:5432"
- "5434:5432"
volumes:
- sqlx_postgres_data:/var/lib/postgresql/data

entreprise-postgres:
image: postgres:16.4
environment:
POSTGRES_USER: root
POSTGRES_PASSWORD: root
POSTGRES_DB: main
ports:
- "5435:5432"
volumes:
- enterprise_postgres_data:/var/lib/postgresql/data

volumes:
ent_postgres_data:
gorm_postgres_data:
sqlx_postgres_data:
enterprise_postgres_data:
23 changes: 23 additions & 0 deletions enterprise/db_models/comment.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package db_models

import "github.com/MrSametBurgazoglu/enterprise/models"

func Comment() *models.Table {
idField := models.UintField("ID").AddSerial()

tb := &models.Table{
Fields: []models.FieldI{
idField,
models.StringField("Text"),
models.UintField("PostID"),
},
Relations: []*models.Relation{
models.OneToMany("Posts", "id", "post_id"),
},
}

tb.SetTableName("Comments")
tb.SetIDField(idField)

return tb
}
Loading