package com.constellio.model.services.search;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from;
import static com.constellio.sdk.tests.schemas.TestsSchemasSetup.whichIsSearchable;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.spy;
import java.util.Arrays;
import org.joda.time.LocalDate;
import org.joda.time.LocalDateTime;
import org.junit.Before;
import org.junit.Test;
import com.constellio.data.dao.services.records.RecordDao;
import com.constellio.data.utils.TimeProvider;
import com.constellio.model.entities.Language;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.Transaction;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
import com.constellio.model.services.search.query.logical.ongoing.OngoingLogicalSearchConditionWithDataStoreFields;
import com.constellio.model.services.search.query.logical.valueCondition.ConditionTemplateFactory;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.TestRecord;
import com.constellio.sdk.tests.annotations.SlowTest;
@SlowTest
public class SearchServiceInEnglishCollectionAcceptanceTest extends ConstellioTest {
private static final LocalDateTime DATE_TIME4 = new LocalDateTime(2003, 7, 15, 22, 40);
private static final LocalDateTime DATE_TIME3 = new LocalDateTime(2002, 8, 15, 22, 40);
private static final LocalDateTime DATE_TIME2 = new LocalDateTime(2001, 9, 15, 22, 40);
private static final LocalDateTime DATE_TIME1 = new LocalDateTime(2000, 10, 15, 22, 40);
private static final LocalDate DATE4 = new LocalDate(2003, 7, 15);
private static final LocalDate DATE3 = new LocalDate(2002, 8, 15);
private static final LocalDate DATE2 = new LocalDate(2001, 9, 15);
private static final LocalDate DATE1 = new LocalDate(2000, 10, 15);
LocalDateTime NOW = TimeProvider.getLocalDateTime();
RecordServices recordServices;
SearchServices searchServices;
RecordDao recordDao;
SearchServiceAcceptanceTestSchemas schema = new SearchServiceAcceptanceTestSchemas(zeCollection);
SearchServiceAcceptanceTestSchemas.ZeSchemaMetadatas zeSchema = schema.new ZeSchemaMetadatas();
ConditionTemplateFactory factory;
Transaction transaction;
Record record1, record2, record3, record4, record5;
@Before
public void setUp() {
givenSystemLanguageIs(Language.English.getCode());
givenCollection(zeCollection, Arrays.asList(Language.English.getCode()));
recordServices = getModelLayerFactory().newRecordServices();
recordDao = spy(getDataLayerFactory().newRecordDao());
searchServices = new SearchServices(recordDao, getModelLayerFactory());
transaction = new Transaction();
factory = new ConditionTemplateFactory(getModelLayerFactory(), zeCollection);
}
@Test
public void whenSearchingWithPrefereAnalyzedFlagInEnglishCollectionThenUseAnalyzedFields()
throws Exception {
defineSchemasManager().using(schema.withAStringMetadata(whichIsSearchable).withAnotherStringMetadata());
getDataLayerFactory().getDataLayerLogger().setPrintAllQueriesLongerThanMS(0);
transaction.addUpdate(record1 = givenARecord("record1")
.set(zeSchema.stringMetadata(),
"When Alexander Bell invented the telephone he had 3 missed calls from Chuck Norris"));
transaction.addUpdate(record2 = givenARecord("record2")
.set(zeSchema.stringMetadata(),
"Fear of spiders is aracnaphobia, fear of tight spaces is chlaustraphobia, fear of Chuck Norris is called Logic"));
transaction.addUpdate(record3 = givenARecord("record3")
.set(zeSchema.stringMetadata(), "Some magicans can walk on water, Chuck Norris can swim through land."));
transaction.addUpdate(record4 = givenARecord("record4")
.set(zeSchema.stringMetadata(),
"When the Boogeyman goes to sleep every night, he checks in fear his closet for Chuck Norris.")
.set(zeSchema.anotherStringMetadata(),
"Dakota l'indien is Chuck Norris idol"));
transaction.addUpdate(record5 = givenARecord("record5").set(zeSchema.stringMetadata(), "Chuck Norris"));
recordServices.execute(transaction);
OngoingLogicalSearchConditionWithDataStoreFields whereStringMetadata = from(zeSchema.instance())
.where(zeSchema.stringMetadata());
assertThat(searchServices.search(new LogicalSearchQuery(whereStringMetadata.isEqualTo("Chuck Norris"))))
.containsOnly(record5);
assertThat(searchServices.search(new LogicalSearchQuery(whereStringMetadata.isEqualTo("Boogeyman"))))
.isEmpty();
assertThat(searchServices.search(new LogicalSearchQuery(whereStringMetadata.isEqualTo("boogeyman"))))
.isEmpty();
assertThat(searchServices.search(new LogicalSearchQuery(whereStringMetadata.isEqualTo("swim"))))
.isEmpty();
assertThat(searchServices.search(new LogicalSearchQuery(whereStringMetadata.isEqualTo("magican"))))
.isEmpty();
assertThat(searchServices.search(new LogicalSearchQuery(whereStringMetadata.isEqualTo("idol"))))
.isEmpty();
assertThat(searchServices.search(new LogicalSearchQuery(whereStringMetadata.isEqualTo("Chuck Norris")
.andWhere(zeSchema.anotherStringMetadata()).isEqualTo("Dakota"))))
.isEmpty();
assertThat(searchServices
.search(new LogicalSearchQuery(whereStringMetadata.isEqualTo("Chuck Norris")).setPreferAnalyzedFields(true)))
.containsOnly(record1, record2, record3, record4, record5);
assertThat(searchServices
.search(new LogicalSearchQuery(whereStringMetadata.isEqualTo("Boogeyman")).setPreferAnalyzedFields(true)))
.containsOnly(record4);
assertThat(searchServices
.search(new LogicalSearchQuery(whereStringMetadata.isEqualTo("boogeyman")).setPreferAnalyzedFields(true)))
.containsOnly(record4);
assertThat(searchServices
.search(new LogicalSearchQuery(whereStringMetadata.isEqualTo("swim")).setPreferAnalyzedFields(true)))
.containsOnly(record3);
assertThat(searchServices
.search(new LogicalSearchQuery(whereStringMetadata.isEqualTo("magican")).setPreferAnalyzedFields(true)))
.containsOnly(record3);
assertThat(searchServices
.search(new LogicalSearchQuery(whereStringMetadata.isEqualTo("idol")).setPreferAnalyzedFields(true)))
.isEmpty();
assertThat(searchServices.search(new LogicalSearchQuery(whereStringMetadata.isEqualTo("Chuck Norris")
.andWhere(zeSchema.anotherStringMetadata()).isEqualTo("Dakota")).setPreferAnalyzedFields(true)))
.isEmpty();
}
private Record givenARecord(String record) {
return new TestRecord(zeSchema, record);
}
}