diff --git a/pom.xml b/pom.xml
index b3e0453..06202c8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,6 +7,18 @@
com.jesuspinar
booksearch
0.0.2
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ 17
+
+
+
+
booksearch
Search books from a global book database
@@ -22,8 +34,8 @@
- 1.8
- 1.8
+ 17
+ 17
\ No newline at end of file
diff --git a/src/main/java/com/jesuspinar/booksearch/service/BookQueryService.java b/src/main/java/com/jesuspinar/booksearch/service/BookQueryService.java
new file mode 100644
index 0000000..2dd66e1
--- /dev/null
+++ b/src/main/java/com/jesuspinar/booksearch/service/BookQueryService.java
@@ -0,0 +1,56 @@
+package com.jesuspinar.booksearch.service;
+
+import com.jesuspinar.booksearch.dao.BookDao;
+import com.jesuspinar.booksearch.model.Book;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+@Service
+public class BookQueryService implements IBookQueryService{
+
+ @Autowired
+ BookDao dao;
+
+ private Predicate predicate;
+
+ @PostConstruct
+ public void init() {
+ predicate = null;
+ }
+
+ @Override
+ public Collection exec() {
+ return dao.findAll()
+ .stream()
+ .filter(predicate)
+ .collect(Collectors.toList());
+ }
+
+ @Override
+ public IBookQueryService anyGenre(String... genre) {
+ Predicate pAnyGenre = (book -> Arrays.stream(genre).anyMatch(book.getGenre()::contains));
+ predicate = (predicate == null) ? pAnyGenre : predicate.and(pAnyGenre);
+ return this;
+ }
+
+ @Override
+ public IBookQueryService allGenres(String... genres) {
+ Predicate pAnyGenre = (book -> Arrays.stream(genres).allMatch(book.getGenre()::contains));
+ predicate = (predicate == null) ? pAnyGenre : predicate.and(pAnyGenre);
+ return this;
+ }
+
+ @Override
+ public IBookQueryService anyTitle(String title) {
+ Predicate pTitleContains = (book -> book.getTitle().toLowerCase().contains(title.toLowerCase()));
+ predicate = (predicate == null) ? pTitleContains : predicate.and(pTitleContains);
+
+ return this;
+ }
+}
diff --git a/src/main/java/com/jesuspinar/booksearch/service/BookService.java b/src/main/java/com/jesuspinar/booksearch/service/BookService.java
new file mode 100644
index 0000000..915e759
--- /dev/null
+++ b/src/main/java/com/jesuspinar/booksearch/service/BookService.java
@@ -0,0 +1,57 @@
+package com.jesuspinar.booksearch.service;
+
+import com.jesuspinar.booksearch.dao.BookDao;
+import com.jesuspinar.booksearch.model.Book;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+
+@Service
+public class BookService implements IBookService{
+
+ @Autowired
+ BookDao bookDao;
+
+ @Autowired
+ IBookQueryService queryService;
+
+
+ @Override
+ public Collection findAllGenres() {
+ List result = null;
+
+ result = bookDao.findAll()
+ .stream()
+ .map(book -> book.getGenre())
+ //.flatMap(l -> Stream.of(l))//TODO: Check this if other java version!
+ .distinct()
+ .sorted()
+ .collect(Collectors.toList());
+
+ return result;
+ }
+
+ @Override
+ public Collection findByAnyGenre(String... genres) {
+ return queryService.anyGenre(genres).exec();
+ }
+
+ @Override
+ public Collection findByAllGenres(String... genres) {
+ return queryService.allGenres(genres).exec();
+ }
+
+ @Override
+ public Collection findByTitleContains(String title) {
+ return queryService.anyTitle(title).exec();
+ }
+
+ @Override
+ public Collection findAll() {
+ return bookDao.findAll();
+ }
+}
diff --git a/src/main/java/com/jesuspinar/booksearch/service/IBookQueryService.java b/src/main/java/com/jesuspinar/booksearch/service/IBookQueryService.java
new file mode 100644
index 0000000..67ffeda
--- /dev/null
+++ b/src/main/java/com/jesuspinar/booksearch/service/IBookQueryService.java
@@ -0,0 +1,15 @@
+package com.jesuspinar.booksearch.service;
+
+import com.jesuspinar.booksearch.model.Book;
+
+import java.util.Collection;
+
+public interface IBookQueryService {
+ public Collection exec();
+ public IBookQueryService anyGenre(String... genre);
+ public IBookQueryService allGenres(String... genres);
+ //public IBookQueryService anyAuthor(String... author);
+ //public IBookQueryService allAuthors(String... genres);
+ public IBookQueryService anyTitle(String title);
+
+}
diff --git a/src/main/java/com/jesuspinar/booksearch/service/IBookService.java b/src/main/java/com/jesuspinar/booksearch/service/IBookService.java
new file mode 100644
index 0000000..ee6672c
--- /dev/null
+++ b/src/main/java/com/jesuspinar/booksearch/service/IBookService.java
@@ -0,0 +1,13 @@
+package com.jesuspinar.booksearch.service;
+
+import com.jesuspinar.booksearch.model.Book;
+
+import java.util.Collection;
+
+public interface IBookService {
+ public Collection findAllGenres();
+ public Collection findByAnyGenre(String... genres);
+ public Collection findByAllGenres(String... genres);
+ public Collection findByTitleContains(String title);
+ public Collection findAll();
+}