package com.constellio.model.services.search.services;
import com.constellio.data.dao.services.bigVault.solr.BigVaultServer;
import com.constellio.data.io.concurrent.data.DataWithVersion;
import com.constellio.data.io.concurrent.filesystem.AtomicFileSystem;
import com.constellio.model.entities.records.Record;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.records.SchemasRecordsServices;
import com.constellio.model.services.search.Elevations;
import com.constellio.model.services.search.Elevations.QueryElevation;
import com.constellio.model.services.search.Elevations.QueryElevation.DocElevation;
import com.constellio.model.services.search.ElevationsView;
import org.apache.commons.lang.StringUtils;
import java.util.List;
//TODO make all methods thread safe
/* Currently, because the all the Constellio collections store in one solr collection, it is not possible
* to change one Constellio collection configurations for the Elevation feature without any side effect on the
* other Constellio collections.
*/
public class ElevationServiceImpl implements ElevationService {
public static final String ELEVATE_FILE_NAME = "/elevate.xml";
private BigVaultServer server;
private ModelLayerFactory modelLayerFactory;
public ElevationServiceImpl(BigVaultServer server, ModelLayerFactory modelLayerFactory) {
this.server = server;
this.modelLayerFactory = modelLayerFactory;
}
@Override
public void elevate(Record record, String freeTextQuery) {
if (StringUtils.isBlank(freeTextQuery)) {
freeTextQuery = "*:*";
}
AtomicFileSystem solrFileSystem = server.getSolrFileSystem();
DataWithVersion readData = solrFileSystem.readData(ELEVATE_FILE_NAME);
ElevationsView anElevationsView = readData.getView(new ElevationsView());
Elevations elevations = anElevationsView.getData();
elevations.addOrUpdate(
new QueryElevation().setQuery(freeTextQuery)
.addDocElevation(new QueryElevation.DocElevation(record.getId(), false)));
anElevationsView.setData(elevations);
readData.setDataFromView(anElevationsView);
solrFileSystem.writeData(ELEVATE_FILE_NAME, readData);
server.reload();
}
@Override
public void removeElevation(Record record, String freeTextQuery) {
if (StringUtils.isBlank(freeTextQuery)) {
freeTextQuery = "*:*";
}
AtomicFileSystem solrFileSystem = server.getSolrFileSystem();
DataWithVersion readData = solrFileSystem.readData(ELEVATE_FILE_NAME);
ElevationsView anElevationsView = readData.getView(new ElevationsView());
Elevations elevations = anElevationsView.getData();
elevations.removeElevation(freeTextQuery);
anElevationsView.setData(elevations);
readData.setDataFromView(anElevationsView);
solrFileSystem.writeData(ELEVATE_FILE_NAME, readData);
server.reload();
}
@Override
public void removeCollectionElevation(String collection, String query) {
if (StringUtils.isBlank(query)) {
query = "*:*";
}
AtomicFileSystem solrFileSystem = server.getSolrFileSystem();
DataWithVersion readData = solrFileSystem.readData(ELEVATE_FILE_NAME);
ElevationsView anElevationsView = readData.getView(new ElevationsView());
Elevations elevations = anElevationsView.getData();
SchemasRecordsServices schemas = new SchemasRecordsServices(collection, modelLayerFactory);
elevations.removeCollectionElevation(schemas, query);
anElevationsView.setData(elevations);
readData.setDataFromView(anElevationsView);
solrFileSystem.writeData(ELEVATE_FILE_NAME, readData);
server.reload();
}
@Override
public List<DocElevation> getCollectionElevation(String collection, String query) {
if (StringUtils.isBlank(query)) {
query = "*:*";
}
AtomicFileSystem solrFileSystem = server.getSolrFileSystem();
DataWithVersion readData = solrFileSystem.readData(ELEVATE_FILE_NAME);
ElevationsView anElevationsView = readData.getView(new ElevationsView());
Elevations elevations = anElevationsView.getData();
SchemasRecordsServices schemas = new SchemasRecordsServices(collection, modelLayerFactory);
return elevations.getCollectionElevation(schemas, query);
}
@Override
public Elevations getCollectionElevations(String collection) {
AtomicFileSystem solrFileSystem = server.getSolrFileSystem();
DataWithVersion readData = solrFileSystem.readData(ELEVATE_FILE_NAME);
ElevationsView anElevationsView = readData.getView(new ElevationsView());
Elevations elevations = anElevationsView.getData();
SchemasRecordsServices schemas = new SchemasRecordsServices(collection, modelLayerFactory);
return elevations.getCollectionElevations(schemas);
}
@Override
public void removeCollectionElevations(String collection) {
AtomicFileSystem solrFileSystem = server.getSolrFileSystem();
DataWithVersion readData = solrFileSystem.readData(ELEVATE_FILE_NAME);
ElevationsView anElevationsView = readData.getView(new ElevationsView());
Elevations elevations = anElevationsView.getData();
SchemasRecordsServices schemas = new SchemasRecordsServices(collection, modelLayerFactory);
elevations.removeCollectionElevations(schemas);
anElevationsView.setData(elevations);
readData.setDataFromView(anElevationsView);
solrFileSystem.writeData(ELEVATE_FILE_NAME, readData);
server.reload();
}
}