package com.constellio.model.services.search; import static com.constellio.model.entities.schemas.MetadataTransiency.TRANSIENT_EAGER; import static com.constellio.model.entities.schemas.MetadataTransiency.TRANSIENT_LAZY; import static com.constellio.model.entities.schemas.Schemas.TITLE; import static com.constellio.model.services.records.cache.CacheConfig.permanentCache; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.allConditions; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.anyConditions; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.containingText; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.fromAllSchemasIn; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.startingWithText; import static com.constellio.sdk.tests.TestUtils.asList; import static com.constellio.sdk.tests.TestUtils.ids; import static com.constellio.sdk.tests.schemas.TestsSchemasSetup.ANOTHER_SCHEMA_TYPE_CODE; import static com.constellio.sdk.tests.schemas.TestsSchemasSetup.ZE_SCHEMA_TYPE_CODE; import static com.constellio.sdk.tests.schemas.TestsSchemasSetup.whichHasTransiency; import static com.constellio.sdk.tests.schemas.TestsSchemasSetup.whichIsCalculatedUsing; import static com.constellio.sdk.tests.schemas.TestsSchemasSetup.whichIsEncrypted; import static com.constellio.sdk.tests.schemas.TestsSchemasSetup.whichIsSearchable; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Random; import java.util.Set; import org.apache.solr.common.params.SolrParams; import org.joda.time.LocalDate; import org.joda.time.LocalDateTime; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import com.constellio.data.dao.dto.records.FacetValue; import com.constellio.data.dao.dto.records.OptimisticLockingResolution; import com.constellio.data.dao.services.bigVault.solr.BigVaultRuntimeException.BadRequest; import com.constellio.data.dao.services.records.RecordDao; import com.constellio.data.utils.TimeProvider; import com.constellio.model.entities.calculators.CalculatorParameters; import com.constellio.model.entities.calculators.MetadataValueCalculator; import com.constellio.model.entities.calculators.dependencies.Dependency; import com.constellio.model.entities.calculators.dependencies.LocalDependency; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.records.Transaction; import com.constellio.model.entities.schemas.Metadata; import com.constellio.model.entities.schemas.MetadataSchemaType; import com.constellio.model.entities.schemas.MetadataValueType; import com.constellio.model.entities.schemas.Schemas; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.records.RecordServicesException; import com.constellio.model.services.schemas.builders.MetadataBuilder; import com.constellio.model.services.schemas.builders.MetadataBuilder_EnumClassTest.AValidEnum; import com.constellio.model.services.schemas.builders.MetadataSchemaTypeBuilder; import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder; import com.constellio.model.services.search.moreLikeThis.MoreLikeThisClustering; import com.constellio.model.services.search.query.ReturnedMetadatasFilter; 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.model.services.search.query.logical.criteria.MeasuringUnitTime; 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.TestUtils; import com.constellio.sdk.tests.annotations.SlowTest; import com.constellio.sdk.tests.schemas.MetadataBuilderConfigurator; @SlowTest public class SearchServiceAcceptanceTest 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(); SearchServiceAcceptanceTestSchemas.ZeCustomSchemaMetadatas zeCustomSchema = schema.new ZeCustomSchemaMetadatas(); SearchServiceAcceptanceTestSchemas.AnotherSchemaMetadatas anotherSchema = schema.new AnotherSchemaMetadatas(); SearchServiceAcceptanceTestSchemas otherSchema = new SearchServiceAcceptanceTestSchemas("collection2"); SearchServiceAcceptanceTestSchemas.OtherSchemaMetadatasInCollection2 otherSchemaInCollection2 = otherSchema.new OtherSchemaMetadatasInCollection2(); LogicalSearchCondition condition; ConditionTemplateFactory factory; Transaction transaction; Record expectedRecord, expectedRecord2, expectedRecord3, expectedRecord4, expectedRecord5; Record zeSchemaRecord1, zeSchemaRecord2, zeSchemaRecord3, zeSchemaRecord4, anotherSchemaRecord1, anotherSchemaRecord2, otherSchemaRecord1InCollection2, otherSchemaRecord2InCollection2, record1, record2, record3, record4, record5; @Before public void setUp() { prepareSystem( withZeCollection(), withCollection("collection2") ); //givenCollection(zeCollection, Arrays.asList(Language.French.getCode(), 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 givenAListOfDocumentsWhenModifyingOneOfThemAndSearchItThenTheOldVersionIsReturned() throws Exception { defineSchemasManager().using(schema.withAStringMetadata(whichIsSearchable)); Record documentA, documentB, documentC, documentCNewVersion; transaction.addUpdate(documentA = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "This is a document A")); transaction.addUpdate(documentB = newRecordOfZeSchema() .set(zeSchema.stringMetadata(), "This is an another document without misspelling")); transaction.addUpdate(documentC = newRecordOfZeSchema() .set(zeSchema.stringMetadata(), "Document with misspelling: this is a frist version of this document.")); transaction.addUpdate(documentCNewVersion = newRecordOfZeSchema() .set(zeSchema.stringMetadata(), "Document without misspelling: this is a second version of this document.")); recordServices.execute(transaction); condition = fromAllSchemasIn(zeCollection).where(Schemas.IDENTIFIER).isEqualTo(documentCNewVersion); //when LogicalSearchQuery query = new LogicalSearchQuery(fromAllSchemasIn(zeCollection).returnAll()); query.setQueryCondition(condition); query.setMoreLikeThis(true); query.addMoreLikeThisField(zeSchema.stringMetadata()); Map<Record, Map<Record, Double>> resutls = searchServices.searchWithMoreLikeThis(query); assertThat(resutls).hasSize(1); Map<Record, Double> similarDocs = resutls.entrySet().iterator().next().getValue(); List<Record> docsInOrder = new ArrayList<>(); for (Entry<Record, Double> record : similarDocs.entrySet()) { docsInOrder.add(record.getKey()); } assertThat(docsInOrder).containsExactly(documentC, documentB, documentA); } public String createAContentWithWords(Random random, String[] words) { final int WORD_DOC_CNT = 10; StringBuilder sb = new StringBuilder(); for (int i = 0; i < WORD_DOC_CNT; i++) { if (sb.length() != 0) sb.append(" "); sb.append(words[random.nextInt(words.length)]); } return sb.toString(); } @Test public void givenTwoTopicsWhenSearchingForADocumentThenItsTopicIsAutomaticallyIdentifiedFromSearchResult() throws Exception { //given defineSchemasManager().using(schema.withAStringMetadata(whichIsSearchable).withAnotherStringMetadata()); String[] politicsWords = new String[] { "party", "democrat", "president", "election", "vote" }; String[] sportWords = new String[] { "hockey", "team", "game", "play", "league" }; String[][] topics = new String[][] { politicsWords, sportWords }; String[] topicNames = new String[] { "POLICTICS", "SPORT" }; final int TOPIC_DOC_CNT = 10; Random random = new Random(77655467554l); for (int topicIdx = 0; topicIdx < topicNames.length; topicIdx++) { String topicName = topicNames[topicIdx]; String[] words = topics[topicIdx]; for (int i = 0; i < TOPIC_DOC_CNT; i++) { transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata() , createAContentWithWords(random, words)).set(zeSchema.anotherStringMetadata(), topicName)); } } int docTopicIdx = 1; Record docToBeClassified; transaction.addUpdate(docToBeClassified = newRecordOfZeSchema().set( zeSchema.stringMetadata(), createAContentWithWords(random, topics[docTopicIdx]))); recordServices.execute(transaction); //when condition = fromAllSchemasIn(zeCollection).where(Schemas.IDENTIFIER).isEqualTo(docToBeClassified); LogicalSearchQuery query = new LogicalSearchQuery(fromAllSchemasIn(zeCollection).returnAll()); query.setQueryCondition(condition); query.setMoreLikeThis(true); query.addMoreLikeThisField(zeSchema.stringMetadata()); Map<Record, Map<Record, Double>> resutls = searchServices.searchWithMoreLikeThis(query); assertThat(resutls).hasSize(1); assertThat(resutls.entrySet().iterator().next().getValue()).isNotEmpty(); //then MoreLikeThisClustering facet = new MoreLikeThisClustering(resutls.get(docToBeClassified), new MoreLikeThisClustering.StringConverter<Record>() { @Override public String converToString(Record record) { return record.get(zeSchema.anotherStringMetadata()); } }); String suggestedTopic = facet.getClusterScore().entrySet().iterator().next().getKey(); assertThat(suggestedTopic).isEqualTo(topicNames[docTopicIdx]); } @Test public void whenSearchingUsingIdsInFreeTextTheFindRecordWithOrWithoutPaddingZeros() throws Exception { defineSchemasManager().using(schema); transaction.addUpdate(recordServices.newRecordWithSchema(zeSchema.instance(), "00000001042")); transaction.addUpdate(recordServices.newRecordWithSchema(zeSchema.instance(), "00000001043")); transaction.addUpdate(recordServices.newRecordWithSchema(zeSchema.instance(), "00000011043")); recordServices.execute(transaction); LogicalSearchQuery query = new LogicalSearchQuery(); query.setCondition(from(zeSchema.type()).returnAll()); query.setFreeTextQuery("00000001042"); assertThat(searchServices.searchRecordIds(query)).containsOnly("00000001042"); query.setFreeTextQuery("00000001043"); assertThat(searchServices.searchRecordIds(query)).containsOnly("00000001043"); query.setFreeTextQuery("00000011043"); assertThat(searchServices.searchRecordIds(query)).containsOnly("00000011043"); query.setFreeTextQuery("1042"); assertThat(searchServices.searchRecordIds(query)).containsOnly("00000001042"); query.setFreeTextQuery("1043"); assertThat(searchServices.searchRecordIds(query)).containsOnly("00000001043"); query.setFreeTextQuery("11043"); assertThat(searchServices.searchRecordIds(query)).containsOnly("00000011043"); } @Test public void whenSearchingRecordsReturningWithFullValueContainingSpacesAsteriskAndQuestionMarkThenFindResult() throws Exception { defineSchemasManager().using(schema.withAStringMetadata().withABooleanMetadata()); Record withSpace, withSlash, withBackSlash, withSemicolon, withQuestionMark; transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck \\\"\\?Norris*:")); transaction.addUpdate(withSpace = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Norris")); transaction.addUpdate(withSlash = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck/Norris")); transaction.addUpdate(withBackSlash = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck\\Norris")); transaction.addUpdate(withSemicolon = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck:Norris")); transaction.addUpdate(withQuestionMark = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck?Norris")); recordServices.execute(transaction); OngoingLogicalSearchConditionWithDataStoreFields whereMetadata = from(zeSchema.instance()) .where(zeSchema.stringMetadata()); assertThat(findRecords(whereMetadata.isEqualTo("Chuck Norris"))).containsOnly(withSpace); assertThat(findRecords(whereMetadata.isEqualTo("Chuck/Norris"))).containsOnly(withSlash); assertThat(findRecords(whereMetadata.isEqualTo("Chuck\\Norris"))).containsOnly(withBackSlash); assertThat(findRecords(whereMetadata.isEqualTo("Chuck:Norris"))).containsOnly(withSemicolon); assertThat(findRecords(whereMetadata.isEqualTo("Chuck?Norris"))).containsOnly(withQuestionMark); assertThat(findRecords(whereMetadata.isIn(asList("Chuck Norris")))).containsOnly(withSpace); assertThat(findRecords(whereMetadata.isIn(asList("Chuck/Norris")))).containsOnly(withSlash); assertThat(findRecords(whereMetadata.isIn(asList("Chuck\\Norris")))).containsOnly(withBackSlash); assertThat(findRecords(whereMetadata.isIn(asList("Chuck:Norris")))).containsOnly(withSemicolon); assertThat(findRecords(whereMetadata.isIn(asList("Chuck?Norris")))).containsOnly(withQuestionMark); } @Test public void whenSearchingRecordsReturningWithFullValueContainingSpecialCharactersThenFindResult() throws Exception { defineSchemasManager().using(schema.withAStringMetadata().withABooleanMetadata()); Record special; transaction.addUpdate( newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Norris + - && || ! ( ) { } [ ] ^ \" ~ * ? : \\")); transaction.addUpdate( special = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "+ - && || ! ( ) { } [ ] ^ \" ~ * ? : \\")); recordServices.execute(transaction); OngoingLogicalSearchConditionWithDataStoreFields whereMetadata = from(zeSchema.instance()) .where(zeSchema.stringMetadata()); assertThat(findRecords(whereMetadata.isEqualTo("+ - && || ! ( ) { } [ ] ^ \" ~ * ? : \\"))).containsOnly(special); assertThat(findRecords(whereMetadata.isIn(asList("+ - && || ! ( ) { } [ ] ^ \" ~ * ? : \\")))).containsOnly(special); } @Test public void whenSearchingByEnumValueThenFindRecords() throws Exception { defineSchemasManager().using(schema.withAnEnumMetadata(AValidEnum.class)); transaction.addUpdate(record1 = givenARecord("record1").set(zeSchema.enumMetadata(), AValidEnum.FIRST_VALUE)); transaction.addUpdate(record2 = givenARecord("record2").set(zeSchema.enumMetadata(), AValidEnum.SECOND_VALUE)); transaction.addUpdate(record3 = givenARecord("record3").set(zeSchema.enumMetadata(), AValidEnum.FIRST_VALUE)); transaction.addUpdate(record4 = givenARecord("record4").set(zeSchema.enumMetadata(), AValidEnum.FIRST_VALUE)); recordServices.execute(transaction); OngoingLogicalSearchConditionWithDataStoreFields whereMetadata = from(zeSchema.instance()) .where(zeSchema.enumMetadata()); assertThat(findRecords(whereMetadata.isEqualTo(AValidEnum.FIRST_VALUE))).containsOnly(record1, record3, record4); assertThat(findRecords(whereMetadata.isEqualTo(AValidEnum.SECOND_VALUE))).containsOnly(record2); assertThat(findRecords(whereMetadata.isNotNull())).containsOnly(record1, record2, record3, record4); assertThat(findRecords(whereMetadata.isNull())).isEmpty(); assertThat(findRecords(whereMetadata.isIn(asList(AValidEnum.SECOND_VALUE)))).containsOnly(record2); assertThat(findRecords(whereMetadata.isIn(asList(AValidEnum.FIRST_VALUE, AValidEnum.SECOND_VALUE)))).containsOnly( record1, record2, record3, record4); assertThat(findRecords(whereMetadata.isIn(new ArrayList<>()))).isEmpty(); assertThat(findRecords(whereMetadata.isNotIn(asList(AValidEnum.FIRST_VALUE)))).containsOnly(record2); assertThat(findRecords(whereMetadata.isNotIn(asList(AValidEnum.FIRST_VALUE, AValidEnum.SECOND_VALUE)))).isEmpty(); assertThat(findRecords(whereMetadata.isNotIn(new ArrayList<>()))).containsOnly(record1, record2, record3, record4); } @Test public void whenSearchingStatsForCollectionThenFindResults() throws Exception { //recordServices.execute(transaction); LogicalSearchQuery query = new LogicalSearchQuery(); query.setCondition(condition); } @Test public void whenSearchingStatsForNumberMetadataThenFindResults() throws Exception { defineSchemasManager().using(schema.withANumberMetadata(whichIsSearchable)); Metadata statsMetadata = zeSchema.numberMetadata(); transaction.addUpdate(expectedRecord = newRecordOfZeSchema() .set(statsMetadata, 12.0)); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema() .set(statsMetadata, 13.5)); //transaction.addUpdate(expectedRecord3 = newRecordOfZeSchema()); recordServices.execute(transaction); condition = from(zeSchema.instance()).returnAll(); //when LogicalSearchQuery query = new LogicalSearchQuery(condition); query.computeStatsOnField(statsMetadata); //then SPEQueryResponse response = searchServices.query(query); Map<String, Object> values = response.getStatValues(statsMetadata); assertThat(values.get("min")).isEqualTo(12.0); assertThat(values.get("max")).isEqualTo(13.5); assertThat(values.get("sum")).isEqualTo(25.5); assertThat(values.get("count")).isEqualTo(2L); assertThat(values.get("missing")).isEqualTo(0L); } @Test public void whenSearchingStatsForNumberMetadataWithMissingValueThenFindResults() throws Exception { defineSchemasManager().using(schema.withANumberMetadata(whichIsSearchable)); Metadata statsMetadata = zeSchema.numberMetadata(); transaction.addUpdate(expectedRecord = newRecordOfZeSchema() .set(statsMetadata, 12.0)); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema() .set(statsMetadata, 13.5)); transaction.addUpdate(expectedRecord3 = newRecordOfZeSchema()); recordServices.execute(transaction); condition = from(zeSchema.instance()).returnAll(); //when LogicalSearchQuery query = new LogicalSearchQuery(condition); query.computeStatsOnField(statsMetadata); //then SPEQueryResponse response = searchServices.query(query); Map<String, Object> values = response.getStatValues(statsMetadata); assertThat(values.get("missing")).isEqualTo(1L); assertThat(values.get("count")).isEqualTo(2L); assertThat(values.get("min")).isEqualTo(12.0); assertThat(values.get("max")).isEqualTo(13.5); assertThat(values.get("sum")).isEqualTo(25.5); } @Test public void whenSearchingStatsForAllContainersOfACollectionThenFindResults() throws Exception { } @Test public void whenSearchingStatsForContainerWithAtLeastOneFolderWithoutLinearSizeThenReturnFolderWithoutLinearSizeException() throws Exception { } @Test public void whenSearchingStatsForCollectionWithAtLeastOneFolderWithoutLinearSizeThenReturnFolderWithoutLinearSizeException() throws Exception { } @Test public void whenSearchingStatsForContainerWithInvalidCapacityThenReturnContainerCapacityNotFoundException() throws Exception { } @Test public void whenSearchingBySingleFacetValueThenFindRecordsWithGivenValue() throws Exception { defineSchemasManager().using(schema.withAStringMetadata().withANumberMetadata()); transaction.addUpdate(record1 = givenARecord("record1") .set(zeSchema.stringMetadata(), "Chuck Norris").set(zeSchema.numberMetadata(), 1.0)); transaction.addUpdate(record2 = givenARecord("record2") .set(zeSchema.stringMetadata(), "Chuck Norris").set(zeSchema.numberMetadata(), 2.0)); transaction.addUpdate(record3 = givenARecord("record3") .set(zeSchema.stringMetadata(), "Chuck Norris").set(zeSchema.numberMetadata(), 3.0)); transaction.addUpdate(record4 = givenARecord("record4") .set(zeSchema.stringMetadata(), "Gandalf le Blanc").set(zeSchema.numberMetadata(), 1.0)); transaction.addUpdate(record5 = givenARecord("record5") .set(zeSchema.stringMetadata(), "Gandalf le Blanc").set(zeSchema.numberMetadata(), 2.0)); recordServices.execute(transaction); LogicalSearchCondition condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isEqualTo("Chuck Norris"); LogicalSearchQuery query = new LogicalSearchQuery(condition); query.getFacetFilters().selectedFieldFacetValues(zeSchema.numberMetadata().getDataStoreCode(), Arrays.asList("1.0")); assertThat(searchServices.search(query)).containsOnly(record1); } @Test public void whenSearchingAndFilteringUsingQueryValueThenFindRecordsWithGivenValue() throws Exception { defineSchemasManager().using(schema.withAStringMetadata().withANumberMetadata().withADateMetadata()); transaction.addUpdate(record1 = givenARecord("record1") .set(zeSchema.stringMetadata(), "Chuck Norris") .set(zeSchema.numberMetadata(), 1.0) .set(zeSchema.dateMetadata(), new LocalDate(2012, 5, 12))); transaction.addUpdate(record2 = givenARecord("record2") .set(zeSchema.stringMetadata(), "Chuck Norris") .set(zeSchema.numberMetadata(), 2.0) .set(zeSchema.dateMetadata(), new LocalDate(2012, 5, 15))); transaction.addUpdate(record3 = givenARecord("record3") .set(zeSchema.stringMetadata(), "Chuck Norris") .set(zeSchema.numberMetadata(), 3.0) .set(zeSchema.dateMetadata(), new LocalDate(2012, 5, 18))); transaction.addUpdate(record4 = givenARecord("record4") .set(zeSchema.stringMetadata(), "Gandalf le Blanc") .set(zeSchema.numberMetadata(), 1.0)); transaction.addUpdate(record5 = givenARecord("record5") .set(zeSchema.stringMetadata(), "Gandalf le Blanc") .set(zeSchema.numberMetadata(), 2.0)); recordServices.execute(transaction); LogicalSearchCondition condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isEqualTo("Chuck Norris"); LogicalSearchQuery query = new LogicalSearchQuery(condition); query.getFacetFilters().selectedQueryFacetValue("numberFacet", "numberMetadata_d:[2.0 TO 3.0]"); assertThat(searchServices.search(query)).containsOnly(record2, record3); query.getFacetFilters().selectedQueryFacetValue("numberFacet", "numberMetadata_d:[1.0 TO 2.0]"); assertThat(searchServices.search(query)).containsOnly(record1, record2, record3); query.getFacetFilters() .selectedQueryFacetValue("dateFacet", "dateMetadata_da:[2012-05-14T00:00:00Z TO 2012-05-18T00:00:00Z]"); assertThat(searchServices.search(query)).containsOnly(record2, record3); } @Test public void whenSearchingByMultipleFacetValuesThenFindRecordsWithAnyValue() throws Exception { defineSchemasManager().using(schema.withAStringMetadata().withANumberMetadata()); transaction.addUpdate(record1 = givenARecord("record1") .set(zeSchema.stringMetadata(), "Chuck Norris").set(zeSchema.numberMetadata(), 1.0)); transaction.addUpdate(record2 = givenARecord("record2") .set(zeSchema.stringMetadata(), "Chuck Norris").set(zeSchema.numberMetadata(), 2.0)); transaction.addUpdate(record3 = givenARecord("record3") .set(zeSchema.stringMetadata(), "Chuck Norris").set(zeSchema.numberMetadata(), 3.0)); transaction.addUpdate(record4 = givenARecord("record4") .set(zeSchema.stringMetadata(), "Gandalf le Blanc").set(zeSchema.numberMetadata(), 1.0)); transaction.addUpdate(record5 = givenARecord("record5") .set(zeSchema.stringMetadata(), "Gandalf le Blanc").set(zeSchema.numberMetadata(), 2.0)); recordServices.execute(transaction); LogicalSearchCondition condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isEqualTo("Chuck Norris"); LogicalSearchQuery query = new LogicalSearchQuery(condition); query.getFacetFilters().selectedFieldFacetValues(zeSchema.numberMetadata().getDataStoreCode(), Arrays.asList("1.0", "2.0")); assertThat(searchServices.search(query)).containsOnly(record1, record2); } @Test public void whenSearchingByMultipleFacetsThenFindRecordsWithAllValues() throws Exception { defineSchemasManager().using(schema.withAStringMetadata().withAnotherStringMetadata().withANumberMetadata()); transaction.addUpdate(record1 = givenARecord("record1") .set(zeSchema.stringMetadata(), "Chuck Norris") .set(zeSchema.anotherStringMetadata(), "A") .set(zeSchema.numberMetadata(), 1.0)); transaction.addUpdate(record2 = givenARecord("record2") .set(zeSchema.stringMetadata(), "Chuck Norris") .set(zeSchema.anotherStringMetadata(), "B") .set(zeSchema.numberMetadata(), 2.0)); transaction.addUpdate(record3 = givenARecord("record3") .set(zeSchema.stringMetadata(), "Chuck Norris") .set(zeSchema.anotherStringMetadata(), "A") .set(zeSchema.numberMetadata(), 3.0)); transaction.addUpdate(record4 = givenARecord("record4") .set(zeSchema.stringMetadata(), "Gandalf le Blanc") .set(zeSchema.anotherStringMetadata(), "A") .set(zeSchema.numberMetadata(), 1.0)); transaction.addUpdate(record5 = givenARecord("record5") .set(zeSchema.stringMetadata(), "Gandalf le Blanc") .set(zeSchema.anotherStringMetadata(), "A") .set(zeSchema.numberMetadata(), 2.0)); recordServices.execute(transaction); LogicalSearchCondition condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isEqualTo("Chuck Norris"); LogicalSearchQuery query = new LogicalSearchQuery(condition); query.getFacetFilters() .selectedFieldFacetValues(zeSchema.numberMetadata().getDataStoreCode(), Arrays.asList("1.0", "2.0")) .selectedFieldFacetValue(zeSchema.anotherStringMetadata().getDataStoreCode(), "A"); assertThat(searchServices.search(query)).containsOnly(record1); } @Test public void whenAskingForSingleFacetThenReturnFacetValues() throws Exception { defineSchemasManager().using(schema.withAStringMetadata().withAnotherStringMetadata().withANumberMetadata()); transaction.addUpdate(record1 = givenARecord("record1") .set(zeSchema.stringMetadata(), "Chuck Norris") .set(zeSchema.anotherStringMetadata(), "A") .set(zeSchema.numberMetadata(), 1.0)); transaction.addUpdate(record2 = givenARecord("record2") .set(zeSchema.stringMetadata(), "Chuck Norris") .set(zeSchema.anotherStringMetadata(), "B") .set(zeSchema.numberMetadata(), 2.0)); transaction.addUpdate(record3 = givenARecord("record3") .set(zeSchema.stringMetadata(), "Chuck Norris") .set(zeSchema.anotherStringMetadata(), "A") .set(zeSchema.numberMetadata(), 3.0)); transaction.addUpdate(record4 = givenARecord("record4") .set(zeSchema.stringMetadata(), "Gandalf le Blanc") .set(zeSchema.anotherStringMetadata(), "A") .set(zeSchema.numberMetadata(), 1.0)); transaction.addUpdate(record5 = givenARecord("record5") .set(zeSchema.stringMetadata(), "Gandalf le Blanc") .set(zeSchema.anotherStringMetadata(), "A") .set(zeSchema.numberMetadata(), 2.0)); recordServices.execute(transaction); LogicalSearchQuery query = new LogicalSearchQuery(from(zeSchema.instance()).returnAll()) .addFieldFacet(zeSchema.numberMetadata().getDataStoreCode()); Map<String, List<FacetValue>> facets = searchServices.query(query).getFieldFacetValues(); assertThat(facets.keySet()).containsOnly(zeSchema.numberMetadata().getDataStoreCode()); assertThat(facets.get(zeSchema.numberMetadata().getDataStoreCode())).hasSize(3); } @Test public void whenAskingForMultipleFacetsThenReturnFacetValues() throws Exception { defineSchemasManager().using(schema.withAStringMetadata().withAnotherStringMetadata().withANumberMetadata()); transaction.addUpdate(record1 = givenARecord("record1") .set(zeSchema.stringMetadata(), "Chuck Norris") .set(zeSchema.anotherStringMetadata(), "A") .set(zeSchema.numberMetadata(), 1.0)); transaction.addUpdate(record2 = givenARecord("record2") .set(zeSchema.stringMetadata(), "Chuck Norris") .set(zeSchema.anotherStringMetadata(), "B") .set(zeSchema.numberMetadata(), 2.0)); transaction.addUpdate(record3 = givenARecord("record3") .set(zeSchema.stringMetadata(), "Chuck Norris") .set(zeSchema.anotherStringMetadata(), "A") .set(zeSchema.numberMetadata(), 3.0)); transaction.addUpdate(record4 = givenARecord("record4") .set(zeSchema.stringMetadata(), "Gandalf le Blanc") .set(zeSchema.anotherStringMetadata(), "A") .set(zeSchema.numberMetadata(), 1.0)); transaction.addUpdate(record5 = givenARecord("record5") .set(zeSchema.stringMetadata(), "Gandalf le Blanc") .set(zeSchema.anotherStringMetadata(), "A") .set(zeSchema.numberMetadata(), 2.0)); recordServices.execute(transaction); LogicalSearchQuery query = new LogicalSearchQuery(from(zeSchema.instance()).returnAll()) .addFieldFacet(zeSchema.numberMetadata().getDataStoreCode()) .addFieldFacet(zeSchema.anotherStringMetadata().getDataStoreCode()); Map<String, List<FacetValue>> facets = searchServices.query(query).getFieldFacetValues(); assertThat(facets.keySet()).containsOnly( zeSchema.numberMetadata().getDataStoreCode(), zeSchema.anotherStringMetadata().getDataStoreCode()); assertThat(facets.get(zeSchema.numberMetadata().getDataStoreCode())).hasSize(3); assertThat(facets.get(zeSchema.anotherStringMetadata().getDataStoreCode())).hasSize(2); } @Test public void whenSearchingRecordsReturningOnlySomeFieldsThenFindResultsEventIfFieldNotReturned() throws Exception { defineSchemasManager().using(schema.withAStringMetadata().withABooleanMetadata()); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Norris").set( zeSchema.booleanMetadata(), true)); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Lechat Norris") .set(zeSchema.booleanMetadata(), true)); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "chuck Norris").set( zeSchema.booleanMetadata(), true)); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Edouard Chuck Lechat").set( zeSchema.booleanMetadata(), true)); recordServices.execute(transaction); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isStartingWithText("Chuck"); LogicalSearchQuery query = new LogicalSearchQuery(); query.setCondition(condition); query.setReturnedMetadatas(ReturnedMetadatasFilter.onlyMetadatas(zeSchema.booleanMetadata())); List<Record> records = searchServices.search(query); assertThat(ids(records)).containsOnly(TestUtils.idsArray(expectedRecord, expectedRecord2)); assertThat(records.get(0).get(zeSchema.stringMetadata())).isNull(); assertThat((boolean) records.get(0).get(zeSchema.booleanMetadata())).isTrue(); assertThat(records.get(1).get(zeSchema.stringMetadata())).isNull(); assertThat((boolean) records.get(1).get(zeSchema.booleanMetadata())).isTrue(); } @Test public void whenSearchingRecordsReturningOnlySomeFieldsThenReturnOnlyAskedFieldsVersionIdAndSchema() throws Exception { defineSchemasManager().using(schema.withAStringMetadata().withABooleanMetadata()); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Norris").set( zeSchema.booleanMetadata(), true)); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Lechat Norris") .set(zeSchema.booleanMetadata(), true)); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "chuck Norris").set( zeSchema.booleanMetadata(), true)); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Edouard Chuck Lechat").set( zeSchema.booleanMetadata(), true)); recordServices.execute(transaction); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isStartingWithText("Chuck"); LogicalSearchQuery query = new LogicalSearchQuery(); query.setCondition(condition); query.setReturnedMetadatas(ReturnedMetadatasFilter.onlyMetadatas(zeSchema.stringMetadata())); List<Record> records = searchServices.search(query); assertThat(ids(records)).containsOnly(TestUtils.idsArray(expectedRecord, expectedRecord2)); assertThat(records.get(0).get(zeSchema.stringMetadata())).isNotNull(); assertThat(records.get(0).getId()).isNotNull(); assertThat(records.get(0).getVersion()).isNotNull(); assertThat(records.get(0).getSchemaCode()).isNotNull(); assertThat(records.get(0).get(zeSchema.booleanMetadata())).isNull(); assertThat(records.get(1).get(zeSchema.stringMetadata())).isNotNull(); assertThat(records.get(1).getId()).isNotNull(); assertThat(records.get(1).getVersion()).isNotNull(); assertThat(records.get(1).getSchemaCode()).isNotNull(); assertThat(records.get(1).get(zeSchema.booleanMetadata())).isNull(); } @Test public void whenSearchingWithPrefereAnalyzedFlagThenUseAnalyzedFields() throws Exception { defineSchemasManager().using(schema.withAStringMetadata(whichIsSearchable).withAnotherStringMetadata()); getDataLayerFactory().getDataLayerLogger().setPrintAllQueriesLongerThanMS(0); transaction.addUpdate(record1 = givenARecord("record1") .set(zeSchema.stringMetadata(), "Rien ne sert de jouer aux échecs avec Chuck Norris, il ne connait pas l'échec")); transaction.addUpdate(record2 = givenARecord("record2") .set(zeSchema.stringMetadata(), "Chuck Norris et Superman ont fait un bras de fer, le perdant devait mettre son slip par dessus son pantalon.")); transaction.addUpdate(record3 = givenARecord("record3") .set(zeSchema.stringMetadata(), "Chuck Norris a déjà compté jusqu'à l'infini. Deux fois.")); transaction.addUpdate(record4 = givenARecord("record4") .set(zeSchema.stringMetadata(), "Certaines personnes portent un pyjama superman. Superman porte un pyjama Chuck Norris.") .set(zeSchema.anotherStringMetadata(), "Dakota l'indien est l'idole de Chuck Norris")); 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("Superman")))) .isEmpty(); assertThat(searchServices.search(new LogicalSearchQuery(whereStringMetadata.isEqualTo("superman")))) .isEmpty(); assertThat(searchServices.search(new LogicalSearchQuery(whereStringMetadata.isEqualTo("echec")))) .isEmpty(); assertThat(searchServices.search(new LogicalSearchQuery(whereStringMetadata.isEqualTo("personne")))) .isEmpty(); assertThat(searchServices.search(new LogicalSearchQuery(whereStringMetadata.isEqualTo("idole")))) .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("Superman")).setPreferAnalyzedFields(true))) .containsOnly(record2, record4); assertThat(searchServices .search(new LogicalSearchQuery(whereStringMetadata.isEqualTo("superman")).setPreferAnalyzedFields(true))) .containsOnly(record2, record4); assertThat(searchServices .search(new LogicalSearchQuery(whereStringMetadata.isEqualTo("echec")).setPreferAnalyzedFields(true))) .containsOnly(record1); assertThat(searchServices .search(new LogicalSearchQuery(whereStringMetadata.isEqualTo("persone")).setPreferAnalyzedFields(true))) .containsOnly(record4); assertThat(searchServices .search(new LogicalSearchQuery(whereStringMetadata.isEqualTo("idole")).setPreferAnalyzedFields(true))) .isEmpty(); assertThat(searchServices.search(new LogicalSearchQuery(whereStringMetadata.isEqualTo("Chuck Norris") .andWhere(zeSchema.anotherStringMetadata()).isEqualTo("Dakota")).setPreferAnalyzedFields(true))) .isEmpty(); } //Broken multilingual @Test public void givenSearchableStringMetadataWhenSearchingRecordsUsingFrenchDefaultSearchFieldThenFindValidFrenchRecods() throws Exception { defineSchemasManager().using(schema.withAStringMetadata(whichIsSearchable)); transaction.addUpdate( expectedRecord = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Édouard Lechat est le meilleur")); transaction .addUpdate(expectedRecord2 = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "J'entend un bruit étrange")); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "It is snowing outside. Meilleur")); recordServices.execute(transaction); assertThat( findRecords(from(zeSchema.instance()).where(zeSchema.stringMetadata().getAnalyzedField("fr")).query("meilleur"))) .containsOnly(expectedRecord); } //Multilinguage broken @Test public void givenSearchableStringMetadataWhenSearchingWithLanguageAnalysisThenFindValue() throws Exception { ConditionTemplateFactory factory = new ConditionTemplateFactory(getModelLayerFactory(), zeCollection); defineSchemasManager().using(schema.withAStringMetadata(whichIsSearchable)); transaction.addUpdate( record1 = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Édouard Lechat est le meilleur")); transaction .addUpdate(record2 = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "J'entend un bruit étrange")); transaction.addUpdate(record3 = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "It is snowing outside. Meilleur")); recordServices.execute(transaction); assertThat(findRecords(from(zeSchema.instance()) .where(factory.metadatasHasAnalyzedValue("snowing", zeSchema.stringMetadata())))).containsOnly(record3); assertThat(findRecords(from(zeSchema.instance()) .where(factory.metadatasHasAnalyzedValue("meilleur", zeSchema.stringMetadata())))).containsOnly(record1); } //Broken multilingual @Test public void givenSearchableStringMetadataWhenSearchingRecordsUsingEnglishDefaultSearchFieldThenFindValidEnglishRecords() throws Exception { defineSchemasManager().using(schema.withAStringMetadata(whichIsSearchable)); transaction.addUpdate(expectedRecord = newRecordOfZeSchema() .set(zeSchema.stringMetadata(), "This is some amazing text in document number 42")); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema() .set(zeSchema.stringMetadata(), "My favorite numbers are 42 and 666.")); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Ceci est un number en francais : 42")); recordServices.execute(transaction); } //Multilinguage broken @Test public void givenSearchableTextMetadataWhenSearchingRecordsUsingFrenchDefaultSearchFieldThenFindValidFrenchRecods() throws Exception { defineSchemasManager().using(schema.withALargeTextMetadata(whichIsSearchable)); transaction.addUpdate( expectedRecord = newRecordOfZeSchema().set(zeSchema.largeTextMetadata(), "Édouard Lechat est le meilleur")); transaction .addUpdate( expectedRecord2 = newRecordOfZeSchema().set(zeSchema.largeTextMetadata(), "J'entend un bruit étrange")); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.largeTextMetadata(), "It is snowing outside. Meilleur")); recordServices.execute(transaction); } @Test public void givenSimpleSearchWhenAskingForHighlightsThenReturnTheHighlights() throws Exception { //given defineSchemasManager().using(schema.withAStringMetadata(whichIsSearchable)); transaction.addUpdate(expectedRecord = newRecordOfZeSchema() .set(zeSchema.stringMetadata(), "This is some amazing text in document number 42")); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema() .set(zeSchema.stringMetadata(), "My favorite numbers are 42 and 666, but I like text as well.")); recordServices.execute(transaction); String text = "text"; condition = fromAllSchemasIn(zeCollection).returnAll(); //when LogicalSearchQuery query = new LogicalSearchQuery(condition).setFreeTextQuery(text).setHighlighting(true); SPEQueryResponse response = searchServices.query(query); //then Map<String, Map<String, List<String>>> highlights = response.getHighlights(); String highlightText = "<em>" + text + "</em>"; for (Record record : new Record[] { expectedRecord, expectedRecord2 }) { assertThat(highlights).containsKey(record.getId()); assertThat(highlights.get(record.getId()).size()).isGreaterThan(0); for (List<String> snippets : highlights.get(record.getId()).values()) { for (String snippet : snippets) { assertThat(snippet).contains(highlightText); assertThat(record.get(zeSchema.stringMetadata()).toString()).contains(snippet.replaceAll("</?em>", "")); } } } } @Test public void givenAdvancedSearchWhenAskingForHighlightsThenReturnTheHighlights() throws Exception { //given defineSchemasManager().using(schema.withAStringMetadata(whichIsSearchable)); transaction.addUpdate(expectedRecord = newRecordOfZeSchema() .set(zeSchema.stringMetadata(), "This is some amazing text in document number 42")); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema() .set(zeSchema.stringMetadata(), "My favorite numbers are 42 and 666, but I like text as well.")); recordServices.execute(transaction); String text = "text"; condition = from(zeSchema.instance()).returnAll(); //when LogicalSearchQuery query = new LogicalSearchQuery(condition).setFreeTextQuery(text).setHighlighting(true); SPEQueryResponse response = searchServices.query(query); //then Map<String, Map<String, List<String>>> highlights = response.getHighlights(); String highlightText = "<em>" + text + "</em>"; for (Record record : new Record[] { expectedRecord, expectedRecord2 }) { assertThat(highlights).containsKey(record.getId()); assertThat(highlights.get(record.getId()).size()).isGreaterThan(0); for (Entry<String, List<String>> snippets : highlights.get(record.getId()).entrySet()) { if (!snippets.getKey().equals("stringMetadata_t_en")) continue; for (String snippet : snippets.getValue()) { assertThat(snippet).contains(highlightText); assertThat(record.get(zeSchema.stringMetadata()).toString()).contains(snippet.replaceAll("</?em>", "")); } } } } @Test public void whenSearchingRecordsWithEncryptedMetadatasThenDecryptedInResultedRecords() throws Exception { defineSchemasManager().using(schema.withAStringMetadata(whichIsEncrypted)); transaction.addUpdate(expectedRecord = newRecordOfZeSchema("1").set(zeSchema.stringMetadata(), "Chuck Norris")); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema("2").set(zeSchema.stringMetadata(), "Chuck Lechat Norris")); recordServices.execute(transaction); LogicalSearchQuery query = new LogicalSearchQuery(from(zeSchema.instance()) .where(zeSchema.stringMetadata()).isNot(containingText("Chuck"))); query.sortAsc(Schemas.IDENTIFIER); List<Record> records = searchServices.search(query); assertThat(records).hasSize(2); assertThat(records.get(0).get(zeSchema.stringMetadata())).isEqualTo("Chuck Norris"); assertThat(records.get(1).get(zeSchema.stringMetadata())).isEqualTo("Chuck Lechat Norris"); } @Test public void whenSearchingRecordsStartingWithTextThenFindThem() throws Exception { defineSchemasManager().using(schema.withAStringMetadata()); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Norris")); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Lechat Norris")); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "chuck Norris")); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Edouard Chuck Lechat")); recordServices.execute(transaction); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isStartingWithText("Chuck"); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void whenSearchingRecordsEndingWithTextThenFindThem() throws Exception { defineSchemasManager().using(schema.withAStringMetadata()); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Norris")); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Lechat Norris")); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Lechat")); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Edouard Chuck Lechat")); recordServices.execute(transaction); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isEndingWithText("Norris"); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void whenSearchingRecordsContainingTextThenFindThem() throws Exception { defineSchemasManager().using(schema.withAStringMetadata()); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Norris")); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Lechat Norris")); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "chuck Norris")); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Edouard Chuck Lechat")); recordServices.execute(transaction); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isContainingText("Lechat"); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void whenSearchingRecordsContainingTextWithSpecialCharactersThenFindThem() throws Exception { defineSchemasManager().using(schema.withAStringMetadata()); transaction.addUpdate(expectedRecord = newRecordOfZeSchema() .set(zeSchema.stringMetadata(), "Chuck:h=T+4zq4cGP/tXkdJp/qz1WVWYhoQ=:Norris -1.-03")); recordServices.execute(transaction); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()) .isContainingText("Chuck:h=T+4zq4cGP/tXkdJp/qz1WVWYhoQ=:Norris -1.-03"); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord); } @Test public void whenSearchingRecordsInAnySchemaContainingTextThenFindThem() throws Exception { defineSchemasManager().using(schema.withAStringMetadata().withAnotherSchemaStringMetadata()); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Norris")); transaction.addUpdate(expectedRecord2 = newRecordOfAnotherSchema().set(anotherSchema.stringMetadata(), "Chuck Lechat Norris")); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Lechat")); transaction.addUpdate(newRecordOfAnotherSchema().set(anotherSchema.stringMetadata(), "Edouard Chuck Lechat")); recordServices.execute(transaction); condition = fromAllSchemasIn(zeCollection).where(zeSchema.stringMetadata()).isContainingText("Norris"); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void whenSearchingRecordsIsTrueThenFindThem() throws Exception { defineSchemasManager().using(schema.withABooleanMetadata()); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.booleanMetadata(), true)); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema().set(zeSchema.booleanMetadata(), true)); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.booleanMetadata(), false)); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.booleanMetadata(), false)); recordServices.execute(transaction); condition = from(zeSchema.instance()).where(zeSchema.booleanMetadata()).isTrue(); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void whenSearchingRecordsIsTrueOrNullThenFindThem() throws Exception { defineSchemasManager().using(schema.withABooleanMetadata()); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.booleanMetadata(), true)); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema().set(zeSchema.booleanMetadata(), null)); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.booleanMetadata(), false)); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.booleanMetadata(), false)); recordServices.execute(transaction); condition = from(zeSchema.instance()).where(zeSchema.booleanMetadata()).isTrueOrNull(); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void whenSearchingRecordsIsFalseThenFindThem() throws Exception { defineSchemasManager().using(schema.withABooleanMetadata()); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.booleanMetadata(), false)); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema().set(zeSchema.booleanMetadata(), false)); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.booleanMetadata(), true)); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.booleanMetadata(), true)); recordServices.execute(transaction); condition = from(zeSchema.instance()).where(zeSchema.booleanMetadata()).isFalse(); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void whenSearchingRecordsIsFalseOrNullThenFindThem() throws Exception { defineSchemasManager().using(schema.withABooleanMetadata()); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.booleanMetadata(), false)); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema().set(zeSchema.booleanMetadata(), null)); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.booleanMetadata(), true)); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.booleanMetadata(), true)); recordServices.execute(transaction); condition = from(zeSchema.instance()).where(zeSchema.booleanMetadata()).isFalseOrNull(); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void whenSearchingRecordsOnBooleanMetadataIsNullThenFindThem() throws Exception { defineSchemasManager().using(schema.withABooleanMetadata()); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.booleanMetadata(), null)); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema().set(zeSchema.booleanMetadata(), null)); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.booleanMetadata(), true)); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.booleanMetadata(), false)); recordServices.execute(transaction); condition = from(zeSchema.instance()).where(zeSchema.booleanMetadata()).isNull(); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void whenSearchingRecordsOnBooleanMetadataIsNotNullThenFindThem() throws Exception { defineSchemasManager().using(schema.withABooleanMetadata()); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.booleanMetadata(), null)); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.booleanMetadata(), null)); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.booleanMetadata(), true)); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema().set(zeSchema.booleanMetadata(), false)); recordServices.execute(transaction); condition = from(zeSchema.instance()).where(zeSchema.booleanMetadata()).isNotNull(); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void whenSearchingRecordsOnTextMetadataIsNullThenFindThem() throws Exception { defineSchemasManager().using(schema.withAStringMetadata()); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.stringMetadata(), null)); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema().set(zeSchema.stringMetadata(), null)); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Norris")); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Nuck Chorris")); recordServices.execute(transaction); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isNull(); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void whenSearchingRecordsOnTextMetadataIsNotNullThenFindThem() throws Exception { defineSchemasManager().using(schema.withAStringMetadata()); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), null)); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), null)); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Norris")); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Nuck Chorris")); recordServices.execute(transaction); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isNotNull(); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void whenSearchingRecordsContainingTextANDIsStartingWithTextThenFindThem() throws Exception { defineSchemasManager().using(schema.withAStringMetadata()); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Norris")); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Lechat")); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Edouard Norris")); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Edouard Chuck Lechat")); recordServices.execute(transaction); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isContainingText("Norris") .and(asList(startingWithText("Chuck"))); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord); } @Test public void whenSearchingRecordsContainingTextORIsStartingWithTextThenFindThem() throws Exception { defineSchemasManager().using(schema.withAStringMetadata()); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Norris")); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Lechat")); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Edouard Lechat")); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Edouard Chuck Lechat")); recordServices.execute(transaction); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isContainingText("Norris") .or(asList(startingWithText("Chuck"))); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void whenSearchingRecordsContainingTextANDIsFalseThenFindThem() throws Exception { defineSchemasManager().using(schema.withAStringMetadata().withABooleanMetadata()); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Norris")); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Lechat")); expectedRecord.set(zeSchema.booleanMetadata(), false); expectedRecord2.set(zeSchema.booleanMetadata(), false); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Edouard Lechat")); transaction.addUpdate(expectedRecord3 = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Edouard Norris")); recordServices.execute(transaction); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isContainingText("Chuck") .andWhere(zeSchema.booleanMetadata()).isFalse().orWhere(zeSchema.stringMetadata()) .isNot(containingText("Lechat")); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2, expectedRecord3); } @Test public void whenSearchingRecordsContainingTextANDIsFalseOrNotContainingTextThenFindThem() throws Exception { defineSchemasManager().using(schema.withAStringMetadata().withABooleanMetadata()); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Norris")); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Lechat")); expectedRecord.set(zeSchema.booleanMetadata(), false); expectedRecord2.set(zeSchema.booleanMetadata(), false); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Edouard Lechat")); transaction.addUpdate(expectedRecord3 = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Edouard Norris")); recordServices.execute(transaction); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isContainingText("Chuck") .andWhere(zeSchema.booleanMetadata()).isFalse().orWhere(zeSchema.stringMetadata()) .isNot(containingText("Lechat")); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2, expectedRecord3); } @Test public void whenSearchingRecordsContainingTextORIsTrueThenFindThem() throws Exception { defineSchemasManager().using(schema.withAStringMetadata().withABooleanMetadata()); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Edouard Norris")); expectedRecord.set(zeSchema.booleanMetadata(), true); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Lechat")); expectedRecord2.set(zeSchema.booleanMetadata(), false); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Edouard Lechat")); transaction.addUpdate(expectedRecord3 = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Norris")); expectedRecord.set(zeSchema.booleanMetadata(), true); recordServices.execute(transaction); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isContainingText("Chuck") .orWhere(zeSchema.booleanMetadata()).isTrue(); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2, expectedRecord3); } @Test public void givenNumberValuesWhenIsValueInRange10NegativeTo2ThenReturnTwoRecords() throws Exception { givenFiveNumberValuesIncludingNegativeNumberAndMinIntegerValue(); condition = from(zeSchema.instance()).where(zeSchema.numberMetadata()).isValueInRange(-10, 2); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2, expectedRecord3); } @Test public void givenLettersValuesWhenIsValueInRangeBToCThenReturnTwoRecords() throws Exception { givenFourLettersValues(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isValueInRange("B", "C"); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2, expectedRecord3); } @Test public void givenTextValuesWhenIsValueInRangeThenReturnTwoRecords() throws Exception { givenFiveTextValues(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isValueInRange("Chuck Norris", "Edouard Lechat"); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2, expectedRecord3); } @Test public void givenTextValuesIncludingNULLWhenIsValueInRangeFromThenDoNotReturnNullValue() throws Exception { givenFourTextValuesIncludingNull(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isValueInRange("__A__", "__T__"); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord3); } @Test public void givenDateValuesWhenIsValueInRangeThenReturnTwoRecords() throws Exception { givenFiveDateValuesIncludingNullDate(); condition = from(zeSchema.instance()).where(zeSchema.dateMetadata()).isValueInRange(DATE2, DATE3); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2, expectedRecord3); } @Test public void givenDateTimeValuesWhenIsValueInRangeThenReturnTwoRecords() throws Exception { givenFiveDateTimeValuesIncludingNullDateTime(); condition = from(zeSchema.instance()).where(zeSchema.dateTimeMetadata()).isValueInRange(DATE_TIME2, DATE_TIME3); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2, expectedRecord3); } @Test public void givenNumberValuesIncludingNegativeNumberAndMinIntegerValueWhenIsLessThanThenReturnThreeRecords() throws Exception { givenFiveNumberValuesIncludingNegativeNumberAndMinIntegerValue(); condition = from(zeSchema.instance()).where(zeSchema.numberMetadata()).isLessThan(10); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2, expectedRecord3); } @Test public void givenLettersValuesWhenIsLessThanThenReturnTwoRecords() throws Exception { givenFourLettersValues(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isLessThan("C"); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void givenTextValuesWhenIsLessThanThenReturnTwoRecords() throws Exception { givenFiveTextValues(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isLessThan("Edouard Lechat"); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void givenTextValuesIncludingNULLWhenIsLessThanThenDoNotReturnNullValue() throws Exception { givenFourTextValuesIncludingNull(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isLessThan("__Z__"); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord3); } @Test public void givenDateTimeIncludingNullDateTimeValuesWhenIsLessThanThenDoNotReturnNullValue() throws Exception { givenFiveDateTimeValuesIncludingNullDateTime(); condition = from(zeSchema.instance()).where(zeSchema.dateTimeMetadata()).isLessThan(DATE_TIME3); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void givenDateIncludingNullDateValuesWhenIsLessThanThenDoNotReturnNullValue() throws Exception { givenFiveDateValuesIncludingNullDate(); condition = from(zeSchema.instance()).where(zeSchema.dateMetadata()).isLessThan(DATE3); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void givenDateIncludingNullDateValuesWhenIsNotNullThenDoNotReturnNullValue() throws Exception { givenFiveDateValuesIncludingNullDate(); condition = from(zeSchema.instance()).where(zeSchema.dateMetadata()).isNotNull(); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2, expectedRecord3, expectedRecord4); } @Test public void givenDateIncludingNullDateValuesWhenIsNullThenReturnNullValueOnly() throws Exception { givenFiveDateValuesIncludingNullDate(); condition = from(zeSchema.instance()).where(zeSchema.dateMetadata()).isNull(); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord5); } @Test public void givenNumberValuesIncludingMinIntegerValueWhenIsLessOrEqualThan10ThenReturnTwoRecords() throws Exception { givenFiveNumberValuesIncludingNegativeNumberAndMinIntegerValue(); condition = from(zeSchema.instance()).where(zeSchema.numberMetadata()).isLessOrEqualThan(-10); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void givenLettersValuesWhenIsLessOrEqualThanCThenReturnThreeRecords() throws Exception { givenFourLettersValues(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isLessOrEqualThan("C"); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2, expectedRecord3); } @Test public void givenTextValuesWhenIsLessOrEqualThanThirdRecordThenReturnThreeRecords() throws Exception { givenFiveTextValues(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isLessOrEqualThan("Edouard Lechat"); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2, expectedRecord3); } @Test public void givenFourTextValuesIncludingNULLWhenIsLessOrEqualThanZThenReturnThreeRecords() throws Exception { givenFourTextValuesIncludingNull(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isLessOrEqualThan("__Z__"); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord3, expectedRecord4); } @Test public void givenFourDateTimeAndNULLDateTimeValuesWhenIsLessOrEqualThanThirdThenReturnThreeRecords() throws Exception { givenFiveDateTimeValuesIncludingNullDateTime(); condition = from(zeSchema.instance()).where(zeSchema.dateTimeMetadata()).isLessOrEqualThan(DATE_TIME3); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2, expectedRecord3); } @Test public void givenFourDateAndNULLDateValuesWhenIsLessOrEqualThanThirdThenReturnThreeRecords() throws Exception { givenFiveDateValuesIncludingNullDate(); condition = from(zeSchema.instance()).where(zeSchema.dateMetadata()).isLessOrEqualThan(DATE3); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2, expectedRecord3); } // @Test public void givenFourRelativesDatesAndNullDateValuesWhenIsNewerThanThenReturnThreeRecords() throws Exception { givenTimeIs(NOW); givenFiveRelativeDatesDateValuesIncludingNullDate(); condition = from(zeSchema.instance()).where(zeSchema.dateMetadata()).isNewerThan(2.0, MeasuringUnitTime.YEARS); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord4); } @Test public void givenFourRelativesDatesAndNullDateValuesWhenIsOlderThanThenReturnOneRecords() throws Exception { givenTimeIs(NOW); givenFiveRelativeDatesDateValuesIncludingNullDate(); condition = from(zeSchema.instance()).where(zeSchema.dateMetadata()).isOlderThan(2.0, MeasuringUnitTime.YEARS); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord3); } @Test public void givenFourRelativesDatesAndNullDateValuesWhenIsOlderLikeThenReturnOneRecords() throws Exception { givenTimeIs(NOW); givenFiveRelativeDatesDateValuesIncludingNullDate(); condition = from(zeSchema.instance()).where(zeSchema.dateMetadata()).isOldLike(2.0, MeasuringUnitTime.YEARS); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2); } // @Test public void givenNumberValuesIncludingMinIntegerValueWhenIsGreaterThanThenReturnThreeRecords() throws Exception { givenFiveNumberValuesIncludingNegativeNumberAndMinIntegerValue(); condition = from(zeSchema.instance()).where(zeSchema.numberMetadata()).isGreaterThan(-20); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2, expectedRecord3, expectedRecord4); } @Test public void givenLettresValuesWhenIsGreaterThanThenReturnTwoRecords() throws Exception { givenFourLettersValues(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isGreaterThan("B"); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord3, expectedRecord4); } @Test public void givenTextValuesWhenIsGreaterThanThenReturnTwoRecords() throws Exception { givenFiveTextValues(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isGreaterThan("Chuck Norris"); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord3, expectedRecord4, expectedRecord5); } @Test public void givenTextValuesIncludingNULLWhenIsGreaterThanThenDoNotReturnNull() throws Exception { givenFourTextValuesIncludingNull(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isGreaterThan("__A__"); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord3, expectedRecord4); } @Test public void givenDateValuesWhenIsGreaterThanThenReturnTwoRecords() throws Exception { givenFiveDateValuesIncludingNullDate(); condition = from(zeSchema.instance()).where(zeSchema.dateMetadata()).isGreaterThan(DATE2); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord3, expectedRecord4); } @Test public void givenDateTimeValuesWhenIsGreaterThanThenReturnTwoRecords() throws Exception { givenFiveDateTimeValuesIncludingNullDateTime(); condition = from(zeSchema.instance()).where(zeSchema.dateTimeMetadata()).isGreaterThan(DATE_TIME2); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord3, expectedRecord4); } @Test public void givenNumberValuesIncludingMinIntegerValueWhenIsGreaterOrEqualThan10NegativeThenReturnThreeRecords() throws Exception { givenFiveNumberValuesIncludingNegativeNumberAndMinIntegerValue(); condition = from(zeSchema.instance()).where(zeSchema.numberMetadata()).isGreaterOrEqualThan(-10); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2, expectedRecord3, expectedRecord4); } @Test public void givenLettersValuesWhenIsGreaterOrEqualThanBThenReturnThreeRecords() throws Exception { givenFourLettersValues(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isGreaterOrEqualThan("B"); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2, expectedRecord3, expectedRecord4); } @Test public void givenTextValuesWhenIsGreaterOrEqualThanSecondRecordThenReturnThreeRecords() throws Exception { givenFiveTextValues(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isGreaterOrEqualThan("Chuck Norris"); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2, expectedRecord3, expectedRecord4, expectedRecord5); } @Test public void givenTextValuesIncludingNULLWhenIsGreaterOrEqualThanAThenReturnThreeRecords() throws Exception { givenFourTextValuesIncludingNull(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isGreaterOrEqualThan("__A__"); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord3, expectedRecord4); } @Test public void givenDateAndNULLDateValuesWhenIsGreaterOrEqualThanDateThenReturnThreeRecords() throws Exception { givenFiveDateValuesIncludingNullDate(); condition = from(zeSchema.instance()).where(zeSchema.dateMetadata()).isGreaterOrEqualThan(DATE2); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2, expectedRecord3, expectedRecord4); } @Test public void givenDateTimeAndNULLDateValuesWhenIsGreaterOrEqualThanDateThenReturnThreeRecords() throws Exception { givenFiveDateTimeValuesIncludingNullDateTime(); condition = from(zeSchema.instance()).where(zeSchema.dateTimeMetadata()).isGreaterOrEqualThan(DATE_TIME2); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2, expectedRecord3, expectedRecord4); } @Test public void givenNumberValuesIncludingMinIntegerValueWhenIsEqualThenReturnTheRecord() throws Exception { givenFiveNumberValuesIncludingNegativeNumberAndMinIntegerValue(); condition = from(zeSchema.instance()).where(zeSchema.numberMetadata()).isEqualTo(-10); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2); } @Test public void givenTextValuesWhenIsEqualThenReturnTheRecord() throws Exception { givenFiveTextValues(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isEqualTo("Chuck Norris"); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2); } @Test public void givenTextValuesIncludingNULLWhenIsEqualNullThenReturnNullRecord() throws Exception { givenFourTextValuesIncludingNull(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isNull(); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2); } @Test public void givenDateAndNULLDateValuesWhenIsEqualThenReturnTheRecord() throws Exception { givenFiveDateValuesIncludingNullDate(); condition = from(zeSchema.instance()).where(zeSchema.dateMetadata()).isEqualTo(DATE2); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2); } @Test public void givenDateTimeAndNULLDateTimeValuesWhenIsEqualThenReturnTheRecord() throws Exception { givenFiveDateTimeValuesIncludingNullDateTime(); condition = from(zeSchema.instance()).where(zeSchema.dateTimeMetadata()).isEqualTo(DATE_TIME2); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2); } @Test public void givenDateAndNULLDateValuesWhenIsEqualNullDateThenReturnTheNullDateRecord() throws Exception { givenFiveDateValuesIncludingNullDate(); condition = from(zeSchema.instance()).where(zeSchema.dateMetadata()).isEqualTo(new LocalDateTime(Integer.MIN_VALUE)); List<Record> records = findRecords(condition); assertThat(records).isEmpty(); condition = from(zeSchema.instance()).where(zeSchema.dateMetadata()).isNull(); records = findRecords(condition); assertThat(records).containsOnly(expectedRecord5); } @Test public void givenDateTimeAndNULLDateTimeValuesWhenIsEqualNullDateTimeThenReturnTheNullDateTimeRecord() throws Exception { givenFiveDateTimeValuesIncludingNullDateTime(); condition = from(zeSchema.instance()).where(zeSchema.dateTimeMetadata()).isEqualTo(new LocalDateTime(Integer.MIN_VALUE)); List<Record> records = findRecords(condition); assertThat(records).isEmpty(); condition = from(zeSchema.instance()).where(zeSchema.dateTimeMetadata()).isNull(); records = findRecords(condition); assertThat(records).containsOnly(expectedRecord5); } @Test public void givenTwoEqualsValuesWhenIsEqualValueThenReturnTheTwoRecordsWithTheValue() throws Exception { defineSchemasManager().using(schema.withAStringMetadata()); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Norris")); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Norris")); recordServices.execute(transaction); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isEqualTo("Chuck Norris"); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void givenBooleanValuesWhenIsEqualThenReturnTheRecord() throws Exception { defineSchemasManager().using(schema.withABooleanMetadata()); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.booleanMetadata(), true)); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema().set(zeSchema.booleanMetadata(), false)); recordServices.execute(transaction); condition = from(zeSchema.instance()).where(zeSchema.booleanMetadata()).isEqualTo(true); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord); } @Test public void givenNumberValuesWhenIsContainingThenReturnTheRecord() throws Exception { givenNumberMultiValueMetadataWithThreeNumbers(); condition = from(zeSchema.instance()).where(zeSchema.numberMetadata()).isContaining(Arrays.asList(-10, 0, 1)); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord); } @Test public void givenNumberValuesWhenIsContainingAnotherNumberThenDoNotFindRecord() throws Exception { givenNumberMultiValueMetadataWithThreeNumbers(); condition = from(zeSchema.instance()).where(zeSchema.numberMetadata()).isContaining(Arrays.asList(-10, 0, 2)); List<Record> records = findRecords(condition); assertThat(records).isEmpty(); } @Test public void givenTextValuesWhenIsContainingThenReturnTheRecord() throws Exception { givenTextMultiValueMetadataWithThreeTexts(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isContaining( Arrays.asList("Edouard Lechat", "Chuck Norris")); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord); } @Test public void givenTextValuesWhenIsContainingAnotherTextThenDoNotFindRecord() throws Exception { givenTextMultiValueMetadataWithThreeTexts(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isContaining( Arrays.asList("Edouard Lechat", "Chuck Norris", "a a")); List<Record> records = findRecords(condition); assertThat(records).isEmpty(); } @Test public void givenDateTimeValuesWhenIsContainingThenReturnTheRecord() throws Exception { givenDateTimeMultiValueMetadataWithThreeDateTimes(); condition = from(zeSchema.instance()).where(zeSchema.dateTimeMetadata()) .isContaining(Arrays.asList(DATE_TIME1, DATE_TIME2)); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord); } @Test public void givenDateValuesWhenIsContainingThenReturnTheRecord() throws Exception { givenDateMultiValueMetadataWithThreeDates(); condition = from(zeSchema.instance()).where(zeSchema.dateMetadata()) .isContaining(Arrays.asList(DATE1, DATE2)); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord); } @Test public void givenDateTimeValuesWhenIsContainingAnotherDateTimeThenDoNotFindRecord() throws Exception { givenDateTimeMultiValueMetadataWithThreeDateTimes(); condition = from(zeSchema.instance()).where(zeSchema.dateTimeMetadata()) .isContaining(Arrays.asList(DATE_TIME1, DATE_TIME4)); List<Record> records = findRecords(condition); assertThat(records).isEmpty(); } @Test public void givenDateValuesWhenIsContainingAnotherDateThenDoNotFindRecord() throws Exception { givenDateMultiValueMetadataWithThreeDates(); condition = from(zeSchema.instance()).where(zeSchema.dateMetadata()) .isContaining(Arrays.asList(DATE1, DATE4)); List<Record> records = findRecords(condition); assertThat(records).isEmpty(); } @Test public void givenNumberValuesWhenIsIn10NegativeTo2ThenReturnTwoRecords() throws Exception { givenFiveNumberValuesIncludingNegativeNumberAndMinIntegerValue(); condition = from(zeSchema.instance()).where(zeSchema.numberMetadata()).isIn(Arrays.asList(-10, 2, 3, 4)); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2, expectedRecord3); } @Test public void givenNumberFloatValuesWhenIsIn10NegativeTo2ThenReturnTwoRecords() throws Exception { givenFiveNumberValuesIncludingNegativeNumberAndMinIntegerValue(); condition = from(zeSchema.instance()).where(zeSchema.numberMetadata()).isIn(Arrays.asList(-10.0f, 2.0f, 3.0f, 4.0f)); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2, expectedRecord3); } @Test public void givenNumberDoubleValuesWhenIsIn10NegativeTo2ThenReturnTwoRecords() throws Exception { givenFiveNumberValuesIncludingNegativeNumberAndMinIntegerValue(); condition = from(zeSchema.instance()).where(zeSchema.numberMetadata()).isIn(Arrays.asList(-10.0d, 2.0d, 3.0d, 4.0d)); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2, expectedRecord3); } @Test public void givenNumberLongValuesWhenIsIn10NegativeTo2ThenReturnTwoRecords() throws Exception { givenFiveNumberValuesIncludingNegativeNumberAndMinIntegerValue(); condition = from(zeSchema.instance()).where(zeSchema.numberMetadata()).isIn( Arrays.asList(Long.valueOf(-10l), Long.valueOf(2l), Long.valueOf(3l), Long.valueOf(4l))); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2, expectedRecord3); } @Test public void givenLettersValuesWhenIsInThenReturnTwoRecords() throws Exception { givenFourLettersValues(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isIn(Arrays.asList("B", "C", "F")); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2, expectedRecord3); } @Test public void givenTextValuesWhenIsInThenReturnTwoRecords() throws Exception { givenFiveTextValues(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isIn( Arrays.asList("Chuck Norris", "Edouard Lechat", "a a")); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2, expectedRecord3); } @Test public void givenDateValuesWhenIsInThenReturnTwoRecords() throws Exception { givenFiveDateValuesIncludingNullDate(); condition = from(zeSchema.instance()).where(zeSchema.dateMetadata()).isIn( Arrays.asList(DATE3, DATE4, new LocalDateTime())); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord3, expectedRecord4); } @Test public void givenDateTimeValuesWhenIsInThenReturnTwoRecords() throws Exception { givenFiveDateTimeValuesIncludingNullDateTime(); condition = from(zeSchema.instance()).where(zeSchema.dateTimeMetadata()).isIn( Arrays.asList(DATE_TIME3, DATE_TIME4, new LocalDateTime())); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord3, expectedRecord4); } @Test public void givenNumberValuesIncludingMinIntegerValueWhenIsNotEqualThenReturnThreeRecords() throws Exception { givenFiveNumberValuesIncludingNegativeNumberAndMinIntegerValue(); condition = from(zeSchema.instance()).where(zeSchema.numberMetadata()).isNotEqual(-10); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord3, expectedRecord4); } @Test public void givenTextValuesWhenIsNotEqualThenReturnThreeRecords() throws Exception { givenFiveTextValues(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isNotEqual("Chuck Norris"); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord3, expectedRecord4, expectedRecord5); } @Test public void givenTextValuesIncludingNULLWhenIsNotEqualThenReturnTwoRecordsAndNotNull() throws Exception { givenFourTextValuesIncludingNull(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isNotEqual("__A__"); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2, expectedRecord3, expectedRecord4); } @Test public void givenDateAndNULLDateValuesWhenIsNotEqualThenReturnTheRecord() throws Exception { givenFiveDateValuesIncludingNullDate(); condition = from(zeSchema.instance()).where(zeSchema.dateMetadata()).isNotEqual(DATE2); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord3, expectedRecord4, expectedRecord5); } @Test public void givenDateTimeAndNULLDateTimeValuesWhenIsNotEqualThenReturnTheRecord() throws Exception { givenFiveDateTimeValuesIncludingNullDateTime(); condition = from(zeSchema.instance()).where(zeSchema.dateTimeMetadata()).isNotEqual(DATE_TIME2); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord3, expectedRecord4, expectedRecord5); } @Test public void givenTwoBooleanValuesWhenIsNotEqualThenReturnTheOtherRecord() throws Exception { defineSchemasManager().using(schema.withABooleanMetadata()); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.booleanMetadata(), true)); transaction.addUpdate(expectedRecord2 = newRecordOfZeSchema().set(zeSchema.booleanMetadata(), false)); recordServices.execute(transaction); condition = from(zeSchema.instance()).where(zeSchema.booleanMetadata()).isNotEqual(true); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord2); } @Test public void givenNumberValuesWhenIsNotContainingThenDoNotReturnTheRecord() throws Exception { givenNumberMultiValueMetadataWithThreeNumbers(); condition = from(zeSchema.instance()).where(zeSchema.numberMetadata()).isNotContainingElements(Arrays.asList(-10, 0)); List<Record> records = findRecords(condition); assertThat(records).isEmpty(); } @Test public void givenNumberValuesWhenIsNotContainingThenReturnTheRecord() throws Exception { givenNumberMultiValueMetadataWithThreeNumbers(); condition = from(zeSchema.instance()).where(zeSchema.numberMetadata()) .isNotContainingElements(Arrays.asList(-10, 0, 5)); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord); } @Test public void givenNumberValuesWhenIsNotContainingThemThenDoNotReturnTheRecord() throws Exception { givenNumberMultiValueMetadataWithThreeNumbers(); condition = from(zeSchema.instance()).where(zeSchema.numberMetadata()) .isNotContainingElements(Arrays.asList(-10, 0, 1)); List<Record> records = findRecords(condition); assertThat(records).isEmpty(); } @Test public void givenTextValuesWhenIsNotContainingThenDoNotReturnTheRecord() throws Exception { givenTextMultiValueMetadataWithThreeTexts(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isNotContainingElements( Arrays.asList("Edouard Lechat", "Chuck Norris")); List<Record> records = findRecords(condition); assertThat(records).isEmpty(); } @Test public void givenTextValuesWhenIsNotContainingAnotherTextThenReturnTheRecord() throws Exception { givenTextMultiValueMetadataWithThreeTexts(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isNotContainingElements( Arrays.asList("Edouard Lechat", "Chuck Norris", "a a")); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord); } @Test public void givenDateValuesWhenIsNotContainingThenDoNotReturnTheRecord() throws Exception { givenDateMultiValueMetadataWithThreeDates(); condition = from(zeSchema.instance()).where(zeSchema.dateMetadata()) .isNotContainingElements(Arrays.asList(DATE1)); List<Record> records = findRecords(condition); assertThat(records).isEmpty(); } @Test public void givenDateTimeValuesWhenIsNotContainingThenDoNotReturnTheRecord() throws Exception { givenDateTimeMultiValueMetadataWithThreeDateTimes(); condition = from(zeSchema.instance()).where(zeSchema.dateTimeMetadata()) .isNotContainingElements(Arrays.asList(DATE_TIME1)); List<Record> records = findRecords(condition); assertThat(records).isEmpty(); } @Test public void givenDateValuesWhenIsNotContainingAnotherDateThenReturnRecord() throws Exception { givenDateMultiValueMetadataWithThreeDates(); condition = from(zeSchema.instance()).where(zeSchema.dateMetadata()).isNotContainingElements( Arrays.asList(DATE1, DATE4)); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord); } @Test public void givenDateTimeValuesWhenIsNotContainingAnotherDateTimeThenReturnRecord() throws Exception { givenDateTimeMultiValueMetadataWithThreeDateTimes(); condition = from(zeSchema.instance()).where(zeSchema.dateTimeMetadata()).isNotContainingElements( Arrays.asList(DATE_TIME1, DATE_TIME4)); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord); } @Test public void whenSearchingByDateTimeTheNullValuesAreNeverReturned() throws Exception { LocalDateTime time0 = new LocalDateTime(1000, 1, 1, 0, 0, 0, 0); LocalDateTime time1 = new LocalDateTime(1000, 2, 1, 0, 0, 0, 0); LocalDateTime time2 = new LocalDateTime(2000, 1, 1, 1, 1, 1, 1); LocalDateTime time3 = new LocalDateTime(3000, 1, 1, 1, 1, 1, 1); defineSchemasManager().using(schema.withADateTimeMetadata()); transaction.addUpdate(record1 = givenARecord("record1").set(zeSchema.dateTimeMetadata(), time1)); transaction.addUpdate(record2 = givenARecord("record2").set(zeSchema.dateTimeMetadata(), time2)); transaction.addUpdate(record3 = givenARecord("record3").set(zeSchema.dateTimeMetadata(), time3)); transaction.addUpdate(record4 = givenARecord("recordNull").set(zeSchema.dateTimeMetadata(), null)); recordServices.execute(transaction); assertThat(findRecords(from(zeSchema.instance()).where(zeSchema.dateTimeMetadata()).isValueInRange(time0, time3))) .containsOnly(record1, record2, record3); assertThat(findRecords(from(zeSchema.instance()).where(zeSchema.dateTimeMetadata()).isNull())).containsOnly(record4); } @Test public void whenSearchingByDateTheNullValuesAreNeverReturned() throws Exception { LocalDate time0 = new LocalDate(1, 1, 1); LocalDate time1 = new LocalDate(1, 1, 12); LocalDate time2 = new LocalDate(1000, 1, 1); LocalDate time3 = new LocalDate(3000, 1, 1); defineSchemasManager().using(schema.withADateMetadata()); transaction.addUpdate(record1 = givenARecord("record1").set(zeSchema.dateMetadata(), time1)); transaction.addUpdate(record2 = givenARecord("record2").set(zeSchema.dateMetadata(), time2)); transaction.addUpdate(record3 = givenARecord("record3").set(zeSchema.dateMetadata(), time3)); transaction.addUpdate(record4 = givenARecord("recordNull").set(zeSchema.dateMetadata(), null)); recordServices.execute(transaction); assertThat(findRecords(from(zeSchema.instance()).where(zeSchema.dateMetadata()).isValueInRange(time0, time3))) .containsOnly(record1, record2, record3); assertThat(findRecords(from(zeSchema.instance()).where(zeSchema.dateMetadata()).isNull())).containsOnly(record4); } @Test public void whenSearchingByDateTimeThenHaveMillisecondsPrecision() throws Exception { LocalDateTime time1 = new LocalDateTime().minusHours(42); LocalDateTime time2 = time1.plusMillis(1); LocalDateTime time3 = time2.plusMillis(1); LocalDateTime time4 = time3.plusMillis(1); LocalDateTime time5 = time4.plusMillis(1); defineSchemasManager().using(schema.withADateTimeMetadata()); transaction.addUpdate(record1 = givenARecord("record1").set(zeSchema.dateTimeMetadata(), time1)); transaction.addUpdate(record2 = givenARecord("record2").set(zeSchema.dateTimeMetadata(), time2)); transaction.addUpdate(record3 = givenARecord("record3").set(zeSchema.dateTimeMetadata(), time3)); transaction.addUpdate(record4 = givenARecord("record4").set(zeSchema.dateTimeMetadata(), time4)); transaction.addUpdate(record5 = givenARecord("record5").set(zeSchema.dateTimeMetadata(), time5)); recordServices.execute(transaction); OngoingLogicalSearchConditionWithDataStoreFields whereDateTime = from(zeSchema.instance()) .where(zeSchema.dateTimeMetadata()); assertThat(findRecords(whereDateTime.isNotIn(asList(time2, time4)))).containsOnly(record1, record3, record5); assertThat(findRecords(whereDateTime.isIn(asList(time2, time4)))).containsOnly(record2, record4); assertThat(findRecords(whereDateTime.isGreaterThan(time3))).containsOnly(record4, record5); assertThat(findRecords(whereDateTime.isGreaterOrEqualThan(time3))).containsOnly(record3, record4, record5); assertThat(findRecords(whereDateTime.isLessThan(time3))).containsOnly(record1, record2); assertThat(findRecords(whereDateTime.isLessOrEqualThan(time3))).containsOnly(record1, record2, record3); assertThat(findRecords(whereDateTime.isValueInRange(time2, time4))).containsOnly(record2, record3, record4); } @Test public void whenSearchingByDateThenHaveDaysPrecision() throws Exception { LocalDate time1 = new LocalDate().minusDays(42); LocalDate time2 = time1.plusDays(1); LocalDate time3 = time2.plusDays(1); LocalDate time4 = time3.plusDays(1); LocalDate time5 = time4.plusDays(1); defineSchemasManager().using(schema.withADateMetadata()); transaction.addUpdate(record1 = givenARecord("record1").set(zeSchema.dateMetadata(), time1)); transaction.addUpdate(record2 = givenARecord("record2").set(zeSchema.dateMetadata(), time2)); transaction.addUpdate(record3 = givenARecord("record3").set(zeSchema.dateMetadata(), time3)); transaction.addUpdate(record4 = givenARecord("record4").set(zeSchema.dateMetadata(), time4)); transaction.addUpdate(record5 = givenARecord("record5").set(zeSchema.dateMetadata(), time5)); recordServices.execute(transaction); OngoingLogicalSearchConditionWithDataStoreFields whereDate = from(zeSchema.instance()).where(zeSchema.dateMetadata()); assertThat(findRecords(whereDate.isNotIn(asList(time2, time4)))).containsOnly(record1, record3, record5); assertThat(findRecords(whereDate.isIn(asList(time2, time4)))).containsOnly(record2, record4); assertThat(findRecords(whereDate.isGreaterThan(time3))).containsOnly(record4, record5); assertThat(findRecords(whereDate.isGreaterOrEqualThan(time3))).containsOnly(record3, record4, record5); assertThat(findRecords(whereDate.isLessThan(time3))).containsOnly(record1, record2); assertThat(findRecords(whereDate.isLessOrEqualThan(time3))).containsOnly(record1, record2, record3); assertThat(findRecords(whereDate.isValueInRange(time2, time4))).containsOnly(record2, record3, record4); } @Test public void givenNumberValuesWhenIsNotInThenReturnTwoRecords() throws Exception { givenFiveNumberValuesIncludingNegativeNumberAndMinIntegerValue(); condition = from(zeSchema.instance()).where(zeSchema.numberMetadata()).isNotIn(Arrays.asList(-10, 2, 3)); List<Record> records = findRecords(condition); for (Record record : records) { record.get(zeSchema.numberMetadata()); } assertThat(records).containsOnly(expectedRecord, expectedRecord4); } @Test public void givenLettersValuesWhenIsNotInThenReturnTwoRecords() throws Exception { givenFourLettersValues(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isNotIn(Arrays.asList("B", "C", "F")); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord4); } @Test public void givenTextValuesWhenIsNotInThenReturnTwoRecords() throws Exception { givenFiveTextValues(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isNotIn( Arrays.asList("Chuck Norris", "Edouard Lechat", "a a")); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord4, expectedRecord5); } @Test public void givenDateValuesWhenIsNotInThenReturnTwoRecords() throws Exception { givenFiveDateValuesIncludingNullDate(); condition = from(zeSchema.instance()).where(zeSchema.dateMetadata()).isNotIn( Arrays.asList(DATE3, DATE4, new LocalDateTime())); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void givenDateTimeValuesWhenIsNotInThenReturnTwoRecords() throws Exception { givenFiveDateTimeValuesIncludingNullDateTime(); condition = from(zeSchema.instance()).where(zeSchema.dateTimeMetadata()).isNotIn( Arrays.asList(DATE_TIME3, DATE_TIME4, new LocalDateTime())); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void givenFourLettersAndQueryWhenQueryThenItQueriesInSolrl() throws Exception { givenFourLettersValues(); String query = "[A TO B]"; condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).query(query); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void givenTextsAndQueryStartingWithChuckWhenQueryThenItQueriesInSolrl() throws Exception { givenFiveTextValues(); String query = "Chuck *"; condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).query(query); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void givenFiveTextAndQueryWhenQueryThenItQueriesInSolrl() throws Exception { givenFiveTextValues(); String query = "zeEdouard \\*"; condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).query(query); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord5); } @Test(expected = BadRequest.class) public void givenFourLettersAndWrongQueryWhenQueryThenItQueriesInSolrl() throws Exception { givenFourLettersValues(); String wrongQuery = "[A TO B"; condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).query(wrongQuery); List<Record> records = findRecords(condition); assertThat(records).isEmpty(); } @Test public void whenSearchingJustIdsThenUseFlParameters() throws Exception { givenFourLettersValues(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).query("*"); List<String> ids = findRecordIds(condition); assertThat(ids).hasSize(4); assertThat(ids.get(0)).isNotNull(); ArgumentCaptor<SolrParams> params = ArgumentCaptor.forClass(SolrParams.class); verify(recordDao).query(params.capture()); assertThat(params.getValue().get("fl")).isEqualTo("id,schema_s,_version_,collection_s"); } @Test public void whenGetResultsCountThenUseFlAndRowsParameters() throws Exception { givenFourLettersValues(); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).query("*"); long count = searchServices.getResultsCount(condition); assertThat(count).isEqualTo(4); ArgumentCaptor<SolrParams> params = ArgumentCaptor.forClass(SolrParams.class); verify(recordDao).query(params.capture()); assertThat(params.getValue().get("rows")).isEqualTo("0"); } @Test public void whenSearchingWithIdentifierThenFindResults() throws Exception { givenFiveTextValues(); condition = from(zeSchema.instance()).where(Schemas.IDENTIFIER).isIn( Arrays.asList(expectedRecord.getId(), expectedRecord2.getId())); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void whenSearchingWithVersionThenFindResults() throws Exception { givenFiveTextValues(); condition = from(zeSchema.instance()).where(Schemas.VERSION).isIn( Arrays.asList(expectedRecord.getVersion(), expectedRecord2.getVersion())); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void whenSearchingWithIdAndVersionsThenObtainCorrectResults() throws Exception { givenFiveTextValues(); Record unexpectedRecord = expectedRecord4; LogicalSearchCondition condition = LogicalSearchQueryOperators.fromAllSchemasIn(zeCollection).where(Schemas.IDENTIFIER) .isIn(Arrays.asList(expectedRecord.getId(), expectedRecord2.getId(), unexpectedRecord.getId())) .andWhere(Schemas.VERSION).isNotIn(Arrays.asList(1l, 2l, unexpectedRecord.getVersion())); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2); } @Test public void whenSearchingWithIsNotInThenSupport1000Elements() throws Exception { givenTwoZeSchemaRecords(); Record unexpectedRecord = zeSchemaRecord1; Record expectedRecord = zeSchemaRecord2; List<String> notInCriterion = new ArrayList<>(); for (int i = 0; i < 999; i++) { notInCriterion.add("anInexistendId_" + anInteger()); } //1000 notInCriterion.add(unexpectedRecord.getId()); LogicalSearchCondition condition = LogicalSearchQueryOperators.fromAllSchemasIn(zeCollection).where(Schemas.IDENTIFIER) .isNotIn(notInCriterion).andWhere(Schemas.IDENTIFIER).isNotIn( notInCriterion).andWhere(Schemas.IDENTIFIER).isNotIn(notInCriterion) .andWhere(Schemas.IDENTIFIER).isNotIn(notInCriterion).andWhere(Schemas.IDENTIFIER).isNotIn(notInCriterion); List<Record> records = findRecords(condition); assertThat(records).doesNotContain(unexpectedRecord).contains(expectedRecord); } @Test public void whenSearchingWithIsInThenSupport1000Elements() throws Exception { givenTwoZeSchemaRecords(); Record unexpectedRecord = zeSchemaRecord1; Record expectedRecord = zeSchemaRecord2; List<String> inCriterion = new ArrayList<>(); for (int i = 0; i < 999; i++) { inCriterion.add("anInexistendId_" + anInteger()); } //1000 inCriterion.add(expectedRecord.getId()); LogicalSearchCondition condition = LogicalSearchQueryOperators.fromAllSchemasIn(zeCollection).where(Schemas.IDENTIFIER) .isIn(inCriterion).andWhere(Schemas.IDENTIFIER).isIn(inCriterion).andWhere(Schemas.IDENTIFIER).isIn(inCriterion) .andWhere(Schemas.IDENTIFIER).isIn(inCriterion).andWhere(Schemas.IDENTIFIER).isIn(inCriterion); List<Record> records = findRecords(condition); assertThat(records).doesNotContain(unexpectedRecord).contains(expectedRecord); } @Test(expected = SearchServicesRuntimeException.TooManyElementsInCriterion.class) public void whenSearchingWithIsInWith1001ElementsThenException() throws Exception { givenTwoZeSchemaRecords(); List<String> inCriterion = new ArrayList<>(); for (int i = 0; i < 1001; i++) { inCriterion.add("anInexistendId_" + anInteger()); } LogicalSearchCondition condition = LogicalSearchQueryOperators.fromAllSchemasIn(zeCollection).where(Schemas.IDENTIFIER) .isIn(inCriterion); searchServices.hasResults(condition); } @Test(expected = SearchServicesRuntimeException.TooManyElementsInCriterion.class) public void whenSearchingWithIsNotInWith1001ElementsThenException() throws Exception { givenTwoZeSchemaRecords(); List<String> notInCriteria = new ArrayList<>(); for (int i = 0; i < 1001; i++) { notInCriteria.add("anInexistendId_" + anInteger()); } LogicalSearchCondition condition = LogicalSearchQueryOperators.fromAllSchemasIn(zeCollection).where(Schemas.IDENTIFIER) .isNotIn(notInCriteria); searchServices.hasResults(condition); } @Test public void givenRecordsFromTwoSchemaTypesWhenSearchingForEverythingThenReturnTwo() throws Exception { configureFolderAndRule(); TestRecord expectedRecord1 = new TestRecord(zeSchema); TestRecord expectedRecord2 = new TestRecord(zeSchema); recordServices.execute(new Transaction(expectedRecord1, expectedRecord2)); condition = fromAllSchemasIn(zeCollection).returnAll(); List<Record> records = findRecords(condition); assertThat(records).contains(expectedRecord2, expectedRecord1); } @Test public void givenRecordsFromTwoSchemaTypesWhenReturnAllThenReturnAllRecordsFromSchema() throws Exception { givenRecordsFromTwoSchemasTypesWithReferences(); condition = from(zeSchema.instance()).returnAll(); List<Record> records = findRecords(condition); assertThat(records).containsOnly(expectedRecord, expectedRecord2, expectedRecord3, expectedRecord4); } @Test public void givenRecordsFromTwoCollectionsWhenSearchFromAllSchemasInCollectionThenReturnTwo() throws Exception { givenSchemasInDiferentsCollections(); LogicalSearchCondition condition = fromAllSchemasIn(zeCollection).returnAll(); List<Record> records = findRecords(condition); assertThat(records) .contains(zeSchemaRecord1, zeSchemaRecord2, recordServices.getDocumentById(zeCollection)); } @Test public void givenRecordsFromTwoCollectionsWhenSearchFromSchemaThenReturnTwo() throws Exception { givenSchemasInDiferentsCollections(); LogicalSearchCondition condition = from(schema.getSchema(zeSchema.code())).returnAll(); List<Record> records = findRecords(condition); assertThat(records).containsOnly(zeSchemaRecord1, zeSchemaRecord2); } @Test public void givenRecordsInCustomAndDefaultSchemaWhenSearchingInCustomDefaultAndTypeThenGetCorrectRecords() throws Exception { Record defaultSchemaRecord1, defaultSchemaRecord2, customSchemaRecord1, customSchemaRecord2; defineSchemasManager().using(schema.andCustomSchema().withAStringMetadata()); transaction.addUpdate(defaultSchemaRecord1 = new TestRecord(zeSchema, "defaultSchemaRecord1").set( zeSchema.stringMetadata(), "Chuck Lechat")); transaction.addUpdate(defaultSchemaRecord2 = new TestRecord(zeSchema, "defaultSchemaRecord2").set( zeSchema.stringMetadata(), "Chuck Norris")); transaction.addUpdate(customSchemaRecord1 = new TestRecord(zeCustomSchema, "customSchemaRecord1").set( zeCustomSchema.stringMetadata(), "Chuck Lechat")); transaction.addUpdate(customSchemaRecord2 = new TestRecord(zeCustomSchema, "customSchemaRecord2").set( zeCustomSchema.stringMetadata(), "Chuck Norris")); recordServices.execute(transaction); MetadataSchemaType type = getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes("zeCollection") .getSchemaType("zeSchemaType"); assertThat(findRecords(from(zeSchema.instance()).returnAll())) .containsOnly(defaultSchemaRecord1, defaultSchemaRecord2); assertThat(findRecords(from(zeSchema.instance()).where(zeSchema.stringMetadata()).isContainingText("Lechat"))) .containsOnly(defaultSchemaRecord1); assertThat(findRecords(from(zeCustomSchema.instance()).returnAll())).containsOnly(customSchemaRecord1, customSchemaRecord2); assertThat(findRecords(from(zeCustomSchema.instance()).where(zeSchema.stringMetadata()).isContainingText("Lechat"))) .containsOnly(customSchemaRecord1); assertThat(findRecords(from(type).returnAll())).containsOnly(defaultSchemaRecord1, defaultSchemaRecord2, customSchemaRecord1, customSchemaRecord2); assertThat(findRecords(from(type).where(zeSchema.stringMetadata()).isContainingText("Lechat"))).containsOnly( defaultSchemaRecord1, customSchemaRecord1); } @Test public void givenRecordWithTitleWhenSearchSingleResultThenReturnTheRecord() throws Exception { givenSchemasInDiferentsCollections(); LogicalSearchCondition condition = from(schema.getSchema(zeSchema.code())).where(Schemas.TITLE).isEqualTo("Folder 1"); Record record = searchServices.searchSingleResult(condition); assertThat(record).isEqualTo(zeSchemaRecord1); } @Test public void givenNoRecordWithTitleWhenSearchSingleResultThenReturnNull() throws Exception { givenSchemasInDiferentsCollections(); LogicalSearchCondition condition = from(schema.getSchema(zeSchema.code())).where(Schemas.TITLE).isEqualTo("Folder 3"); Record record = searchServices.searchSingleResult(condition); assertThat(record).isNull(); } @Test(expected = SearchServicesRuntimeException.TooManyRecordsInSingleSearchResult.class) public void whenSearchSingleResultReturnMoreThan1RecordThenException() throws Exception { givenSchemasInDiferentsCollections(); LogicalSearchCondition condition = from(schema.getSchema(zeSchema.code())).where(Schemas.TITLE).isStartingWithText( "Folder"); Record record = searchServices.searchSingleResult(condition); assertThat(record.get(Schemas.TITLE)).isEqualTo("Folder 1"); } @Test public void whenNegatingSearchForRecordsContainingTextANDIsStartingWithTextThenDontFindThem() throws Exception { Record unexpectedRecord; defineSchemasManager().using(schema.withAStringMetadata()); transaction.addUpdate(unexpectedRecord = newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Norris")); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Chuck Lechat")); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Edouard Norris")); transaction.addUpdate(newRecordOfZeSchema().set(zeSchema.stringMetadata(), "Edouard Chuck Lechat")); recordServices.execute(transaction); condition = from(zeSchema.instance()).where(zeSchema.stringMetadata()).isContainingText("Norris") .and(asList(startingWithText("Chuck"))).negated(); List<Record> records = findRecords(condition); assertThat(records).hasSize(3).doesNotContain(unexpectedRecord); } @Test public void whenSearchingForRecordsContainingTextAndNotHavingUnwantedTitleThenDontFindExcludedDocument() throws Exception { defineSchemasManager().using(schema.withAStringMetadata()); Record expected = newRecordOfZeSchema(); expected.set(zeSchema.metadata("title"), "Wanted"); expected.set(zeSchema.stringMetadata(), "Chuck Norris"); Record unexpected = newRecordOfZeSchema(); unexpected.set(zeSchema.metadata("title"), "Unwanted"); unexpected.set(zeSchema.stringMetadata(), "Chuck Norris"); transaction.addUpdate(expected, unexpected); recordServices.execute(transaction); condition = allConditions( from(zeSchema.instance()).where(zeSchema.stringMetadata()).isContainingText("Chuck"), from(zeSchema.instance()).where(zeSchema.metadata("title")).isEqualTo("Unwanted").negated()); List<Record> records = findRecords(condition); assertThat(records).containsExactly(expected); } @Test public void whenSearchingForRecordsContainingTextAndNotHavingUnwantedTitleOrTextThenDontFindExcludedDocuments() throws Exception { defineSchemasManager().using(schema.withAStringMetadata()); Record expected = newRecordOfZeSchema(); expected.set(zeSchema.metadata("title"), "Wanted"); expected.set(zeSchema.stringMetadata(), "Chuck Norris"); Record unexpected1 = newRecordOfZeSchema(); unexpected1.set(zeSchema.metadata("title"), "Unwanted"); unexpected1.set(zeSchema.stringMetadata(), "Chuck Norris"); Record unexpected2 = newRecordOfZeSchema(); unexpected2.set(zeSchema.metadata("title"), "Not excluded by the title"); unexpected2.set(zeSchema.stringMetadata(), "Chuck Lechat"); transaction.addUpdate(expected, unexpected1, unexpected2); recordServices.execute(transaction); condition = allConditions( from(zeSchema.instance()).where(zeSchema.stringMetadata()).isContainingText("Chuck"), anyConditions( from(zeSchema.instance()).where(zeSchema.metadata("title")).isEqualTo("Unwanted"), from(zeSchema.instance()).where(zeSchema.stringMetadata()).isContainingText("Lechat")).negated()); List<Record> records = findRecords(condition); assertThat(records).containsExactly(expected); } @Test public void whenSearchingWithMultipleNegationsThenDontFindExcludedDocuments() throws Exception { defineSchemasManager().using(schema.withAStringMetadata()); Record expected = newRecordOfZeSchema(); expected.set(zeSchema.metadata("title"), "Wanted"); expected.set(zeSchema.stringMetadata(), "Chuck Norris"); Record unexpected1 = newRecordOfZeSchema(); unexpected1.set(zeSchema.metadata("title"), "Unwanted"); unexpected1.set(zeSchema.stringMetadata(), "Chuck Norris"); Record unexpected2 = newRecordOfZeSchema(); unexpected2.set(zeSchema.metadata("title"), "Not excluded by the title"); unexpected2.set(zeSchema.stringMetadata(), "Chuck Lechat"); transaction.addUpdate(expected, unexpected1, unexpected2); recordServices.execute(transaction); condition = allConditions( from(zeSchema.instance()).where(zeSchema.stringMetadata()).isContainingText("Chuck"), allConditions( from(zeSchema.instance()).where(zeSchema.metadata("title")).isEqualTo("Unwanted").negated(), from(zeSchema.instance()).where(zeSchema.stringMetadata()).isContainingText("Lechat").negated())); List<Record> records = findRecords(condition); assertThat(records).containsExactly(expected); } @Test @SlowTest public void givenRecordsModifiedWhenIteratingOverSearchResultsThenDoesNotAffectIteration() throws RecordServicesException { defineSchemasManager().using(schema); Transaction transaction = new Transaction(); transaction.setOptimisticLockingResolution(OptimisticLockingResolution.EXCEPTION); for (int i = 0; i < 10000; i++) { Record record = new TestRecord(schema.zeDefaultSchema(), "" + i); record.set(Schemas.TITLE, "zeTitleInitial"); transaction.addUpdate(record); } recordServices.execute(transaction); Set<String> ids = new HashSet<>(); LogicalSearchQuery query = new LogicalSearchQuery(); query.setCondition(from(schema.zeDefaultSchema()).where(Schemas.TITLE).isStartingWithText("zeTitle")); Iterator<Record> records = searchServices.recordsIterator(query); int i = 0; while (records.hasNext()) { Record record = records.next(); ids.add(record.getId()); if (i % 10 == 0) { record.set(Schemas.TITLE, "zeTitleModified"); recordServices.update(record); } System.out.println(++i); } assertThat(ids).hasSize(10000); } @Test @SlowTest public void givenRecordsModifiedWhenIteratingOverSearchResultsWithSortOnOtherFieldThenDoesNotAffectIteration() throws RecordServicesException { defineSchemasManager().using(schema.withCodeInZeSchema()); Transaction transaction = new Transaction(); transaction.setOptimisticLockingResolution(OptimisticLockingResolution.EXCEPTION); for (int i = 0; i < 10000; i++) { Record record = new TestRecord(schema.zeDefaultSchema(), "" + i); record.set(Schemas.TITLE, "zeTitleInitial"); record.set(Schemas.CODE, "" + i); transaction.addUpdate(record); } recordServices.execute(transaction); Set<String> ids = new HashSet<>(); LogicalSearchQuery query = new LogicalSearchQuery(); query.sortDesc(zeSchema.metadata("code")); query.setCondition(from(schema.zeDefaultSchema()).where(Schemas.TITLE).isStartingWithText("zeTitle")); Iterator<Record> records = searchServices.recordsIteratorKeepingOrder(query, 25); int i = 0; while (records.hasNext()) { Record record = records.next(); ids.add(record.getId()); if (i % 10 == 0) { record.set(Schemas.TITLE, "zeTitleModified"); recordServices.update(record); } System.out.println(++i); } assertThat(ids).hasSize(10000); } @Test public void givenTransientLazyMetadataThenNotSavedAndRetrievedOnRecordRecalculate() throws Exception { defineSchemasManager().using(schema.withANumberMetadata( whichIsCalculatedUsing(TitleLengthCalculator.class), whichHasTransiency(TRANSIENT_LAZY))); //TODO records in cache should lost volatile metadatas Record record = new TestRecord(zeSchema).set(TITLE, "Vodka Framboise"); recordServices.add(record); assertThat(searchServices.hasResults(from(zeSchema.type()).where(zeSchema.numberMetadata()).isNotNull())).isFalse(); assertThat(searchServices.searchSingleResult(from(zeSchema.type()).returnAll()).get(zeSchema.numberMetadata())).isNull(); getModelLayerFactory().getRecordsCaches().getCache(zeCollection).configureCache(permanentCache(zeSchema.type())); searchServices.searchSingleResult(from(zeSchema.type()).returnAll()); Record recordInCache = getModelLayerFactory().getRecordsCaches().getCache(zeCollection).get(record.getId()); assertThat(recordInCache.get(zeSchema.numberMetadata())).isNull(); } @Test public void givenTransientEagerMetadataThenNotSavedAndRetrievedOnRecordRetrieval() throws Exception { defineSchemasManager().using(schema.withANumberMetadata( whichIsCalculatedUsing(TitleLengthCalculator.class), whichHasTransiency(TRANSIENT_EAGER))); Record record = new TestRecord(zeSchema).set(TITLE, "Vodka Framboise"); recordServices.add(record); assertThat(searchServices.hasResults(from(zeSchema.type()).where(zeSchema.numberMetadata()).isNotNull())).isFalse(); assertThat(searchServices.searchSingleResult(from(zeSchema.type()).returnAll()).get(zeSchema.numberMetadata())) .isEqualTo(15.0); getModelLayerFactory().getRecordsCaches().getCache(zeCollection).configureCache(permanentCache(zeSchema.type())); searchServices.searchSingleResult(from(zeSchema.type()).returnAll()); Record recordInCache = getModelLayerFactory().getRecordsCaches().getCache(zeCollection).get(record.getId()); assertThat(recordInCache.get(zeSchema.numberMetadata())).isEqualTo(15.0); } private void givenSchemasInDiferentsCollections() throws Exception { defineSchemasManager().using(schema.withATitle()); transaction.addUpdate(zeSchemaRecord1 = newRecordOfZeSchema().set(zeSchema.metadata("title"), "Folder 1")); transaction.addUpdate(zeSchemaRecord2 = newRecordOfZeSchema().set(zeSchema.metadata("title"), "Folder 2")); recordServices.execute(transaction); defineSchemasManager().using(otherSchema.withATitle()); Transaction transaction2 = new Transaction(); transaction2.addUpdate(otherSchemaRecord1InCollection2 = newRecordOfOotherSchemaInCollection2().set( otherSchemaInCollection2.metadata("title"), "Folder 3")); transaction2.addUpdate(otherSchemaRecord2InCollection2 = newRecordOfOotherSchemaInCollection2().set( otherSchemaInCollection2.metadata("title"), "Folder 4")); recordServices.execute(transaction2); } private void givenRecordsFromTwoSchemasTypesWithReferences() throws Exception { configureFolderAndRule(); executeTransaction1(); executeTransaction2(); } private void executeTransaction2() throws RecordServicesException { Transaction transaction2 = new Transaction(); transaction2.addUpdate(expectedRecord = zeSchemaRecord1.set(zeSchema.metadata("anotherSchemaRecord"), anotherSchemaRecord1.getId())); transaction2.addUpdate(expectedRecord2 = zeSchemaRecord2.set(zeSchema.metadata("anotherSchemaRecord"), anotherSchemaRecord2.getId())); transaction2.addUpdate(expectedRecord3 = zeSchemaRecord3.set(zeSchema.metadata("anotherSchemaRecord"), anotherSchemaRecord2.getId())); transaction2.addUpdate(expectedRecord4 = zeSchemaRecord4.set(zeSchema.metadata("anotherSchemaRecord"), anotherSchemaRecord2.getId())); recordServices.execute(transaction2); } private void executeTransaction1() throws RecordServicesException { transaction.addUpdate(zeSchemaRecord1 = newRecordOfZeSchema().set(zeSchema.metadata("title"), "Folder 1")); transaction.addUpdate(zeSchemaRecord2 = newRecordOfZeSchema().set(zeSchema.metadata("title"), "Folder 2")); transaction.addUpdate(zeSchemaRecord3 = newRecordOfZeSchema().set(zeSchema.metadata("title"), "Folder 3")); transaction.addUpdate(zeSchemaRecord4 = newRecordOfZeSchema().set(zeSchema.metadata("title"), "Other folder")); transaction.addUpdate(anotherSchemaRecord1 = newRecordOfAnotherSchema().set(anotherSchema.metadata("code"), "10")); transaction.addUpdate(anotherSchemaRecord2 = newRecordOfAnotherSchema().set(anotherSchema.metadata("code"), "20")); recordServices.execute(transaction); } private void configureFolderAndRule() throws Exception { MetadataBuilderConfigurator configurator = new MetadataBuilderConfigurator() { @Override public void configure(MetadataBuilder builder, MetadataSchemaTypesBuilder schemaTypes) { MetadataSchemaTypeBuilder zeSchemaTypeBuilder = schemaTypes.getSchemaType(ZE_SCHEMA_TYPE_CODE); MetadataSchemaTypeBuilder anotherSchemaTypeBuilder = schemaTypes.getSchemaType(ANOTHER_SCHEMA_TYPE_CODE); zeSchemaTypeBuilder.getDefaultSchema().create("anotherSchemaRecord") .defineReferencesTo(anotherSchemaTypeBuilder); anotherSchemaTypeBuilder.getDefaultSchema().create("code").setType(MetadataValueType.STRING); } }; defineSchemasManager().using(schema.withAMetadata(configurator)); } private void givenFourLettersValues() throws Exception { defineSchemasManager().using(schema.withAStringMetadata()); transaction.addUpdate(expectedRecord = new TestRecord(zeSchema, "expectedRecord").set(zeSchema.stringMetadata(), "A")); transaction .addUpdate(expectedRecord2 = new TestRecord(zeSchema, "expectedRecord2").set(zeSchema.stringMetadata(), "B")); transaction .addUpdate(expectedRecord3 = new TestRecord(zeSchema, "expectedRecord3").set(zeSchema.stringMetadata(), "C")); transaction .addUpdate(expectedRecord4 = new TestRecord(zeSchema, "expectedRecord4").set(zeSchema.stringMetadata(), "D")); recordServices.execute(transaction); } private void givenFiveDateTimeValuesIncludingNullDateTime() throws Exception { defineSchemasManager().using(schema.withADateTimeMetadata()); transaction.addUpdate(expectedRecord5 = new TestRecord(zeSchema, "recordWithNullDate")); transaction.addUpdate( expectedRecord = new TestRecord(zeSchema, "dateTime1Record").set(zeSchema.dateTimeMetadata(), DATE_TIME1)); transaction.addUpdate( expectedRecord2 = new TestRecord(zeSchema, "dateTime2Record").set(zeSchema.dateTimeMetadata(), DATE_TIME2)); transaction.addUpdate( expectedRecord3 = new TestRecord(zeSchema, "dateTime3Record").set(zeSchema.dateTimeMetadata(), DATE_TIME3)); transaction.addUpdate( expectedRecord4 = new TestRecord(zeSchema, "dateTime4Record").set(zeSchema.dateTimeMetadata(), DATE_TIME4)); recordServices.execute(transaction); } private void givenFiveDateValuesIncludingNullDate() throws Exception { defineSchemasManager().using(schema.withADateMetadata()); transaction.addUpdate(expectedRecord5 = new TestRecord(zeSchema, "recordWithNullDate")); transaction.addUpdate( expectedRecord = new TestRecord(zeSchema, "date1Record").set(zeSchema.dateMetadata(), DATE1)); transaction.addUpdate( expectedRecord2 = new TestRecord(zeSchema, "date2Record").set(zeSchema.dateMetadata(), DATE2)); transaction.addUpdate( expectedRecord3 = new TestRecord(zeSchema, "date3Record").set(zeSchema.dateMetadata(), DATE3)); transaction.addUpdate( expectedRecord4 = new TestRecord(zeSchema, "date4Record").set(zeSchema.dateMetadata(), DATE4)); recordServices.execute(transaction); } private void givenFiveRelativeDatesDateValuesIncludingNullDate() throws Exception { defineSchemasManager().using(schema.withADateMetadata()); transaction.addUpdate(expectedRecord5 = new TestRecord(zeSchema, "recordWithNullDate")); transaction.addUpdate( expectedRecord = new TestRecord(zeSchema, "date1Record") .set(zeSchema.dateMetadata(), NOW.toLocalDate().minusYears(1))); transaction.addUpdate( expectedRecord2 = new TestRecord(zeSchema, "date2Record") .set(zeSchema.dateMetadata(), NOW.toLocalDate().minusYears(2))); transaction.addUpdate( expectedRecord3 = new TestRecord(zeSchema, "date3Record") .set(zeSchema.dateMetadata(), NOW.toLocalDate().minusYears(4))); transaction.addUpdate( expectedRecord4 = new TestRecord(zeSchema, "date4Record") .set(zeSchema.dateMetadata(), NOW.toLocalDate().plusYears(1))); recordServices.execute(transaction); } private void givenFiveNumberValuesIncludingNegativeNumberAndMinIntegerValue() throws Exception { defineSchemasManager().using(schema.withANumberMetadata()); transaction.addUpdate(expectedRecord = new TestRecord(zeSchema, "expectedRecord").set(zeSchema.numberMetadata(), null)); transaction.addUpdate(expectedRecord = new TestRecord(zeSchema, "expectedRecord").set(zeSchema.numberMetadata(), -20)); transaction .addUpdate(expectedRecord2 = new TestRecord(zeSchema, "expectedRecord2").set(zeSchema.numberMetadata(), -10)); transaction.addUpdate(expectedRecord3 = new TestRecord(zeSchema, "expectedRecord3").set(zeSchema.numberMetadata(), 2)); transaction.addUpdate(expectedRecord4 = new TestRecord(zeSchema, "expectedRecord4").set(zeSchema.numberMetadata(), 10)); recordServices.execute(transaction); } @SuppressWarnings("rawtypes") private void givenNumberMultiValueMetadataWithThreeNumbers() throws Exception { defineSchemasManager().using(schema.withANumberMetadata(multiValueConfigurator())); List numberList = Arrays.asList(-10, 0, 1); transaction.addUpdate(expectedRecord = new TestRecord(zeSchema, "expectedRecord").set(zeSchema.numberMetadata(), numberList)); recordServices.execute(transaction); } @SuppressWarnings("rawtypes") private void givenTextMultiValueMetadataWithThreeTexts() throws Exception { defineSchemasManager().using(schema.withAStringMetadata(multiValueConfigurator())); List textList = Arrays.asList("Chuck Norris", "Edouard Norris", "Edouard Lechat"); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.stringMetadata(), textList)); recordServices.execute(transaction); } @SuppressWarnings("rawtypes") private void givenDateTimeMultiValueMetadataWithThreeDateTimes() throws Exception { defineSchemasManager().using(schema.withADateTimeMetadata(multiValueConfigurator())); List dateList = Arrays.asList(DATE_TIME1, DATE_TIME2, DATE_TIME3); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.dateTimeMetadata(), dateList)); recordServices.execute(transaction); } @SuppressWarnings("rawtypes") private void givenDateMultiValueMetadataWithThreeDates() throws Exception { defineSchemasManager().using(schema.withADateMetadata(multiValueConfigurator())); List dateList = Arrays.asList(DATE1, DATE2, DATE3); transaction.addUpdate(expectedRecord = newRecordOfZeSchema().set(zeSchema.dateMetadata(), dateList)); recordServices.execute(transaction); } private MetadataBuilderConfigurator multiValueConfigurator() { MetadataBuilderConfigurator configurator = new MetadataBuilderConfigurator() { @Override public void configure(MetadataBuilder builder, MetadataSchemaTypesBuilder schemaTypes) { builder.setMultivalue(true); } }; return configurator; } private void givenFiveTextValues() throws Exception { defineSchemasManager().using(schema.withAStringMetadata()); transaction.addUpdate(expectedRecord = new TestRecord(zeSchema, "expectedRecord").set(zeSchema.stringMetadata(), "Chuck Lechat")); transaction.addUpdate(expectedRecord2 = new TestRecord(zeSchema, "expectedRecord2").set(zeSchema.stringMetadata(), "Chuck Norris")); transaction.addUpdate(expectedRecord3 = new TestRecord(zeSchema, "expectedRecord3").set(zeSchema.stringMetadata(), "Edouard Lechat")); transaction.addUpdate(expectedRecord4 = new TestRecord(zeSchema, "expectedRecord4").set(zeSchema.stringMetadata(), "zeEdouard Lechat")); transaction.addUpdate(expectedRecord5 = new TestRecord(zeSchema, "expectedRecord5").set(zeSchema.stringMetadata(), "zeEdouard *")); recordServices.execute(transaction); } private void givenTwoZeSchemaRecords() throws Exception { defineSchemasManager().using(schema.withAStringMetadata()); transaction.addUpdate(zeSchemaRecord1 = new TestRecord(zeSchema, "expectedRecord").set(zeSchema.stringMetadata(), "Chuck Lechat")); transaction.addUpdate(zeSchemaRecord2 = new TestRecord(zeSchema, "unexpectedRecord").set(zeSchema.stringMetadata(), "Chuck Norris")); recordServices.execute(transaction); } private void givenFourTextValuesIncludingNull() throws Exception { defineSchemasManager().using(schema.withAStringMetadata()); transaction.addUpdate(expectedRecord = new TestRecord(zeSchema, "expectedRecord").set(zeSchema.stringMetadata(), "__A__")); transaction .addUpdate(expectedRecord2 = new TestRecord(zeSchema, "expectedRecord2").set(zeSchema.stringMetadata(), null)); transaction.addUpdate(expectedRecord3 = new TestRecord(zeSchema, "expectedRecord3").set(zeSchema.stringMetadata(), "__T__")); transaction.addUpdate(expectedRecord4 = new TestRecord(zeSchema, "expectedRecord4").set(zeSchema.stringMetadata(), "__Z__")); recordServices.execute(transaction); } private List<Record> findRecords(LogicalSearchCondition condition) { LogicalSearchQuery query = new LogicalSearchQuery(); query.setCondition(condition); return searchServices.search(query); } private SPEQueryResponse query(LogicalSearchCondition condition) { LogicalSearchQuery query = new LogicalSearchQuery(); query.setCondition(condition); return searchServices.query(query); } private List<String> findRecordIds(LogicalSearchCondition condition) { LogicalSearchQuery query = new LogicalSearchQuery(); query.setCondition(condition); return searchServices.searchRecordIds(query); } private Record givenARecord(String record) { return new TestRecord(zeSchema, record); } private Record newRecordOfZeSchema() { return recordServices.newRecordWithSchema(zeSchema.instance()); } private Record newRecordOfZeSchema(String id) { return recordServices.newRecordWithSchema(zeSchema.instance(), id); } private Record newRecordOfAnotherSchema() { return new TestRecord(anotherSchema); } private Record newRecordOfOotherSchemaInCollection2() { return new TestRecord(otherSchemaInCollection2); } public static final class TitleLengthCalculator implements MetadataValueCalculator<Double> { LocalDependency<String> titleDependency = LocalDependency.toAString(Schemas.TITLE.getLocalCode()); @Override public Double calculate(CalculatorParameters parameters) { return (double) parameters.get(titleDependency).length(); } @Override public Double getDefaultValue() { return 0.0; } @Override public MetadataValueType getReturnType() { return MetadataValueType.NUMBER; } @Override public boolean isMultiValue() { return false; } @Override public List<? extends Dependency> getDependencies() { return asList(titleDependency); } } }