From 8970785ab8a8a66be8f2b325afcf735af087c524 Mon Sep 17 00:00:00 2001 From: Mohsin Husen Date: Mon, 28 Jan 2013 15:34:13 +0000 Subject: [PATCH] Added Support for IN Query and Added more test cases --- .../core/CriteriaQueryProcessor.java | 8 +- .../elasticsearch/core/query/Criteria.java | 10 +- .../CustomMethodRepositoryTest.java | 323 +++++++++--------- .../SampleCustomMethodRepository.java | 20 +- 4 files changed, 177 insertions(+), 184 deletions(-) diff --git a/src/main/java/org/springframework/data/elasticsearch/core/CriteriaQueryProcessor.java b/src/main/java/org/springframework/data/elasticsearch/core/CriteriaQueryProcessor.java index 7ddca32c..81c3e4a8 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/CriteriaQueryProcessor.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/CriteriaQueryProcessor.java @@ -94,7 +94,13 @@ class CriteriaQueryProcessor { query = rangeQuery(fieldName).from(ranges[0]).to(ranges[1]); break; case FUZZY: query = fuzzyQuery(fieldName, (String) value); break; - + case IN: + query = boolQuery(); + Iterable collection = (Iterable) value; + for(Object item : collection){ + ((BoolQueryBuilder) query).should(fieldQuery(fieldName, item)); + } + break; } return query; diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/Criteria.java b/src/main/java/org/springframework/data/elasticsearch/core/query/Criteria.java index 0f3dbfe2..083d074a 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/Criteria.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/Criteria.java @@ -340,13 +340,7 @@ public class Criteria { */ public Criteria in(Iterable values) { Assert.notNull(values, "Collection of 'in' values must not be null"); - for (Object value : values) { - if (value instanceof Collection) { - in((Collection) value); - } else { - is(value); - } - } + criteria.add(new CriteriaEntry(OperationKey.IN, values)); return this; } @@ -430,7 +424,7 @@ public class Criteria { } public enum OperationKey { - EQUALS, CONTAINS, STARTS_WITH, ENDS_WITH, EXPRESSION, BETWEEN, FUZZY; + EQUALS, CONTAINS, STARTS_WITH, ENDS_WITH, EXPRESSION, BETWEEN, FUZZY, IN; } public static class CriteriaEntry { diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/CustomMethodRepositoryTest.java b/src/test/java/org/springframework/data/elasticsearch/repositories/CustomMethodRepositoryTest.java index 59222e1c..950c0165 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/CustomMethodRepositoryTest.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/CustomMethodRepositoryTest.java @@ -227,170 +227,163 @@ public class CustomMethodRepositoryTest { assertThat(page.getTotalElements(), is(equalTo(1L))); } -// @Test -// @Ignore("Test failing due to java.lang.IllegalArgumentException: Invalid order syntax for part Message!") -// public void shouldExecuteCustomMethodForIn(){ -// //given -// String documentId = randomNumeric(5); -// SampleEntity sampleEntity = new SampleEntity(); -// sampleEntity.setId(documentId); -// sampleEntity.setType("test"); -// sampleEntity.setMessage("foo"); -// repository.save(sampleEntity); -// -// //given -// String documentId2 = randomNumeric(5); -// SampleEntity sampleEntity2 = new SampleEntity(); -// sampleEntity2.setId(documentId2); -// sampleEntity2.setType("test"); -// sampleEntity2.setMessage("bar"); -// repository.save(sampleEntity2); -// -// List ids = Arrays.asList(documentId,documentId2); -// -// -// //when -// Page page = repository.findByIdIn(ids, new PageRequest(1, 10)); -// //then -// assertThat(page, is(notNullValue())); -// assertThat(page.getTotalElements(), is(equalTo(2L))); -// } -// -// @Test -// @Ignore("Test failing due to java.lang.IllegalArgumentException: Invalid order syntax for part Message!") -// public void shouldExecuteCustomMethodForNotIn(){ -// //given -// String documentId = randomNumeric(5); -// SampleEntity sampleEntity = new SampleEntity(); -// sampleEntity.setId(documentId); -// sampleEntity.setType("test"); -// sampleEntity.setMessage("foo"); -// repository.save(sampleEntity); -// -// //given -// String documentId2 = randomNumeric(5); -// SampleEntity sampleEntity2 = new SampleEntity(); -// sampleEntity2.setId(documentId2); -// sampleEntity2.setType("test"); -// sampleEntity2.setMessage("bar"); -// repository.save(sampleEntity2); -// -// List ids = Arrays.asList(documentId); -// -// -// //when -// Page page = repository.findByIdNotIn(ids, new PageRequest(1, 10)); -// //then -// assertThat(page, is(notNullValue())); -// assertThat(page.getTotalElements(), is(equalTo(1L))); -// assertThat(page.getContent().get(0).getId(),is(documentId2)); -// } -// -// @Test -// @Ignore("Test failing due to java.lang.IllegalArgumentException: Invalid order syntax for part Message!") -// public void shouldExecuteCustomMethodForTrue(){ -// //given -// String documentId = randomNumeric(5); -// SampleEntity sampleEntity = new SampleEntity(); -// sampleEntity.setId(documentId); -// sampleEntity.setType("test"); -// sampleEntity.setMessage("foo"); -// sampleEntity.setAvailable(true); -// repository.save(sampleEntity); -// -// //given -// String documentId2 = randomNumeric(5); -// SampleEntity sampleEntity2 = new SampleEntity(); -// sampleEntity2.setId(documentId2); -// sampleEntity2.setType("test"); -// sampleEntity2.setMessage("bar"); -// sampleEntity2.setAvailable(false); -// repository.save(sampleEntity2); -// //when -// Page page = repository.findByAvailableTrue(new PageRequest(1, 10)); -// //then -// assertThat(page, is(notNullValue())); -// assertThat(page.getTotalElements(), is(equalTo(1L))); -// } -// -// @Test -// @Ignore("Test failing due to java.lang.IllegalArgumentException: Invalid order syntax for part Message!") -// public void shouldExecuteCustomMethodForFalse(){ -// //given -// String documentId = randomNumeric(5); -// SampleEntity sampleEntity = new SampleEntity(); -// sampleEntity.setId(documentId); -// sampleEntity.setType("test"); -// sampleEntity.setMessage("foo"); -// sampleEntity.setAvailable(true); -// repository.save(sampleEntity); -// -// //given -// String documentId2 = randomNumeric(5); -// SampleEntity sampleEntity2 = new SampleEntity(); -// sampleEntity2.setId(documentId2); -// sampleEntity2.setType("test"); -// sampleEntity2.setMessage("bar"); -// sampleEntity2.setAvailable(false); -// repository.save(sampleEntity2); -// //when -// Page page = repository.findByAvailableFalse(new PageRequest(1, 10)); -// //then -// assertThat(page, is(notNullValue())); -// assertThat(page.getTotalElements(), is(equalTo(1L))); -// } -// -// @Test -// @Ignore("Test failing due to java.lang.IllegalArgumentException: Invalid order syntax for part Message!") -// public void shouldExecuteCustomMethodForOrderBy(){ -// //given -// String documentId = randomNumeric(5); -// SampleEntity sampleEntity = new SampleEntity(); -// sampleEntity.setId(documentId); -// sampleEntity.setType("test"); -// sampleEntity.setMessage("foo"); -// sampleEntity.setAvailable(true); -// repository.save(sampleEntity); -// -// //given -// String documentId2 = randomNumeric(5); -// SampleEntity sampleEntity2 = new SampleEntity(); -// sampleEntity2.setId(documentId2); -// sampleEntity2.setType("test"); -// sampleEntity2.setMessage("bar"); -// sampleEntity2.setAvailable(false); -// repository.save(sampleEntity2); -// //when -// Page page = repository.findByMessageOrderByMessage("foo",new PageRequest(1, 10)); -// //then -// assertThat(page, is(notNullValue())); -// assertThat(page.getTotalElements(), is(equalTo(1L))); -// } -// -// @Test -// public void testCustomMethodForBoolean(){ -// //given -// String documentId = randomNumeric(5); -// SampleEntity sampleEntity = new SampleEntity(); -// sampleEntity.setId(documentId); -// sampleEntity.setType("test"); -// sampleEntity.setMessage("foo"); -// sampleEntity.setAvailable(true); -// repository.save(sampleEntity); -// -// //given -// String documentId2 = randomNumeric(5); -// SampleEntity sampleEntity2 = new SampleEntity(); -// sampleEntity2.setId(documentId2); -// sampleEntity2.setType("test"); -// sampleEntity2.setMessage("bar"); -// sampleEntity2.setAvailable(false); -// repository.save(sampleEntity2); -// //when -// Page page = repository.findByAvailable(false,new PageRequest(1, 10)); -// //then -// assertThat(page, is(notNullValue())); -// assertThat(page.getTotalElements(), is(equalTo(1L))); -// } + @Test + public void shouldExecuteCustomMethodForIn(){ + //given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setMessage("foo"); + repository.save(sampleEntity); + + //given + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setType("test"); + sampleEntity2.setMessage("bar"); + repository.save(sampleEntity2); + + List ids = Arrays.asList(documentId,documentId2); + + //when + Page page = repository.findByIdIn(ids, new PageRequest(1, 10)); + //then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(2L))); + } + + @Test + public void shouldExecuteCustomMethodForNotIn(){ + //given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setMessage("foo"); + repository.save(sampleEntity); + + //given + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setType("test"); + sampleEntity2.setMessage("bar"); + repository.save(sampleEntity2); + + List ids = Arrays.asList(documentId); + + //when + Page page = repository.findByIdNotIn(ids, new PageRequest(1, 10)); + //then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + assertThat(page.getContent().get(0).getId(),is(documentId2)); + } + + @Test + public void shouldExecuteCustomMethodForTrue(){ + //given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setMessage("foo"); + sampleEntity.setAvailable(true); + repository.save(sampleEntity); + + //given + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setType("test"); + sampleEntity2.setMessage("bar"); + sampleEntity2.setAvailable(false); + repository.save(sampleEntity2); + //when + Page page = repository.findByAvailableTrue(new PageRequest(1, 10)); + //then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + } + + @Test + public void shouldExecuteCustomMethodForFalse(){ + //given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setMessage("foo"); + sampleEntity.setAvailable(true); + repository.save(sampleEntity); + + //given + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setType("test"); + sampleEntity2.setMessage("bar"); + sampleEntity2.setAvailable(false); + repository.save(sampleEntity2); + //when + Page page = repository.findByAvailableFalse(new PageRequest(1, 10)); + //then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + } + + @Test + public void shouldExecuteCustomMethodForOrderBy(){ + //given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setMessage("foo"); + sampleEntity.setAvailable(true); + repository.save(sampleEntity); + + //given + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setType("test"); + sampleEntity2.setMessage("bar"); + sampleEntity2.setAvailable(false); + repository.save(sampleEntity2); + //when + Page page = repository.findByMessageOrderByTypeAsc("foo",new PageRequest(1, 10)); + //then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + } + + @Test + public void testCustomMethodForBoolean(){ + //given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setType("test"); + sampleEntity.setMessage("foo"); + sampleEntity.setAvailable(true); + repository.save(sampleEntity); + + //given + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setType("test"); + sampleEntity2.setMessage("bar"); + sampleEntity2.setAvailable(false); + repository.save(sampleEntity2); + //when + Page page = repository.findByAvailable(false,new PageRequest(1, 10)); + //then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + } } diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/SampleCustomMethodRepository.java b/src/test/java/org/springframework/data/elasticsearch/repositories/SampleCustomMethodRepository.java index 0c2021fa..14c0fe7b 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/SampleCustomMethodRepository.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/SampleCustomMethodRepository.java @@ -18,7 +18,7 @@ public interface SampleCustomMethodRepository extends ElasticsearchRepository findByMessage(String message, Pageable pageable); -// Page findByAvailable(boolean available, Pageable pageable); + Page findByAvailable(boolean available, Pageable pageable); Page findByRateLessThan(int rate, Pageable pageable); @@ -34,14 +34,14 @@ public interface SampleCustomMethodRepository extends ElasticsearchRepository findByMessageContaining(String message, Pageable pageable); -// Page findByIdIn(List ids, Pageable pageable); -// -// Page findByIdNotIn(List messages, Pageable pageable); -// -// Page findByAvailableTrue(Pageable pageable); -// -// Page findByAvailableFalse(Pageable pageable); -// -// Page findByMessageOrderByMessage(String message,Pageable pageable); + Page findByIdIn(List ids, Pageable pageable); + + Page findByIdNotIn(List messages, Pageable pageable); + + Page findByAvailableTrue(Pageable pageable); + + Page findByAvailableFalse(Pageable pageable); + + Page findByMessageOrderByTypeAsc(String message,Pageable pageable); }