Skip to content

Commit 0964980

Browse files
authored
Merge pull request #3474 from ebean-orm/feature/3453
#3453 - Different filterMany behavior when no matches found
2 parents cbac00a + dc7d349 commit 0964980

File tree

14 files changed

+70
-18
lines changed

14 files changed

+70
-18
lines changed

ebean-core/src/main/java/io/ebeaninternal/api/SpiQueryManyJoin.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,9 @@ public interface SpiQueryManyJoin {
1414
* Order by clause defined via mapping on the ToMany property.
1515
*/
1616
String fetchOrderBy();
17+
18+
/**
19+
* Wrap the filter many expression with a condition allowing lEFT JOIN null matching row.
20+
*/
21+
String idNullOr(String filterManyExpression);
1722
}

ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanFkeyProperty.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ public String toString() {
3636
return "prefix:" + prefix + " name:" + name + " dbColumn:" + dbColumn + " ph:" + placeHolder;
3737
}
3838

39+
@Override
40+
public String idNullOr(String filterManyExpression) {
41+
throw new UnsupportedOperationException();
42+
}
43+
3944
@Override
4045
public boolean isAggregation() {
4146
return false;

ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,11 @@ public boolean isAssignableFrom(Class<?> type) {
512512
return owningType.isAssignableFrom(type);
513513
}
514514

515+
@Override
516+
public String idNullOr(String filterManyExpression) {
517+
throw new UnsupportedOperationException();
518+
}
519+
515520
@Override
516521
public void loadIgnore(DbReadContext ctx) {
517522
ctx.dataReader().incrementPos(1);

ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -634,6 +634,11 @@ public String fetchOrderBy() {
634634
return fetchOrderBy;
635635
}
636636

637+
@Override
638+
public String idNullOr(String filterManyExpression) {
639+
return targetIdBinder.idNullOr(name, filterManyExpression);
640+
}
641+
637642
/**
638643
* Return the order by for use when lazy loading the associated collection.
639644
*/

ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinder.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ public interface IdBinder {
2727
*/
2828
void initialise();
2929

30+
/**
31+
* Wrap the filter many expression with a condition allowing lEFT JOIN null matching row.
32+
*/
33+
String idNullOr(String name, String filterManyExpression);
34+
3035
String idSelect();
3136

3237
/**

ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmbedded.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,20 @@ public void initialise() {
4646
this.idInValueSql = idInExpandedForm ? idInExpanded() : idInCompressed();
4747
}
4848

49+
@Override
50+
public String idNullOr(String prefix, String filterManyExpression) {
51+
StringBuilder sb = new StringBuilder(100);
52+
sb.append("((");
53+
for (int i = 0; i < props.length; i++) {
54+
if (i > 0) {
55+
sb.append(" and ");
56+
}
57+
sb.append("${").append(prefix).append('.').append(embIdProperty.name()).append('}').append(props[i].name()).append(" is null");
58+
}
59+
sb.append(") or (").append(filterManyExpression).append("))");
60+
return sb.toString();
61+
}
62+
4963
@Override
5064
public String idSelect() {
5165
return embIdProperty.name();

ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmpty.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ public IdBinderEmpty() {
2828
public void initialise() {
2929
}
3030

31+
@Override
32+
public String idNullOr(String name, String filterManyExpression) {
33+
throw new UnsupportedOperationException();
34+
}
35+
3136
@Override
3237
public String idSelect() {
3338
return "";

ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderSimple.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,4 +260,9 @@ public String cacheKeyFromBean(EntityBean bean) {
260260
final Object value = idProperty.getValue(bean);
261261
return scalarType.format(value);
262262
}
263+
264+
@Override
265+
public String idNullOr(String prefix, String filterManyExpression) {
266+
return "(${" + prefix + "}" + idProperty.name() + " is null or (" + filterManyExpression + "))";
267+
}
263268
}

ebean-core/src/main/java/io/ebeaninternal/server/el/ElPropertyChain.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,4 +286,8 @@ public void pathSet(Object bean, Object value) {
286286
}
287287
}
288288

289+
@Override
290+
public String idNullOr(String filterManyExpression) {
291+
throw new UnsupportedOperationException();
292+
}
289293
}

ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPredicates.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ public void prepare(boolean buildSql) {
191191
if (filterManyExpr != null) {
192192
this.filterMany = new DefaultExpressionRequest(request, deployParser, binder, filterManyExpr);
193193
if (buildSql) {
194-
dbFilterMany = filterMany.buildSql();
194+
dbFilterMany = manyProperty.idNullOr(filterMany.buildSql());
195195
}
196196
}
197197
}

0 commit comments

Comments
 (0)