package com.constellio.model.services.background; import static com.constellio.data.dao.dto.records.OptimisticLockingResolution.EXCEPTION; import static com.constellio.model.entities.records.RecordUpdateOptions.validationExceptionSafeOptions; import static com.constellio.model.entities.records.TransactionRecordsReindexation.ALL; import java.util.List; 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.collections.CollectionsListManager; import com.constellio.model.services.factories.ModelLayerFactory; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.records.RecordServicesException; import com.constellio.model.services.search.SearchServices; import com.constellio.model.services.search.query.logical.LogicalSearchQuery; import com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators; public class RecordsReindexingBackgroundAction implements Runnable { private ModelLayerFactory modelLayerFactory; private SearchServices searchServices; private RecordServices recordServices; private CollectionsListManager collectionsListManager; public RecordsReindexingBackgroundAction(ModelLayerFactory modelLayerFactory) { this.modelLayerFactory = modelLayerFactory; this.searchServices = modelLayerFactory.newSearchServices(); this.recordServices = modelLayerFactory.newRecordServices(); this.collectionsListManager = modelLayerFactory.getCollectionsListManager(); } @Override public synchronized void run() { for (String collection : collectionsListManager.getCollectionsExcludingSystem()) { LogicalSearchQuery query = new LogicalSearchQuery(); query.setCondition(LogicalSearchQueryOperators.fromAllSchemasInExceptEvents(collection) .where(Schemas.MARKED_FOR_REINDEXING).isTrue()); query.setNumberOfRows(1000); List<Record> records = searchServices.search(query); if (!records.isEmpty()) { System.out.println("---------------------------------------"); for (Record record : records) { System.out.println("Reindexing : " + record.getId()); } Transaction transaction = new Transaction(records); transaction.setOptions(validationExceptionSafeOptions().setForcedReindexationOfMetadatas(ALL()) .setOptimisticLockingResolution(EXCEPTION)); executeTransaction(transaction); } } } void executeTransaction(Transaction transaction) { try { recordServices.executeHandlingImpactsAsync(transaction); } catch (RecordServicesException e) { throw new RuntimeException(e); } } }