Files
pgm/playground/qry_select_test.go

116 lines
3.5 KiB
Go
Raw Permalink Normal View History

package playground
2025-07-26 18:34:56 +05:30
import (
"testing"
"code.patial.tech/go/pgm"
"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()
}
}