package com.constellio.data.dao.services.bigVault.solr;
import static com.constellio.data.dao.dto.records.RecordsFlushing.NOW;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.params.SolrParams;
import org.junit.Before;
import org.junit.Test;
import com.constellio.data.dao.services.factories.DataLayerFactory;
import com.constellio.data.dao.services.solr.ConstellioSolrInputDocument;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.TestUtils;
import com.constellio.sdk.tests.annotations.LoadTest;
@LoadTest
public class BigVaultServerLoadTest extends ConstellioTest {
BigVaultServer vaultServer;
@Before
public void setUp()
throws Exception {
DataLayerFactory daosFactory = (DataLayerFactory) getDataLayerFactory();
vaultServer = daosFactory.getRecordsVaultServer();
}
@Test
public void whenDeleting100000EmptyRecordsThenFast()
throws Exception {
List<String> ids = new ArrayList<>();
for (int i = 0; i < 100; i++) {
System.out.println(i);
List<SolrInputDocument> documents = new ArrayList<>();
for (int j = 0; j < 1000; j++) {
String id = "id" + i + "_" + j;
ids.add(id);
SolrInputDocument inputDocument = new ConstellioSolrInputDocument();
inputDocument.setField("id", id);
inputDocument.setField("text_s", TestUtils.frenchPangram());
documents.add(inputDocument);
}
vaultServer.addAll(new BigVaultServerTransaction(NOW).setNewDocuments(documents));
}
Date start = new Date();
vaultServer.addAll(new BigVaultServerTransaction(NOW).setDeletedRecords(ids));
System.out.println(new Date().getTime() - start.getTime() + "ms");
assertThat(vaultServer.query(query("*:*")).getResults().getNumFound()).isEqualTo(0);
}
@Test
public void whenUpdating100000EmptyRecordsThenFast()
throws Exception {
List<String> ids = new ArrayList<>();
for (int i = 0; i < 10; i++) {
System.out.println(i);
List<SolrInputDocument> documents = new ArrayList<>();
ids = new ArrayList<>();
for (int j = 0; j < 10000; j++) {
String id = "id" + i + "_" + j;
ids.add(id);
SolrInputDocument inputDocument = new ConstellioSolrInputDocument();
inputDocument.setField("id", id);
inputDocument.setField("type_l", "8");
documents.add(inputDocument);
}
vaultServer.addAll(new BigVaultServerTransaction(NOW).setNewDocuments(documents));
}
List<SolrInputDocument> modifiedDocuments = new ArrayList<>();
for (String id : ids) {
SolrInputDocument doc = new SolrInputDocument();
doc.setField("id", id);
doc.setField("_version_", 1);
doc.setField("type_l", newMap("inc", "-2"));
modifiedDocuments.add(doc);
}
Date start = new Date();
vaultServer.addAll(new BigVaultServerTransaction(NOW).setUpdatedDocuments(modifiedDocuments));
System.out.println(new Date().getTime() - start.getTime() + "ms");
assertThat(vaultServer.query(query("type_l:6")).getResults().getNumFound()).isEqualTo(10000);
}
@Test
public void testOptimisticLockingWithVersion1()
throws Exception {
SolrInputDocument solrInputDocument = new ConstellioSolrInputDocument();
solrInputDocument.setField("id", "chuck");
//solrInputDocument.setField("text_s", "norris");
vaultServer.addAll(new BigVaultServerTransaction(NOW).setNewDocuments(asList(solrInputDocument)));
solrInputDocument = new ConstellioSolrInputDocument();
solrInputDocument.setField("id", "chuck");
solrInputDocument.setField("_version_", 1);
//solrInputDocument.setField("text_s", "norris");
vaultServer.addAll(new BigVaultServerTransaction(NOW).setUpdatedDocuments(asList(solrInputDocument)));
}
private SolrParams query(String q) {
ModifiableSolrParams params = new ModifiableSolrParams();
params.set("q", q);
return params;
}
private Map<String, String> newMap(String key, String value) {
Map<String, String> map = new HashMap<>();
map.put(key, value);
return map;
}
}