package com.constellio.app.modules.es.ui.pages;
import static com.constellio.app.ui.i18n.i18n.$;
import static com.constellio.model.entities.schemas.MetadataValueType.STRING;
import static com.constellio.model.entities.schemas.MetadataValueType.TEXT;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.anyConditions;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.where;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import com.constellio.app.modules.es.connectors.spi.Connector;
import com.constellio.app.modules.es.model.connectors.ConnectorInstance;
import com.constellio.app.modules.es.navigation.ESViews;
import com.constellio.app.modules.es.services.ESSchemasRecordsServices;
import com.constellio.app.ui.entities.MetadataSchemaVO;
import com.constellio.app.ui.entities.MetadataVO;
import com.constellio.app.ui.entities.RecordVO.VIEW_MODE;
import com.constellio.app.ui.framework.builders.MetadataSchemaToVOBuilder;
import com.constellio.app.ui.framework.builders.RecordToVOBuilder;
import com.constellio.app.ui.framework.data.RecordVOWithDistinctSchemasDataProvider;
import com.constellio.app.ui.pages.base.BasePresenter;
import com.constellio.app.ui.params.ParamUtils;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataSchemaType;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition;
public class ConnectorReportPresenter extends BasePresenter<ConnectorReportView> {
private String connectorId;
private String reportMode;
private transient ESSchemasRecordsServices es;
private ConnectorInstance connectorInstance;
private Connector connector;
public ConnectorReportPresenter(ConnectorReportView view) {
super(view);
initTransientObjects();
}
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject();
initTransientObjects();
}
private void initTransientObjects() {
es = new ESSchemasRecordsServices(collection, appLayerFactory);
}
public void forParams(String parameters) {
Map<String, String> params = ParamUtils.getParamsMap(parameters);
connectorId = params.get(ConnectorReportView.CONNECTOR_ID);
reportMode = params.get(ConnectorReportView.REPORT_MODE);
connectorInstance = es.getConnectorManager().getConnectorInstance(connectorId);
connector = es.instanciate(connectorInstance);
if (ConnectorReportView.ERRORS.equals(reportMode)) {
view.setTitle($("ConnectorReportView.viewTitle.error"));
} else {
view.setTitle($("ConnectorReportView.viewTitle.indexing"));
}
}
public RecordVOWithDistinctSchemasDataProvider getDataProvider() {
final List<MetadataSchemaType> types = getMetadataSchemaTypes();
final List<String> reportMetadata = connector.getReportMetadatas(reportMode);
List<MetadataSchemaVO> schemaVOs = new ArrayList<>();
for (MetadataSchemaType type : types) {
MetadataSchemaVO schemaVO = new MetadataSchemaToVOBuilder()
.build(type.getSchema(connectorId), VIEW_MODE.TABLE, reportMetadata, view.getSessionContext());
schemaVOs.add(schemaVO);
}
return new RecordVOWithDistinctSchemasDataProvider(schemaVOs, new RecordToVOBuilder(), modelLayerFactory,
view.getSessionContext()) {
@Override
protected LogicalSearchQuery getQuery() {
LogicalSearchCondition condition = from(types).where(es.connectorDocument.connector()).isEqualTo(
connectorId);
if (ConnectorReportView.ERRORS.equals(reportMode)) {
condition = condition.andWhere(es.connectorDocument.errorsCount()).isGreaterOrEqualThan(1);
}
return new LogicalSearchQuery(condition);
}
};
}
public List<String> getReportMetadataList() {
return connector.getReportMetadatas(reportMode);
}
public RecordVOWithDistinctSchemasDataProvider getFilteredDataProvider(final String filterString) {
final List<MetadataSchemaType> types = getMetadataSchemaTypes();
final List<String> reportMetadata = connector.getReportMetadatas(reportMode);
final List<MetadataSchemaVO> schemaVOs = new ArrayList<>();
for (MetadataSchemaType type : types) {
MetadataSchemaVO schemaVO = new MetadataSchemaToVOBuilder()
.build(type.getSchema(connectorId), VIEW_MODE.TABLE, view.getSessionContext());
schemaVOs.add(schemaVO);
}
return new RecordVOWithDistinctSchemasDataProvider(schemaVOs, new RecordToVOBuilder(), modelLayerFactory,
view.getSessionContext()) {
@Override
protected LogicalSearchQuery getQuery() {
LogicalSearchCondition condition = where(es.connectorDocument.connector()).isEqualTo(connectorId);
if (ConnectorReportView.ERRORS.equals(reportMode)) {
condition = condition.andWhere(es.connectorDocument.errorsCount()).isGreaterOrEqualThan(1);
}
List<LogicalSearchCondition> filterConditions = new ArrayList<>();
List<Metadata> fileterMetadatas = new ArrayList<>();
for (String metadataCode : reportMetadata) {
for (MetadataSchemaVO schemaVO : schemaVOs) {
MetadataVO metadataVO = schemaVO.getMetadata(metadataCode);
Metadata metadata = types().getMetadata(metadataVO.getCode());
if (STRING.equals(metadata.getType()) || TEXT
.equals(metadata.getType())) {
fileterMetadatas.add(metadata);
}
}
}
if (StringUtils.isNotBlank(filterString)) {
for (Metadata fileterMetadata : fileterMetadatas) {
filterConditions.add(where(fileterMetadata).isContainingText(filterString));
}
return new LogicalSearchQuery(condition).setCondition(from(types)
.whereAllConditions(condition, anyConditions(filterConditions)));
} else {
return new LogicalSearchQuery(condition).setCondition(from(types)
.where(condition));
}
}
};
}
@Override
protected boolean hasPageAccess(String params, User user) {
return true;
}
public Long getTotalDocumentsCount() {
final List<MetadataSchemaType> types = getMetadataSchemaTypes();
LogicalSearchCondition condition = from(types).returnAll();
condition = condition.andWhere(es.connectorDocument.connector()).isEqualTo(connectorId);
if (ConnectorReportView.ERRORS.equals(reportMode)) {
condition = condition.andWhere(es.connectorDocument.errorsCount()).isGreaterOrEqualThan(1);
}
return modelLayerFactory.newSearchServices().getResultsCount(condition);
}
private List<MetadataSchemaType> getMetadataSchemaTypes() {
List<String> typeCodes = connector.getConnectorDocumentTypes();
return types().getSchemaTypesWithCode(typeCodes);
}
public Long getFetchedDocumentsCount() {
final List<MetadataSchemaType> types = getMetadataSchemaTypes();
LogicalSearchCondition condition = from(types).where(es.connectorDocument.fetched()).isTrue();
condition = condition.andWhere(es.connectorDocument.connector()).isEqualTo(connectorId);
if (ConnectorReportView.ERRORS.equals(reportMode)) {
condition = condition.andWhere(es.connectorDocument.errorsCount()).isGreaterOrEqualThan(1);
}
return modelLayerFactory.newSearchServices().getResultsCount(condition);
}
public Long getUnfetchedDocumentsCount() {
final List<MetadataSchemaType> types = getMetadataSchemaTypes();
LogicalSearchCondition condition = from(types).where(es.connectorDocument.fetched()).isFalse();
if (ConnectorReportView.ERRORS.equals(reportMode)) {
condition = condition.andWhere(es.connectorDocument.errorsCount()).isGreaterOrEqualThan(1);
}
return modelLayerFactory.newSearchServices().getResultsCount(condition);
}
public void filterButtonClicked() {
view.filterTable();
}
public void backButtonClicked() {
view.navigate().to(ESViews.class).displayConnectorInstance(connectorId);
}
}