Issue #3508437: Fix the "is none of" and "is all of" operators on base table columns

ManyToOne expresses every operator through joins, because it is written for values kept in a separate multi-value table. The module also puts the filter on entity id columns of base and data tables, and on id columns Views exposes through a relationship. There the column sits in the row the view already selects, so getJoin() returns NULL and ManyToOneHelper dereferences it: 'Attempt to assign property "type" on null'. Only "is one of" survives, because that branch checks the join for NULL.

Guarding the NULL is not enough. On a single-value column the join strategies degenerate: "is none of" reduces to "id IS NULL", which never matches, and "is all of" builds its condition from table aliases that are never created.

  • Bypass the ManyToOne helper when the filtered column lies on the base table of the view or of the filter's relationship, and build plain conditions instead: IN, NOT IN combined with IS NULL so that a row without a value keeps matching "is none of" as it does through the join, and for "is all of" either IN on a single distinct value or an always false expression.
  • Keep the join logic for field table columns, where one entity spans several rows and the operators do need it.
  • Leave the Search API variant untouched by testing for the SQL query plugin.
  • Add a kernel test and three test views covering both kinds of column, with and without a relationship, exposed and not.

Closes #3508437

Merge request reports

Loading
Loading