|
|
@@ -0,0 +1,110 @@
|
|
|
+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))
|
|
|
+ }
|
|
|
+}
|