v2 / vlib / orm / orm_fn_test.v
749 lines · 696 sloc · 19.25 KB · d5578efae67ef01ab3a63866d429b7dacf6c237d
Raw
1// vtest retry: 3
2import orm
3
4fn test_orm_stmt_gen_update() {
5 table := orm.Table{
6 name: 'Test'
7 }
8 query_and, _ := orm.orm_stmt_gen(.default, table, "'", .update, true, '?', 0, orm.QueryData{
9 fields: ['test', 'a']
10 data: []
11 types: []
12 kinds: []
13 }, orm.QueryData{
14 fields: ['id', 'name']
15 data: []
16 types: []
17 kinds: [.ge, .eq]
18 is_and: [true]
19 })
20 assert query_and == "UPDATE 'Test' SET 'test' = ?0, 'a' = ?1 WHERE 'id' >= ?2 AND 'name' = ?3;"
21
22 query_or, _ := orm.orm_stmt_gen(.default, table, "'", .update, true, '?', 0, orm.QueryData{
23 fields: ['test', 'a']
24 data: []
25 types: []
26 kinds: []
27 }, orm.QueryData{
28 fields: ['id', 'name']
29 data: []
30 types: []
31 kinds: [.ge, .eq]
32 is_and: [false]
33 })
34 assert query_or == "UPDATE 'Test' SET 'test' = ?0, 'a' = ?1 WHERE 'id' >= ?2 OR 'name' = ?3;"
35}
36
37fn test_orm_stmt_gen_insert() {
38 table := orm.Table{
39 name: 'Test'
40 }
41 query, _ := orm.orm_stmt_gen(.default, table, "'", .insert, true, '?', 0, orm.QueryData{
42 fields: ['test', 'a']
43 data: []
44 types: []
45 kinds: []
46 }, orm.QueryData{})
47 assert query == "INSERT INTO 'Test' ('test', 'a') VALUES (?0, ?1);"
48}
49
50fn test_orm_stmt_gen_bulk_insert() {
51 table := orm.Table{
52 name: 'Test'
53 }
54 query, converted := orm.orm_stmt_gen(.default, table, "'", .insert, true, '?', 0, orm.QueryData{
55 fields: ['name', 'age']
56 data: [orm.Primitive('Alice'), orm.Primitive(25), orm.Primitive('Bob'), orm.Primitive(30)]
57 batch_rows: 2
58 }, orm.QueryData{})
59 assert query == "INSERT INTO 'Test' ('name', 'age') VALUES (?0, ?1), (?2, ?3);"
60 assert converted.data.len == 4
61
62 pg_query, _ := orm.orm_stmt_gen(.pg, table, '"', .insert, true, '$', 1, orm.QueryData{
63 fields: ['name', 'age']
64 data: [orm.Primitive('Alice'), orm.Primitive(25), orm.Primitive('Bob'), orm.Primitive(30)]
65 batch_rows: 2
66 }, orm.QueryData{})
67 assert pg_query == 'INSERT INTO "Test" ("name", "age") VALUES ($1, $2), ($3, $4);'
68
69 mysql_query, _ := orm.orm_stmt_gen(.mysql, table, '`', .insert, false, '?', 1, orm.QueryData{
70 fields: ['name', 'age']
71 data: [orm.Primitive('Alice'), orm.Primitive(25), orm.Primitive('Bob'), orm.Primitive(30)]
72 batch_rows: 2
73 }, orm.QueryData{})
74 assert mysql_query == 'INSERT INTO `Test` (`name`, `age`) VALUES (?, ?), (?, ?);'
75}
76
77fn test_orm_stmt_gen_bulk_update() {
78 table := orm.Table{
79 name: 'Test'
80 }
81 query, _ := orm.orm_stmt_gen(.default, table, "'", .update, true, '?', 0, orm.QueryData{
82 fields: ['name', 'age']
83 data: [orm.Primitive(1), orm.Primitive('Alice'), orm.Primitive(2), orm.Primitive('Bob'),
84 orm.Primitive(1), orm.Primitive(25), orm.Primitive(2), orm.Primitive(30)]
85 batch_rows: 2
86 batch_key: 'id'
87 }, orm.QueryData{
88 fields: ['id', 'id']
89 data: [orm.Primitive(1), orm.Primitive(2)]
90 kinds: [.eq, .eq]
91 is_and: [false]
92 })
93 assert query == "UPDATE 'Test' SET 'name' = CASE 'id' WHEN ?0 THEN ?1 WHEN ?2 THEN ?3 ELSE 'name' END, 'age' = CASE 'id' WHEN ?4 THEN ?5 WHEN ?6 THEN ?7 ELSE 'age' END WHERE 'id' = ?8 OR 'id' = ?9;"
94
95 pg_query, _ := orm.orm_stmt_gen(.pg, table, '"', .update, true, '$', 1, orm.QueryData{
96 fields: ['name']
97 data: [orm.Primitive(1), orm.Primitive('Alice'), orm.Primitive(2), orm.Primitive('Bob')]
98 batch_rows: 2
99 batch_key: 'id'
100 }, orm.QueryData{
101 fields: ['id', 'id']
102 data: [orm.Primitive(1), orm.Primitive(2)]
103 kinds: [.eq, .eq]
104 is_and: [false]
105 })
106 assert pg_query == 'UPDATE "Test" SET "name" = CASE "id" WHEN $1 THEN $2 WHEN $3 THEN $4 ELSE "name" END WHERE "id" = $5 OR "id" = $6;'
107
108 mysql_query, _ := orm.orm_stmt_gen(.mysql, table, '`', .update, false, '?', 1, orm.QueryData{
109 fields: ['name']
110 data: [orm.Primitive(1), orm.Primitive('Alice'), orm.Primitive(2), orm.Primitive('Bob')]
111 batch_rows: 2
112 batch_key: 'id'
113 }, orm.QueryData{
114 fields: ['id', 'id']
115 data: [orm.Primitive(1), orm.Primitive(2)]
116 kinds: [.eq, .eq]
117 is_and: [false]
118 })
119 assert mysql_query == 'UPDATE `Test` SET `name` = CASE `id` WHEN ? THEN ? WHEN ? THEN ? ELSE `name` END WHERE `id` = ? OR `id` = ?;'
120}
121
122fn test_orm_stmt_gen_insert_default_values_pg() {
123 table := orm.Table{
124 name: 'Test'
125 }
126 query, converted := orm.orm_stmt_gen(.pg, table, "'", .insert, true, '$', 1, orm.QueryData{
127 fields: ['id', 'example']
128 data: [orm.Primitive(0), orm.Primitive('')]
129 types: []
130 kinds: []
131 auto_fields: [0, 1]
132 }, orm.QueryData{})
133 assert query == "INSERT INTO 'Test' DEFAULT VALUES;"
134 assert converted.fields.len == 0
135 assert converted.data.len == 0
136}
137
138fn test_orm_stmt_gen_insert_default_values_mysql() {
139 table := orm.Table{
140 name: 'Test'
141 }
142 query, converted := orm.orm_stmt_gen(.mysql, table, '`', .insert, false, '?', 1, orm.QueryData{
143 fields: ['id']
144 data: [orm.Primitive(0)]
145 auto_fields: [0]
146 }, orm.QueryData{})
147 assert query == 'INSERT INTO `Test` () VALUES ();'
148 assert converted.fields.len == 0
149 assert converted.data.len == 0
150
151 bulk_query, bulk_converted := orm.orm_stmt_gen(.mysql, table, '`', .insert, false, '?', 1, orm.QueryData{
152 fields: ['id']
153 data: [orm.Primitive(0), orm.Primitive(0), orm.Primitive(0)]
154 auto_fields: [0]
155 batch_rows: 3
156 }, orm.QueryData{})
157 assert bulk_query == 'INSERT INTO `Test` () VALUES (), (), ();'
158 assert bulk_converted.fields.len == 0
159 assert bulk_converted.data.len == 0
160}
161
162fn test_orm_stmt_gen_h2_insert_default_values() {
163 table := orm.Table{
164 name: 'Test'
165 }
166 query, _ :=
167 orm.orm_stmt_gen(.h2, table, '"', .insert, false, '?', 1, orm.QueryData{}, orm.QueryData{})
168 assert query == 'INSERT INTO "Test" DEFAULT VALUES;'
169}
170
171fn test_orm_stmt_gen_delete() {
172 table := orm.Table{
173 name: 'Test'
174 }
175 query_and, _ := orm.orm_stmt_gen(.default, table, "'", .delete, true, '?', 0, orm.QueryData{
176 fields: ['test', 'a']
177 data: []
178 types: []
179 kinds: []
180 }, orm.QueryData{
181 fields: ['id', 'name']
182 data: []
183 types: []
184 kinds: [.ge, .eq]
185 is_and: [true]
186 })
187 assert query_and == "DELETE FROM 'Test' WHERE 'id' >= ?0 AND 'name' = ?1;"
188
189 query_or, _ := orm.orm_stmt_gen(.default, table, "'", .delete, true, '?', 0, orm.QueryData{
190 fields: ['test', 'a']
191 data: []
192 types: []
193 kinds: []
194 }, orm.QueryData{
195 fields: ['id', 'name']
196 data: []
197 types: []
198 kinds: [.ge, .eq]
199 is_and: [false]
200 })
201 assert query_or == "DELETE FROM 'Test' WHERE 'id' >= ?0 OR 'name' = ?1;"
202}
203
204fn get_select_fields() []string {
205 return ['id', 'test', 'abc']
206}
207
208fn test_orm_select_gen() {
209 query := orm.orm_select_gen(orm.SelectConfig{
210 table: orm.Table{
211 name: 'test_table'
212 }
213 fields: get_select_fields()
214 }, "'", true, '?', 0, orm.QueryData{})
215
216 assert query == "SELECT 'id', 'test', 'abc' FROM 'test_table';"
217}
218
219fn test_orm_select_gen_with_limit() {
220 query := orm.orm_select_gen(orm.SelectConfig{
221 table: orm.Table{
222 name: 'test_table'
223 }
224 fields: get_select_fields()
225 has_limit: true
226 }, "'", true, '?', 0, orm.QueryData{})
227
228 assert query == "SELECT 'id', 'test', 'abc' FROM 'test_table' LIMIT ?0;"
229}
230
231fn test_orm_select_gen_with_where() {
232 query := orm.orm_select_gen(orm.SelectConfig{
233 table: orm.Table{
234 name: 'test_table'
235 }
236 fields: get_select_fields()
237 has_where: true
238 }, "'", true, '?', 0, orm.QueryData{
239 fields: ['abc', 'test']
240 kinds: [.eq, .gt]
241 is_and: [true]
242 })
243
244 assert query == "SELECT 'id', 'test', 'abc' FROM 'test_table' WHERE 'abc' = ?0 AND 'test' > ?1;"
245}
246
247fn test_orm_select_gen_with_order() {
248 query := orm.orm_select_gen(orm.SelectConfig{
249 table: orm.Table{
250 name: 'test_table'
251 }
252 fields: get_select_fields()
253 has_order: true
254 order_type: .desc
255 }, "'", true, '?', 0, orm.QueryData{})
256
257 assert query == "SELECT 'id', 'test', 'abc' FROM 'test_table' ORDER BY '' DESC;"
258}
259
260fn test_orm_select_gen_with_offset() {
261 query := orm.orm_select_gen(orm.SelectConfig{
262 table: orm.Table{
263 name: 'test_table'
264 }
265 fields: get_select_fields()
266 has_offset: true
267 }, "'", true, '?', 0, orm.QueryData{})
268
269 assert query == "SELECT 'id', 'test', 'abc' FROM 'test_table' OFFSET ?0;"
270}
271
272fn test_orm_select_gen_with_all() {
273 query := orm.orm_select_gen(orm.SelectConfig{
274 table: orm.Table{
275 name: 'test_table'
276 }
277 fields: get_select_fields()
278 has_limit: true
279 has_order: true
280 order_type: .desc
281 has_offset: true
282 has_where: true
283 }, "'", true, '?', 0, orm.QueryData{
284 fields: ['abc', 'test']
285 kinds: [.eq, .gt]
286 is_and: [true]
287 })
288
289 assert query == "SELECT 'id', 'test', 'abc' FROM 'test_table' WHERE 'abc' = ?0 AND 'test' > ?1 ORDER BY '' DESC LIMIT ?2 OFFSET ?3;"
290}
291
292fn test_orm_select_gen_with_distinct() {
293 query := orm.orm_select_gen(orm.SelectConfig{
294 table: orm.Table{
295 name: 'test_table'
296 }
297 fields: get_select_fields()
298 has_distinct: true
299 }, "'", true, '?', 0, orm.QueryData{})
300
301 assert query == "SELECT DISTINCT 'id', 'test', 'abc' FROM 'test_table';"
302}
303
304fn test_orm_select_gen_with_distinct_and_where() {
305 query := orm.orm_select_gen(orm.SelectConfig{
306 table: orm.Table{
307 name: 'test_table'
308 }
309 fields: get_select_fields()
310 has_distinct: true
311 has_where: true
312 }, "'", true, '?', 0, orm.QueryData{
313 fields: ['abc']
314 kinds: [.eq]
315 is_and: []
316 })
317
318 assert query == "SELECT DISTINCT 'id', 'test', 'abc' FROM 'test_table' WHERE 'abc' = ?0;"
319}
320
321fn test_orm_select_gen_with_sum() {
322 query := orm.orm_select_gen(orm.SelectConfig{
323 table: orm.Table{
324 name: 'test_table'
325 }
326 aggregate_kind: .sum
327 aggregate_field: 'age'
328 fields: ['age']
329 types: [orm.type_idx['int']]
330 }, "'", true, '?', 0, orm.QueryData{})
331
332 assert query == "SELECT SUM('age') FROM 'test_table';"
333}
334
335fn test_orm_select_gen_with_avg_and_where() {
336 query := orm.orm_select_gen(orm.SelectConfig{
337 table: orm.Table{
338 name: 'test_table'
339 }
340 aggregate_kind: .avg
341 aggregate_field: 'score'
342 fields: ['score']
343 types: [orm.type_idx['f64']]
344 has_where: true
345 }, "'", true, '?', 0, orm.QueryData{
346 fields: ['abc']
347 kinds: [.eq]
348 is_and: []
349 })
350
351 assert query == "SELECT AVG('score') FROM 'test_table' WHERE 'abc' = ?0;"
352}
353
354fn test_orm_select_gen_with_count() {
355 query := orm.orm_select_gen(orm.SelectConfig{
356 table: orm.Table{
357 name: 'test_table'
358 }
359 aggregate_kind: .count
360 types: [orm.type_idx['int']]
361 }, "'", true, '?', 0, orm.QueryData{})
362
363 assert query == "SELECT COUNT(*) FROM 'test_table';"
364}
365
366fn test_orm_table_gen() {
367 table := orm.Table{
368 name: 'test_table'
369 }
370 query := orm.orm_table_gen(.default, table, "'", true, 0, [
371 orm.TableField{
372 name: 'id'
373 typ: typeof[int]().idx
374 default_val: '10'
375 nullable: true
376 attrs: [
377 VAttribute{
378 name: 'primary'
379 },
380 VAttribute{
381 name: 'sql'
382 has_arg: true
383 arg: 'serial'
384 kind: .plain
385 },
386 ]
387 },
388 orm.TableField{
389 name: 'test'
390 typ: typeof[string]().idx
391 nullable: true
392 },
393 orm.TableField{
394 name: 'abc'
395 typ: typeof[i64]().idx
396 nullable: true
397 default_val: '6754'
398 },
399 ], sql_type_from_v, false) or { panic(err) }
400 assert query == "CREATE TABLE IF NOT EXISTS 'test_table' ('id' SERIAL DEFAULT 10, 'test' TEXT, 'abc' INT64 DEFAULT 6754, PRIMARY KEY('id'));"
401
402 alt_query := orm.orm_table_gen(.default, table, "'", true, 0, [
403 orm.TableField{
404 name: 'id'
405 typ: typeof[int]().idx
406 nullable: true
407 default_val: '10'
408 attrs: [
409 VAttribute{
410 name: 'primary'
411 },
412 VAttribute{
413 name: 'sql'
414 has_arg: true
415 arg: 'serial'
416 kind: .plain
417 },
418 ]
419 },
420 orm.TableField{
421 name: 'test'
422 typ: typeof[string]().idx
423 nullable: true
424 },
425 orm.TableField{
426 name: 'abc'
427 typ: typeof[i64]().idx
428 nullable: true
429 default_val: '6754'
430 },
431 ], sql_type_from_v, true) or { panic(err) }
432 assert alt_query == "IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='test_table' and xtype='U') CREATE TABLE 'test_table' ('id' SERIAL DEFAULT 10, 'test' TEXT, 'abc' INT64 DEFAULT 6754, PRIMARY KEY('id'));"
433
434 unique_query := orm.orm_table_gen(.default, table, "'", true, 0, [
435 orm.TableField{
436 name: 'id'
437 typ: typeof[int]().idx
438 nullable: true
439 default_val: '10'
440 attrs: [
441 VAttribute{
442 name: 'primary'
443 },
444 VAttribute{
445 name: 'sql'
446 has_arg: true
447 arg: 'serial'
448 kind: .plain
449 },
450 ]
451 },
452 orm.TableField{
453 name: 'test'
454 typ: typeof[string]().idx
455 attrs: [
456 VAttribute{
457 name: 'unique'
458 },
459 ]
460 },
461 orm.TableField{
462 name: 'abc'
463 typ: typeof[i64]().idx
464 default_val: '6754'
465 },
466 ], sql_type_from_v, false) or { panic(err) }
467 assert unique_query == "CREATE TABLE IF NOT EXISTS 'test_table' ('id' SERIAL DEFAULT 10, 'test' TEXT NOT NULL, 'abc' INT64 DEFAULT 6754 NOT NULL, PRIMARY KEY('id'), UNIQUE('test'));"
468
469 mult_unique_query := orm.orm_table_gen(.default, table, "'", true, 0, [
470 orm.TableField{
471 name: 'id'
472 typ: typeof[int]().idx
473 nullable: true
474 default_val: '10'
475 attrs: [
476 VAttribute{
477 name: 'primary'
478 },
479 VAttribute{
480 name: 'sql'
481 has_arg: true
482 arg: 'serial'
483 kind: .plain
484 },
485 ]
486 },
487 orm.TableField{
488 name: 'test'
489 typ: typeof[string]().idx
490 nullable: true
491 attrs: [
492 VAttribute{
493 name: 'unique'
494 has_arg: true
495 arg: 'test'
496 kind: .string
497 },
498 ]
499 },
500 orm.TableField{
501 name: 'abc'
502 typ: typeof[i64]().idx
503 nullable: true
504 default_val: '6754'
505 attrs: [
506 VAttribute{
507 name: 'unique'
508 has_arg: true
509 arg: 'test'
510 kind: .string
511 },
512 ]
513 },
514 ], sql_type_from_v, false) or { panic(err) }
515 assert mult_unique_query == "CREATE TABLE IF NOT EXISTS 'test_table' ('id' SERIAL DEFAULT 10, 'test' TEXT, 'abc' INT64 DEFAULT 6754, /* test */UNIQUE('test', 'abc'), PRIMARY KEY('id'));"
516
517 table_with_unique := orm.Table{
518 name: 'test_table'
519 attrs: [
520 VAttribute{
521 name: 'unique_key'
522 has_arg: true
523 arg: 'test, abc'
524 kind: .string
525 },
526 ]
527 }
528 table_unique_query := orm.orm_table_gen(.default, table_with_unique, "'", true, 0, [
529 orm.TableField{
530 name: 'id'
531 typ: typeof[int]().idx
532 nullable: true
533 default_val: '10'
534 attrs: [
535 VAttribute{
536 name: 'primary'
537 },
538 VAttribute{
539 name: 'sql'
540 has_arg: true
541 arg: 'serial'
542 kind: .plain
543 },
544 ]
545 },
546 orm.TableField{
547 name: 'test'
548 typ: typeof[string]().idx
549 nullable: true
550 },
551 orm.TableField{
552 name: 'abc'
553 typ: typeof[i64]().idx
554 nullable: true
555 default_val: '6754'
556 },
557 ], sql_type_from_v, false) or { panic(err) }
558 assert table_unique_query == "CREATE TABLE IF NOT EXISTS 'test_table' ('id' SERIAL DEFAULT 10, 'test' TEXT, 'abc' INT64 DEFAULT 6754, UNIQUE('test', 'abc'), PRIMARY KEY('id'));"
559}
560
561fn test_orm_table_gen_h2() {
562 table := orm.Table{
563 name: 'test_table'
564 attrs: [
565 VAttribute{
566 name: 'comment'
567 has_arg: true
568 arg: 'test table'
569 kind: .string
570 },
571 ]
572 }
573 query := orm.orm_table_gen(.h2, table, '"', true, 0, [
574 orm.TableField{
575 name: 'id'
576 typ: typeof[int]().idx
577 attrs: [
578 VAttribute{
579 name: 'primary'
580 },
581 VAttribute{
582 name: 'sql'
583 has_arg: true
584 arg: 'serial'
585 kind: .plain
586 },
587 ]
588 },
589 orm.TableField{
590 name: 'name'
591 typ: typeof[string]().idx
592 attrs: [
593 VAttribute{
594 name: 'comment'
595 has_arg: true
596 arg: 'display name'
597 kind: .string
598 },
599 VAttribute{
600 name: 'index'
601 },
602 ]
603 },
604 ], sql_type_from_v, false) or { panic(err) }
605 assert query == 'CREATE TABLE IF NOT EXISTS "test_table" ("id" SERIAL NOT NULL, "name" TEXT NOT NULL, PRIMARY KEY("id"));\nCOMMENT ON TABLE "test_table" IS \'test table\';\nCOMMENT ON COLUMN "test_table"."name" IS \'display name\';\nCREATE INDEX "idx_test_table" ON "test_table" ("name");'
606}
607
608fn reset_tenant_filter() {
609 orm.configure_tenant_filter(enabled: false, field_name: 'tenant_id')
610 orm.clear_current_tenant_id()
611}
612
613fn test_apply_tenant_filter_appends_default_field() {
614 defer {
615 reset_tenant_filter()
616 }
617 reset_tenant_filter()
618 orm.configure_tenant_filter(field_name: 'tenant_id')
619 orm.set_current_tenant_id(77)
620 where := orm.QueryData{
621 fields: ['id']
622 data: [orm.Primitive(int(11))]
623 kinds: [.eq]
624 }
625 filtered := orm.apply_tenant_filter(orm.Table{
626 name: 'test_table'
627 }, where)
628 assert filtered.fields == ['id', 'tenant_id']
629 assert filtered.data == [orm.Primitive(int(11)), orm.Primitive(int(77))]
630 assert filtered.kinds == [.eq, .eq]
631 assert filtered.is_and == [true]
632}
633
634fn test_apply_tenant_filter_does_not_duplicate_existing_field() {
635 defer {
636 reset_tenant_filter()
637 }
638 reset_tenant_filter()
639 orm.configure_tenant_filter(field_name: 'tenant_id')
640 orm.set_current_tenant_id(77)
641 where := orm.QueryData{
642 fields: ['tenant_id']
643 data: [orm.Primitive(int(11))]
644 kinds: [.eq]
645 }
646 filtered := orm.apply_tenant_filter(orm.Table{
647 name: 'test_table'
648 }, where)
649 assert filtered.fields == ['tenant_id']
650 assert filtered.data == [orm.Primitive(int(11))]
651 assert filtered.kinds == [.eq]
652 assert filtered.is_and == []
653}
654
655fn test_apply_tenant_filter_with_table_override_and_ignore() {
656 defer {
657 reset_tenant_filter()
658 }
659 reset_tenant_filter()
660 orm.configure_tenant_filter(field_name: 'tenant_id')
661 orm.set_current_tenant_id(5)
662 with_override := orm.apply_tenant_filter(orm.Table{
663 name: 'test_table'
664 attrs: [
665 VAttribute{
666 name: 'tenant_field'
667 has_arg: true
668 arg: 'company_id'
669 kind: .string
670 },
671 ]
672 }, orm.QueryData{})
673 assert with_override.fields == ['company_id']
674 assert with_override.data == [orm.Primitive(int(5))]
675 ignored := orm.apply_tenant_filter(orm.Table{
676 name: 'test_table'
677 attrs: [
678 VAttribute{
679 name: 'ignore_tenant_filter'
680 },
681 ]
682 }, orm.QueryData{})
683 assert ignored.fields == []
684 assert ignored.data == []
685}
686
687fn test_apply_tenant_filter_wraps_existing_where_clause() {
688 defer {
689 reset_tenant_filter()
690 }
691 reset_tenant_filter()
692 orm.configure_tenant_filter(field_name: 'tenant_id')
693 orm.set_current_tenant_id(42)
694 filtered := orm.apply_tenant_filter(orm.Table{
695 name: 'test_table'
696 }, orm.QueryData{
697 fields: ['a', 'b']
698 kinds: [.eq, .eq]
699 is_and: [false]
700 })
701 assert filtered.fields == ['a', 'b', 'tenant_id']
702 assert filtered.is_and == [false, true]
703 assert filtered.parentheses.len == 1
704 assert filtered.parentheses[0] == [0, 1]
705}
706
707fn test_without_tenant_filter_and_with_tenant() {
708 defer {
709 reset_tenant_filter()
710 }
711 reset_tenant_filter()
712 orm.configure_tenant_filter(field_name: 'tenant_id')
713 orm.set_current_tenant_id(10)
714 without_filter := orm.without_tenant_filter[orm.QueryData](fn () !orm.QueryData {
715 return orm.apply_tenant_filter(orm.Table{
716 name: 'test_table'
717 }, orm.QueryData{})
718 }) or { panic(err) }
719 assert without_filter.fields == []
720
721 with_override := orm.with_tenant[orm.QueryData](22, fn () !orm.QueryData {
722 return orm.apply_tenant_filter(orm.Table{
723 name: 'test_table'
724 }, orm.QueryData{})
725 }) or { panic(err) }
726 assert with_override.fields == ['tenant_id']
727 assert with_override.data == [orm.Primitive(int(22))]
728
729 after_scope := orm.apply_tenant_filter(orm.Table{
730 name: 'test_table'
731 }, orm.QueryData{})
732 assert after_scope.data == [orm.Primitive(int(10))]
733}
734
735fn sql_type_from_v(typ int) !string {
736 return if typ in orm.nums {
737 'INT'
738 } else if typ in orm.num64 {
739 'INT64'
740 } else if typ in orm.float {
741 'DOUBLE'
742 } else if typ == orm.type_string {
743 'TEXT'
744 } else if typ == orm.serial {
745 'SERIAL'
746 } else {
747 error('Unknown type ${typ}')
748 }
749}
750