Selmer icon indicating copy to clipboard operation
Selmer copied to clipboard

Confused: multiple filters don’t seem to be working on a collection

Open aviflax opened this issue 5 years ago • 5 comments

Sorry if this is a n00b question, but I am a n00b.

I’ve created a few custom filters for sorting and filtering collections.

I think what I’m seeing now is that if I apply two filters to a collection, the result seems to be applied only to the original collection, rather than the result of the first filter.

For example, my tag looks something like:

{% for foo in my.coll|my-filter|my-sort %}

The result seems to be equivalent to my.coll|my-sort — it seems as though the results of the first filter are being thrown away?

I’m sure this is PEBKAC — what am I missing?

Thanks!

aviflax avatar Mar 20 '20 15:03 aviflax

You're right, the filters don't chain for collections at the moment. I'd call it a bug since filters chain otherwise. I'll try take a look at fixing this when I get a chance. In the meantime, you'd have to compose the filters into a single filter that would do all the transformations in one shot.

yogthos avatar Mar 20 '20 16:03 yogthos

😌 its actually a relief to know that I’m not crazy. Thanks!

I’d be happy to take a look at maybe contributing a fix for this, if you maybe want to point me in the right direction?

aviflax avatar Mar 20 '20 16:03 aviflax

If you don't mind taking a look that would be great, and compile-filter-body would likely be the best place to start. That's where the filters get parsed out and mapped to the respective functions.

yogthos avatar Mar 20 '20 19:03 yogthos

Thanks! I’ll try to take a look, but it might be a week or two before I can get to it.


In the meantime, I wonder if you could once again help me refine my mental model of Selmer… I thought I might be able to work around this bug by using with to assign a filtered collection to a variable, and then inside of that with I could apply another filter to the collection.

e.g.:

{% with blips = radar.blips|filter-by:ring:@ring %}
  {% for tech-name,blip in blips|sort-by-keys %}

but no dice. In fact in this case my variable seems to be empty? If I remove the second filter, in the for, I still get nothing — blips seems to be empty. When I remove both filters, however, the variable does seem to hold the entire collection. So variables can refer to collections — but not filtered collections?

Is this possibly the same bug? Or a different bug? Or am I missing something?

Thanks!

aviflax avatar Mar 23 '20 19:03 aviflax

No worries, and it sounds like this is likely related as well, but I'd have to take a closer look to be sure.

yogthos avatar Mar 23 '20 20:03 yogthos

👋 I had a hiatus from working on projects that used Selmer for a couple of years, but I just started working on another one, and maybe I’m confused or missing something, but it seems now like this is working? Has something changed in the meantime?

ghost avatar Jan 17 '23 23:01 ghost

I guess it's possible this got fixed under some other ticket and this issue just didn't get updated?

(~/clojure)-(!2007)-> clj -Sdeps '{:deps {selmer/selmer {:mvn/version "RELEASE"}}}'
Downloading: selmer/selmer/maven-metadata.xml from clojars
Clojure 1.11.1
user=> (require '[selmer.parser :as p])
nil
user=> (p/render "{% for i in data|take:6|drop:3 %}{{i}}:{% endfor %}" {:data (range 20)})
"3:4:5:"
user=>

seancorfield avatar Jan 17 '23 23:01 seancorfield

Yeah, looks like this got fixed by another refactor. Sounds like we can close this then.

yogthos avatar Jan 18 '23 00:01 yogthos