package com.hubspot.jinjava.lib.filter; import java.util.LinkedHashMap; import java.util.Map; import com.hubspot.jinjava.doc.annotations.JinjavaDoc; import com.hubspot.jinjava.doc.annotations.JinjavaParam; import com.hubspot.jinjava.doc.annotations.JinjavaSnippet; import com.hubspot.jinjava.interpret.JinjavaInterpreter; import com.hubspot.jinjava.util.ForLoop; import com.hubspot.jinjava.util.ObjectIterator; @JinjavaDoc( value = "Extract a unique set from a sequence of objects", params = { @JinjavaParam(value = "sequence", type = "sequence", desc = "Sequence to filter"), @JinjavaParam(value = "attr", type = "Optional attribute on object to use as unique identifier") }, snippets = { @JinjavaSnippet( desc = "Filter duplicated strings from a sequence of strings", code = "{{ ['foo', 'bar', 'foo', 'other'] | unique | join(', ') }}", output = "foo, bar, other"), @JinjavaSnippet( desc = "Filter out duplicate blog posts", code = "{% for content in contents|unique(attr='slug') %}\n" + "\n{% endfor %}") }) public class UniqueFilter implements Filter { @Override public String getName() { return "unique"; } @Override public Object filter(Object var, JinjavaInterpreter interpreter, String... args) { Map<Object, Object> result = new LinkedHashMap<>(); String attr = null; if (args.length > 0) { attr = args[0]; } ForLoop loop = ObjectIterator.getLoop(var); while (loop.hasNext()) { Object val = loop.next(); Object key = val; if (attr != null) { key = interpreter.resolveProperty(val, attr); } if (!result.containsKey(key)) { result.put(key, val); } } return result.values(); } }