AaronLasseigne / active_interaction

:briefcase: Manage application specific business logic.
MIT License
2.06k stars 136 forks source link

Mongoid::Criteria objects are resolved in object filter #573

Open william-stacken opened 2 months ago

william-stacken commented 2 months ago

We are using an interactor that lists models. It accepts a Mongoid::Criteria as input and a filter that is used to limit the scope of the criteria further. Occasionally, this interactor would run very slowly, and we found that in the matches? method in object_filter.rb, the value is compared against nil. This means that if the value is a potentially expensive Mongoid::Criteria object, performance could be impacted as the criteria must be resolved to perform the comparison.

This may have already been considered, but would it be possible to use .nil? for comparision instead? This would leave the criteria unresolved.

AaronLasseigne commented 2 months ago

It's compared to nil because we support all Ruby objects including BasicObject. Unfortunately, BasicObject doesn't work with .nil?.

Having said that, people shouldn't really be throwing around BasicObject and it added complexity to the code that I'm not thrilled with. I'd consider removing that and using .nil?. It'll have to be in a major release though since it would technically be a breaking change.