2025-07-26 20:16:50 +05:30
|
|
|
package playground
|
2025-07-26 18:34:56 +05:30
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"code.patial.tech/go/pgm"
|
2025-07-26 20:16:50 +05:30
|
|
|
"code.patial.tech/go/pgm/playground/db"
|
|
|
|
"code.patial.tech/go/pgm/playground/db/branchuser"
|
|
|
|
"code.patial.tech/go/pgm/playground/db/employee"
|
|
|
|
"code.patial.tech/go/pgm/playground/db/user"
|
|
|
|
"code.patial.tech/go/pgm/playground/db/usersession"
|
2025-07-26 18:34:56 +05:30
|
|
|
)
|
|
|
|
|
|
|
|
func TestQryBuilder2(t *testing.T) {
|
|
|
|
got := db.User.Debug().Select(user.Email, user.FirstName).
|
|
|
|
Join(db.UserSession, user.ID, usersession.UserID).
|
|
|
|
Join(db.BranchUser, user.ID, branchuser.UserID).
|
|
|
|
Where(
|
|
|
|
user.ID.Eq(1),
|
|
|
|
pgm.Or(
|
|
|
|
user.StatusID.Eq(2),
|
|
|
|
user.UpdatedAt.Eq(3),
|
|
|
|
),
|
|
|
|
user.MfaKind.Eq(4),
|
|
|
|
pgm.Or(
|
|
|
|
user.FirstName.Eq(5),
|
|
|
|
user.MiddleName.Eq(6),
|
|
|
|
),
|
|
|
|
).
|
|
|
|
Where(
|
2025-08-11 22:37:25 +05:30
|
|
|
user.LastName.NotEq(7),
|
2025-07-26 18:34:56 +05:30
|
|
|
user.Phone.Like("%123%"),
|
2025-08-03 21:41:20 +05:30
|
|
|
user.UpdatedAt.IsNotNull(),
|
2025-07-26 18:34:56 +05:30
|
|
|
user.Email.NotInSubQuery(db.User.Select(user.ID).Where(user.ID.Eq(123))),
|
|
|
|
).
|
|
|
|
Limit(10).
|
|
|
|
Offset(100).
|
|
|
|
String()
|
|
|
|
|
|
|
|
expected := "SELECT users.email, users.first_name FROM users JOIN user_sessions ON users.id = user_sessions.user_id" +
|
|
|
|
" JOIN branch_users ON users.id = branch_users.user_id WHERE users.id = $1 AND (users.status_id = $2 OR users.updated_at = $3)" +
|
|
|
|
" AND users.mfa_kind = $4 AND (users.first_name = $5 OR users.middle_name = $6) AND users.last_name != $7 AND users.phone" +
|
2025-08-03 21:41:20 +05:30
|
|
|
" LIKE $8 AND users.updated_at IS NOT NULL AND users.email NOT IN(SELECT users.id FROM users WHERE users.id = $9) LIMIT 10 OFFSET 100"
|
2025-07-26 18:34:56 +05:30
|
|
|
if expected != got {
|
|
|
|
t.Errorf("\nexpected: %q\ngot: %q", expected, got)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestSelectWithHaving(t *testing.T) {
|
|
|
|
expected := "SELECT employees.department, AVG(employees.salary), COUNT(employees.id)" +
|
|
|
|
" FROM employees GROUP BY employees.department HAVING AVG(employees.salary) > $1 AND COUNT(employees.id) > $2"
|
|
|
|
got := db.Employee.
|
|
|
|
Select(employee.Department, employee.Salary.Avg(), employee.ID.Count()).
|
|
|
|
GroupBy(employee.Department).
|
|
|
|
Having(employee.Salary.Avg().Gt(50000), employee.ID.Count().Gt(5)).
|
|
|
|
String()
|
|
|
|
|
|
|
|
if expected != got {
|
|
|
|
t.Errorf("\nexpected: %q\ngot: %q", expected, got)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-08-10 20:26:09 +05:30
|
|
|
func TestSelectWithJoin(t *testing.T) {
|
|
|
|
got := db.User.Select(user.Email, user.FirstName).
|
|
|
|
Join(db.UserSession, user.ID, usersession.UserID).
|
|
|
|
LeftJoin(db.BranchUser, user.ID, branchuser.UserID, pgm.Or(branchuser.RoleID.Eq("1"), branchuser.RoleID.Eq("2"))).
|
|
|
|
Where(
|
|
|
|
user.ID.Eq(3),
|
|
|
|
pgm.Or(
|
|
|
|
user.StatusID.Eq(4),
|
|
|
|
user.UpdatedAt.Eq(5),
|
|
|
|
),
|
|
|
|
).
|
|
|
|
Limit(10).
|
|
|
|
Offset(100).
|
|
|
|
String()
|
|
|
|
|
|
|
|
expected := "SELECT users.email, users.first_name " +
|
|
|
|
"FROM users JOIN user_sessions ON users.id = user_sessions.user_id " +
|
|
|
|
"LEFT JOIN branch_users ON users.id = branch_users.user_id AND (branch_users.role_id = $1 OR branch_users.role_id = $2) " +
|
|
|
|
"WHERE users.id = $3 AND (users.status_id = $4 OR users.updated_at = $5) " +
|
|
|
|
"LIMIT 10 OFFSET 100"
|
|
|
|
if expected != got {
|
|
|
|
t.Errorf("\nexpected: %q\ngot: %q", expected, got)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-07-26 18:34:56 +05:30
|
|
|
// BenchmarkSelect-12 638901 1860 ns/op 4266 B/op 61 allocs/op
|
|
|
|
func BenchmarkSelect(b *testing.B) {
|
|
|
|
for b.Loop() {
|
|
|
|
_ = db.User.Select(user.Email, user.FirstName).
|
|
|
|
Join(db.UserSession, user.ID, usersession.UserID).
|
|
|
|
Join(db.BranchUser, user.ID, branchuser.UserID).
|
|
|
|
Where(
|
|
|
|
user.ID.Eq(1),
|
|
|
|
pgm.Or(
|
|
|
|
user.StatusID.Eq(2),
|
|
|
|
user.UpdatedAt.Eq(3),
|
|
|
|
),
|
|
|
|
user.MfaKind.Eq(4),
|
|
|
|
pgm.Or(
|
|
|
|
user.FirstName.Eq(5),
|
|
|
|
user.MiddleName.Eq(6),
|
|
|
|
),
|
|
|
|
).
|
|
|
|
Where(
|
2025-08-11 22:37:25 +05:30
|
|
|
user.LastName.NotEq(7),
|
2025-07-26 18:34:56 +05:30
|
|
|
user.Phone.Like("%123%"),
|
|
|
|
user.Email.NotInSubQuery(db.User.Select(user.ID).Where(user.ID.Eq(123))),
|
|
|
|
).
|
|
|
|
Limit(10).
|
|
|
|
Offset(100).
|
|
|
|
String()
|
|
|
|
}
|
|
|
|
}
|