package pl.edu.icm.saos.search.indexing; import java.io.IOException; import java.util.List; import java.util.stream.Collectors; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrQuery.ORDER; import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.response.QueryResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import com.google.common.collect.Lists; import pl.edu.icm.saos.persistence.repository.JudgmentRepository; import pl.edu.icm.saos.search.config.model.JudgmentIndexField; /** * @author madryk */ @Service public class JudgmentIndexDeleter { private final static Logger log = LoggerFactory.getLogger(JudgmentIndexDeleter.class); private JudgmentRepository judgmentRepository; private SolrServer solrJudgmentsServer; private int indexIteratingPageSize = 1000; //------------------------ LOGIC -------------------------- public void deleteFromIndexWithoutCorrespondingJudgmentInDb() throws SolrServerException, IOException { int pageNumber = 0; while (true) { SolrQuery query = createIndexIteratingQuery(pageNumber); QueryResponse response = solrJudgmentsServer.query(query); if (response.getResults().size() == 0) { break; } List<Long> indexJudgmentIds = extractIdsFromResult(response); List<Long> existingJudgmentIds = judgmentRepository.filterIdsToExisting(indexJudgmentIds); List<Long> judgmentIdsToDelete = Lists.newArrayList(indexJudgmentIds); judgmentIdsToDelete.removeAll(existingJudgmentIds); if (judgmentIdsToDelete.size() > 0) { log.info("Removing judgments from index which don't have corresponding entry in database: {}", judgmentIdsToDelete); solrJudgmentsServer.deleteById(judgmentIdsToDelete.stream().map(x -> String.valueOf(x)).collect(Collectors.toList())); } ++pageNumber; } } //------------------------ PRIVATE -------------------------- private SolrQuery createIndexIteratingQuery(int pageNumber) { SolrQuery query = new SolrQuery("*:*"); query.setStart(pageNumber * indexIteratingPageSize); query.setRows(indexIteratingPageSize); query.setSort(JudgmentIndexField.DATABASE_ID.getFieldName(), ORDER.asc); query.setFields(JudgmentIndexField.DATABASE_ID.getFieldName()); return query; } private List<Long> extractIdsFromResult(QueryResponse response) { return response.getResults().stream() .map(x -> (Long) x.getFirstValue(JudgmentIndexField.DATABASE_ID.getFieldName())) .collect(Collectors.toList()); } //------------------------ SETTERS -------------------------- @Autowired public void setJudgmentRepository(JudgmentRepository judgmentRepository) { this.judgmentRepository = judgmentRepository; } @Autowired @Qualifier("solrJudgmentsServer") public void setSolrJudgmentsServer(SolrServer solrJudgmentsServer) { this.solrJudgmentsServer = solrJudgmentsServer; } public void setIndexIteratingPageSize(int indexIteratingPageSize) { this.indexIteratingPageSize = indexIteratingPageSize; } }