package com.constellio.app.ui.pages.search.criteria;
import static com.constellio.app.ui.pages.search.criteria.Criterion.BooleanOperator.AND;
import static com.constellio.app.ui.pages.search.criteria.Criterion.BooleanOperator.OR;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.List;
import org.assertj.core.api.ListAssert;
import org.joda.time.LocalDate;
import org.joda.time.LocalDateTime;
import org.junit.Before;
import org.junit.Test;
import com.constellio.app.modules.rm.RMTestRecords;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.modules.rm.wrappers.Folder;
import com.constellio.app.ui.pages.base.SessionContext;
import com.constellio.app.ui.pages.search.criteria.Criterion.SearchOperator;
import com.constellio.app.ui.pages.search.criteria.RelativeCriteria.RelativeSearchOperator;
import com.constellio.data.utils.TimeProvider;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.search.SearchServices;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition;
import com.constellio.model.services.search.query.logical.criteria.MeasuringUnitTime;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.FakeSessionContext;
public class ConditionBuilderAcceptTest extends ConstellioTest {
SearchServices searchServices;
RMTestRecords records = new RMTestRecords(zeCollection);
RMSchemasRecordsServices rm;
ConditionBuilder folderConditionBuilder;
RecordServices recordServices;
LocalDateTime now = TimeProvider.getLocalDateTime();
@Before
public void setUp()
throws Exception {
prepareSystem(
withZeCollection().withConstellioRMModule().withAllTestUsers().withRMTest(records)
.withFoldersAndContainersOfEveryStatus()
);
searchServices = getModelLayerFactory().newSearchServices();
recordServices = getModelLayerFactory().newRecordServices();
rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory());
folderConditionBuilder = new ConditionBuilder(rm.folderSchemaType(), "fr");
}
@Test
public void testWithParens()
throws Exception {
// A && ( B || C)
CriteriaBuilder builder = newFolderCriteriaBuilderAsAdmin();
builder.addCriterion(Folder.ADMINISTRATIVE_UNIT).isEqualTo(records.unitId_10a).booleanOperator(AND);
builder.addCriterion("title").isContainingText("Écureuil").withLeftParens().booleanOperator(OR);
builder.addCriterion("title").isContainingText("grenouille").withRightParens();
assertThat(recordIdsOfFolderCriteria(builder)).containsOnly(records.folder_A45, records.folder_A49);
// A && ( B || (C & D) || E)
builder = newFolderCriteriaBuilderAsAdmin();
builder.addCriterion(Folder.ADMINISTRATIVE_UNIT).isEqualTo(records.unitId_10a).booleanOperator(AND);
builder.addCriterion("title").isContainingText("Écureuil").withLeftParens().booleanOperator(OR);
builder.addCriterion("title").isContainingText("Chauve").withLeftParens().booleanOperator(AND);
builder.addCriterion("title").isContainingText("souris").withRightParens().booleanOperator(OR);
builder.addCriterion("title").isContainingText("grenouille").withRightParens();
assertThat(recordIdsOfFolderCriteria(builder)).containsOnly(records.folder_A45, records.folder_A49, records.folder_A17);
}
private ListAssert<String> assertWhenSearchingFolderTitleWithExactMatch(String text) {
CriteriaBuilder builder = newFolderCriteriaBuilderAsAdmin();
builder.addCriterion("title").isEqualTo(text);
try {
return assertThat(recordIdsOfFolderCriteria(builder));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private ListAssert<String> assertWhenSearchingFolderTitleWithoutExactMatch(String text) {
CriteriaBuilder builder = newFolderCriteriaBuilderAsAdmin();
builder.addCriterion("title").isContainingText(text);
try {
return assertThat(recordIdsOfFolderCriteria(builder));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Test
public void whenSearchingAnalyzedFieldAndExactExpressionThenGoodResults()
throws Exception {
getDataLayerFactory().getDataLayerLogger().setPrintAllQueriesLongerThanMS(0);
recordServices.update(records.getFolder_A48().setTitle("Gorille rose"));
assertWhenSearchingFolderTitleWithExactMatch("Gorille rose").containsOnly("A48");
assertWhenSearchingFolderTitleWithExactMatch("gorille rose").isEmpty();
assertWhenSearchingFolderTitleWithExactMatch("Gorille").isEmpty();
assertWhenSearchingFolderTitleWithoutExactMatch("Gorille").containsOnly("A48");
assertWhenSearchingFolderTitleWithoutExactMatch("Gorilles").containsOnly("A48");
assertWhenSearchingFolderTitleWithoutExactMatch("Goril").containsOnly("A48");
assertWhenSearchingFolderTitleWithoutExactMatch("rose").containsOnly("A48");
assertWhenSearchingFolderTitleWithoutExactMatch("rosé").containsOnly("A48");
//assertWhenSearchingFolderTitleWithoutExactMatch("Gor?lle").containsOnly("A48");
assertWhenSearchingFolderTitleWithoutExactMatch("Gori*").containsOnly("A48");
//assertWhenSearchingFolderTitleWithoutExactMatch("ril").isEmpty();
assertWhenSearchingFolderTitleWithoutExactMatch("gorille").containsOnly("A48");
assertWhenSearchingFolderTitleWithExactMatch("Chauve-souris").containsOnly("A17");
assertWhenSearchingFolderTitleWithExactMatch("Chauve souris").isEmpty();
assertWhenSearchingFolderTitleWithExactMatch("Chauve").isEmpty();
assertWhenSearchingFolderTitleWithExactMatch("souris").isEmpty();
assertWhenSearchingFolderTitleWithExactMatch("Souris").containsOnly("A93");
assertWhenSearchingFolderTitleWithExactMatch("Chauve-Souris").isEmpty();
assertWhenSearchingFolderTitleWithoutExactMatch("Souris").containsOnly("A17", "A93");
assertWhenSearchingFolderTitleWithoutExactMatch("souris").containsOnly("A17", "A93");
assertWhenSearchingFolderTitleWithoutExactMatch("Chauve-souris").containsOnly("A17", "A93");
assertWhenSearchingFolderTitleWithoutExactMatch("Chauve-Souris").containsOnly("A17", "A93");
assertWhenSearchingFolderTitleWithoutExactMatch("Chauve").containsOnly("A17");
assertWhenSearchingFolderTitleWithoutExactMatch("Chauve*").containsOnly("A17");
assertWhenSearchingFolderTitleWithoutExactMatch("Chauv*").containsOnly("A17");
assertWhenSearchingFolderTitleWithoutExactMatch("*souris").isEmpty();
assertWhenSearchingFolderTitleWithoutExactMatch("*our*").contains("A17");
assertWhenSearchingFolderTitleWithoutExactMatch("Cheval").containsOnly("A18");
assertWhenSearchingFolderTitleWithoutExactMatch("Chevaux").containsOnly("A18");
}
//Relative equals today
@Test
public void whenBuilderWithRelativeCriterionEqualsTodayThenNoRecordFound()
throws Exception {
RelativeCriteria relativeCriteria = new RelativeCriteria();
relativeCriteria.setRelativeSearchOperator(RelativeSearchOperator.TODAY);
CriteriaBuilder builder = newFolderCriteriaBuilderAsAdmin();
builder.addCriterion(Folder.OPENING_DATE).searchOperator(SearchOperator.EQUALS).relativeSearchCriteria(relativeCriteria);
assertThat(recordIdsOfFolderCriteria(builder)).isEmpty();
}
@Test
public void givenAFolderWithOpeningDateOfTodayWhenBuilderWithRelativeCriterionEqualsTodayThenOneRecordFound()
throws Exception {
Folder folder = records.getFolder_A01().setOpenDate(now.toLocalDate());
recordServices.update(folder);
RelativeCriteria relativeCriteria = new RelativeCriteria();
relativeCriteria.setRelativeSearchOperator(RelativeSearchOperator.TODAY);
CriteriaBuilder builder = newFolderCriteriaBuilderAsAdmin();
builder.addCriterion(Folder.OPENING_DATE).searchOperator(SearchOperator.EQUALS).relativeSearchCriteria(relativeCriteria);
assertThat(recordIdsOfFolderCriteria(builder)).containsOnly(records.folder_A01);
}
@Test
public void givenAFolderWithOpeningDateOfTodayAndTimeTommorowWhenBuilderWithRelativeCriterionEqualsTodayThenNoRecordFound()
throws Exception {
givenTimeIs(now);
Folder folder = records.getFolder_A01().setOpenDate(now.toLocalDate());
recordServices.update(folder);
givenTimeIs(now.plusDays(1));
RelativeCriteria relativeCriteria = new RelativeCriteria();
relativeCriteria.setRelativeSearchOperator(RelativeSearchOperator.TODAY);
CriteriaBuilder builder = newFolderCriteriaBuilderAsAdmin();
builder.addCriterion(Folder.OPENING_DATE).searchOperator(SearchOperator.EQUALS).relativeSearchCriteria(relativeCriteria);
assertThat(recordIdsOfFolderCriteria(builder)).isEmpty();
}
//Relative equals in future
@Test
public void givenAFolderWithOpeningDateInTheFutureWhenBuilderWithRelativeCriterionEqualsFutureThenOneRecordFound()
throws Exception {
Folder folder = records.getFolder_A01().setOpenDate(now.toLocalDate().plusDays(1));
recordServices.update(folder);
RelativeCriteria relativeCriteria = new RelativeCriteria();
relativeCriteria.setRelativeSearchOperator(RelativeSearchOperator.FUTURE);
relativeCriteria.setMeasuringUnitTime(MeasuringUnitTime.DAYS);
CriteriaBuilder builder = newFolderCriteriaBuilderAsAdmin();
builder.addCriterion(Folder.OPENING_DATE).searchOperator(SearchOperator.EQUALS).relativeSearchCriteria(relativeCriteria)
.value(1.0);
assertThat(recordIdsOfFolderCriteria(builder)).containsOnly(records.folder_A01);
}
@Test
public void givenAFolderWithOpeningDateInThePastWhenBuilderWithRelativeCriterionEqualsFutureThenNoRecordFound()
throws Exception {
Folder folder = records.getFolder_A01().setOpenDate(now.toLocalDate().minusDays(1));
recordServices.update(folder);
RelativeCriteria relativeCriteria = new RelativeCriteria();
relativeCriteria.setRelativeSearchOperator(RelativeSearchOperator.FUTURE);
relativeCriteria.setMeasuringUnitTime(MeasuringUnitTime.DAYS);
CriteriaBuilder builder = newFolderCriteriaBuilderAsAdmin();
builder.addCriterion(Folder.OPENING_DATE).searchOperator(SearchOperator.EQUALS).relativeSearchCriteria(relativeCriteria)
.value(1.0);
assertThat(recordIdsOfFolderCriteria(builder)).isEmpty();
}
//Relative equals in past
@Test
public void givenAFolderWithOpeningDateInThePastWhenBuilderWithRelativeCriterionEqualsPastThenOneRecordFound()
throws Exception {
Folder folder = records.getFolder_A01().setOpenDate(now.toLocalDate().minusDays(1));
recordServices.update(folder);
RelativeCriteria relativeCriteria = new RelativeCriteria();
relativeCriteria.setRelativeSearchOperator(RelativeSearchOperator.PAST);
relativeCriteria.setMeasuringUnitTime(MeasuringUnitTime.DAYS);
CriteriaBuilder builder = newFolderCriteriaBuilderAsAdmin();
builder.addCriterion(Folder.OPENING_DATE).searchOperator(SearchOperator.EQUALS).relativeSearchCriteria(relativeCriteria)
.value(1.0);
assertThat(recordIdsOfFolderCriteria(builder)).containsOnly(records.folder_A01);
}
@Test
public void givenAFolderWithOpeningDateInTheFutureWhenBuilderWithRelativeCriterionEqualsPastThenNoRecordFound()
throws Exception {
Folder folder = records.getFolder_A01().setOpenDate(now.toLocalDate().plusDays(1));
recordServices.update(folder);
RelativeCriteria relativeCriteria = new RelativeCriteria();
relativeCriteria.setRelativeSearchOperator(RelativeSearchOperator.PAST);
relativeCriteria.setMeasuringUnitTime(MeasuringUnitTime.DAYS);
CriteriaBuilder builder = newFolderCriteriaBuilderAsAdmin();
builder.addCriterion(Folder.OPENING_DATE).searchOperator(SearchOperator.EQUALS).relativeSearchCriteria(relativeCriteria)
.value(1.0);
assertThat(recordIdsOfFolderCriteria(builder)).isEmpty();
}
//Relative equals
@Test
public void givenAFolderWithOpeningDateInThePastWhenBuilderWithRelativeCriterionEqualsTheDateThenOneRecordFound()
throws Exception {
LocalDate ldt = now.toLocalDate().minusDays(1);
Folder folder = records.getFolder_A01().setOpenDate(ldt);
recordServices.update(folder);
RelativeCriteria relativeCriteria = new RelativeCriteria();
relativeCriteria.setRelativeSearchOperator(RelativeSearchOperator.EQUALS);
CriteriaBuilder builder = newFolderCriteriaBuilderAsAdmin();
builder.addCriterion(Folder.OPENING_DATE).searchOperator(SearchOperator.EQUALS).relativeSearchCriteria(relativeCriteria)
.value(ldt);
assertThat(recordIdsOfFolderCriteria(builder)).containsOnly(records.folder_A01);
}
@Test
public void givenAFolderWithOpeningDateInTheFutureWhenBuilderWithRelativeCriterionEqualsTheDateThenOneRecordFound()
throws Exception {
LocalDate ldt = now.toLocalDate().plusDays(1);
Folder folder = records.getFolder_A01().setOpenDate(ldt);
recordServices.update(folder);
RelativeCriteria relativeCriteria = new RelativeCriteria();
relativeCriteria.setRelativeSearchOperator(RelativeSearchOperator.EQUALS);
CriteriaBuilder builder = newFolderCriteriaBuilderAsAdmin();
builder.addCriterion(Folder.OPENING_DATE).searchOperator(SearchOperator.EQUALS).relativeSearchCriteria(relativeCriteria)
.value(ldt);
assertThat(recordIdsOfFolderCriteria(builder)).containsOnly(records.folder_A01);
}
//Relative between
@Test
public void givenAFolderWithOpeningDateWhenBuilderWithRelativeCriterionBetweenTheDateThenOneRecordFound()
throws Exception {
Folder folder = records.getFolder_A01().setOpenDate(now.toLocalDate());
recordServices.update(folder);
RelativeCriteria relativeCriteria = new RelativeCriteria();
relativeCriteria.setRelativeSearchOperator(RelativeSearchOperator.EQUALS);
relativeCriteria.setEndRelativeSearchOperator(RelativeSearchOperator.TODAY);
CriteriaBuilder builder = newFolderCriteriaBuilderAsAdmin();
builder.addCriterion(Folder.OPENING_DATE).searchOperator(SearchOperator.BETWEEN).relativeSearchCriteria(relativeCriteria)
.value(now.toLocalDate().minusDays(1));
assertThat(recordIdsOfFolderCriteria(builder)).containsOnly(records.folder_A01);
}
@Test
public void givenAFolderWithOpeningDateWhenBuilderWithRelativeCriterionBetweenTheDateThenNoRecordFound()
throws Exception {
Folder folder = records.getFolder_A01().setOpenDate(now.toLocalDate().minusDays(1));
recordServices.update(folder);
RelativeCriteria relativeCriteria = new RelativeCriteria();
relativeCriteria.setRelativeSearchOperator(RelativeSearchOperator.TODAY);
relativeCriteria.setEndRelativeSearchOperator(RelativeSearchOperator.EQUALS);
CriteriaBuilder builder = newFolderCriteriaBuilderAsAdmin();
builder.addCriterion(Folder.OPENING_DATE).searchOperator(SearchOperator.BETWEEN).relativeSearchCriteria(relativeCriteria)
.endValue(now.toLocalDate().plusDays(1));
assertThat(recordIdsOfFolderCriteria(builder)).isEmpty();
}
//Relative lesserThan
@Test
public void givenAFolderWithOpeningDateWhenBuilderWithRelativeCriterionLesserThanTheDateThenOneRecordFound()
throws Exception {
Folder folder = records.getFolder_A01().setOpenDate(now.toLocalDate().plusDays(1));
recordServices.update(folder);
RelativeCriteria relativeCriteria = new RelativeCriteria();
relativeCriteria.setRelativeSearchOperator(RelativeSearchOperator.TODAY);
CriteriaBuilder builder = newFolderCriteriaBuilderAsAdmin();
builder.addCriterion(Folder.OPENING_DATE).searchOperator(SearchOperator.LESSER_THAN)
.relativeSearchCriteria(relativeCriteria);
assertThat(recordIdsOfFolderCriteria(builder)).doesNotContain(records.folder_A01);
}
//Relative greaterThan
@Test
public void givenAFolderWithOpeningDateWhenBuilderWithRelativeCriterionGreaterThanTheDateThenOneRecordFound()
throws Exception {
Folder folder = records.getFolder_A01().setOpenDate(now.toLocalDate().plusDays(1));
recordServices.update(folder);
RelativeCriteria relativeCriteria = new RelativeCriteria();
relativeCriteria.setRelativeSearchOperator(RelativeSearchOperator.TODAY);
CriteriaBuilder builder = newFolderCriteriaBuilderAsAdmin();
builder.addCriterion(Folder.OPENING_DATE).searchOperator(SearchOperator.GREATER_THAN)
.relativeSearchCriteria(relativeCriteria);
assertThat(recordIdsOfFolderCriteria(builder)).containsOnly(records.folder_A01);
}
//
private List<String> recordIdsOfFolderCriteria(CriteriaBuilder criteriaBuilder)
throws Exception {
LogicalSearchCondition condition = folderConditionBuilder.build(criteriaBuilder.build());
LogicalSearchQuery query = new LogicalSearchQuery(condition);
return searchServices.searchRecordIds(query);
}
private CriteriaBuilder newFolderCriteriaBuilderAsAdmin() {
SessionContext sessionContext = FakeSessionContext.adminInCollection(zeCollection);
return new CriteriaBuilder(rm.folderSchemaType(), sessionContext);
}
}