Andrus Adamchik created CAY-2816:
------------------------------------
Summary: (NOT) EXIST usability - provide simple expression syntax
Key: CAY-2816
URL: https://issues.apache.org/jira/browse/CAY-2816
Project: Cayenne
Issue Type: Improvement
Reporter: Andrus Adamchik
Assignee: Nikita Timofeev
Fix For: 5.0.M1
h2. Background
Currently, the syntax for (NOT) EXISTS requires two queries and an explicit
correlation expression:
https://cayenne.apache.org/docs/4.2/cayenne-guide/#subqueries
https://twitter.com/ApacheCayenne/status/1562702875327082496
This is great for a general case, but in practice, in 90% of cases the
"enclosing" expression is simply a relationship from top query root to subquery
root. So the syntax can be drastically simplifed, replacing sub ObjectSelect
with a simple expression. So this:
{noformat}
ObjectSelect<Painting> subQuery = ObjectSelect.query(Painting.class)
.where(Painting.TO_ARTIST.eq(Artist.ARTIST_ID_PK_PROPERTY.enclosing()));
long count = ObjectSelect.query(Artist.class)
.where(ExpressionFactory.notExists(subQuery))
.selectCount(context);
{noformat}
becomes this:
{noformat}
long count = ObjectSelect.query(Artist.class)
.where(ExpressionFactory.notExists(Artist.PAINTING))
.selectCount(context);
{noformat}
h2. Task Scope
_(TODO: break to subtasks?)_
* Implement "ExpressionFactory.exists(Exp)" and
"ExpressionFactory.notExists(Exp)". The trick would be to check all paths
within the Exp and build the corresponding correlation expressions for the
subquery. It may potentially resolve to multiple subqueries (if multiple
relationships are specified), or no subqueries (for conditions based on the
root query attributes: 'not exists name = "A"' would become 'not (name = "A")'
in SQL)
* Implement parseable exp syntax "exists <exp>" and "not exists <exp>"
* Implement "exp.exists()" and "exp.notExists()"
--
This message was sent by Atlassian Jira
(v8.20.10#820010)