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 + 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(); +}