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.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
import com.carrotsearch.junitbenchmarks.BenchmarkOptions;
import com.carrotsearch.junitbenchmarks.annotation.BenchmarkHistoryChart;
import com.constellio.data.dao.dto.records.OptimisticLockingResolution;
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.RecordServicesException;
import com.constellio.model.services.search.query.ReturnedMetadatasFilter;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
import com.constellio.sdk.tests.ConstellioTestWithGlobalContext;
import com.constellio.sdk.tests.TestRecord;
import com.constellio.sdk.tests.annotations.PerformanceTest;
@PerformanceTest
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class SearchServicesIteratorsPerformanceTest extends ConstellioTestWithGlobalContext {
static SearchServiceAcceptanceTestSchemas schema = new SearchServiceAcceptanceTestSchemas("zeCollection");
static SearchServiceAcceptanceTestSchemas.ZeSchemaMetadatas zeSchema = schema.new ZeSchemaMetadatas();
@Test
public void __prepareTests__()
throws RecordServicesException {
defineSchemasManager().using(schema);
Transaction transaction = new Transaction();
transaction.setOptimisticLockingResolution(OptimisticLockingResolution.EXCEPTION);
for (int i = 0; i < 10000; i++) {
Record record = new TestRecord(schema.zeDefaultSchema(), "" + i);
record.set(Schemas.TITLE, "zeTitleInitial");
transaction.addUpdate(record);
}
getModelLayerFactory().newRecordServices().execute(transaction);
}
@BenchmarkOptions(warmupRounds = 1, benchmarkRounds = 10)
@BenchmarkHistoryChart(maxRuns = 20)
@Test
public void iterateOver10000Records() {
Set<String> ids = new HashSet<>();
LogicalSearchQuery query = new LogicalSearchQuery();
query.setReturnedMetadatas(ReturnedMetadatasFilter.idVersionSchema());
query.setCondition(from(schema.zeDefaultSchema()).where(Schemas.TITLE).isStartingWithText("zeTitle"));
Iterator<Record> records = getModelLayerFactory().newSearchServices().recordsIterator(query, 10000);
int i = 0;
while (records.hasNext()) {
ids.add(records.next().getId());
}
assertThat(ids).hasSize(10000);
}
@BenchmarkOptions(warmupRounds = 1, benchmarkRounds = 10)
@BenchmarkHistoryChart(maxRuns = 20)
@Test
public void iterateOver10000RecordIds() {
Set<String> ids = new HashSet<>();
LogicalSearchQuery query = new LogicalSearchQuery();
query.setReturnedMetadatas(ReturnedMetadatasFilter.idVersionSchema());
query.setCondition(from(schema.zeDefaultSchema()).where(Schemas.TITLE).isStartingWithText("zeTitle"));
Iterator<String> records = getModelLayerFactory().newSearchServices().recordsIdsIterator(query);
int i = 0;
while (records.hasNext()) {
ids.add(records.next());
}
assertThat(ids).hasSize(10000);
}
}