package com.constellio.model.services.search;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.spy;
import org.joda.time.LocalDateTime;
import org.junit.Before;
import org.junit.Test;
import com.constellio.data.dao.services.records.RecordDao;
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.LogicalSearchQueryOperators;
import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.TestRecord;
public class SearchServiceSortAcceptTest extends ConstellioTest {
RecordServices recordServices;
SearchServices searchServices;
RecordDao recordDao;
SearchServiceAcceptanceTestSchemas schema = new SearchServiceAcceptanceTestSchemas(zeCollection);
SearchServiceAcceptanceTestSchemas.ZeSchemaMetadatas zeSchema = schema.new ZeSchemaMetadatas();
@Before
public void setUp()
throws Exception {
recordServices = getModelLayerFactory().newRecordServices();
recordDao = spy(getDataLayerFactory().newRecordDao());
searchServices = new SearchServices(recordDao, getModelLayerFactory());
defineSchemasManager()
.using(schema.withADateTimeMetadata().withANumberMetadata().withAStringMetadata());
}
@Test
public void whenSortingOnDatesThenCorrectOrder()
throws Exception {
LocalDateTime dateTime1 = null;
LocalDateTime dateTime2 = new LocalDateTime(2014, 2, 1, 1, 1, 1);
LocalDateTime dateTime3 = new LocalDateTime(2014, 2, 1, 1, 1, 2);
LocalDateTime dateTime4 = new LocalDateTime(2015, 2, 1, 1, 1, 1);
LocalDateTime dateTime5 = new LocalDateTime(2015, 2, 1, 1, 1, 2);
Transaction transaction = new Transaction();
Record record4 = transaction.add(new TestRecord(zeSchema).set(zeSchema.dateTimeMetadata(), dateTime4));
Record record2 = transaction.add(new TestRecord(zeSchema).set(zeSchema.dateTimeMetadata(), dateTime2));
Record record5 = transaction.add(new TestRecord(zeSchema).set(zeSchema.dateTimeMetadata(), dateTime5));
Record record3 = transaction.add(new TestRecord(zeSchema).set(zeSchema.dateTimeMetadata(), dateTime3));
Record recordWithNull = transaction.add(new TestRecord(zeSchema).set(zeSchema.dateTimeMetadata(), dateTime1));
recordServices.execute(transaction);
assertThat(searchServices.search(findAllQuery().sortAsc(zeSchema.dateTimeMetadata())))
.containsExactly(recordWithNull, record2, record3, record4, record5);
assertThat(searchServices.searchRecordIds(findAllQuery().sortAsc(zeSchema.dateTimeMetadata())))
.containsExactly(recordWithNull.getId(), record2.getId(), record3.getId(), record4.getId(), record5.getId());
assertThat(searchServices.search(findAllQuery().sortDesc(zeSchema.dateTimeMetadata())))
.containsExactly(record5, record4, record3, record2, recordWithNull);
assertThat(searchServices.searchRecordIds(findAllQuery().sortDesc(zeSchema.dateTimeMetadata())))
.containsExactly(record5.getId(), record4.getId(), record3.getId(), record2.getId(), recordWithNull.getId());
}
@Test
public void whenSortingOnNumbersThenCorrectOrder()
throws Exception {
Double number1 = null;
Double number2 = -3.0;
Double number3 = 1.1;
Double number4 = 1.2;
Double number5 = 2.1;
Double number6 = 10.1;
Double number7 = 3456347.1234;
Double number8 = 109842477384.1;
Transaction transaction = new Transaction();
Record record4 = transaction.add(new TestRecord(zeSchema, "4").set(zeSchema.numberMetadata(), number4));
Record record8 = transaction.add(new TestRecord(zeSchema, "8").set(zeSchema.numberMetadata(), number8));
Record record2 = transaction.add(new TestRecord(zeSchema, "2").set(zeSchema.numberMetadata(), number2));
Record record5 = transaction.add(new TestRecord(zeSchema, "5").set(zeSchema.numberMetadata(), number5));
Record record7 = transaction.add(new TestRecord(zeSchema, "7").set(zeSchema.numberMetadata(), number7));
Record record3 = transaction.add(new TestRecord(zeSchema, "3").set(zeSchema.numberMetadata(), number3));
Record record6 = transaction.add(new TestRecord(zeSchema, "6").set(zeSchema.numberMetadata(), number6));
Record record1 = transaction.add(new TestRecord(zeSchema, "1").set(zeSchema.numberMetadata(), number1));
recordServices.execute(transaction);
assertThat(searchServices.search(findAllQuery().sortAsc(zeSchema.numberMetadata())))
.containsExactly(record2, record1, record3, record4, record5, record6, record7, record8);
assertThat(searchServices.searchRecordIds(findAllQuery().sortAsc(zeSchema.numberMetadata())))
.containsExactly(record2.getId(), record1.getId(), record3.getId(), record4.getId(), record5.getId(),
record6.getId(), record7.getId(), record8.getId());
assertThat(searchServices.search(findAllQuery().sortDesc(zeSchema.numberMetadata())))
.containsExactly(record8, record7, record6, record5, record4, record3, record1, record2);
assertThat(searchServices.searchRecordIds(findAllQuery().sortDesc(zeSchema.numberMetadata())))
.containsExactly(record8.getId(), record7.getId(), record6.getId(), record5.getId(),
record4.getId(),
record3.getId(), record1.getId(), record2.getId()
);
}
@Test
public void whenSortingOnTextThenCorrectOrder()
throws Exception {
String text1 = null;
String text2 = "a";
String text3 = "a b";
String text4 = "ab";
String text5 = "";
Transaction transaction = new Transaction();
Record record4 = transaction.add(new TestRecord(zeSchema, "4").set(zeSchema.stringMetadata(), text4));
Record record2 = transaction.add(new TestRecord(zeSchema, "2").set(zeSchema.stringMetadata(), text2));
Record record5 = transaction.add(new TestRecord(zeSchema, "5").set(zeSchema.stringMetadata(), text5));
Record record3 = transaction.add(new TestRecord(zeSchema, "3").set(zeSchema.stringMetadata(), text3));
Record record1 = transaction.add(new TestRecord(zeSchema, "1").set(zeSchema.stringMetadata(), text1));
recordServices.execute(transaction);
assertThat(searchServices.search(findAllQuery().sortAsc(zeSchema.stringMetadata())))
.containsExactly(record2, record3, record4, record1, record5);
assertThat(searchServices.searchRecordIds(findAllQuery().sortAsc(zeSchema.stringMetadata())))
.containsExactly(record2.getId(), record3.getId(), record4.getId(), record1.getId(), record5.getId());
assertThat(searchServices.search(findAllQuery().sortDesc(zeSchema.stringMetadata())))
.containsExactly(record4, record3, record2, record1, record5);
assertThat(searchServices.searchRecordIds(findAllQuery().sortDesc(zeSchema.stringMetadata())))
.containsExactly(record4.getId(), record3.getId(), record2.getId(), record1.getId(), record5.getId());
}
@Test
public void whenSortingOnMultipleFieldsThenCorrectOrder()
throws Exception {
LocalDateTime dateTime1 = new LocalDateTime(2014, 2, 1, 1, 1, 1);
LocalDateTime dateTime2 = new LocalDateTime(2015, 2, 1, 1, 1, 2);
Double number1 = 1.1;
Double number2 = 1.2;
Transaction transaction = new Transaction();
Record record4 = transaction.add(new TestRecord(zeSchema, "4").set(zeSchema.dateTimeMetadata(), dateTime2).set(
zeSchema.numberMetadata(), number2));
Record record2 = transaction.add(new TestRecord(zeSchema, "2").set(zeSchema.dateTimeMetadata(), dateTime1).set(
zeSchema.numberMetadata(), number2));
Record record3 = transaction.add(new TestRecord(zeSchema, "3").set(zeSchema.dateTimeMetadata(), dateTime2).set(
zeSchema.numberMetadata(), number1));
Record record1 = transaction.add(new TestRecord(zeSchema, "1").set(zeSchema.dateTimeMetadata(), dateTime1).set(
zeSchema.numberMetadata(), number1));
recordServices.execute(transaction);
assertThat(searchServices.search(findAllQuery().sortAsc(zeSchema.dateTimeMetadata()).sortAsc(zeSchema.numberMetadata())))
.containsExactly(record1, record2, record3, record4);
assertThat(searchServices.searchRecordIds(findAllQuery().sortAsc(
zeSchema.dateTimeMetadata()).sortAsc(zeSchema.numberMetadata())))
.containsExactly(record1.getId(), record2.getId(), record3.getId(), record4.getId());
assertThat(searchServices.search(findAllQuery().sortDesc(zeSchema.dateTimeMetadata()).sortAsc(zeSchema.numberMetadata())))
.containsExactly(record3, record4, record1, record2);
assertThat(searchServices.searchRecordIds(findAllQuery().sortDesc(zeSchema.dateTimeMetadata()).sortAsc(
zeSchema.numberMetadata())))
.containsExactly(record3.getId(), record4.getId(), record1.getId(), record2.getId());
assertThat(searchServices.search(findAllQuery().sortAsc(zeSchema.dateTimeMetadata()).sortDesc(zeSchema.numberMetadata())))
.containsExactly(record2, record1, record4, record3);
assertThat(searchServices
.searchRecordIds(findAllQuery().sortAsc(zeSchema.dateTimeMetadata()).sortDesc(zeSchema.numberMetadata())))
.containsExactly(record2.getId(), record1.getId(), record4.getId(), record3.getId());
}
private LogicalSearchQuery findAllQuery() {
LogicalSearchCondition condition = LogicalSearchQueryOperators.from(zeSchema.instance()).returnAll();
return new LogicalSearchQuery(condition);
}
}