package com.constellio.model.services.search;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.fromAllSchemasIn;
import static com.constellio.sdk.tests.schemas.TestsSchemasSetup.whichIsSearchable;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.List;
import com.constellio.data.dao.services.bigVault.solr.BigVaultServer;
import com.constellio.data.io.concurrent.data.DataWithVersion;
import com.constellio.data.io.concurrent.data.TextView;
import com.constellio.data.io.concurrent.filesystem.AtomicFileSystem;
import com.constellio.model.entities.records.Record;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
import com.constellio.sdk.tests.SolrSafeConstellioAcceptanceTest;
import com.constellio.sdk.tests.annotations.SlowTest;
import org.junit.Test;
@SlowTest
public class SynonymFeatureAcceptanceTest extends SolrSafeConstellioAcceptanceTest {
Record tv, television;
@Test
public void givenSynonymFeatureDiabeledWhenIndexingDocumentsAndSearchForAWordThenNoDocumentContainTheWordsSynonymIsReturned()
throws Exception {
//given
String synonymFileContent = "";
setUpSynonymTests(synonymFileContent);
//when
String text = "tv";
condition = fromAllSchemasIn(zeCollection).returnAll();
LogicalSearchQuery query = new LogicalSearchQuery(condition).setFreeTextQuery(text);
List<Record> results = searchServices.search(query);
//then
assertThat(results).containsOnly(tv);
}
@Test
public void givenSynonymFeatureEnabledWhenIndexingDocumentsAndSearchForAWordThenAllDocumentsContainTheWordAndItsSynonymAreReturned()
throws Exception {
if (!getDataLayerFactory().getDataLayerConfiguration().isLocalHttpSolrServer()) {
return;
}
//given
String synonymFileContent = "tv, television\n";
setUpSynonymTests(synonymFileContent);
//when
String text = "tv";
condition = fromAllSchemasIn(zeCollection).returnAll();
LogicalSearchQuery query = new LogicalSearchQuery(condition).setFreeTextQuery(text);
List<Record> results = searchServices.search(query);
//then
assertThat(results).containsOnly(tv, television);
}
private void setUpSynonymTests(String synonymFileContent)
throws Exception {
String synontyFilePath = "/synonyms.txt";
BigVaultServer server = getDataLayerFactory().getRecordsVaultServer();
AtomicFileSystem solrFileSystem = server.getSolrFileSystem();
DataWithVersion readData = solrFileSystem.readData(synontyFilePath);
TextView aStringView = readData.getView(new TextView());
aStringView.setData(synonymFileContent);
readData.setDataFromView(aStringView);
solrFileSystem.writeData(synontyFilePath, readData);
server.reload();
//when
defineSchemasManager().using(schema.withAStringMetadata(whichIsSearchable));
transaction.addUpdate(tv = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "tv"));
transaction.addUpdate(television = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "television"));
transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "radio"));
recordServices.execute(transaction);
}
}