| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- package DB
- import (
- "path/filepath"
- "testing"
- )
- // 钉住 ORM Where 的 "in" 操作符行为 (docs/OPERATION_TUTORIAL.md §7.3 的承诺):
- // - 切片/数组值 → field IN (...)
- // - 空集合 → 恒假 (0 行), 不能退化成查全表
- // - 单值 (非切片) → 容忍为等值
- // - 分量按列类型归一 (int 字面量 vs int64 列)
- func TestWhereIn(t *testing.T) {
- db, err := Open(filepath.Join(t.TempDir(), "in_test.db"))
- if err != nil {
- t.Fatal(err)
- }
- defer db.Close()
- type Emp struct {
- BaseModel
- Name string `vrtx:"maxlen:16"`
- Dept string `vrtx:"maxlen:16"`
- Age int64 `vrtx:"index:idx_age"`
- }
- et, err := UseTable[Emp](db, "in_test")
- if err != nil {
- t.Fatal(err)
- }
- for i, dept := range []string{"工程部", "技术部", "销售部", "工程部"} {
- if err := et.Insert(&Emp{Name: "e", Dept: dept, Age: int64(20 + i)}); err != nil {
- t.Fatal(err)
- }
- }
- if err := db.Commit(); err != nil {
- t.Fatal(err)
- }
- // 基本形态: 字符串集合
- rows, err := et.Where("Dept", "in", []string{"工程部", "技术部"}).Find()
- if err != nil {
- t.Fatal(err)
- }
- if len(rows) != 3 {
- t.Fatalf("in [工程部,技术部] 期望 3 行, 实际 %d", len(rows))
- }
- // 整数集合: int 分量对 int64 列自动归一
- rows, err = et.Where("Age", "in", []int{20, 22}).Find()
- if err != nil {
- t.Fatal(err)
- }
- if len(rows) != 2 {
- t.Fatalf("in [20,22] 期望 2 行, 实际 %d", len(rows))
- }
- // 数组载体
- rows, err = et.Where("Age", "in", [1]int64{23}).Find()
- if err != nil {
- t.Fatal(err)
- }
- if len(rows) != 1 {
- t.Fatalf("in [24] 期望 1 行, 实际 %d", len(rows))
- }
- // 空集合恒假: 0 行, 而不是退化成全表
- rows, err = et.Where("Dept", "in", []string{}).Find()
- if err != nil {
- t.Fatal(err)
- }
- if len(rows) != 0 {
- t.Fatalf("in 空集期望 0 行, 实际 %d (退化成全表了)", len(rows))
- }
- cnt, err := et.Where("Age", "in", []int64{}).Count()
- if err != nil {
- t.Fatal(err)
- }
- if cnt != 0 {
- t.Fatalf("in 空集 Count 期望 0, 实际 %d", cnt)
- }
- // 与其它条件 AND 组合
- rows, err = et.Where("Dept", "in", []string{"工程部", "技术部"}).
- Where("Age", ">", int64(21)).Find()
- if err != nil {
- t.Fatal(err)
- }
- if len(rows) != 1 {
- t.Fatalf("in + > 组合期望 1 行, 实际 %d", len(rows))
- }
- // 集合外无一行命中
- rows, err = et.Where("Dept", "in", []string{"人事部"}).Find()
- if err != nil {
- t.Fatal(err)
- }
- if len(rows) != 0 {
- t.Fatalf("in [人事部] 期望 0 行, 实际 %d", len(rows))
- }
- // 单值容忍: ≡ 等值
- rows, err = et.Where("Age", "in", int64(20)).Find()
- if err != nil {
- t.Fatal(err)
- }
- if len(rows) != 1 {
- t.Fatalf("in 单值期望 1 行, 实际 %d", len(rows))
- }
- }
|