From 8d792c2d20a38c29a0fbd613f70c0f834688d464 Mon Sep 17 00:00:00 2001 From: Pawel Hajduk Date: Wed, 2 Sep 2015 23:26:39 +0200 Subject: [PATCH] mapToOneOrNull replaced by mapToOneOrDefault --- .../squareup/sqlbrite/BriteDatabaseTest.java | 27 ++++++++++++------- .../squareup/sqlbrite/QueryObservable.java | 12 +++++---- .../squareup/sqlbrite/QueryToOneOperator.java | 16 +++++++---- 3 files changed, 36 insertions(+), 19 deletions(-) diff --git a/sqlbrite/src/androidTest/java/com/squareup/sqlbrite/BriteDatabaseTest.java b/sqlbrite/src/androidTest/java/com/squareup/sqlbrite/BriteDatabaseTest.java index 0c15c9dc..e6a8229a 100644 --- a/sqlbrite/src/androidTest/java/com/squareup/sqlbrite/BriteDatabaseTest.java +++ b/sqlbrite/src/androidTest/java/com/squareup/sqlbrite/BriteDatabaseTest.java @@ -145,6 +145,7 @@ public final class BriteDatabaseTest { db.createQuery(TABLE_EMPLOYEE, SELECT_EMPLOYEES) // .mapToList(new Func1() { private int count; + @Override public Employee call(Cursor cursor) { return count++ == 2 ? null : Employee.MAPPER.call(cursor); } @@ -207,30 +208,38 @@ public final class BriteDatabaseTest { } } - @Test public void queryMapToOneOrNull() { + @Test public void queryMapToOneOrDefault() { Employee employees = db.createQuery(TABLE_EMPLOYEE, SELECT_EMPLOYEES + " LIMIT 1") - .mapToOneOrNull(Employee.MAPPER) + .mapToOneOrDefault(Employee.MAPPER, null) .toBlocking() .first(); assertThat(employees).isEqualTo(new Employee("alice", "Alice Allison")); } - @Test public void queryMapToOneOrNullEmpty() { + @Test public void queryMapToOneOrDefaultEmpty() { Employee employees = db.createQuery(TABLE_EMPLOYEE, SELECT_EMPLOYEES + " WHERE 1=2") - .mapToOneOrNull(Employee.MAPPER) + .mapToOneOrDefault(Employee.MAPPER, new Employee("bob", "Bob Bobberson")) + .toBlocking() + .first(); + assertThat(employees).isEqualTo(new Employee("bob", "Bob Bobberson")); + } + + @Test public void queryMapToOneOrDefaultEmptyUsingNull() { + Employee employees = db.createQuery(TABLE_EMPLOYEE, SELECT_EMPLOYEES + " WHERE 1=2") + .mapToOneOrDefault(Employee.MAPPER, null) .toBlocking() .first(); assertThat(employees).isNull(); } - @Test public void queryMapToOneOrNullMapperReturnNullThrows() { + @Test public void queryMapToOneOrDefaultMapperReturnNullThrows() { BlockingObservable employees = db.createQuery(TABLE_EMPLOYEE, SELECT_EMPLOYEES) // - .mapToOneOrNull(new Func1() { + .mapToOneOrDefault(new Func1() { @Override public Employee call(Cursor cursor) { return null; } - }) // + }, null) // .toBlocking(); try { employees.first(); @@ -241,10 +250,10 @@ public final class BriteDatabaseTest { } } - @Test public void queryMapToOneOrNullMultipleRowsThrows() { + @Test public void queryMapToOneOrDefaultMultipleRowsThrows() { BlockingObservable employees = db.createQuery(TABLE_EMPLOYEE, SELECT_EMPLOYEES + " LIMIT 2") // - .mapToOneOrNull(Employee.MAPPER) // + .mapToOneOrDefault(Employee.MAPPER, null) // .toBlocking(); try { employees.first(); diff --git a/sqlbrite/src/main/java/com/squareup/sqlbrite/QueryObservable.java b/sqlbrite/src/main/java/com/squareup/sqlbrite/QueryObservable.java index 8a5884fe..a7fe06f6 100644 --- a/sqlbrite/src/main/java/com/squareup/sqlbrite/QueryObservable.java +++ b/sqlbrite/src/main/java/com/squareup/sqlbrite/QueryObservable.java @@ -36,7 +36,7 @@ public final class QueryObservable extends Observable { */ @CheckResult @NonNull public final Observable mapToOne(@NonNull final Func1 mapper) { - return lift(new QueryToOneOperator<>(mapper, false)); + return lift(new QueryToOneOperator<>(mapper, false, null)); } /** @@ -45,18 +45,20 @@ public final Observable mapToOne(@NonNull final Func1 mapper) *

* It is an error for a query to pass through this operator with more than 1 row in its result * set. Use {@code LIMIT 1} on the underlying SQL query to prevent this. Result sets with 0 rows - * emit {@code null}. + * emit {@code defaultValue}. *

* This method is equivalent to: *

{@code
-   * flatMap(q -> q.asRows(mapper).take(1).defaultIfEmpty(null))
+   * flatMap(q -> q.asRows(mapper).take(1).defaultIfEmpty(defaultValue))
    * }
* * @param mapper Maps the current {@link Cursor} row to {@code T}. May not return null. + * @param defaultValue Value returned if result set is empty */ @CheckResult @NonNull - public final Observable mapToOneOrNull(@NonNull final Func1 mapper) { - return lift(new QueryToOneOperator<>(mapper, true)); + public final Observable mapToOneOrDefault(@NonNull final Func1 mapper, + T defaultValue) { + return lift(new QueryToOneOperator<>(mapper, true, defaultValue)); } /** diff --git a/sqlbrite/src/main/java/com/squareup/sqlbrite/QueryToOneOperator.java b/sqlbrite/src/main/java/com/squareup/sqlbrite/QueryToOneOperator.java index eb1d0693..09f834f1 100644 --- a/sqlbrite/src/main/java/com/squareup/sqlbrite/QueryToOneOperator.java +++ b/sqlbrite/src/main/java/com/squareup/sqlbrite/QueryToOneOperator.java @@ -9,11 +9,13 @@ final class QueryToOneOperator implements Observable.Operator { private final Func1 mapper; - private final boolean emitNull; + private boolean emitDefault; + private T defaultValue; - QueryToOneOperator(Func1 mapper, boolean emitNull) { + QueryToOneOperator(Func1 mapper, boolean emitDefault, T defaultValue) { this.mapper = mapper; - this.emitNull = emitNull; + this.emitDefault = emitDefault; + this.defaultValue = defaultValue; } @Override public Subscriber call(final Subscriber subscriber) { @@ -35,8 +37,12 @@ final class QueryToOneOperator implements Observable.Operator