package com.constellio.model.services.schemas; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from; import static com.constellio.model.services.search.query.logical.valueCondition.ConditionTemplateFactory.autocompleteFieldMatching; import static com.constellio.sdk.tests.schemas.TestsSchemasSetup.whichIsSearchable; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import java.util.ArrayList; import org.junit.Before; import com.constellio.data.dao.managers.config.ConfigManager; import com.constellio.data.dao.services.DataStoreTypesFactory; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.schemas.Metadata; import com.constellio.model.entities.schemas.MetadataSchemaType; import com.constellio.model.entities.schemas.Schemas; import com.constellio.model.services.collections.CollectionsListManager; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.records.RecordServicesException; import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder; import com.constellio.model.services.search.SearchServices; import com.constellio.model.services.search.query.logical.LogicalSearchQuery; import com.constellio.model.services.search.query.logical.condition.ConditionTemplate; import com.constellio.model.services.search.query.logical.valueCondition.ConditionTemplateFactory; import com.constellio.model.services.taxonomies.TaxonomiesManager; import com.constellio.sdk.tests.ConstellioTest; import com.constellio.sdk.tests.TestRecord; import com.constellio.sdk.tests.schemas.TestsSchemasSetup; import com.constellio.sdk.tests.schemas.TestsSchemasSetup.AnotherSchemaMetadatas; import com.constellio.sdk.tests.schemas.TestsSchemasSetup.ZeCustomSchemaMetadatas; import com.constellio.sdk.tests.schemas.TestsSchemasSetup.ZeSchemaMetadatas; public class SchemasModificationImpactsAcceptanceTest extends ConstellioTest { TaxonomiesManager taxonomiesManager; MetadataSchemasManager schemasManager; ConfigManager configManager; TestsSchemasSetup schemas = new TestsSchemasSetup(); ZeSchemaMetadatas zeSchema = schemas.new ZeSchemaMetadatas(); ZeCustomSchemaMetadatas zeCustomSchema = schemas.new ZeCustomSchemaMetadatas(); AnotherSchemaMetadatas anotherSchema = schemas.new AnotherSchemaMetadatas(); SearchServices searchServices; DataStoreTypesFactory typesFactory; CollectionsListManager collectionsListManager; RecordServices recordServices; @Before public void setUp() throws Exception { recordServices = getModelLayerFactory().newRecordServices(); configManager = getDataLayerFactory().getConfigManager(); schemasManager = getModelLayerFactory().getMetadataSchemasManager(); taxonomiesManager = getModelLayerFactory().getTaxonomiesManager(); searchServices = getModelLayerFactory().newSearchServices(); typesFactory = getDataLayerFactory().newTypesFactory(); collectionsListManager = getModelLayerFactory().getCollectionsListManager(); givenCollection("zeCollection"); } //@Test //TODO Disabled, because there is a problem with impacts handling causing a change of status to destroy all search indexes. public void whenModifyingTheAutocompleteFlagOfMetadatasThenRecordsReindexed() throws Exception { defineSchemasManager().using(schemas.withALargeTextMetadata()); String record1 = givenZeSchemaRecordWithLargeText("Je vais prendre mes pommes pour emporter"); String record2 = givenZeSchemaRecordWithLargeText("Un shish par jour éloigne le docteur pour toujours"); assertThatAutoCompleteSearch("pomme").isEmpty(); //assertThatSimpleSearch("pomme").isEmpty(); schemasManager.modify(zeCollection, changeLargeTextAutocompletStatus(true)); waitForBatchProcess(); assertThatAutoCompleteSearch("pomme").containsOnly(record1); //assertThatSimpleSearch("pomme").isEmpty(); schemasManager.modify(zeCollection, changeLargeTextAutocompletStatus(false)); waitForBatchProcess(); assertThatAutoCompleteSearch("pomme").isEmpty(); //assertThatSimpleSearch("pomme").isEmpty(); } //@Test //TODO Disabled, because there is a problem with impacts handling causing a change of status to destroy all search indexes. public void whenModifyingTheSearchableFlagOfMetadatasThenRecordsReindexed() throws Exception { defineSchemasManager().using(schemas.withALargeTextMetadata()); String record1 = givenZeSchemaRecordWithLargeText("Je vais prendre mes pommes pour emporter"); String record2 = givenZeSchemaRecordWithLargeText("Un shish par jour éloigne le docteur pour toujours"); assertThatAutoCompleteSearch("pommes").isEmpty(); //assertThatSimpleSearch("pommes").isEmpty(); schemasManager.modify(zeCollection, changeLargeTextSearchableStatus(true)); waitForBatchProcess(); assertThatAutoCompleteSearch("pommes").isEmpty(); //assertThatSimpleSearch("pommes").containsOnly(record1); schemasManager.modify(zeCollection, changeLargeTextSearchableStatus(false)); waitForBatchProcess(); assertThatAutoCompleteSearch("pommes").isEmpty(); //assertThatSimpleSearch("pommes").isEmpty(); } //@Test //TODO Disabled, because there is a problem with impacts handling causing a change of status to destroy all search indexes. public void whenModifyingTheMultivalueFlagOfMetadatasThenRecordsReindexed() throws Exception { defineSchemasManager().using(schemas.withAStringMetadata(whichIsSearchable).withANumberMetadata()); String record1 = givenZeSchemaRecordWithStringAndNumber("Shish", 42.0); String record2 = givenZeSchemaRecordWithStringAndNumber("Pomme", null); assertThat(record(record1).get(zeSchemaStringMetadata())).isEqualTo("Shish"); assertThat(record(record1).get(zeSchemaNumberMetadata())).isEqualTo(42.0); assertThat(record(record2).get(zeSchemaStringMetadata())).isEqualTo("Pomme"); assertThat(record(record2).get(zeSchemaNumberMetadata())).isEqualTo(null); schemasManager.modify(zeCollection, changeStringAndNumberMultivalueStatus(true)); waitForBatchProcess(); assertThat(record(record1).get(zeSchemaStringMetadata())).isEqualTo(asList("Shish")); assertThat(record(record1).get(zeSchemaNumberMetadata())).isEqualTo(asList(42.0)); assertThat(record(record2).get(zeSchemaStringMetadata())).isEqualTo(asList("Pomme")); assertThat(record(record2).get(zeSchemaNumberMetadata())).isEqualTo(new ArrayList<>()); //assertThatSimpleSearch("Shish").containsOnly(record1); recordServices.update(record(record1).set(zeSchemaStringMetadata(), asList("Shish", "inter")) .set(zeSchemaNumberMetadata(), asList(123.4, 42.0))); recordServices.update(record(record2).set(zeSchemaStringMetadata(), asList("Banane", "Shish")) .set(zeSchemaNumberMetadata(), new ArrayList<>())); assertThat(record(record1).get(zeSchemaStringMetadata())).isEqualTo(asList("Shish", "inter")); assertThat(record(record1).get(zeSchemaNumberMetadata())).isEqualTo(asList(123.4, 42.0)); assertThat(record(record2).get(zeSchemaStringMetadata())).isEqualTo(asList("Banane", "Shish")); assertThat(record(record2).get(zeSchemaNumberMetadata())).isEqualTo(new ArrayList<>()); //assertThatSimpleSearch("Shish").containsOnly(record1, record2); schemasManager.modify(zeCollection, changeStringAndNumberMultivalueStatus(false)); waitForBatchProcess(); assertThat(record(record1).get(zeSchemaStringMetadata())).isEqualTo("Shish"); assertThat(record(record1).getList(Schemas.dummyMultiValueMetadata(zeSchemaStringMetadata()))) .isEqualTo(new ArrayList<>()); assertThat(record(record1).get(zeSchemaNumberMetadata())).isEqualTo(123.4); assertThat(record(record2).get(zeSchemaStringMetadata())).isEqualTo("Banane"); assertThat(record(record2).get(zeSchemaNumberMetadata())).isEqualTo(null); //assertThatSimpleSearch("Shish").containsOnly(record1); } private Metadata zeSchemaStringMetadata() { return schemasManager.getSchemaTypes(zeCollection).getSchema(zeSchema.code()) .getMetadata(zeSchema.stringMetadata().getLocalCode()); } private Metadata zeSchemaNumberMetadata() { return schemasManager.getSchemaTypes(zeCollection).getSchema(zeSchema.code()) .getMetadata(zeSchema.numberMetadata().getLocalCode()); } private org.assertj.core.api.ListAssert<String> assertThatAutoCompleteSearch(String text) { MetadataSchemaType type = schemasManager.getSchemaTypes(zeCollection).getSchemaType(zeSchema.typeCode()); LogicalSearchQuery query = new LogicalSearchQuery().setCondition(from(type).where(autocompleteFieldMatching(text))); return assertThat(searchServices.searchRecordIds(query)); } private MetadataSchemaTypesAlteration changeLargeTextAutocompletStatus(final boolean status) { return new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchema(zeSchema.code()).getMetadata(zeSchema.largeTextMetadata().getLocalCode()) .setSchemaAutocomplete(status); } }; } private MetadataSchemaTypesAlteration changeLargeTextSearchableStatus(final boolean status) { return new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchema(zeSchema.code()).getMetadata(zeSchema.largeTextMetadata().getLocalCode()) .setSearchable(status); } }; } private MetadataSchemaTypesAlteration changeStringAndNumberMultivalueStatus(final boolean status) { return new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchema(zeSchema.code()).getMetadata(zeSchema.stringMetadata().getLocalCode()) .setMultivalue(status); types.getSchema(zeSchema.code()).getMetadata(zeSchema.numberMetadata().getLocalCode()) .setMultivalue(status); } }; } String givenZeSchemaRecordWithLargeText(String largeText) { Record record = new TestRecord(zeSchema); record.set(zeSchema.largeTextMetadata(), largeText); try { recordServices.add(record); } catch (RecordServicesException e) { throw new RuntimeException(e); } return record.getId(); } String givenZeSchemaRecordWithStringAndNumber(Object text, Object number) { Record record = new TestRecord(zeSchema); record.set(zeSchema.stringMetadata(), text); record.set(zeSchema.numberMetadata(), number); try { recordServices.add(record); } catch (RecordServicesException e) { throw new RuntimeException(e); } return record.getId(); } }