From 336a679ca3fec080b127d4f5b1610644e9f980b0 Mon Sep 17 00:00:00 2001 From: Daniil Cheban <danikcheban2007@gmail.com> Date: Tue, 24 Dec 2024 20:26:20 +0300 Subject: [PATCH] Consider supporting in, containing, not in, not containing query method keywords Closes gh-14 --- .../query/ReindexerRepositoryQuery.java | 13 +++++ .../repository/ReindexerRepositoryTests.java | 55 +++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/src/main/java/org/springframework/data/reindexer/repository/query/ReindexerRepositoryQuery.java b/src/main/java/org/springframework/data/reindexer/repository/query/ReindexerRepositoryQuery.java index b081b97..bf3a5c3 100644 --- a/src/main/java/org/springframework/data/reindexer/repository/query/ReindexerRepositoryQuery.java +++ b/src/main/java/org/springframework/data/reindexer/repository/query/ReindexerRepositoryQuery.java @@ -15,6 +15,7 @@ */ package org.springframework.data.reindexer.repository.query; +import java.util.Collection; import java.util.Iterator; import ru.rt.restream.reindexer.Namespace; @@ -101,6 +102,12 @@ private Query<?> where(Part part, Query<?> criteria, Iterator<Object> parameters return criteria.where(indexName, Query.Condition.LT, parameters.next()); case LESS_THAN_EQUAL: return criteria.where(indexName, Query.Condition.LE, parameters.next()); + case IN: + case CONTAINING: + return createInQuery(criteria, indexName, parameters); + case NOT_IN: + case NOT_CONTAINING: + return createInQuery(criteria.not(), indexName, parameters); case IS_NOT_NULL: return criteria.isNotNull(indexName); case IS_NULL: @@ -114,6 +121,12 @@ private Query<?> where(Part part, Query<?> criteria, Iterator<Object> parameters } } + private Query<?> createInQuery(Query<?> criteria, String indexName, Iterator<Object> parameters) { + Object value = parameters.next(); + Assert.isInstanceOf(Collection.class, value, () -> "Expected Collection but got " + value); + return criteria.where(indexName, Query.Condition.SET, (Collection<?>) value); + } + @Override public ReindexerQueryMethod getQueryMethod() { return this.queryMethod; diff --git a/src/test/java/org/springframework/data/reindexer/repository/ReindexerRepositoryTests.java b/src/test/java/org/springframework/data/reindexer/repository/ReindexerRepositoryTests.java index 6c54409..ddd132c 100644 --- a/src/test/java/org/springframework/data/reindexer/repository/ReindexerRepositoryTests.java +++ b/src/test/java/org/springframework/data/reindexer/repository/ReindexerRepositoryTests.java @@ -539,6 +539,54 @@ public void deleteAll() { assertEquals(0, this.repository.count()); } + @Test + public void findByIdIn() { + List<TestItem> expectedItems = new ArrayList<>(); + for (long i = 0; i < 100; i++) { + expectedItems.add(this.repository.save(new TestItem(i, "TestName" + i, "TestValue" + i))); + } + List<TestItem> foundItems = this.repository.findByIdIn(expectedItems.stream() + .map(TestItem::getId) + .collect(Collectors.toList())); + assertEquals(expectedItems.size(), foundItems.size()); + } + + @Test + public void findByIdContaining() { + List<TestItem> expectedItems = new ArrayList<>(); + for (long i = 0; i < 100; i++) { + expectedItems.add(this.repository.save(new TestItem(i, "TestName" + i, "TestValue" + i))); + } + List<TestItem> foundItems = this.repository.findByIdContaining(expectedItems.stream() + .map(TestItem::getId) + .collect(Collectors.toList())); + assertEquals(expectedItems.size(), foundItems.size()); + } + + @Test + public void findByIdNotIn() { + List<TestItem> expectedItems = new ArrayList<>(); + for (long i = 0; i < 100; i++) { + expectedItems.add(this.repository.save(new TestItem(i, "TestName" + i, "TestValue" + i))); + } + List<TestItem> foundItems = this.repository.findByIdNotIn(expectedItems.stream() + .map(TestItem::getId) + .collect(Collectors.toList())); + assertEquals(0, foundItems.size()); + } + + @Test + public void findByIdNotContaining() { + List<TestItem> expectedItems = new ArrayList<>(); + for (long i = 0; i < 100; i++) { + expectedItems.add(this.repository.save(new TestItem(i, "TestName" + i, "TestValue" + i))); + } + List<TestItem> foundItems = this.repository.findByIdNotContaining(expectedItems.stream() + .map(TestItem::getId) + .collect(Collectors.toList())); + assertEquals(0, foundItems.size()); + } + @Configuration @EnableReindexerRepositories(basePackageClasses = TestItemReindexerRepository.class, considerNestedRepositories = true) @EnableTransactionManagement @@ -642,6 +690,13 @@ Optional<TestItem> findOneSqlByNameAndValueManyParams(String name1, String name2 @Query("SELECT * FROM items") Stream<TestItem> findAllStreamSql(); + List<TestItem> findByIdIn(List<Long> ids); + + List<TestItem> findByIdContaining(List<Long> ids); + + List<TestItem> findByIdNotIn(List<Long> ids); + + List<TestItem> findByIdNotContaining(List<Long> ids); } @Namespace(name = NAMESPACE_NAME)