diff --git a/src/main/java/com/hubspot/jinjava/lib/filter/SelectAttrFilter.java b/src/main/java/com/hubspot/jinjava/lib/filter/SelectAttrFilter.java index 7e07478d8..17b7462e2 100644 --- a/src/main/java/com/hubspot/jinjava/lib/filter/SelectAttrFilter.java +++ b/src/main/java/com/hubspot/jinjava/lib/filter/SelectAttrFilter.java @@ -1,6 +1,7 @@ package com.hubspot.jinjava.lib.filter; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import com.hubspot.jinjava.doc.annotations.JinjavaDoc; @@ -41,6 +42,8 @@ public Object filter(Object var, JinjavaInterpreter interpreter, String... args) throw new InterpretException(getName() + " filter requires an attr to filter on", interpreter.getLineNumber()); } + String[] expArgs = new String[]{}; + String attr = args[0]; ExpTest expTest = interpreter.getContext().getExpTest("truthy"); @@ -49,6 +52,10 @@ public Object filter(Object var, JinjavaInterpreter interpreter, String... args) if (expTest == null) { throw new InterpretException("No expression test defined with name '" + args[1] + "'", interpreter.getLineNumber()); } + + if (args.length > 2) { + expArgs = Arrays.copyOfRange(args, 2, args.length); + } } ForLoop loop = ObjectIterator.getLoop(var); @@ -56,7 +63,7 @@ public Object filter(Object var, JinjavaInterpreter interpreter, String... args) Object val = loop.next(); Object attrVal = interpreter.resolveProperty(val, attr); - if (expTest.evaluate(attrVal, interpreter)) { + if (expTest.evaluate(attrVal, interpreter, (Object[]) expArgs)) { result.add(val); } } diff --git a/src/test/java/com/hubspot/jinjava/lib/filter/SelectAttrFilterTest.java b/src/test/java/com/hubspot/jinjava/lib/filter/SelectAttrFilterTest.java index 99dc766c5..20836f7d0 100644 --- a/src/test/java/com/hubspot/jinjava/lib/filter/SelectAttrFilterTest.java +++ b/src/test/java/com/hubspot/jinjava/lib/filter/SelectAttrFilterTest.java @@ -33,6 +33,13 @@ public void selectAttrWithExp() { .isEqualTo("[2]"); } + @Test + public void selectAttrWithIsEqualToExp() { + assertThat(jinjava.render("{{ users|selectattr('email', 'equalto', 'bar@bar.com') }}", new HashMap())) + .isEqualTo("[1]"); + } + + public static class User { private int num; private boolean isActive;