package com.constellio.app.utils.scripts;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from;
import static java.util.Arrays.asList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.services.factories.AppLayerFactory;
import com.constellio.app.utils.ScriptsUtils;
import com.constellio.data.dao.services.factories.DataLayerFactory;
import com.constellio.data.utils.ThreadList;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.schemas.MetadataSchemaType;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.records.RecordCachesServices;
import com.constellio.model.services.search.SearchServices;
import com.constellio.model.services.search.StatusFilter;
import com.constellio.model.services.search.query.ReturnedMetadatasFilter;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
public class QueryPerformanceTester {
private static User user;
public static void main(String[] args)
throws Exception {
String collection = args[0];
String username = args[1];
int nbOfThreads = Integer.valueOf(args[2]);
int nbOfExecute = Integer.valueOf(args[3]);
AppLayerFactory appLayerFactory = ScriptsUtils.startLayerFactoriesWithoutBackgroundThreads();
runTest(appLayerFactory, collection, username, nbOfThreads, nbOfExecute);
}
public static void runTest(AppLayerFactory appLayerFactory, final String collection, String username, int nbOfThreads,
int nbOfExecute)
throws Exception {
final ModelLayerFactory modelLayerFactory = appLayerFactory.getModelLayerFactory();
DataLayerFactory dataLayerFactory = modelLayerFactory.getDataLayerFactory();
user = modelLayerFactory.newUserServices().getUserInCollection(username, collection);
new RecordCachesServices(modelLayerFactory).loadCachesIn(collection);
dataLayerFactory.getDataLayerLogger().setPrintAllQueriesLongerThanMS(0);
ThreadList<Thread> threads = new ThreadList<>();
final AtomicBoolean atomicBoolean = new AtomicBoolean(true);
for (int i = 0; i < (nbOfThreads - 1); i++) {
threads.addAndStart(new Thread() {
@Override
public void run() {
while (atomicBoolean.get()) {
doSearch(collection, modelLayerFactory);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
}
long start = new Date().getTime();
for (int j = 0; j < nbOfExecute; j++) {
System.out.println(">" + j);
doSearch(collection, modelLayerFactory);
}
long duration = (new Date().getTime() - start);
atomicBoolean.set(false);
threads.joinAll();
long durationByRequests = duration / nbOfExecute;
System.out.println("---------------------------------");
System.out.println("Number of threads : " + threads);
System.out.println("Number of requests : " + nbOfExecute);
System.out.println("Requests are taking " + durationByRequests + "ms");
}
private static void doSearch(String collection, ModelLayerFactory modelLayerFactory) {
SearchServices searchServices = modelLayerFactory.newSearchServices();
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(collection, modelLayerFactory);
List<MetadataSchemaType> types = asList(rm.folder.schemaType(), rm.documentSchemaType(), rm.containerRecord.schemaType());
LogicalSearchQuery query = new LogicalSearchQuery(from(types).returnAll())
.setFreeTextQuery("agence rap")
.filteredWithUser(user)
.filteredByStatus(StatusFilter.ACTIVES)
.setPreferAnalyzedFields(true)
.setNumberOfRows(10)
.setHighlighting(true)
.setReturnedMetadatas(ReturnedMetadatasFilter
.onlyMetadatas(Schemas.TITLE, rm.folder.administrativeUnit(), rm.folder.category(), rm.folder.openingDate(),
rm.folder.semiactiveRetentionType(),
rm.folder.activeRetentionType(), rm.folder.archivisticStatus(), rm.folder.closingDate(),
rm.folder.retentionRule()));
List<Record> records = searchServices.search(query);
LogicalSearchQuery facetQuery = new LogicalSearchQuery(from(types).returnAll())
.setFreeTextQuery("agence rap")
.filteredWithUser(user)
.filteredByStatus(StatusFilter.ACTIVES)
.setPreferAnalyzedFields(true)
.setNumberOfRows(0);
facetQuery.addFieldFacet(rm.folder.administrativeUnit().getDataStoreCode());
facetQuery.addFieldFacet(rm.folder.category().getDataStoreCode());
facetQuery.addFieldFacet("schema_s");
facetQuery.addFieldFacet(rm.folder.archivisticStatus().getDataStoreCode());
searchServices.search(facetQuery);
}
}