Good point. LimeSurvey always ANDs together compound array_filter and/or array_filter_exclude statements. There are valid reasons for wanting to OR them together, but sometimes AND is the right solution.
Your case is even trickier, since Q2 has an exclusion on Q1, and Q3 uses both. This runs afoul of the cascading feature.
A concrete example is:
Q1: Which animals have you owned?
Q2: Of those you haven't owned, which do you wish you could own someday?
Q3: Why don't you like about these animals?
Since Q2 uses array_filter_exclude = "Q1", and Q3 uses array_filter_exclude = "Q1;Q2", you get relevance like this for Q3:
(( ! is_empty(Q2_1.NAOK)) && ( ! is_empty(Q1_1.NAOK)) && (is_empty(Q1_1.NAOK)))
Which can never be true.
Even if you don't have Q2 array_filter_exclude on Q1, you get:
(( ! is_empty(Q2_1.NAOK)) && ( ! is_empty(Q1_1.NAOK)))
when it should be OR.
Going back to basics:
(1) If you combine two array_filters, should they always be ORed together? What if you want to ensure that the user selected the same option in two different questions?
(2) If you combine two array_filter_excludes, should they always be
(3) What if you mix array_filter and array_filter_exclude?
(4) What if you want to mix filter styles and also support cascading?
Rather than simply using ; to separate filters, perhaps we should allow a syntax to indicate how they should be combined? Since this can get complex, we might do a consolidated array_filter syntax that lets you explicitly mix and match array_filter and array_filter_exclude, such as:
A => filter on A
!A => filter_exclude on A
~A => filter on A, but do not cascade
A|B => A OR B
A&B => A AND B
A&~!B => A AND exclude B, but don't cascade on B
!A&(B|C) => exclude A and filter on A OR B
Alternatively we could finally support sub-question-level relevance and let users explicitly declare the filtering logic for each question.