package com.constellio.model.services.search;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.List;
import org.junit.Before;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
import com.constellio.data.dao.dto.records.OptimisticLockingResolution;
import com.constellio.data.dao.services.records.RecordDao;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.Transaction;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.annotations.LoadTest;
@LoadTest
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class SearchServiceLoadTest extends ConstellioTest {
private List<String> hundredRecordsId;
private List<String> fiveHundredRecordsId;
private List<String> thousandRecordsId;
private List<String> fiveThousandRecordsId;
private List<String> tenThousandsRecordsId;
private boolean recordsCreated = false;
private SearchServiceAcceptanceTestSchemas schema = new SearchServiceAcceptanceTestSchemas();
private SearchServiceAcceptanceTestSchemas.ZeSchemaMetadatas zeSchema = schema.new ZeSchemaMetadatas();
private RecordServices recordServices;
private SearchServices searchServices;
private LogicalSearchCondition condition;
@Before
public void setUp()
throws Exception {
RecordDao recordDao = getDataLayerFactory().newRecordDao();
searchServices = new SearchServices(recordDao, getModelLayerFactory());
defineSchemasManager().using(schema.withAStringMetadata());
hundredRecordsId = addAndGetIdRecords(100);
fiveHundredRecordsId = addAndGetIdRecords(500);
thousandRecordsId = addAndGetIdRecords(1000);
fiveThousandRecordsId = addAndGetIdRecords(5000);
tenThousandsRecordsId = addAndGetIdRecords(10000);
}
@Test
public void isInSearchOnIdIn100records() {
condition = from(zeSchema.instance()).where(Schemas.IDENTIFIER).isIn(hundredRecordsId);
LogicalSearchQuery query = new LogicalSearchQuery();
query.setCondition(condition);
long startTime = System.currentTimeMillis();
List<Record> result = searchServices.search(query);
long diff = System.currentTimeMillis() - startTime;
assertThat(result).hasSize(100);
System.out.println("millis duration for 100: " + diff);
}
@Test
public void isInSearchOnIdIn500records() {
condition = from(zeSchema.instance()).where(Schemas.IDENTIFIER).isIn(fiveHundredRecordsId);
LogicalSearchQuery query = new LogicalSearchQuery();
query.setCondition(condition);
long startTime = System.currentTimeMillis();
List<Record> result = searchServices.search(query);
long diff = System.currentTimeMillis() - startTime;
assertThat(result).hasSize(500);
System.out.println("millis duration for 500: " + diff);
}
@Test
public void isInSearchOnIdIn1000records() {
condition = from(zeSchema.instance()).where(Schemas.IDENTIFIER).isIn(thousandRecordsId);
LogicalSearchQuery query = new LogicalSearchQuery();
query.setCondition(condition);
long startTime = System.currentTimeMillis();
List<Record> result = searchServices.search(query);
long diff = System.currentTimeMillis() - startTime;
assertThat(result).hasSize(1000);
System.out.println("millis duration for 1000: " + diff);
}
@Test
public void isNotInSearchOnIdOn100records() {
condition = from(zeSchema.instance()).where(Schemas.IDENTIFIER).isNotIn(hundredRecordsId);
LogicalSearchQuery query = new LogicalSearchQuery();
query.setCondition(condition);
long startTime = System.currentTimeMillis();
searchServices.search(query);
long diff = System.currentTimeMillis() - startTime;
System.out.println("millis duration for not in 100: " + diff);
}
@Test
public void isNotInSearchOnIdOn500records() {
condition = from(zeSchema.instance()).where(Schemas.IDENTIFIER).isNotIn(fiveHundredRecordsId);
LogicalSearchQuery query = new LogicalSearchQuery();
query.setCondition(condition);
long startTime = System.currentTimeMillis();
searchServices.search(query);
long diff = System.currentTimeMillis() - startTime;
System.out.println("millis duration for not in 500: " + diff);
}
@Test
public void isNotInSearchOnIdOn1000records() {
condition = from(zeSchema.instance()).where(Schemas.IDENTIFIER).isNotIn(thousandRecordsId);
LogicalSearchQuery query = new LogicalSearchQuery();
query.setCondition(condition);
long startTime = System.currentTimeMillis();
searchServices.search(query);
long diff = System.currentTimeMillis() - startTime;
System.out.println("millis duration for not in 1000: " + diff);
}
private Record newRecordOfZeSchema() {
return recordServices.newRecordWithSchema(zeSchema.instance());
}
private List<String> addAndGetIdRecords(int numberRecords)
throws Exception {
Transaction transaction = new Transaction();
for (int i = 0; i < numberRecords; i++) {
transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "records#" + i));
}
transaction.setOptimisticLockingResolution(OptimisticLockingResolution.EXCEPTION);
recordServices.execute(transaction);
return transaction.getRecordIds();
}
}