11package com .hubspot .jinjava .lib .filter ;
22
3+ import com .hubspot .jinjava .features .BuiltInFeatures ;
34import com .hubspot .jinjava .interpret .JinjavaInterpreter ;
45import com .hubspot .jinjava .interpret .TemplateError ;
56import com .hubspot .jinjava .interpret .TemplateSyntaxException ;
@@ -43,7 +44,27 @@ public Object filter(
4344 Set <Object > varSet = objectToSet (var );
4445 Set <Object > argSet = objectToSet (parseArgs (interpreter , args ));
4546
46- attachMismatchedTypesWarning (interpreter , varSet , argSet );
47+ if (!varSet .isEmpty () && !argSet .isEmpty ()) {
48+ Object oneVar = varSet .iterator ().next ();
49+ Object oneArg = argSet .iterator ().next ();
50+
51+ boolean featureActive = interpreter
52+ .getConfig ()
53+ .getFeatures ()
54+ .isActive (
55+ BuiltInFeatures .INTEGER_SET_TO_LONG_CONVERSION ,
56+ interpreter .getContext ()
57+ );
58+ if (featureActive ) {
59+ if (oneVar instanceof Integer && oneArg instanceof Long ) {
60+ varSet = convertIntegersToLongs (varSet );
61+ } else if (oneArg instanceof Integer && oneVar instanceof Long ) {
62+ argSet = convertIntegersToLongs (argSet );
63+ }
64+ }
65+
66+ attachMismatchedTypesWarning (interpreter , varSet , argSet , oneVar , oneArg );
67+ }
4768
4869 return filter (varSet , argSet );
4970 }
@@ -55,17 +76,31 @@ protected void attachMismatchedTypesWarning(
5576 Set <Object > varSet ,
5677 Set <Object > argSet
5778 ) {
58- boolean hasAtLeastOneSetEmpty = varSet .isEmpty () || argSet .isEmpty ();
59- if (hasAtLeastOneSetEmpty ) {
79+ if (varSet .isEmpty () || argSet .isEmpty ()) {
6080 return ;
6181 }
82+ attachMismatchedTypesWarning (
83+ interpreter ,
84+ varSet ,
85+ argSet ,
86+ varSet .iterator ().next (),
87+ argSet .iterator ().next ()
88+ );
89+ }
6290
63- boolean areMatchedElementTypes = getTypeOfSetElements (varSet )
64- .equals (getTypeOfSetElements (argSet ));
65- if (areMatchedElementTypes ) {
91+ private void attachMismatchedTypesWarning (
92+ JinjavaInterpreter interpreter ,
93+ Set <Object > varSet ,
94+ Set <Object > argSet ,
95+ Object oneVarObj ,
96+ Object oneArgObj
97+ ) {
98+ if (getTypeOfSetElements (varSet ).equals (getTypeOfSetElements (argSet ))) {
99+ return ;
100+ }
101+ if (potentiallyConvertibleNumbers (oneVarObj , oneArgObj )) {
66102 return ;
67103 }
68-
69104 interpreter .addError (
70105 new TemplateError (
71106 TemplateError .ErrorType .WARNING ,
@@ -84,6 +119,25 @@ protected void attachMismatchedTypesWarning(
84119 );
85120 }
86121
122+ private boolean potentiallyConvertibleNumbers (Object oneVarObj , Object oneArgObj ) {
123+ return (
124+ (oneArgObj instanceof Integer && oneVarObj instanceof Long ) ||
125+ (oneVarObj instanceof Integer && oneArgObj instanceof Long )
126+ );
127+ }
128+
129+ private Set <Object > convertIntegersToLongs (Set <Object > set ) {
130+ Set <Object > result = new LinkedHashSet <>();
131+ for (Object element : set ) {
132+ if (element instanceof Integer ) {
133+ result .add (Long .valueOf (element .toString ()));
134+ } else {
135+ result .add (element );
136+ }
137+ }
138+ return result ;
139+ }
140+
87141 private String getTypeOfSetElements (Set <Object > set ) {
88142 return TypeFunction .type (set .iterator ().next ());
89143 }
0 commit comments