package com.constellio.model.services.search; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.all; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.allConditions; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.any; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.anyConditions; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.containing; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.containingText; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.endingWithText; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.in; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.isFalse; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.isFalseOrNull; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.isNotNull; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.isTrue; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.isTrueOrNull; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.notContainingElements; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.notIn; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.startingWithText; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.where; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.whereAll; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.whereAny; import static com.constellio.sdk.tests.TestUtils.asList; import static com.constellio.sdk.tests.TestUtils.chuckNorris; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import com.constellio.model.entities.schemas.Metadata; import com.constellio.model.entities.schemas.MetadataSchema; import com.constellio.model.entities.schemas.MetadataValueType; import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition; import com.constellio.sdk.tests.ConstellioTest; public class LogicalSearchEntitiesTest extends ConstellioTest { @Mock MetadataSchema schema; @Mock Metadata firstTextMetadata; @Mock Metadata referenceMetadata; @Mock Metadata secondTextMetadata; @Mock Metadata booleanMetadata; @Before public void setUp() { when(schema.getCollection()).thenReturn(zeCollection); when(firstTextMetadata.getCollection()).thenReturn(zeCollection); when(firstTextMetadata.getCode()).thenReturn("firstText"); when(firstTextMetadata.getType()).thenReturn(MetadataValueType.STRING); when(firstTextMetadata.isMultivalue()).thenReturn(true); when(secondTextMetadata.getCollection()).thenReturn(zeCollection); when(secondTextMetadata.getCode()).thenReturn("secondText"); when(secondTextMetadata.getType()).thenReturn(MetadataValueType.STRING); when(secondTextMetadata.isMultivalue()).thenReturn(true); when(referenceMetadata.getCollection()).thenReturn(zeCollection); when(referenceMetadata.getCode()).thenReturn("reference"); when(referenceMetadata.getType()).thenReturn(MetadataValueType.REFERENCE); when(booleanMetadata.getCollection()).thenReturn(zeCollection); when(booleanMetadata.getCode()).thenReturn("boolean"); when(booleanMetadata.getType()).thenReturn(MetadataValueType.BOOLEAN); } @Test public void testName() throws Exception { List<String> arrayList = new ArrayList<>(asList("allo", "bonjour")); List<String> asList = asList("allo", "bonjour"); assertThat(arrayList).isEqualTo(arrayList); assertThat(arrayList).isEqualTo(asList); assertThat(asList).isEqualTo(arrayList); assertThat(asList).isEqualTo(asList); } @Test public void whenAllMetadataThenAnyWhereOnACriterionThenRootConditionIsTheAny() throws Exception { LogicalSearchCondition condition = from(schema).where(firstTextMetadata).isNotNull().andWhere(secondTextMetadata) .isContainingText("text").orWhere(firstTextMetadata).isNotContainingElements(Arrays.asList("othertext")); LogicalSearchCondition subCondition1 = where(firstTextMetadata).isNotNull(); LogicalSearchCondition subCondition2 = where(secondTextMetadata).isContainingText("text"); LogicalSearchCondition subCondition3 = where(firstTextMetadata).isNotContainingElements(Arrays.asList("othertext")); LogicalSearchCondition equalCondition = from(schema).whereAnyCondition( asList(allConditions(asList(subCondition1, subCondition2)), subCondition3)); LogicalSearchCondition differentCondition = from(schema).whereAllConditions( asList(anyConditions(asList(subCondition2, subCondition1)), subCondition3)); assertThat(condition).isEqualTo(equalCondition).isNotEqualTo(differentCondition); } @Test public void whenAnyMetadataThenAndWhereOnACriterionThenRootConditionIsTheAnd() throws Exception { LogicalSearchCondition condition = from(schema).where(firstTextMetadata).isNotNull().orWhere(secondTextMetadata) .isContainingText("text").andWhere(booleanMetadata).isFalse(); LogicalSearchCondition subCondition1 = where(firstTextMetadata).isNotNull(); LogicalSearchCondition subCondition2 = where(secondTextMetadata).isContainingText("text"); LogicalSearchCondition subCondition3 = where(booleanMetadata).isFalse(); LogicalSearchCondition equalCondition = from(schema).whereAllConditions( asList(anyConditions(asList(subCondition1, subCondition2)), subCondition3)); LogicalSearchCondition differentCondition = from(schema).whereAnyCondition( asList(allConditions(asList(subCondition2, subCondition1)), subCondition3)); assertThat(condition).isEqualTo(equalCondition).isNotEqualTo(differentCondition); } @Test public void whenUsingWhereAllOnOnUngoingConditionThenSameAsUsingWhereAndSubCondition() throws Exception { LogicalSearchCondition condition = from(schema).whereAll(Arrays.asList(firstTextMetadata, secondTextMetadata)) .isNotNull(); LogicalSearchCondition equalCondition = from(schema).where( whereAll(asList(firstTextMetadata, secondTextMetadata)).isNotNull()); LogicalSearchCondition differentCondition = from(schema).where( whereAny(asList(secondTextMetadata, firstTextMetadata)).isNotNull()); assertThat(condition).isEqualTo(equalCondition).isNotEqualTo(differentCondition); } @Test public void whenUsingWhereAllListOnOnUngoingConditionThenSameAsUsingWhereAndSubCondition() throws Exception { LogicalSearchCondition condition = from(schema).whereAll(asList(firstTextMetadata, secondTextMetadata)).isNotNull(); LogicalSearchCondition equalCondition = from(schema).where( whereAll(asList(firstTextMetadata, secondTextMetadata)).isNotNull()); LogicalSearchCondition differentCondition = from(schema).where( whereAny(asList(secondTextMetadata, firstTextMetadata)).isNotNull()); assertThat(condition).isEqualTo(equalCondition).isNotEqualTo(differentCondition); } @Test public void whenUsingWhereAnyOnOnUngoingConditionThenSameAsUsingWhereAndSubCondition() throws Exception { LogicalSearchCondition condition = from(schema).whereAny(asList(firstTextMetadata, secondTextMetadata)).isNotNull(); LogicalSearchCondition equalCondition = from(schema).where( whereAny(asList(firstTextMetadata, secondTextMetadata)).isNotNull()); LogicalSearchCondition differentCondition = from(schema).where( whereAll(asList(secondTextMetadata, firstTextMetadata)).isNotNull()); assertThat(condition).isEqualTo(equalCondition).isNotEqualTo(differentCondition); } @Test public void whenUsingWhereAnyListOnOnUngoingConditionThenSameAsUsingWhereAndSubCondition() throws Exception { LogicalSearchCondition condition = from(schema).whereAny(asList(firstTextMetadata, secondTextMetadata)).isNotNull(); LogicalSearchCondition equalCondition = from(schema).where( whereAny(asList(firstTextMetadata, secondTextMetadata)).isNotNull()); LogicalSearchCondition differentCondition = from(schema).where( whereAll(asList(secondTextMetadata, firstTextMetadata)).isNotNull()); assertThat(condition).isEqualTo(equalCondition).isNotEqualTo(differentCondition); } @Test public void whenUsingAndOnValueClauseThenSameAsUsingIsAll() throws Exception { LogicalSearchCondition condition = from(schema).where(firstTextMetadata).isNotNull() .and(asList(startingWithText("prefix"), endingWithText("suffix"))); LogicalSearchCondition equalCondition = from(schema).where(firstTextMetadata).isAll( asList(isNotNull(), startingWithText("prefix"), endingWithText("suffix"))); LogicalSearchCondition differentCondition = from(schema).where(firstTextMetadata).isAll( asList(isNotNull(), all(asList(endingWithText("suffix"), startingWithText("prefix"))))); assertThat(condition).isEqualTo(equalCondition).isNotEqualTo(differentCondition); } @Test public void whenUsingAndThenOrOnValueClauseThenSameAsUsingIsAllThenIsAny() throws Exception { LogicalSearchCondition condition = from(schema).where(firstTextMetadata).isNotNull() .and(asList(startingWithText("prefix"), endingWithText("suffix"))).or(asList(containingText(chuckNorris))); LogicalSearchCondition equalCondition = from(schema).where(firstTextMetadata).isAny( asList(all(asList(isNotNull(), startingWithText("prefix"), endingWithText("suffix"))), containingText(chuckNorris))); LogicalSearchCondition differentCondition = from(schema).where(firstTextMetadata).isAll( asList(isNotNull(), any(asList(endingWithText("suffix"), startingWithText("prefix"))))); assertThat(condition).isEqualTo(equalCondition).isNotEqualTo(differentCondition); } @Test public void whenUsingOrThenAndOnValueClauseThenSameAsUsingIsAnyThenIsAll() throws Exception { LogicalSearchCondition condition = from(schema).where(firstTextMetadata).isNotNull() .or(asList(startingWithText("prefix"), endingWithText("suffix"))).and(asList(containingText(chuckNorris))); LogicalSearchCondition equalCondition = from(schema).where(firstTextMetadata).isAll( asList(any(asList(isNotNull(), startingWithText("prefix"), endingWithText("suffix"))), containingText(chuckNorris))); LogicalSearchCondition differentCondition = from(schema).where(firstTextMetadata).isAny( asList(isNotNull(), all(asList(endingWithText("suffix"), startingWithText("prefix"))))); assertThat(condition).isEqualTo(equalCondition).isNotEqualTo(differentCondition); } @Test public void whenUsingIsNotThenSameAsUsingNot() throws Exception { LogicalSearchCondition condition = from(schema).where(firstTextMetadata).isNot(containingText(chuckNorris)); LogicalSearchCondition equalCondition = from(schema).where(firstTextMetadata).isNot(containingText(chuckNorris)); LogicalSearchCondition differentCondition = from(schema).where(firstTextMetadata).is(containingText(chuckNorris)); assertThat(condition).isEqualTo(equalCondition).isNotEqualTo(differentCondition); } @Test public void whenIsContainingThenSameAsUsingContaining() throws Exception { LogicalSearchCondition condition = from(schema).where(firstTextMetadata).isContaining(asList("zeValue")); LogicalSearchCondition equalCondition = from(schema).where(firstTextMetadata).is(containing(asList("zeValue"))); LogicalSearchCondition differentCondition = from(schema).where(firstTextMetadata).is(containing(asList("anotherValue"))); assertThat(condition).isEqualTo(equalCondition).isNotEqualTo(differentCondition); } @Test public void whenIsNotContainingThenSameAsUsingNotContaining() throws Exception { LogicalSearchCondition condition = from(schema).where(firstTextMetadata).isNotContainingElements(asList("zeValue")); LogicalSearchCondition equalCondition = from(schema).where(firstTextMetadata).is( notContainingElements(asList("zeValue"))); LogicalSearchCondition differentCondition = from(schema).where(firstTextMetadata).is( notContainingElements(asList("anotherValue"))); assertThat(condition).isEqualTo(equalCondition).isNotEqualTo(differentCondition); } @Test public void whenIsInThenSameAsUsingIn() throws Exception { LogicalSearchCondition condition = from(schema).where(firstTextMetadata).isIn(Arrays.asList("value1", "value2")); LogicalSearchCondition equalCondition = from(schema).where(firstTextMetadata).is(in(Arrays.asList("value1", "value2"))); LogicalSearchCondition differentCondition = from(schema).where(firstTextMetadata).is( in(Arrays.asList("value1", "value2", "value3"))); assertThat(condition).isEqualTo(equalCondition).isNotEqualTo(differentCondition); } @Test public void whenIsNotInThenSameAsUsingNotIn() throws Exception { LogicalSearchCondition condition = from(schema).where(firstTextMetadata).isNotIn(Arrays.asList("value1", "value2")); LogicalSearchCondition equalCondition = from(schema).where(firstTextMetadata).is( notIn(Arrays.asList("value1", "value2"))); LogicalSearchCondition differentCondition = from(schema).where(firstTextMetadata).is( notIn(Arrays.asList("value1", "value2", "value3"))); assertThat(condition).isEqualTo(equalCondition).isNotEqualTo(differentCondition); } @Test public void whenIsNotInWithNestedQueryThenSameAsUsingNotIn() throws Exception { LogicalSearchCondition nestedSearch = from(schema).where(firstTextMetadata).isNotIn(Arrays.asList("value1", "value2")); LogicalSearchCondition otherNestedSearch = from(schema).where(firstTextMetadata).isNotIn( Arrays.asList("value1", "value2", "value3")); LogicalSearchCondition condition = from(schema).where(firstTextMetadata).isNotIn(Arrays.asList(nestedSearch)); LogicalSearchCondition equalCondition = from(schema).where(firstTextMetadata).is(notIn(Arrays.asList(nestedSearch))); LogicalSearchCondition differentCondition = from(schema).where(firstTextMetadata).is( notIn(Arrays.asList(otherNestedSearch))); assertThat(condition).isEqualTo(equalCondition).isNotEqualTo(differentCondition); } @Test public void whenIsContainingTextThenSameAsUsingContainingWithText() throws Exception { LogicalSearchCondition condition = from(schema).where(firstTextMetadata).isContainingText("prefix"); LogicalSearchCondition equalCondition = from(schema).where(firstTextMetadata).is(containingText("prefix")); LogicalSearchCondition differentCondition = from(schema).where(firstTextMetadata).is(containingText("prefix2")); assertThat(condition).isEqualTo(equalCondition).isNotEqualTo(differentCondition); } @Test public void whenIsStartingWithTextThenSameAsUsingStartingWithText() throws Exception { LogicalSearchCondition condition = from(schema).where(firstTextMetadata).isStartingWithText("prefix"); LogicalSearchCondition equalCondition = from(schema).where(firstTextMetadata).is(startingWithText("prefix")); LogicalSearchCondition differentCondition = from(schema).where(firstTextMetadata).is(startingWithText("prefix2")); assertThat(condition).isEqualTo(equalCondition).isNotEqualTo(differentCondition); } @Test public void whenIsEndingWithTextThenSameAsUsingEndingWithText() throws Exception { LogicalSearchCondition condition = from(schema).where(firstTextMetadata).isEndingWithText("prefix"); LogicalSearchCondition equalCondition = from(schema).where(firstTextMetadata).is(endingWithText("prefix")); LogicalSearchCondition differentCondition = from(schema).where(firstTextMetadata).is(endingWithText("prefix2")); assertThat(condition).isEqualTo(equalCondition).isNotEqualTo(differentCondition); } @Test public void whenIsFalseThenSameAsUsingIsFalse() throws Exception { LogicalSearchCondition condition = from(schema).where(booleanMetadata).isFalse(); LogicalSearchCondition equalCondition = from(schema).where(booleanMetadata).is(isFalse()); LogicalSearchCondition differentCondition = from(schema).where(booleanMetadata).is(isFalseOrNull()); assertThat(condition).isEqualTo(equalCondition).isNotEqualTo(differentCondition); } @Test public void whenIsFalseOrNullThenSameAsUsingIsFalseOrNull() throws Exception { LogicalSearchCondition condition = from(schema).where(booleanMetadata).isFalseOrNull(); LogicalSearchCondition equalCondition = from(schema).where(booleanMetadata).is(isFalseOrNull()); LogicalSearchCondition differentCondition = from(schema).where(booleanMetadata).is(isTrueOrNull()); assertThat(condition).isEqualTo(equalCondition).isNotEqualTo(differentCondition); } @Test public void whenIsTrueThenSameAsUsingIsTrue() throws Exception { LogicalSearchCondition condition = from(schema).where(booleanMetadata).isTrue(); LogicalSearchCondition equalCondition = from(schema).where(booleanMetadata).is(isTrue()); LogicalSearchCondition differentCondition = from(schema).where(booleanMetadata).is(isFalse()); assertThat(condition).isEqualTo(equalCondition).isNotEqualTo(differentCondition); } @Test public void whenIsTrueOrNullThenSameAsUsingIsFalseOrNull() throws Exception { LogicalSearchCondition condition = from(schema).where(booleanMetadata).isTrueOrNull(); LogicalSearchCondition equalCondition = from(schema).where(booleanMetadata).is(isTrueOrNull()); LogicalSearchCondition differentCondition = from(schema).where(booleanMetadata).is(isTrue()); assertThat(condition).isEqualTo(equalCondition).isNotEqualTo(differentCondition); } // @Test(expected = LogicalSearchConditionRuntimeException.UnsupportedConditionForMetadata.class) // public void whenUsingInvalidConditionWithinIsThenRuntimeException() throws Exception { // from(schema).where(booleanMetadata).is(endingWithText("t")); // } // // @Test(expected = LogicalSearchConditionRuntimeException.UnsupportedConditionForMetadata.class) // public void whenUsingInvalidConditionWithinNotThenRuntimeException() throws Exception { // from(schema).where(booleanMetadata).is(not(endingWithText("t"))); // } // // @Test(expected = LogicalSearchConditionRuntimeException.UnsupportedConditionForMetadata.class) // public void whenUsingInvalidConditionWithinIsNotThenRuntimeException() throws Exception { // from(schema).where(booleanMetadata).isNot(endingWithText("t")); // } // // @Test(expected = LogicalSearchConditionRuntimeException.UnsupportedConditionForMetadata.class) // public void whenUsingContainingTextOnNonTextMetadataThenRuntimeException() throws Exception { // from(schema).where(booleanMetadata).isContainingText("t"); // } // // @Test(expected = LogicalSearchConditionRuntimeException.UnsupportedConditionForMetadata.class) // public void whenUsingStartingWithTextOnNonTextMetadataThenRuntimeException() throws Exception { // from(schema).where(booleanMetadata).isStartingWithText("t"); // } // // @Test(expected = LogicalSearchConditionRuntimeException.UnsupportedConditionForMetadata.class) // public void whenUsingEndingWithTextOnNonTextMetadataThenRuntimeException() throws Exception { // from(schema).where(booleanMetadata).isEndingWithText("t"); // } // // @Test(expected = LogicalSearchConditionRuntimeException.UnsupportedConditionForMetadata.class) // public void whenUsingIsTrueOnNonBooleanMetadataThenRuntimeException() throws Exception { // from(schema).where(firstTextMetadata).isTrue(); // } // // @Test(expected = LogicalSearchConditionRuntimeException.UnsupportedConditionForMetadata.class) // public void whenUsingIsFalseOnNonBooleanMetadataThenRuntimeException() throws Exception { // from(schema).where(firstTextMetadata).isFalse(); // } // // @Test(expected = LogicalSearchConditionRuntimeException.UnsupportedConditionForMetadata.class) // public void whenUsingIsTrueOrNullOnNonBooleanMetadataThenRuntimeException() throws Exception { // from(schema).where(firstTextMetadata).isTrueOrNull(); // } // // @Test(expected = LogicalSearchConditionRuntimeException.UnsupportedConditionForMetadata.class) // public void whenUsingIsFalseOrNullOnNonBooleanMetadataThenRuntimeException() throws Exception { // from(schema).where(firstTextMetadata).isFalseOrNull(); // } }