package com.senseidb.indexing.activity;
import java.io.File;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import junit.framework.TestCase;
import org.easymock.classextension.EasyMock;
import org.json.JSONObject;
import proj.zoie.api.IndexReaderFactory;
import proj.zoie.api.Zoie;
import proj.zoie.api.ZoieIndexReader;
import proj.zoie.api.impl.DocIDMapperImpl;
import proj.zoie.impl.indexing.ZoieConfig;
import com.browseengine.bobo.api.BoboIndexReader;
import com.senseidb.conf.SenseiSchema.FieldDefinition;
import com.senseidb.search.node.SenseiCore;
import com.senseidb.test.SenseiStarter;
public class PurgeUnusedActivitiesJobTest extends TestCase {
private File dir;
private CompositeActivityValues compositeActivityValues;
private Zoie zoie;
public void setUp() throws Exception {
String pathname = getDirPath();
SenseiStarter.rmrf(new File("sensei-test"));
dir = new File(pathname);
dir.mkdirs();
ZoieIndexReader reader = EasyMock.createMock(ZoieIndexReader.class);
EasyMock.expect(reader.getDocIDMaper()).andReturn(new DocIDMapperImpl(new long[] {105L, 107L})).anyTimes();
zoie = org.easymock.EasyMock.createMock(Zoie.class);
org.easymock.EasyMock.expect(zoie.getIndexReaders()).andReturn(Arrays.asList(reader)).anyTimes();
zoie.returnIndexReaders(org.easymock.EasyMock.<List>notNull());
org.easymock.EasyMock.expectLastCall().anyTimes();
org.easymock.EasyMock.replay(zoie);
EasyMock.replay(reader);
}
public static String getDirPath() {
return "sensei-test/activity2";
}
@Override
protected void tearDown() throws Exception {
compositeActivityValues.close();
File file = new File("sensei-test");
file.deleteOnExit();
SenseiStarter.rmrf(file);
}
public void test1WriteValuesAndReadJustAfterThat() throws Exception {
compositeActivityValues = CompositeActivityValues.createCompositeValues(ActivityPersistenceFactory.getInstance(getDirPath()), java.util.Arrays.asList(getLikesFieldDefinition() ), Collections.EMPTY_LIST, ZoieConfig.DEFAULT_VERSION_COMPARATOR);
int valueCount = 100000;
for (int i = 0; i < valueCount; i++) {
compositeActivityValues.update(i, String.format("%08d", i), ActivityPrimitiveValuesPersistenceTest.toMap(new JSONObject().put("likes", "+1")));
}
compositeActivityValues.flush();
compositeActivityValues.syncWithPersistentVersion(String.format("%08d", valueCount - 1));
assertEquals(100000, compositeActivityValues.metadata.count);
SenseiCore senseiCore = new SenseiCore(0, new int[] {0}, null, null, null, null) {
@Override
public IndexReaderFactory<ZoieIndexReader<BoboIndexReader>> getIndexReaderFactory(int partition) {
return zoie;
}
};
PurgeUnusedActivitiesJob purgeUnusedActivitiesJob = new PurgeUnusedActivitiesJob(compositeActivityValues, senseiCore, 1000L*1000);
assertEquals(99498, purgeUnusedActivitiesJob.purgeUnusedActivityIndexes());
compositeActivityValues.recentlyAddedUids.clear();
assertEquals(500, purgeUnusedActivitiesJob.purgeUnusedActivityIndexes());
assertEquals(2, compositeActivityValues.uidToArrayIndex.size());
assertEquals(0, compositeActivityValues.deletedIndexes.size());
assertEquals(100000, compositeActivityValues.metadata.count);
compositeActivityValues.flush();
Thread.sleep(3000);
assertEquals(99998, compositeActivityValues.deletedIndexes.size());
assertEquals(100000, compositeActivityValues.metadata.count);
assertEquals(0, purgeUnusedActivitiesJob.purgeUnusedActivityIndexes());
compositeActivityValues.flush();
compositeActivityValues.executor.shutdown();
assertEquals(100000, compositeActivityValues.metadata.count);
compositeActivityValues.executor.awaitTermination(10, TimeUnit.SECONDS);
for (int i = 0; i < 10; i++) {
compositeActivityValues.update(i, String.format("%08d", valueCount + i), ActivityPrimitiveValuesPersistenceTest.toMap(new JSONObject().put("likes", "+1")));
}
assertEquals(12, compositeActivityValues.uidToArrayIndex.size());
assertEquals(99988, compositeActivityValues.deletedIndexes.size());
assertEquals(100000, compositeActivityValues.metadata.count);
}
public static FieldDefinition getLikesFieldDefinition() {
return getIntFieldDefinition("likes");
}
public static FieldDefinition getIntFieldDefinition(String name) {
FieldDefinition fieldDefinition = new FieldDefinition();
fieldDefinition.name = name;
fieldDefinition.type = int.class;
fieldDefinition.isActivity = true;
return fieldDefinition;
}
}