package org.infinispan.server.test.query;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.infinispan.arquillian.core.InfinispanResource;
import org.infinispan.arquillian.core.RemoteInfinispanServer;
import org.infinispan.client.hotrod.Search;
import org.infinispan.commons.util.CloseableIterator;
import org.infinispan.protostream.sampledomain.Address;
import org.infinispan.protostream.sampledomain.User;
import org.infinispan.query.dsl.Query;
import org.infinispan.query.dsl.QueryFactory;
import org.infinispan.server.test.category.Queries;
import org.jboss.arquillian.junit.Arquillian;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
/**
* Tests for remote queries over HotRod on a local cache using RAM directory.
*
* @author Adrian Nistor
* @author Martin Gencur
*/
@Category(Queries.class)
@RunWith(Arquillian.class)
public class RemoteQueryIT extends RemoteQueryBaseIT {
@InfinispanResource("remote-query-1")
protected RemoteInfinispanServer server;
public RemoteQueryIT() {
super("clustered", "localtestcache");
}
protected RemoteQueryIT(String cacheContainerName, String cacheName) {
super(cacheContainerName, cacheName);
}
@Override
protected RemoteInfinispanServer getServer() {
return server;
}
@Test
public void testAttributeQuery() throws Exception {
remoteCache.put(1, createUser1());
remoteCache.put(2, createUser2());
// get user back from remote cache and check its attributes
User fromCache = remoteCache.get(1);
assertUser(fromCache);
// get user back from remote cache via query and check its attributes
QueryFactory qf = Search.getQueryFactory(remoteCache);
Query query = qf.from(User.class)
.having("name").eq("Tom")
.build();
List<User> list = query.list();
assertNotNull(list);
assertEquals(1, list.size());
assertEquals(User.class, list.get(0).getClass());
assertUser(list.get(0));
}
@Test
public void testEmbeddedAttributeQuery() throws Exception {
remoteCache.put(1, createUser1());
remoteCache.put(2, createUser2());
// get user back from remote cache via query and check its attributes
QueryFactory qf = Search.getQueryFactory(remoteCache);
Query query = qf.from(User.class)
.having("addresses.postCode").eq("1234")
.build();
List<User> list = query.list();
assertNotNull(list);
assertEquals(1, list.size());
assertEquals(User.class, list.get(0).getClass());
assertUser(list.get(0));
}
@Test
public void testProjections() throws Exception {
remoteCache.put(1, createUser1());
remoteCache.put(2, createUser2());
// get user back from remote cache and check its attributes
User fromCache = remoteCache.get(1);
assertUser(fromCache);
// get user back from remote cache via query and check its attributes
QueryFactory qf = Search.getQueryFactory(remoteCache);
Query query = qf.from(User.class)
.select("name", "surname")
.having("name").eq("Tom")
.build();
List<Object[]> list = query.list();
assertNotNull(list);
assertEquals(1, list.size());
assertEquals(Object[].class, list.get(0).getClass());
assertEquals("Tom", list.get(0)[0]);
assertEquals("Cat", list.get(0)[1]);
}
/**
* Sorting on a field that does not contain DocValues so Hibernate Search is forced to uninvert it.
* @see <a href="https://issues.jboss.org/browse/ISPN-5729">https://issues.jboss.org/browse/ISPN-5729</a>
*/
@Test
public void testUninverting() throws Exception {
remoteCache.put(1, createUser1());
remoteCache.put(2, createUser2());
QueryFactory qf = Search.getQueryFactory(remoteCache);
Query query = qf.from(User.class)
.having("name").eq("John")
.orderBy("id")
.build();
assertEquals(0, query.list().size());
}
@Test
public void testIteratorWithQuery() throws Exception {
remoteCache.put(1, createUser1());
remoteCache.put(2, createUser2());
QueryFactory qf = Search.getQueryFactory(remoteCache);
Query simpleQuery = qf.from(User.class).having("name").eq("Tom").build();
List<Map.Entry<Object, Object>> entries = new ArrayList<>(1);
try (CloseableIterator<Map.Entry<Object, Object>> iter = remoteCache.retrieveEntriesByQuery(simpleQuery, null, 3)) {
while (iter.hasNext()) {
entries.add(iter.next());
}
}
assertEquals(1, entries.size());
assertEquals("Cat", ((User) entries.get(0).getValue()).getSurname());
}
@Test
public void testIteratorWithQueryAndProjections() throws Exception {
remoteCache.put(1, createUser1());
remoteCache.put(2, createUser2());
QueryFactory qf = Search.getQueryFactory(remoteCache);
Query simpleQuery = qf.from(User.class).select("surname", "name").having("name").eq("Tom").build();
List<Map.Entry<Object, Object>> entries = new ArrayList<>(1);
try (CloseableIterator<Map.Entry<Object, Object>> iter = remoteCache.retrieveEntriesByQuery(simpleQuery, null, 3)) {
while (iter.hasNext()) {
entries.add(iter.next());
}
}
assertEquals(1, entries.size());
Object[] projections = (Object[]) entries.get(0).getValue();
assertEquals("Cat", projections[0]);
assertEquals("Tom", projections[1]);
}
private User createUser1() {
User user = new User();
user.setId(1);
user.setName("Tom");
user.setSurname("Cat");
user.setGender(User.Gender.MALE);
user.setAccountIds(Collections.singleton(12));
Address address = new Address();
address.setStreet("Dark Alley");
address.setPostCode("1234");
user.setAddresses(Collections.singletonList(address));
return user;
}
private User createUser2() {
User user = new User();
user.setId(2);
user.setName("Adrian");
user.setSurname("Nistor");
user.setGender(User.Gender.MALE);
Address address = new Address();
address.setStreet("Old Street");
address.setPostCode("XYZ");
user.setAddresses(Collections.singletonList(address));
return user;
}
private void assertUser(User user) {
assertNotNull(user);
assertEquals(1, user.getId());
assertEquals("Tom", user.getName());
assertEquals("Cat", user.getSurname());
assertEquals(User.Gender.MALE, user.getGender());
assertNotNull(user.getAccountIds());
assertEquals(1, user.getAccountIds().size());
assertTrue(user.getAccountIds().contains(12));
assertNotNull(user.getAddresses());
assertEquals(1, user.getAddresses().size());
assertEquals("Dark Alley", user.getAddresses().get(0).getStreet());
assertEquals("1234", user.getAddresses().get(0).getPostCode());
}
}