From bbd7315969afdca19e4fd624b4749d49f48ab3d9 Mon Sep 17 00:00:00 2001 From: Andrei Sereda <25229979+asereda-gs@users.noreply.github.com> Date: Fri, 12 Apr 2019 21:51:44 -0400 Subject: [PATCH] Criteria. Type inside Consumer should not terminate in root (R) ```java S none(Consumer consumer) { // .... } ``` --- .../constraints/CollectionCriteria.java | 12 ++++++++++-- .../criteria/constraints/OptionalCriteria.java | 16 ++++++++-------- .../immutables/criteria/ReflectionTest.java | 4 +++- .../value/processor/Criteria.generator | 18 +++++++++--------- 4 files changed, 30 insertions(+), 20 deletions(-) diff --git a/criteria/common/src/org/immutables/criteria/constraints/CollectionCriteria.java b/criteria/common/src/org/immutables/criteria/constraints/CollectionCriteria.java index 0160f440c..aa6542dd7 100644 --- a/criteria/common/src/org/immutables/criteria/constraints/CollectionCriteria.java +++ b/criteria/common/src/org/immutables/criteria/constraints/CollectionCriteria.java @@ -5,7 +5,7 @@ import java.util.Objects; import java.util.function.Consumer; -public class CollectionCriteria, V, S extends ValueCriteria> { +public class CollectionCriteria, V, S extends ValueCriteria, C extends ValueCriteria> { private final CriteriaContext context; @@ -17,15 +17,23 @@ public S all() { throw new UnsupportedOperationException(); } + public R all(Consumer consumer) { + throw new UnsupportedOperationException(); + } + public S none() { throw new UnsupportedOperationException(); } + public R none(Consumer consumer) { + throw new UnsupportedOperationException(); + } + public S any() { throw new UnsupportedOperationException(); } - public R any(Consumer consumer) { + public R any(Consumer consumer) { throw new UnsupportedOperationException(); } diff --git a/criteria/common/src/org/immutables/criteria/constraints/OptionalCriteria.java b/criteria/common/src/org/immutables/criteria/constraints/OptionalCriteria.java index a0bdfa569..87ecc360a 100644 --- a/criteria/common/src/org/immutables/criteria/constraints/OptionalCriteria.java +++ b/criteria/common/src/org/immutables/criteria/constraints/OptionalCriteria.java @@ -18,33 +18,33 @@ import org.immutables.criteria.DocumentCriteria; -import java.util.Optional; +import java.util.Objects; import java.util.function.Consumer; -import java.util.function.Function; /** * Criteria for optional attributes. */ -// TODO do we really need to extend from ObjectCriteria ? perhaps just make ValueCriteria ? -public class OptionalCriteria, V, S extends ValueCriteria> extends ObjectCriteria> { +public class OptionalCriteria, V, S extends ValueCriteria, C extends ValueCriteria> { + + private final CriteriaContext context; public OptionalCriteria(CriteriaContext context) { - super(context); + this.context = Objects.requireNonNull(context, "context"); } public R isPresent() { - return create(e -> Expressions.call(Operators.IS_PRESENT, e)); + return context.create(e -> Expressions.call(Operators.IS_PRESENT, e)); } public R isAbsent() { - return create(e -> Expressions.call(Operators.IS_ABSENT, e)); + return context.create(e -> Expressions.call(Operators.IS_ABSENT, e)); } public S value() { throw new UnsupportedOperationException(); } - public R value(Consumer consumer) { + public R value(Consumer consumer) { throw new UnsupportedOperationException(); } diff --git a/criteria/common/test/org/immutables/criteria/ReflectionTest.java b/criteria/common/test/org/immutables/criteria/ReflectionTest.java index d933c7c45..caed389c6 100644 --- a/criteria/common/test/org/immutables/criteria/ReflectionTest.java +++ b/criteria/common/test/org/immutables/criteria/ReflectionTest.java @@ -1,6 +1,7 @@ package org.immutables.criteria; import org.immutables.criteria.constraints.DebugExpressionVisitor; +import org.immutables.criteria.constraints.StringCriteria; import org.junit.Ignore; import org.junit.Test; @@ -63,10 +64,11 @@ public void empty() { public void collection() { PersonCriteria.create() .friends.any().nickName.isNotEmpty() - .friends.any(f -> f.nickName.isNotEmpty()) + .friends.any(f -> f.nickName.isNotEmpty().nickName.isEmpty()) .aliases.none().contains("foo") .lastName.value().isNotEmpty() .lastName.value().hasSize(2) + .lastName.value(StringCriteria::isNotEmpty) .bestFriend.nickName.startsWith("foo"); } diff --git a/value-processor/src/org/immutables/value/processor/Criteria.generator b/value-processor/src/org/immutables/value/processor/Criteria.generator index 20106db7f..e8df46f4b 100644 --- a/value-processor/src/org/immutables/value/processor/Criteria.generator +++ b/value-processor/src/org/immutables/value/processor/Criteria.generator @@ -133,17 +133,17 @@ BooleanCriteria StringCriteria [else if a.optionalType] [if a.hasSimpleScalarElementType] - OptionalCriteria + OptionalCriteria [else if a.hasCriteria] - OptionalCriteria> + OptionalCriteria, [a.unwrappedElementType]Criteria.Start> [/if] [else if a.comparable] ComparableCriteria [else if a.collectionType] [if a.hasSimpleScalarElementType] - CollectionCriteria + CollectionCriteria [else if a.hasCriteria] - CollectionCriteria> + CollectionCriteria, [a.unwrappedElementType]Criteria.Start> [else] [output.error]Can't create criteria for collection [a.name] [a.unwrappedElementType][/output.error] [/if] @@ -155,15 +155,15 @@ StringCriteria [/output.trim][/template] [-- Used to create criteria for T (eg. List) when T is a scalar / comparable--] -[template scalarElementCriteria Attribute a][output.trim] +[template scalarElementCriteria Attribute a String elementName][output.trim] [if a.unwrappedElementType eq 'boolean'] - BooleanCriteria + BooleanCriteria<[elementName]> [else if a.unwrappedElementType eq 'java.lang.String'] - StringCriteria + StringCriteria<[elementName]> [else if a.isMaybeComparableKey] - ComparableCriteria + ComparableCriteria<[elementName], [a.wrappedElementType]> [else] - [output.error]unexpected type [a.name] [a.unwrappedElementType], not a simple one[/output.error] + [output.error]unexpected type [a.name] [a.unwrappedElementType]<[elementName]>, not a simple one[/output.error] [/if] [/output.trim][/template]