Coverage Summary for Class: SearchResultGeneration (org.kitodo.production.helper)
Class |
Class, %
|
Method, %
|
Line, %
|
SearchResultGeneration |
100%
(1/1)
|
33,3%
(3/9)
|
16,2%
(13/80)
|
/*
* (c) Kitodo. Key to digital objects e. V. <contact@kitodo.org>
*
* This file is part of the Kitodo project.
*
* It is licensed under GNU General Public License version 3 or later.
*
* For the full copyright and license information, please read the
* GPL3-License.txt file that was distributed with this source code.
*/
package org.kitodo.production.helper;
import java.util.ArrayList;
import java.util.List;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.RangeQueryBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.kitodo.data.elasticsearch.index.type.enums.ProcessTypeField;
import org.kitodo.data.exceptions.DataException;
import org.kitodo.production.dto.ProcessDTO;
import org.kitodo.production.enums.ObjectType;
import org.kitodo.production.services.ServiceManager;
public class SearchResultGeneration {
private String filter;
private boolean showClosedProcesses;
private boolean showInactiveProjects;
private static final Logger logger = LogManager.getLogger(SearchResultGeneration.class);
/**
* Constructor.
*
* @param filter
* String
* @param showClosedProcesses
* boolean
* @param showInactiveProjects
* boolean
*/
public SearchResultGeneration(String filter, boolean showClosedProcesses, boolean showInactiveProjects) {
this.filter = filter;
this.showClosedProcesses = showClosedProcesses;
this.showInactiveProjects = showInactiveProjects;
}
/**
* Get result.
*
* @return HSSFWorkbook
*/
public HSSFWorkbook getResult() {
return getWorkbook();
}
private List<ProcessDTO> getResultsWithFilter() {
List<ProcessDTO> processDTOS = new ArrayList<>();
try {
processDTOS = ServiceManager.getProcessService().findByQuery(getQueryForFilter(ObjectType.PROCESS),
ServiceManager.getProcessService().sortById(SortOrder.ASC), true);
} catch (DataException e) {
logger.error(e.getMessage(), e);
}
return processDTOS;
}
/**
* Gets the query with filters.
*
* @param objectType Type of object that should be filtered
* @return A BoolQueryBuilder
*/
public BoolQueryBuilder getQueryForFilter(ObjectType objectType) {
BoolQueryBuilder query = new BoolQueryBuilder();
try {
query = ServiceManager.getFilterService().queryBuilder(this.filter, objectType, false, false);
} catch (DataException e) {
logger.error(e.getMessage(), e);
}
if (!this.showClosedProcesses) {
query.mustNot(ServiceManager.getProcessService().getQueryForClosedProcesses());
}
if (!this.showInactiveProjects) {
query.mustNot(ServiceManager.getProcessService().getQueryProjectActive(false));
}
return query;
}
private HSSFWorkbook getWorkbook() {
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("Search results");
HSSFRow title = sheet.createRow(0);
title.createCell(0).setCellValue(this.filter);
for (int i = 1; i < 8; i++) {
title.createCell(i).setCellValue("");
}
setRowHeader(sheet);
insertRowData(sheet);
return workbook;
}
private void insertRowData(HSSFSheet sheet) {
int rowCounter = 2;
int numberOfProcessedProcesses = 0;
int elasticsearchLimit = 9999;
try {
Long numberOfExpectedProcesses = ServiceManager.getProcessService()
.count(getQueryForFilter(ObjectType.PROCESS));
if (numberOfExpectedProcesses > elasticsearchLimit) {
List<ProcessDTO> processDTOS;
int queriedIds = 0;
while (numberOfProcessedProcesses < numberOfExpectedProcesses) {
RangeQueryBuilder rangeQueryBuilder = new RangeQueryBuilder(ProcessTypeField.ID.toString());
rangeQueryBuilder.gte(queriedIds).lt(queriedIds + elasticsearchLimit);
BoolQueryBuilder queryForFilter = getQueryForFilter(ObjectType.PROCESS);
queryForFilter.must(rangeQueryBuilder);
processDTOS = ServiceManager.getProcessService().findByQuery(queryForFilter,
ServiceManager.getProcessService().sortById(SortOrder.ASC), true);
queriedIds += elasticsearchLimit;
for (ProcessDTO processDTO : processDTOS) {
prepareRow(rowCounter, sheet, processDTO);
rowCounter++;
}
numberOfProcessedProcesses += processDTOS.size();
}
} else {
List<ProcessDTO> resultsWithFilter = getResultsWithFilter();
for (ProcessDTO processDTO : resultsWithFilter) {
prepareRow(rowCounter, sheet, processDTO);
rowCounter++;
}
}
} catch (DataException e) {
logger.error(e.getMessage(), e);
}
}
private void setRowHeader(HSSFSheet sheet) {
HSSFRow rowHeader = sheet.createRow(1);
rowHeader.createCell(0).setCellValue(Helper.getTranslation("title"));
rowHeader.createCell(1).setCellValue(Helper.getTranslation("ID"));
rowHeader.createCell(2).setCellValue(Helper.getTranslation("Datum"));
rowHeader.createCell(3).setCellValue(Helper.getTranslation("CountImages"));
rowHeader.createCell(4).setCellValue(Helper.getTranslation("CountStructuralElements"));
rowHeader.createCell(5).setCellValue(Helper.getTranslation("CountMetadata"));
rowHeader.createCell(6).setCellValue(Helper.getTranslation("Project"));
rowHeader.createCell(7).setCellValue(Helper.getTranslation("Status"));
}
private void prepareRow(int rowCounter, HSSFSheet sheet, ProcessDTO processDTO) {
HSSFRow row = sheet.createRow(rowCounter);
row.createCell(0).setCellValue(processDTO.getTitle());
row.createCell(1).setCellValue(processDTO.getId());
row.createCell(2).setCellValue(processDTO.getCreationDate());
row.createCell(3).setCellValue(processDTO.getNumberOfImages());
row.createCell(4).setCellValue(processDTO.getNumberOfStructures());
row.createCell(5).setCellValue(processDTO.getNumberOfMetadata());
row.createCell(6).setCellValue(processDTO.getProject().getTitle());
row.createCell(7).setCellValue(processDTO.getSortHelperStatus());
}
}