package com.constellio.model.services.schemas.impacts;
import static java.util.Arrays.asList;
import java.util.ArrayList;
import java.util.List;
import com.constellio.model.entities.batchprocess.BatchProcessAction;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.Transaction;
import com.constellio.model.entities.records.TransactionRecordsReindexation;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.services.records.RecordProvider;
public class SchemaTypeAlterationBatchProcessAction implements BatchProcessAction {
List<String> reindexedMetadataForSearch = new ArrayList<>();
List<String> convertedToSingleValue = new ArrayList<>();
List<String> convertedToMultiValue = new ArrayList<>();
public SchemaTypeAlterationBatchProcessAction(List<String> reindexedMetadataForSearch, List<String> convertedToSingleValue,
List<String> convertedToMultiValue) {
this.convertedToSingleValue = convertedToSingleValue;
this.convertedToMultiValue = convertedToMultiValue;
this.reindexedMetadataForSearch = reindexedMetadataForSearch;
}
@Override
public Transaction execute(List<Record> batch, MetadataSchemaTypes schemaTypes, RecordProvider recordProvider) {
Transaction transaction = new Transaction();
transaction.getRecordUpdateOptions().setForcedReindexationOfMetadatas(TransactionRecordsReindexation.ALL());
transaction.getRecordUpdateOptions().setFullRewrite(true);
for (Record record : batch) {
MetadataSchema schema = schemaTypes.getSchema(record.getSchemaCode());
for (Metadata metadata : schema.getMetadatas()) {
if (convertedToMultiValue.contains(metadata.getLocalCode())) {
Metadata singleValueMetadata = Schemas.dummySingleValueMetadata(metadata);
Object value = record.get(singleValueMetadata);
if (value != null) {
record.removeAllFieldsStartingWith(metadata.getLocalCode() + "_");
record.set(metadata, asList(value));
}
} else if (convertedToSingleValue.contains(metadata.getLocalCode())) {
Metadata multiValueMetadata = Schemas.dummyMultiValueMetadata(metadata);
List<Object> values = record.getList(multiValueMetadata);
if (!values.isEmpty()) {
record.removeAllFieldsStartingWith(metadata.getLocalCode() + "_");
record.set(metadata, values.get(0));
}
}
if (reindexedMetadataForSearch.contains(metadata.getLocalCode())) {
record.markAsModified(metadata);
}
}
transaction.add(record);
}
return transaction;
}
@Override
public Object[] getInstanceParameters() {
return new Object[] { reindexedMetadataForSearch, convertedToSingleValue, convertedToMultiValue };
}
}