package org.molgenis.data.elasticsearch.bootstrap; import org.molgenis.data.DataService; import org.molgenis.data.elasticsearch.SearchService; import org.molgenis.data.elasticsearch.index.job.IndexJobExecution; import org.molgenis.data.elasticsearch.index.job.IndexJobExecutionMeta; import org.molgenis.data.index.IndexActionRegisterService; import org.molgenis.data.index.meta.IndexAction; import org.molgenis.data.index.meta.IndexActionMetaData; import org.molgenis.data.jobs.model.JobExecutionMetaData; import org.molgenis.data.meta.MetaDataService; import org.molgenis.data.meta.model.AttributeMetadata; import org.molgenis.data.support.QueryImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; import static org.molgenis.data.jobs.model.JobExecutionMetaData.*; @Component public class IndexBootstrapper { private static final Logger LOG = LoggerFactory.getLogger(IndexBootstrapper.class); private final MetaDataService metaDataService; private final SearchService searchService; private final IndexActionRegisterService indexActionRegisterService; private final DataService dataService; @Autowired public IndexBootstrapper(MetaDataService metaDataService, SearchService searchService, IndexActionRegisterService indexActionRegisterService, DataService dataService) { this.metaDataService = metaDataService; this.dataService = dataService; this.searchService = searchService; this.indexActionRegisterService = indexActionRegisterService; } public void bootstrap() { if (!searchService.hasMapping(AttributeMetadata.ATTRIBUTE_META_DATA)) { LOG.debug( "No index for Attribute found, asuming missing index, schedule (re)index for all entities"); metaDataService.getRepositories() .forEach(repo -> indexActionRegisterService.register(repo.getName(), null)); LOG.debug("Done scheduling (re)index jobs for all entities"); } else { LOG.debug("Index for Attribute found, index is present, no (re)index needed"); List<IndexJobExecution> failedIndexJobs = dataService.findAll(IndexJobExecutionMeta.INDEX_JOB_EXECUTION, new QueryImpl<IndexJobExecution>().eq(JobExecutionMetaData.STATUS, FAILED), IndexJobExecution.class).collect(Collectors.toList()); failedIndexJobs.forEach(job -> registerNewIndexActionForDirtyJobs(job)); } } private void registerNewIndexActionForDirtyJobs(IndexJobExecution indexJobExecution) { String id = indexJobExecution.getIndexActionJobID(); dataService.findAll(IndexActionMetaData.INDEX_ACTION, new QueryImpl<IndexAction>().eq(IndexActionMetaData.INDEX_ACTION_GROUP_ATTR, id), IndexAction.class) .forEach(action -> indexActionRegisterService .register(action.getEntityFullName(), action.getEntityId())); dataService.delete(IndexJobExecutionMeta.INDEX_JOB_EXECUTION, indexJobExecution); } }