Serge Huber created UNOMI-1015:
----------------------------------
Summary: Empty boolean condition does not match the same items in
rules and in searches
Key: UNOMI-1015
URL: https://issues.apache.org/jira/browse/UNOMI-1015
Project: Apache Unomi
Issue Type: Bug
Components: unomi(-core)
Affects Versions: unomi-4.0.0, unomi-3.0.1, unomi-2.7.0
Reporter: Serge Huber
Fix For: unomi-4.1.0, unomi-3.0.2
h3. Summary
A boolean condition with an empty list of sub-conditions does not give the same
answer everywhere. In rules and other in-memory checks, an empty AND matches
every item and an empty OR matches nothing. In searches and segment queries,
both match every item. This has been the case since at least the 2.x line.
The goal of this ticket is to give an empty list one meaning on every path.
Callers that use an empty OR to mean "all event types" need to keep working.
h3. Background
This relates to UNOMI-1004 (pull request 919) and UNOMI-982. UNOMI-1004 briefly
made an empty OR match nothing in queries as well. That broke code that builds
an OR with one branch per event type and treats an empty type list as "all
types". Profile merge then stopped moving existing session events to the
anonymous profile, and a session events request with no event types would have
returned no events. UNOMI-1004 therefore kept the older query result for a
completely empty list. Only an OR whose branches are all unset optional
parameters matches nothing.
A missing sub-conditions list should be treated the same way as an empty list.
On the 3.0.x line, the query builders currently fail when the list is missing.
The migration notes should say that a stored segment, scoring plan, or search
that uses an empty OR will stop matching every item in queries. Callers that
want every item should use a match-all condition.
h3. Ways to explore
* Find internal callers that build a boolean condition from a list that can be
empty, and stop them from depending on the current query result.
* Make the in-memory check and the Elasticsearch and OpenSearch query builders
agree.
* Cover the empty-list cases in the condition tests, so the in-memory path and
the query path are checked against each other.
h3. How to test
* Check that an empty AND matches every item, and an empty OR matches no item,
both in memory and as a query on both engines.
* Check that searching session events with no event types still returns every
event of the session.
* Check that profile merge still rewrites existing session events, and that the
session events endpoint still works when no event types are given.
* Run the condition integration tests.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)