package com.constellio.model.services.search;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from;
import java.util.ArrayList;
import java.util.List;
import org.junit.Before;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.services.records.BulkRecordTransactionHandler;
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 SearchServiceLinearLoadTest extends ConstellioTest {
private RecordServices recordServices;
private SearchServices searchServices;
private SearchServiceAcceptanceTestSchemas schema = new SearchServiceAcceptanceTestSchemas();
private SearchServiceAcceptanceTestSchemas.ZeSchemaMetadatas zeSchema = schema.new ZeSchemaMetadatas();
private LogicalSearchCondition condition;
@Before
public void setUp()
throws Exception {
recordServices = getModelLayerFactory().newRecordServices();
searchServices = getModelLayerFactory().newSearchServices();
defineSchemasManager().using(schema.withAStringMetadata());
}
@Test
public void isInSearch50IdIn100records()
throws Exception {
List<String> ids = addAndGetIdRecords(100).subList(0, 50);
condition = from(zeSchema.instance()).where(Schemas.IDENTIFIER).isIn(ids);
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 100: " + diff);
}
@Test
public void isInSearch50IdIn500records()
throws Exception {
List<String> ids = addAndGetIdRecords(500).subList(0, 50);
condition = from(zeSchema.instance()).where(Schemas.IDENTIFIER).isIn(ids);
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 500: " + diff);
}
@Test
public void isInSearch50IdIn1000records()
throws Exception {
List<String> ids = addAndGetIdRecords(1000).subList(0, 50);
condition = from(zeSchema.instance()).where(Schemas.IDENTIFIER).isIn(ids);
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 1000: " + diff);
}
@Test
public void isInSearch50IdIn5000records()
throws Exception {
List<String> ids = addAndGetIdRecords(5000).subList(0, 50);
condition = from(zeSchema.instance()).where(Schemas.IDENTIFIER).isIn(ids);
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 5000: " + diff);
}
@Test
public void isInSearch50IdIn10000records()
throws Exception {
List<String> ids = addAndGetIdRecords(10000).subList(0, 50);
condition = from(zeSchema.instance()).where(Schemas.IDENTIFIER).isIn(ids);
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 10000: " + diff);
}
@Test
public void isInSearch500IdIn20000records()
throws Exception {
List<String> ids = addAndGetIdRecords(20000).subList(0, 500);
condition = from(zeSchema.instance()).where(Schemas.IDENTIFIER).isIn(ids);
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 500 in 20k: " + diff);
}
@Test
public void isInSearch1000IdIn20000records()
throws Exception {
List<String> ids = addAndGetIdRecords(20000).subList(0, 1000);
condition = from(zeSchema.instance()).where(Schemas.IDENTIFIER).isIn(ids);
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 1000 in 20k: " + diff);
}
@Test
public void isInSearch1000IdIn40000records()
throws Exception {
List<String> ids = addAndGetIdRecords(40000).subList(0, 1000);
condition = from(zeSchema.instance()).where(Schemas.IDENTIFIER).isIn(ids);
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 1000 in 40k: " + diff);
}
@Test
public void isNotInSearch50IdIn100records()
throws Exception {
List<String> ids = addAndGetIdRecords(100).subList(0, 50);
condition = from(zeSchema.instance()).where(Schemas.IDENTIFIER).isNotIn(ids);
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 isNotInSearch50IdIn500records()
throws Exception {
List<String> ids = addAndGetIdRecords(500).subList(0, 50);
condition = from(zeSchema.instance()).where(Schemas.IDENTIFIER).isNotIn(ids);
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 isNotInSearch50IdIn1000records()
throws Exception {
List<String> ids = addAndGetIdRecords(1000).subList(0, 50);
condition = from(zeSchema.instance()).where(Schemas.IDENTIFIER).isNotIn(ids);
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);
}
@Test
public void isNotInSearch50IdIn5000records()
throws Exception {
List<String> ids = addAndGetIdRecords(5000).subList(0, 50);
condition = from(zeSchema.instance()).where(Schemas.IDENTIFIER).isNotIn(ids);
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 5000: " + diff);
}
@Test
public void isNotInSearch50IdIn10000records()
throws Exception {
List<String> ids = addAndGetIdRecords(10000).subList(0, 50);
condition = from(zeSchema.instance()).where(Schemas.IDENTIFIER).isNotIn(ids);
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 10000: " + diff);
}
@Test
public void isNotInSearch500IdIn20000records()
throws Exception {
List<String> ids = addAndGetIdRecords(20000).subList(0, 500);
condition = from(zeSchema.instance()).where(Schemas.IDENTIFIER).isNotIn(ids);
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 500 in 20k: " + diff);
}
@Test
public void isNotInSearch1000IdIn20000records()
throws Exception {
List<String> ids = addAndGetIdRecords(20000).subList(0, 1000);
condition = from(zeSchema.instance()).where(Schemas.IDENTIFIER).isNotIn(ids);
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 1000 in 20k: " + diff);
}
@Test
public void isNotInSearch1000IdIn40000records()
throws Exception {
List<String> ids = addAndGetIdRecords(40000).subList(0, 1000);
condition = from(zeSchema.instance()).where(Schemas.IDENTIFIER).isNotIn(ids);
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 1000 in 40k: " + diff);
}
private Record newRecordOfZeSchema() {
return recordServices.newRecordWithSchema(zeSchema.instance());
}
private List<String> addAndGetIdRecords(int numberRecords)
throws Exception {
List<String> ids = new ArrayList<>();
BulkRecordTransactionHandler handler = new BulkRecordTransactionHandler(recordServices, "SearchServiceLinearLoadTest");
for (int i = 0; i < numberRecords; i++) {
Record record = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "records#" + i);
handler.append(record);
ids.add(record.getId());
}
handler.closeAndJoin();
return ids;
}
}