From 32ac52db75f6943ee195a50089df5d8462cddfa4 Mon Sep 17 00:00:00 2001 From: mrbatista Date: Tue, 31 Mar 2015 11:32:50 +0200 Subject: [PATCH] Added method `getUniqueResult()` in class `CursorEntity`. This method return `Object` if result of AQL query return one element. Throw `NonUniqueResultException` if call method and size is greater than one. --- .../arangodb/NonUniqueResultException.java | 15 ++++++ .../com/arangodb/entity/CursorEntity.java | 8 +++ .../com/arangodb/ArangoDriverCursorTest.java | 51 ++++++++++++++++++- 3 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/arangodb/NonUniqueResultException.java diff --git a/src/main/java/com/arangodb/NonUniqueResultException.java b/src/main/java/com/arangodb/NonUniqueResultException.java new file mode 100644 index 000000000..13109d7bc --- /dev/null +++ b/src/main/java/com/arangodb/NonUniqueResultException.java @@ -0,0 +1,15 @@ +package com.arangodb; + +public class NonUniqueResultException extends RuntimeException { + + /** + * Constructs a NonUniqueResultException. + * + * @param resultCount + * The number of actual results. + */ + public NonUniqueResultException(int resultCount) { + super("Query did not return a unique result: " + resultCount); + } + +} diff --git a/src/main/java/com/arangodb/entity/CursorEntity.java b/src/main/java/com/arangodb/entity/CursorEntity.java index 29346902c..06f77660a 100644 --- a/src/main/java/com/arangodb/entity/CursorEntity.java +++ b/src/main/java/com/arangodb/entity/CursorEntity.java @@ -20,6 +20,7 @@ import java.util.List; import java.util.Map; +import com.arangodb.NonUniqueResultException; import com.arangodb.util.CollectionUtils; /** @@ -102,6 +103,13 @@ private void rangeCheck(int index) { public List getResults() { return results; } + + public T getUniqueResult() { + int size = size(); + if (size == 0) return null; + if (size > 1) throw new NonUniqueResultException(size); + return get(0); + } public boolean isHasMore() { return hasMore; diff --git a/src/test/java/com/arangodb/ArangoDriverCursorTest.java b/src/test/java/com/arangodb/ArangoDriverCursorTest.java index eee9cae52..ffebf0a45 100644 --- a/src/test/java/com/arangodb/ArangoDriverCursorTest.java +++ b/src/test/java/com/arangodb/ArangoDriverCursorTest.java @@ -18,6 +18,7 @@ import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; +import static org.hamcrest.core.StringStartsWith.startsWith; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; @@ -220,5 +221,53 @@ public void test_executeQueryFullCount() throws ArangoException { } - + @Test + public void test_executeQueryUniqueResult() throws ArangoException { + + // Collectionを作る + String collectionName = "unit_test_query_test"; + try { + driver.createCollection(collectionName); + } catch (ArangoException e) {} + driver.truncateCollection(collectionName); + + // テストデータを作る + for (int i = 0; i < 100; i++) { + TestComplexEntity01 value = new TestComplexEntity01( + "user_" + (i % 10), + "desc" + (i % 10), + i); + driver.createDocument(collectionName, value, null, null); + } + + //String query = "SELECT t FROM unit_test_query_test t WHERE t.age >= @age@"; + String query = "FOR t IN unit_test_query_test FILTER t.age >= @age LIMIT 2 RETURN t"; + Map bindVars = new MapBuilder().put("age", 10).get(); + + // 全件とれる範囲 + { + CursorEntity result = driver.executeQuery( + query, bindVars, TestComplexEntity01.class, true, 0); + assertThat(result.size(), is(2)); + assertThat(result.getCount(), is(2)); + String msg = ""; + try { + result.getUniqueResult(); + } catch (NonUniqueResultException e) { + msg = e.getMessage(); + } + assertThat(msg, startsWith("Query did not return a unique result:")); + } + + //String query = "SELECT t FROM unit_test_query_test t WHERE t.age >= @age@"; + query = "FOR t IN unit_test_query_test FILTER t.age == @age LIMIT 2 RETURN t"; + { + CursorEntity result = driver.executeQuery( + query, bindVars, TestComplexEntity01.class, true, 0); + assertThat(result.size(), is(1)); + assertThat(result.getCount(), is(1)); + TestComplexEntity01 entity = result.getUniqueResult(); + assertThat(entity.getAge(), is(10)); + } + } }