package com.constellio.model.services.batch.controller;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.constellio.data.utils.BatchBuilderIterator;
import com.constellio.model.entities.batchprocess.BatchProcessAction;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.entities.schemas.ModificationImpact;
import com.constellio.model.services.batch.actions.ReindexMetadatasBatchProcessAction;
import com.constellio.model.services.records.RecordModificationImpactHandler;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.schemas.SchemaUtils;
import com.constellio.model.services.search.SearchServices;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition;
public class CreateSubTaskModificationImpactHandler implements RecordModificationImpactHandler {
List<ModificationImpact> impacts = new ArrayList<>();
SearchServices searchServices;
RecordServices recordServices;
MetadataSchemaTypes metadataSchemaTypes;
TaskList taskList;
public CreateSubTaskModificationImpactHandler(SearchServices searchServices, RecordServices recordServices,
MetadataSchemaTypes metadataSchemaTypes, TaskList taskList) {
this.searchServices = searchServices;
this.recordServices = recordServices;
this.metadataSchemaTypes = metadataSchemaTypes;
this.taskList = taskList;
}
@Override
public void prepareToHandle(ModificationImpact modificationImpact) {
impacts.add(modificationImpact);
}
@Override
public void handle() {
for (ModificationImpact modificationImpact : impacts) {
handleModificationImpact(modificationImpact);
}
}
void handleModificationImpact(ModificationImpact modificationImpact) {
List<String> metadatas = newSchemaUtils().toMetadataCodes(modificationImpact.getMetadataToReindex());
Iterator<List<Record>> batchIterator = getBatchsIterator(modificationImpact);
while (batchIterator.hasNext()) {
List<Record> records = batchIterator.next();
createSubTask(records, metadatas);
}
}
void createSubTask(List<Record> subRecords, List<String> metadatas) {
BatchProcessAction action = new ReindexMetadatasBatchProcessAction(metadatas);
BatchProcessTask task = new BatchProcessTask(taskList, subRecords, action, recordServices,
metadataSchemaTypes, searchServices);
taskList.addSubTask(task);
}
Iterator<List<Record>> getBatchsIterator(ModificationImpact modificationImpact) {
LogicalSearchCondition condition = modificationImpact.getLogicalSearchCondition();
LogicalSearchQuery query = new LogicalSearchQuery(condition);
//Iterator<Record> iterator = searchServices.optimizedRecordsIterator(query, 10000);
Iterator<Record> iterator = searchServices.recordsIterator(query, 10000);
return new BatchBuilderIterator<>(iterator, 1000);
}
@Override
public void cancel() {
}
SchemaUtils newSchemaUtils() {
return new SchemaUtils();
}
}