package org.infinispan.query.remote.impl.indexing;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNotNull;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import org.apache.lucene.search.Query;
import org.hibernate.search.query.engine.spi.EntityInfo;
import org.hibernate.search.spi.SearchIntegrator;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.cache.Index;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.protostream.ProtobufUtil;
import org.infinispan.protostream.SerializationContext;
import org.infinispan.protostream.sampledomain.Address;
import org.infinispan.protostream.sampledomain.User;
import org.infinispan.protostream.sampledomain.marshallers.MarshallerRegistration;
import org.infinispan.query.Search;
import org.infinispan.query.SearchManager;
import org.infinispan.query.remote.impl.ProtobufMetadataManagerImpl;
import org.infinispan.test.SingleCacheManagerTest;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.infinispan.transaction.TransactionMode;
import org.testng.annotations.Test;
/**
* @author anistor@redhat.com
* @since 6.0
*/
@Test(groups = "functional", testName = "query.remote.impl.indexing.ProtobufWrapperIndexingTest")
public class ProtobufWrapperIndexingTest extends SingleCacheManagerTest {
protected EmbeddedCacheManager createCacheManager() throws Exception {
ConfigurationBuilder cfg = getDefaultStandaloneCacheConfig(true);
cfg.transaction().transactionMode(TransactionMode.TRANSACTIONAL)
.indexing().index(Index.ALL)
.addProperty("default.directory_provider", "ram")
.addProperty("lucene_version", "LUCENE_CURRENT");
return TestCacheManagerFactory.createCacheManager(cfg);
}
public void testIndexingWithWrapper() throws Exception {
SerializationContext serCtx = ProtobufMetadataManagerImpl.getSerializationContextInternal(cacheManager);
MarshallerRegistration.registerMarshallers(serCtx);
// Store some test data:
ProtobufValueWrapper wrapper1 = new ProtobufValueWrapper(createMarshalledUser(serCtx, "Adrian", "Nistor"));
ProtobufValueWrapper wrapper2 = new ProtobufValueWrapper(createMarshalledUser(serCtx, "John", "Batman"));
cache.put(1, wrapper1); //todo how do we index if the key is a byte array?
cache.put(2, wrapper2);
SearchManager sm = Search.getSearchManager(cache);
SearchIntegrator searchFactory = sm.unwrap(SearchIntegrator.class);
assertNotNull(searchFactory.getIndexManager(ProtobufValueWrapper.class.getName()));
Query luceneQuery = sm.buildQueryBuilderForClass(ProtobufValueWrapper.class)
.get()
.keyword()
.onField("name")
.ignoreFieldBridge()
.ignoreAnalyzer()
.matching("Adrian")
.createQuery();
List<ProtobufValueWrapper> list = sm.<ProtobufValueWrapper>getQuery(luceneQuery).list();
assertEquals(1, list.size());
ProtobufValueWrapper pvw = list.get(0);
User unwrapped = ProtobufUtil.fromWrappedByteArray(serCtx, pvw.getBinary());
assertEquals("Adrian", unwrapped.getName());
// an alternative approach ...
Query luceneQuery2 = searchFactory.buildQueryBuilder().forEntity(ProtobufValueWrapper.class).get()
.keyword()
.onField("name")
.ignoreFieldBridge()
.ignoreAnalyzer()
.matching("Adrian")
.createQuery();
List<EntityInfo> queryEntityInfos = searchFactory.createHSQuery(luceneQuery2, ProtobufValueWrapper.class)
.projection("surname")
.queryEntityInfos();
assertEquals(1, queryEntityInfos.size());
EntityInfo entityInfo = queryEntityInfos.get(0);
assertEquals("Nistor", entityInfo.getProjection()[0]);
}
private byte[] createMarshalledUser(SerializationContext serCtx, String name, String surname) throws IOException {
User user = new User();
user.setId(1);
user.setName(name);
user.setSurname(surname);
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 ProtobufUtil.toWrappedByteArray(serCtx, user);
}
}