package com.constellio.model.services.records.preparation; import static com.constellio.model.entities.schemas.MetadataValueType.REFERENCE; import java.util.HashSet; import java.util.List; import java.util.Set; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.records.Transaction; import com.constellio.model.entities.schemas.Metadata; import com.constellio.model.entities.schemas.MetadataNetworkLink; import com.constellio.model.entities.schemas.MetadataSchema; import com.constellio.model.entities.schemas.MetadataSchemaTypes; public class RecordsToReindexResolver { MetadataSchemaTypes types; public RecordsToReindexResolver(MetadataSchemaTypes types) { this.types = types; } public void findRecordsToReindex(Transaction transaction) { for (Record record : transaction.getModifiedRecords()) { transaction.addAllRecordsToReindex( findRecordsToReindexFromRecord(record, transaction.getRecordUpdateOptions().isFullRewrite())); } } public Set<String> findRecordsToReindexFromRecord(Record record, boolean allMetadatas) { MetadataSchema schema = types.getSchema(record.getSchemaCode()); Record originalRecord = record.isSaved() ? record.getCopyOfOriginalRecord() : null; Set<String> ids = new HashSet<>(); Set<String> metadatasToReindex = new HashSet<>(); List<Metadata> metadatas; if (allMetadatas) { metadatas = schema.getMetadatas(); } else { metadatas = record.getModifiedMetadatas(types); } for (Metadata metadata : metadatas) { for (MetadataNetworkLink link : types.getMetadataNetwork().getLinksTo(metadata)) { if (link.getLevel() > 0) { metadatasToReindex.add(link.getFromMetadata().getCode()); } } } for (String metadataToReindex : metadatasToReindex) { for (MetadataNetworkLink reverseLink : types.getMetadataNetwork().getLinksFrom(metadataToReindex)) { Metadata metadata = reverseLink.getToMetadata(); if (metadata.getType() == REFERENCE && schema.hasMetadataWithCode(metadata.getCode())) { if (originalRecord != null) { String wasValue = originalRecord.get(metadata); if (wasValue != null) { ids.add(wasValue); } } if (record != null) { String value = record.get(metadata); if (value != null) { ids.add(value); } } } } } return ids; } }