#1170 - ENH: Add isIn() methods as alias to in() on ExpressionList (for use with Kotlin where in is a keyword)

This commit is contained in:
Rob Bygrave
2017-10-16 23:13:49 +13:00
parent 96a4b93c75
commit 1005f177fd
4 changed files with 75 additions and 2 deletions
+32 -2
View File
@@ -453,13 +453,13 @@ public interface ExpressionList<T> {
/**
* Calls {@link #setUseQueryCache(CacheMode)} with <code>ON</code> or <code>OFF</code>.
*
*
* @see Query#setUseQueryCache(CacheMode)
*/
default Query<T> setUseQueryCache(boolean enabled) {
return setUseQueryCache(enabled ? CacheMode.ON : CacheMode.OFF);
}
/**
* Set to true if this query should execute against the doc store.
* <p>
@@ -807,6 +807,36 @@ public interface ExpressionList<T> {
*/
ExpressionList<T> in(String propertyName, Collection<?> values);
/**
* In - using a subQuery.
*
* This is exactly the same as in() and provided due to "in" being a Kotlin keyword
* (and hence to avoid the slightly ugly escaping when using in() in Kotlin)
*/
default ExpressionList<T> isIn(String propertyName, Query<?> subQuery) {
return in(propertyName, subQuery);
}
/**
* In - property has a value in the array of values.
*
* This is exactly the same as in() and provided due to "in" being a Kotlin keyword
* (and hence to avoid the slightly ugly escaping when using in() in Kotlin)
*/
default ExpressionList<T> isIn(String propertyName, Object... values) {
return in(propertyName, values);
}
/**
* In - property has a value in the collection of values.
*
* This is exactly the same as in() and provided due to "in" being a Kotlin keyword
* (and hence to avoid the slightly ugly escaping when using in() in Kotlin)
*/
default ExpressionList<T> isIn(String propertyName, Collection<?> values) {
return in(propertyName, values);
}
/**
* Not In - property has a value in the array of values.
*/
@@ -24,6 +24,17 @@ public class TestInEmpty extends BaseTestCase {
assertEquals(0, list.size());
}
@Test
public void test_isIn_empty() {
Query<Order> query = Ebean.find(Order.class).where().isIn("id", new Object[0]).gt("id", 0)
.query();
List<Order> list = query.findList();
assertThat(query.getGeneratedSql()).contains("1=0");
assertEquals(0, list.size());
}
@Test
public void test_notIn_empty() {
@@ -30,6 +30,24 @@ public class TestQueryInAssocOne extends BaseTestCase {
assertThat(sql).contains("t0.kcustomer_id in (?");
}
@Test
public void test_isIn() {
ResetBasicData.reset();
List<Customer> list = Ebean.find(Customer.class).where().lt("id", 300).findList();
Query<Order> query = Ebean.find(Order.class).where().isIn("customer", list).query();
query.findList();
String sql = query.getGeneratedSql();
assertThat(sql).contains("join o_customer t1 on t1.id = t0.kcustomer_id");
assertThat(sql).contains("t0.kcustomer_id in (?");
}
@Test
public void test_notIn() {
@@ -31,6 +31,20 @@ public class TestSubQuery extends BaseTestCase {
Ebean.find(Order.class).where().in("id", sq).findList();
}
@Test
public void test_IsIn() {
ResetBasicData.reset();
List<Integer> productIds = new ArrayList<>();
productIds.add(3);
Query<Order> sq = Ebean.createQuery(Order.class).select("id").where()
.isIn("details.product.id", productIds).query();
Ebean.find(Order.class).where().isIn("id", sq).findList();
}
public void testCompositeKey() {
ResetBasicData.reset();