package org.infinispan.client.hotrod.query;
import static org.infinispan.client.hotrod.test.HotRodClientTestingUtil.killRemoteCacheManager;
import static org.infinispan.client.hotrod.test.HotRodClientTestingUtil.killServers;
import static org.infinispan.server.hotrod.test.HotRodTestingUtil.hotRodCacheConfiguration;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import java.io.IOException;
import java.time.Instant;
import java.util.List;
import org.infinispan.Cache;
import org.infinispan.client.hotrod.RemoteCache;
import org.infinispan.client.hotrod.RemoteCacheManager;
import org.infinispan.client.hotrod.Search;
import org.infinispan.client.hotrod.exceptions.HotRodClientException;
import org.infinispan.client.hotrod.marshall.ProtoStreamMarshaller;
import org.infinispan.client.hotrod.query.testdomain.protobuf.ModelFactoryPB;
import org.infinispan.client.hotrod.query.testdomain.protobuf.marshallers.MarshallerRegistration;
import org.infinispan.client.hotrod.query.testdomain.protobuf.marshallers.NotIndexedMarshaller;
import org.infinispan.client.hotrod.test.HotRodClientTestingUtil;
import org.infinispan.commons.util.Util;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.cache.Index;
import org.infinispan.protostream.FileDescriptorSource;
import org.infinispan.protostream.SerializationContext;
import org.infinispan.query.dsl.Query;
import org.infinispan.query.dsl.QueryFactory;
import org.infinispan.query.dsl.embedded.QueryStringTest;
import org.infinispan.query.dsl.embedded.testdomain.ModelFactory;
import org.infinispan.query.dsl.embedded.testdomain.User;
import org.infinispan.query.remote.client.ProtobufMetadataManagerConstants;
import org.infinispan.server.hotrod.HotRodServer;
import org.testng.annotations.AfterClass;
import org.testng.annotations.Test;
/**
* Test for query language in remote mode.
*
* @author anistor@redhat.com
* @since 9.0
*/
@Test(groups = "functional", testName = "client.hotrod.query.RemoteQueryStringTest")
public class RemoteQueryStringTest extends QueryStringTest {
private static final String NOT_INDEXED_PROTO_SCHEMA = "package sample_bank_account;\n" +
"/* @Indexed(false) */\n" +
"message NotIndexed {\n" +
"\toptional string notIndexedField = 1;\n" +
"}\n";
protected HotRodServer hotRodServer;
protected RemoteCacheManager remoteCacheManager;
protected RemoteCache<Object, Object> remoteCache;
protected Cache<Object, Object> cache;
@Override
protected QueryFactory getQueryFactory() {
return Search.getQueryFactory(remoteCache);
}
@Override
protected ModelFactory getModelFactory() {
return ModelFactoryPB.INSTANCE;
}
@Override
protected RemoteCache<Object, Object> getCacheForQuery() {
return remoteCache;
}
protected Cache<Object, Object> getEmbeddedCache() {
return cache;
}
@Override
protected void createCacheManagers() throws Throwable {
ConfigurationBuilder cfg = getConfigurationBuilder();
createClusteredCaches(1, cfg);
cache = manager(0).getCache();
hotRodServer = HotRodClientTestingUtil.startHotRodServer(manager(0));
org.infinispan.client.hotrod.configuration.ConfigurationBuilder clientBuilder = new org.infinispan.client.hotrod.configuration.ConfigurationBuilder();
clientBuilder.addServer().host("127.0.0.1").port(hotRodServer.getPort());
clientBuilder.marshaller(new ProtoStreamMarshaller());
remoteCacheManager = new RemoteCacheManager(clientBuilder.build());
remoteCache = remoteCacheManager.getCache();
initProtoSchema(remoteCacheManager);
}
protected void initProtoSchema(RemoteCacheManager remoteCacheManager) throws IOException {
//initialize server-side serialization context
RemoteCache<String, String> metadataCache = remoteCacheManager.getCache(ProtobufMetadataManagerConstants.PROTOBUF_METADATA_CACHE_NAME);
metadataCache.put("sample_bank_account/bank.proto", Util.read(Util.getResourceAsStream("/sample_bank_account/bank.proto", getClass().getClassLoader())));
metadataCache.put("not_indexed.proto", NOT_INDEXED_PROTO_SCHEMA);
assertFalse(metadataCache.containsKey(ProtobufMetadataManagerConstants.ERRORS_KEY_SUFFIX));
//initialize client-side serialization context
SerializationContext serCtx = ProtoStreamMarshaller.getSerializationContext(remoteCacheManager);
MarshallerRegistration.registerMarshallers(serCtx);
serCtx.registerProtoFiles(FileDescriptorSource.fromString("not_indexed.proto", NOT_INDEXED_PROTO_SCHEMA));
serCtx.registerMarshaller(new NotIndexedMarshaller());
}
protected ConfigurationBuilder getConfigurationBuilder() {
ConfigurationBuilder builder = hotRodCacheConfiguration();
builder.indexing().index(Index.ALL)
.addProperty("default.directory_provider", "ram")
.addProperty("lucene_version", "LUCENE_CURRENT");
return builder;
}
@AfterClass(alwaysRun = true)
public void release() {
killRemoteCacheManager(remoteCacheManager);
killServers(hotRodServer);
}
@Test(expectedExceptions = HotRodClientException.class, expectedExceptionsMessageRegExp = "org.infinispan.objectfilter.ParsingException: ISPN014036: Prefix, wildcard or regexp queries cannot be fuzzy.*")
@Override
public void testFullTextWildcardFuzzyNotAllowed() throws Exception {
super.testFullTextWildcardFuzzyNotAllowed();
}
@Test(expectedExceptions = HotRodClientException.class, expectedExceptionsMessageRegExp = "org.infinispan.objectfilter.ParsingException: ISPN028526: Invalid query.*")
@Override
public void testFullTextRegexpFuzzyNotAllowed() throws Exception {
super.testFullTextRegexpFuzzyNotAllowed();
}
@Test(expectedExceptions = HotRodClientException.class, expectedExceptionsMessageRegExp = "org.infinispan.objectfilter.ParsingException: ISPN028522: .*property is analyzed.*")
@Override
public void testExactMatchOnAnalyzedFieldNotAllowed() throws Exception {
// exception is wrapped in HotRodClientException
super.testExactMatchOnAnalyzedFieldNotAllowed();
}
@Test(expectedExceptions = HotRodClientException.class, expectedExceptionsMessageRegExp = "org.infinispan.objectfilter.ParsingException: ISPN028521: .*unless the property is indexed and analyzed.*")
@Override
public void testFullTextTermOnNonAnalyzedFieldNotAllowed() throws Exception {
// exception is wrapped in HotRodClientException
super.testFullTextTermOnNonAnalyzedFieldNotAllowed();
}
/**
* This test is overridden because instants need special handling for protobuf (being actually emulated as long
* timestamps).
*/
@Override
public void testInstant1() throws Exception {
QueryFactory qf = getQueryFactory();
Query q = qf.create("from " + getModelFactory().getUserTypeName() + " u where u.creationDate = " + Instant.parse("2011-12-03T10:15:30Z").toEpochMilli());
List<User> list = q.list();
assertEquals(3, list.size());
}
/**
* This test is overridden because instants need special handling for protobuf (being actually emulated as long
* timestamps).
*/
@Override
public void testInstant2() throws Exception {
QueryFactory qf = getQueryFactory();
Query q = qf.create("from " + getModelFactory().getUserTypeName() + " u where u.passwordExpirationDate = " + Instant.parse("2011-12-03T10:15:30Z").toEpochMilli());
List<User> list = q.list();
assertEquals(3, list.size());
}
}