In Java, each individual rule creates its own tuple set. So, a rule downstream will have to aggregate its own collection because it's not cached in a tuple manager properly, and that means that when the rule executes, and it it is aggregating the collection, it will respect the filters because it will reevaluate the filters for that collection.

In JavaScript, however, the tuple manager caches that aggregation, so, when it gets to a rule that uses that collection operator, it will be the result of the filter at the beginning of the rulesheet. After the filters process, you're not dealing with the whole data set; only the ones that match the filters.

A Java project that uses such filters, when ported to JavaScript will show unexpected behaviors: