the searchable cache indexes are not updated if there were data manipulation in
transaction or batch
-----------------------------------------------------------------------------------------------------
Key: JBCACHE-1495
URL:
https://jira.jboss.org/jira/browse/JBCACHE-1495
Project: JBoss Cache
Issue Type: Bug
Security Level: Public (Everyone can see)
Components: SearchableCache
Environment: searchable cache version 1.0.0 GA
Reporter: Yan Falken
Assignee: Manik Surtani
Priority: Blocker
// runnable unit test:
package problems;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.ProvidedId;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.Store;
import org.jboss.cache.*;
import org.jboss.cache.loader.jdbm.JdbmCacheLoaderConfig;
import org.jboss.cache.config.Configuration;
import org.jboss.cache.config.CacheLoaderConfig;
import org.jboss.cache.search.SearchableCacheFactory;
import org.jboss.cache.search.SearchableCache;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.index.Term;
import static org.testng.AssertJUnit.*;
import java.util.Properties;
import java.io.Serializable;
@Test(groups = {"unit"}, sequential = true)
public class IndexingInTransaction {
private static final Fqn fname = Fqn.fromString("blah");
private Cache coreCache;
private SearchableCache searchableCache;
Node node;
public IndexingInTransaction() {
init();
}
@BeforeMethod
public void init() {
CacheFactory factory = new DefaultCacheFactory();
Configuration c = new Configuration();
c.setInvocationBatchingEnabled(true);
CacheLoaderConfig clc = new CacheLoaderConfig();
JdbmCacheLoaderConfig jclc = new JdbmCacheLoaderConfig();
jclc.setAsync(false);
jclc.setFetchPersistentState(false);
jclc.setIgnoreModifications(false);
jclc.setPurgeOnStartup(true);
jclc.setLocation("/tmp/c1");
clc.addIndividualCacheLoaderConfig(jclc);
c.setCacheLoaderConfig(clc);
coreCache = factory.createCache(c, false);
SearchableCacheFactory f = new SearchableCacheFactory();
Properties p = new Properties();
p.put("hibernate.search.default.indexBase", "/tmp/c1idx");
searchableCache = f.createSearchableCache(coreCache, p, Entity.class);
searchableCache.create();
searchableCache.start();
node = searchableCache.getRoot().addChild(fname);
}
@Test
public void testPutEntitiesWithoutTransaction() {
for (int i = 1; i <= 10; i++) {
Entity e = getEntity(i);
System.out.println("caching: " + e);
Node c = node.addChild(Fqn.fromString(e.getName()));
c.put(""+ e.getId(), e);
}
assertFalse(searchableCache.createQuery(
Entity.searchByName("Name5")).list().isEmpty());
}
@Test
public void testPutEntitiesWithTransaction() throws Exception {
((CacheSPI)(coreCache)).getTransactionManager().begin();
for (int i = 11; i <= 20; i++) {
Entity e = getEntity(i);
System.out.println("caching: " + e);
Node c = node.addChild(Fqn.fromString(e.getName()));
c.put(""+ e.getId(), e);
}
((CacheSPI)(coreCache)).getTransactionManager().commit();
assertFalse(searchableCache.createQuery(
Entity.searchByName("Name15")).list().isEmpty());
}
Entity getEntity(long id) {
return new Entity(id, "Name" + id, "Surname" + id, true);
}
// public static void main(String[] args) {
// IndexingInTransaction stb = new IndexingInTransaction();
// stb.init();
// }
}
@ProvidedId
@Indexed
class Entity implements Serializable {
public static final String IDX_NAME = "name";
public static final String IDX_SURNAME = "surname";
private long id;
@Field(store = Store.YES)
private String name;
@Field (store = Store.YES)
private String surname;
private boolean dead;
Entity(long id, String name, String surname, boolean dead) {
this.id = id;
this.name = name;
this.surname = surname;
this.dead = dead;
}
public long getId() {
return id;
}
public String getName() {
return name;
}
public String getSurname() {
return surname;
}
public boolean isDead() {
return dead;
}
public static Query searchByName(String name) {
BooleanQuery query = new BooleanQuery();
query.add(new TermQuery(
new Term(Entity.IDX_NAME,
name.toLowerCase())),
BooleanClause.Occur.MUST);
return query;
}
@Override
public String toString() {
return "Entity{" +
"id=" + id +
", name='" + name + '\'' +
", surname='" + surname + '\'' +
", dead=" + dead +
'}';
}
}
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira