@@ -52,6 +52,7 @@ pub type Primitive = InfixType
5252 | u32
5353 | u64
5454 | u8
55+ | []Primitive
5556
5657pub struct Null {}
5758
@@ -66,6 +67,8 @@ pub enum OperationKind {
6667 orm_ilike // ILIKE
6768 is_null // IS NULL
6869 is_not_null // IS NOT NULL
70+ in // IN
71+ not_in // NOT IN
6972}
7073
7174pub enum MathOperationKind {
@@ -105,6 +108,8 @@ fn (kind OperationKind) to_str() string {
105108 .orm_ilike { 'ILIKE' }
106109 .is_null { 'IS NULL' }
107110 .is_not_null { 'IS NOT NULL' }
111+ .in { 'IN' }
112+ .not_in { 'NOT IN' }
108113 }
109114 return str
110115}
@@ -402,10 +407,23 @@ fn gen_where_clause(where QueryData, q string, qm string, num bool, mut c &int)
402407 }
403408 str + = '${q}${field}${q} ${where.kinds[i].to_str()} '
404409 if ! where.kinds[i].is_unary () {
405- str + = ' ${qm} '
406- if num {
407- str + = '${c} '
408- c++
410+ if where.data.len > i && where.data[i] is []Primitive {
411+ len := (where.data[i] as []Primitive).len
412+ mut tmp := []string {len: len}
413+ for j in 0 .. len {
414+ tmp[j] = '${qm} '
415+ if num {
416+ tmp[j] + = '${c} '
417+ c++
418+ }
419+ }
420+ str + = ' (${tmp.join(', ')} )'
421+ } else {
422+ str + = ' ${qm} '
423+ if num {
424+ str + = '${c} '
425+ c++
426+ }
409427 }
410428 }
411429 if current_post_par > 0 {
@@ -629,6 +647,10 @@ fn option_bool_to_primitive(b ?bool) Primitive {
629647 return if b_ := b { Primitive (b_) } else { null_primitive }
630648}
631649
650+ fn array_bool_to_primitive (b []bool ) Primitive {
651+ return Primitive (b.map (bool_to_primitive (it )))
652+ }
653+
632654fn f32_to_primitive (b f32 ) Primitive {
633655 return Primitive (b)
634656}
@@ -637,6 +659,10 @@ fn option_f32_to_primitive(b ?f32) Primitive {
637659 return if b_ := b { Primitive (b_) } else { null_primitive }
638660}
639661
662+ fn array_f32_to_primitive (b []f32 ) Primitive {
663+ return Primitive (b.map (f32_to_primitive (it )))
664+ }
665+
640666fn f64_to_primitive (b f64 ) Primitive {
641667 return Primitive (b)
642668}
@@ -645,6 +671,10 @@ fn option_f64_to_primitive(b ?f64) Primitive {
645671 return if b_ := b { Primitive (b_) } else { null_primitive }
646672}
647673
674+ fn array_f64_to_primitive (b []f64 ) Primitive {
675+ return Primitive (b.map (f64_to_primitive (it )))
676+ }
677+
648678fn i8_to_primitive (b i8 ) Primitive {
649679 return Primitive (b)
650680}
@@ -653,6 +683,10 @@ fn option_i8_to_primitive(b ?i8) Primitive {
653683 return if b_ := b { Primitive (b_) } else { null_primitive }
654684}
655685
686+ fn array_i8_to_primitive (b []i8 ) Primitive {
687+ return Primitive (b.map (i8_to_primitive (it )))
688+ }
689+
656690fn i16_to_primitive (b i16 ) Primitive {
657691 return Primitive (b)
658692}
@@ -661,6 +695,10 @@ fn option_i16_to_primitive(b ?i16) Primitive {
661695 return if b_ := b { Primitive (b_) } else { null_primitive }
662696}
663697
698+ fn array_i16_to_primitive (b []i16 ) Primitive {
699+ return Primitive (b.map (i16_to_primitive (it )))
700+ }
701+
664702fn int_to_primitive (b int ) Primitive {
665703 return Primitive (b)
666704}
@@ -669,6 +707,10 @@ fn option_int_to_primitive(b ?int) Primitive {
669707 return if b_ := b { Primitive (b_) } else { null_primitive }
670708}
671709
710+ fn array_int_to_primitive (b []int ) Primitive {
711+ return Primitive (b.map (int_to_primitive (it )))
712+ }
713+
672714// int_literal_to_primitive handles int literal value
673715fn int_literal_to_primitive (b int ) Primitive {
674716 return Primitive (b)
@@ -678,6 +720,10 @@ fn option_int_literal_to_primitive(b ?int) Primitive {
678720 return if b_ := b { Primitive (b_) } else { null_primitive }
679721}
680722
723+ fn array_int_literal_to_primitive (b []int ) Primitive {
724+ return Primitive (b.map (int_literal_to_primitive (it )))
725+ }
726+
681727// float_literal_to_primitive handles float literal value
682728fn float_literal_to_primitive (b f64 ) Primitive {
683729 return Primitive (b)
@@ -687,6 +733,10 @@ fn option_float_literal_to_primitive(b ?f64) Primitive {
687733 return if b_ := b { Primitive (b_) } else { null_primitive }
688734}
689735
736+ fn array_float_literal_to_primitive (b []f64 ) Primitive {
737+ return Primitive (b.map (float_literal_to_primitive (it )))
738+ }
739+
690740fn i64_to_primitive (b i64 ) Primitive {
691741 return Primitive (b)
692742}
@@ -695,6 +745,10 @@ fn option_i64_to_primitive(b ?i64) Primitive {
695745 return if b_ := b { Primitive (b_) } else { null_primitive }
696746}
697747
748+ fn array_i64_to_primitive (b []i64 ) Primitive {
749+ return Primitive (b.map (i64_to_primitive (it )))
750+ }
751+
698752fn u8_to_primitive (b u8 ) Primitive {
699753 return Primitive (b)
700754}
@@ -703,6 +757,10 @@ fn option_u8_to_primitive(b ?u8) Primitive {
703757 return if b_ := b { Primitive (b_) } else { null_primitive }
704758}
705759
760+ fn array_u8_to_primitive (b []u8 ) Primitive {
761+ return Primitive (b.map (u8_to_primitive (it )))
762+ }
763+
706764fn u16_to_primitive (b u16 ) Primitive {
707765 return Primitive (b)
708766}
@@ -711,6 +769,10 @@ fn option_u16_to_primitive(b ?u16) Primitive {
711769 return if b_ := b { Primitive (b_) } else { null_primitive }
712770}
713771
772+ fn array_u16_to_primitive (b []u16 ) Primitive {
773+ return Primitive (b.map (u16_to_primitive (it )))
774+ }
775+
714776fn u32_to_primitive (b u32 ) Primitive {
715777 return Primitive (b)
716778}
@@ -719,6 +781,10 @@ fn option_u32_to_primitive(b ?u32) Primitive {
719781 return if b_ := b { Primitive (b_) } else { null_primitive }
720782}
721783
784+ fn array_u32_to_primitive (b []u32 ) Primitive {
785+ return Primitive (b.map (u32_to_primitive (it )))
786+ }
787+
722788fn u64_to_primitive (b u64 ) Primitive {
723789 return Primitive (b)
724790}
@@ -727,6 +793,10 @@ fn option_u64_to_primitive(b ?u64) Primitive {
727793 return if b_ := b { Primitive (b_) } else { null_primitive }
728794}
729795
796+ fn array_u64_to_primitive (b []u64 ) Primitive {
797+ return Primitive (b.map (u64_to_primitive (it )))
798+ }
799+
730800fn string_to_primitive (b string ) Primitive {
731801 return Primitive (b)
732802}
@@ -735,6 +805,10 @@ fn option_string_to_primitive(b ?string) Primitive {
735805 return if b_ := b { Primitive (b_) } else { null_primitive }
736806}
737807
808+ fn array_string_to_primitive (b []string ) Primitive {
809+ return Primitive (b.map (string_to_primitive (it )))
810+ }
811+
738812fn time_to_primitive (b time.Time) Primitive {
739813 return Primitive (b)
740814}
@@ -743,6 +817,10 @@ fn option_time_to_primitive(b ?time.Time) Primitive {
743817 return if b_ := b { Primitive (b_) } else { null_primitive }
744818}
745819
820+ fn array_time_to_primitive (b []time.Time) Primitive {
821+ return Primitive (b.map (time_to_primitive (it )))
822+ }
823+
746824fn infix_to_primitive (b InfixType) Primitive {
747825 return Primitive (b)
748826}
0 commit comments