@@ -1058,23 +1058,35 @@ func (c containsAny) Calculate(src []byte) (any, error) {
10581058 return nil , err
10591059 }
10601060
1061- leftTypeOf := reflect .TypeOf (left )
1062- typesEqual := leftTypeOf == reflect .TypeOf (right )
1063-
1064- if ! typesEqual && leftTypeOf .Kind () != reflect .Slice {
1065- return nil , ErrUnsupportedTypeComparison {s : fmt .Sprintf ("%s CONTAINS %s" , left , right )}
1066- }
1067-
10681061 switch l := left .(type ) {
10691062 case string :
10701063
1071- // betting that lists are short and so less expensive than iterating one to create a hash set
1072- for _ , c := range right .(string ) {
1073- for _ , c2 := range l {
1074- if c == c2 {
1064+ switch r := right .(type ) {
1065+ case string :
1066+
1067+ // betting that lists are short and so less expensive than iterating one to create a hash set
1068+ for _ , c := range r {
1069+ for _ , c2 := range l {
1070+ if c == c2 {
1071+ return true , nil
1072+ }
1073+ }
1074+ }
1075+
1076+ case []any :
1077+ for _ , v := range r {
1078+ s , ok := v .(string )
1079+ if ! ok {
1080+ continue
1081+ }
1082+ if l == s {
10751083 return true , nil
10761084 }
10771085 }
1086+ return false , nil
1087+
1088+ default :
1089+ return nil , ErrUnsupportedTypeComparison {s : fmt .Sprintf ("%s CONTAINS_ANY %s" , left , right )}
10781090 }
10791091
10801092 case []any :
@@ -1098,10 +1110,13 @@ func (c containsAny) Calculate(src []byte) (any, error) {
10981110 }
10991111 }
11001112 }
1113+
1114+ default :
1115+ return nil , ErrUnsupportedTypeComparison {s : fmt .Sprintf ("%s CONTAINS_ANY %s" , left , right )}
11011116 }
11021117
11031118 default :
1104- return nil , ErrUnsupportedTypeComparison {s : fmt .Sprintf ("%s CONTAINS %s !" , left , right )}
1119+ return nil , ErrUnsupportedTypeComparison {s : fmt .Sprintf ("%s CONTAINS_ANY %s !" , left , right )}
11051120 }
11061121 return false , nil
11071122}
@@ -1123,55 +1138,65 @@ func (c containsAll) Calculate(src []byte) (any, error) {
11231138 return nil , err
11241139 }
11251140
1126- leftTypeOf := reflect .TypeOf (left )
1127- typesEqual := leftTypeOf == reflect .TypeOf (right )
1128-
1129- if ! typesEqual && leftTypeOf .Kind () != reflect .Slice {
1130- return nil , ErrUnsupportedTypeComparison {s : fmt .Sprintf ("%s CONTAINS %s" , left , right )}
1131- }
1132-
11331141 switch l := left .(type ) {
11341142 case string :
1135- // betting that lists are short and so less expensive than iterating one to create a hash set
1136- OUTER1:
1137- for _ , c := range right .(string ) {
1138- for _ , c2 := range l {
1139- if c == c2 {
1140- continue OUTER1
1143+ switch r := right .(type ) {
1144+ case string :
1145+ // betting that lists are short and so less expensive than iterating one to create a hash set
1146+ OUTER1:
1147+ for _ , c := range r {
1148+ for _ , c2 := range l {
1149+ if c == c2 {
1150+ continue OUTER1
1151+ }
11411152 }
1153+ return false , nil
11421154 }
1143- return false , nil
1155+
1156+ case []any :
1157+ for _ , v := range r {
1158+ s , ok := v .(string )
1159+ if ! ok || ! strings .Contains (l , s ) {
1160+ return false , nil
1161+ }
1162+ }
1163+ return true , nil
1164+
1165+ default :
1166+ return nil , ErrUnsupportedTypeComparison {s : fmt .Sprintf ("%s CONTAINS_ALL %s" , left , right )}
11441167 }
11451168
11461169 case []any :
11471170 switch r := right .(type ) {
11481171 case []any :
11491172 // betting that lists are short and so less expensive than iterating one to create a hash set
1150- OUTER2 :
1173+ OUTER3 :
11511174 for _ , rv := range r {
11521175 for _ , lv := range l {
11531176 if reflect .DeepEqual (rv , lv ) {
1154- continue OUTER2
1177+ continue OUTER3
11551178 }
11561179 }
11571180 return false , nil
11581181 }
11591182
11601183 case string :
11611184 // betting that lists are short and so less expensive than iterating one to create a hash set
1162- OUTER3 :
1185+ OUTER4 :
11631186 for _ , c := range r {
11641187 for _ , v := range l {
11651188 if reflect .DeepEqual (string (c ), v ) {
1166- continue OUTER3
1189+ continue OUTER4
11671190 }
11681191 }
11691192 return false , nil
11701193 }
1194+ default :
1195+ return nil , ErrUnsupportedTypeComparison {s : fmt .Sprintf ("%s CONTAINS_ALL %s" , left , right )}
11711196 }
11721197
11731198 default :
1174- return nil , ErrUnsupportedTypeComparison {s : fmt .Sprintf ("%s CONTAINS %s !" , left , right )}
1199+ return nil , ErrUnsupportedTypeComparison {s : fmt .Sprintf ("%s CONTAINS_ALL %s !" , left , right )}
11751200 }
11761201 return true , nil
11771202}
0 commit comments