package org.littlewings.hazelcast.spring;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.query.EntryObject;
import com.hazelcast.query.Predicate;
import com.hazelcast.query.PredicateBuilder;
import com.hazelcast.query.Predicates;
import com.hazelcast.query.SqlPredicate;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.littlewings.hazelcast.spring.entity.Book;
import org.littlewings.hazelcast.spring.repository.BookRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.data.keyvalue.core.KeyValueOperations;
import org.springframework.data.keyvalue.core.query.KeyValueQuery;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.assertj.core.api.Assertions.assertThat;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = HazelcastConfig.class)
public class SpringDataHazelcastTest {
@Autowired
BookRepository bookRepository;
@Before
public void setUp() {
bookRepository.delete(bookRepository.findAll());
}
@Test
public void saveAndFind() {
bookRepository.save(Book.create("978-1785285332", "Getting Started With Hazelcast", 3848));
assertThat(bookRepository.findOne("978-1785285332").getTitle())
.isEqualTo("Getting Started With Hazelcast");
assertThat(bookRepository.findAll())
.hasSize(1);
assertThat(bookRepository.count())
.isEqualTo(1);
}
@Autowired
HazelcastInstance hazelcast;
@Test
public void saveAndFindAndUnderlying() {
bookRepository.save(Book.create("978-1785285332", "Getting Started With Hazelcast", 3848));
assertThat(bookRepository.findOne("978-1785285332").getTitle())
.isEqualTo("Getting Started With Hazelcast");
assertThat(bookRepository.findAll())
.hasSize(1);
assertThat(bookRepository.count())
.isEqualTo(1);
// assertThat(hazelcast.getMap("org.littlewings.hazelcast.spring.entity.Book"))
// .hasSize(1);
assertThat(hazelcast.getMap("books"))
.hasSize(1);
assertThat(hazelcast.<String, Book>getMap("books").get("978-1785285332").getTitle())
.isEqualTo("Getting Started With Hazelcast");
}
@Test
public void query() {
bookRepository.save(Arrays.asList(Book.create("978-1785285332", "Getting Started With Hazelcast", 3848),
Book.create("978-1782169970", "Infinispan Data Grid Platform Definitive Guide", 4947),
Book.create("978-1783988181", "Mastering Redis", 6172)));
assertThat(bookRepository.findByTitle("Getting Started With Hazelcast").getPrice())
.isEqualTo(3848);
List<Book> books = bookRepository.findByPriceGreaterThan(4000);
assertThat(books.stream().map(Book::getTitle).collect(Collectors.toList()))
.hasSize(2)
.containsExactly("Infinispan Data Grid Platform Definitive Guide", "Mastering Redis");
}
@Autowired
KeyValueOperations keyValueOperations;
@Test
public void usingPredicates() {
bookRepository.save(Arrays.asList(Book.create("978-1785285332", "Getting Started With Hazelcast", 3848),
Book.create("978-1782169970", "Infinispan Data Grid Platform Definitive Guide", 4947),
Book.create("978-1783988181", "Mastering Redis", 6172)));
Predicate<String, Book> predicate =
Predicates.and(Predicates.equal("isbn", "978-1785285332"), Predicates.greaterEqual("price", 3000));
KeyValueQuery<Predicate<String, Book>> query = new KeyValueQuery<>(predicate);
Iterable<Book> books = keyValueOperations.find(query, Book.class);
assertThat(StreamSupport.stream(books.spliterator(), false).map(Book::getTitle).collect(Collectors.toList()))
.hasSize(1)
.containsExactly("Getting Started With Hazelcast");
}
@Test
public void usingPredicateBuilder() {
bookRepository.save(Arrays.asList(Book.create("978-1785285332", "Getting Started With Hazelcast", 3848),
Book.create("978-1782169970", "Infinispan Data Grid Platform Definitive Guide", 4947),
Book.create("978-1783988181", "Mastering Redis", 6172)));
EntryObject e = new PredicateBuilder().getEntryObject();
Predicate<String, Book> predicate =
e.get("isbn").equal("978-1785285332").and(e.get("price").greaterEqual(3000));
KeyValueQuery<Predicate<String, Book>> query = new KeyValueQuery<>(predicate);
Iterable<Book> books = keyValueOperations.find(query, Book.class);
assertThat(StreamSupport.stream(books.spliterator(), false).map(Book::getTitle).collect(Collectors.toList()))
.hasSize(1)
.containsExactly("Getting Started With Hazelcast");
}
@Test
public void usingSqlPredicate() {
bookRepository.save(Arrays.asList(Book.create("978-1785285332", "Getting Started With Hazelcast", 3848),
Book.create("978-1782169970", "Infinispan Data Grid Platform Definitive Guide", 4947),
Book.create("978-1783988181", "Mastering Redis", 6172)));
Predicate<String, Book> predicate = new SqlPredicate("price > 4000");
KeyValueQuery<Predicate<String, Book>> query = new KeyValueQuery<>(predicate);
query.setSort(new Sort(Sort.Direction.DESC, "price"));
Iterable<Book> books = keyValueOperations.find(query, Book.class);
assertThat(StreamSupport.stream(books.spliterator(), false).map(Book::getTitle).collect(Collectors.toList()))
.hasSize(2)
.containsExactly("Mastering Redis", "Infinispan Data Grid Platform Definitive Guide");
}
}