package org.molgenis.integrationtest.platform; import org.molgenis.data.DataService; import org.molgenis.data.Entity; import org.molgenis.data.Query; import org.molgenis.data.elasticsearch.SearchService; import org.molgenis.data.elasticsearch.index.job.IndexService; import org.molgenis.data.meta.MetaDataService; import org.molgenis.data.meta.model.Attribute; import org.molgenis.data.meta.model.AttributeMetadata; import org.molgenis.data.meta.model.EntityType; import org.molgenis.data.meta.model.EntityTypeMetadata; import org.molgenis.data.support.QueryImpl; import org.molgenis.security.core.runas.RunAsSystemProxy; import org.molgenis.test.data.EntityTestHarness; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import static org.molgenis.data.meta.AttributeType.*; import static org.molgenis.integrationtest.platform.PlatformIT.waitForWorkToBeFinished; import static org.molgenis.security.core.runas.RunAsSystemProxy.runAsSystem; import static org.testng.Assert.*; public class IndexMetadataCUDOperationsPlatformIT { private static final Logger LOG = LoggerFactory.getLogger(IndexMetadataCUDOperationsPlatformIT.class); public static void testIndexCreateMetaData(SearchService searchService, EntityType entityTypeStatic, EntityType entityTypeDynamic, MetaDataService metaDataService) { Query<Entity> q1 = new QueryImpl<>(); q1.eq(EntityTypeMetadata.FULL_NAME, entityTypeStatic.getName()); assertEquals(searchService.count(q1, metaDataService.getEntityType(EntityTypeMetadata.ENTITY_TYPE_META_DATA)), 1); Query<Entity> q2 = new QueryImpl<>(); q2.eq(EntityTypeMetadata.FULL_NAME, entityTypeDynamic.getName()); assertEquals(searchService.count(q2, metaDataService.getEntityType(EntityTypeMetadata.ENTITY_TYPE_META_DATA)), 1); } /** * Test delete only for dynamic entity metadata * static entity metadata cannot be deleted */ public static void testIndexDeleteMetaData(SearchService searchService, DataService dataService, EntityType entityTypeDynamic, MetaDataService metaDataService, IndexService indexService) { // 1. verify that sys_test_TypeTestDynamic exists in mapping Query<Entity> q = new QueryImpl<>(); q.eq(EntityTypeMetadata.FULL_NAME, entityTypeDynamic.getName()); assertEquals(searchService.count(q, metaDataService.getEntityType(EntityTypeMetadata.ENTITY_TYPE_META_DATA)), 1); // 2. delete sys_test_TypeTestDynamic metadata and wait on index runAsSystem(() -> { dataService.getMeta().deleteEntityType(entityTypeDynamic.getName()); }); PlatformIT.waitForIndexToBeStable(EntityTypeMetadata.ENTITY_TYPE_META_DATA, indexService, LOG); waitForWorkToBeFinished(indexService, LOG); // 3. verify that mapping is removed assertFalse(searchService.hasMapping(entityTypeDynamic)); // Reset context RunAsSystemProxy.runAsSystem(() -> { metaDataService.addEntityType(entityTypeDynamic); }); waitForWorkToBeFinished(indexService, LOG); } /** * Test metadata Updating an attribute */ public static void testIndexUpdateMetaDataUpdateAttribute(SearchService searchService, EntityType entityTypeDynamic, MetaDataService metaDataService, IndexService indexService) { // 1. verify that sys_test_TypeTestDynamic exists in mapping Query<Entity> q = new QueryImpl<>(); q.eq(EntityTypeMetadata.FULL_NAME, entityTypeDynamic.getName()); assertEquals(searchService.count(q, metaDataService.getEntityType(EntityTypeMetadata.ENTITY_TYPE_META_DATA)), 1); // 2. change dataType value of ATTR_EMAIL Attribute toUpdateAttribute = entityTypeDynamic.getAttribute(EntityTestHarness.ATTR_EMAIL); toUpdateAttribute.setDataType(STRING); Object toUpdateAttributeId = toUpdateAttribute.getIdValue(); // 3. Preform update runAsSystem(() -> { metaDataService.updateEntityType(entityTypeDynamic); }); waitForWorkToBeFinished(indexService, LOG); assertTrue(searchService.hasMapping(entityTypeDynamic)); // Verify metadata changed Query<Entity> q2 = new QueryImpl<>(); EntityType emdActual = metaDataService.getEntityType(AttributeMetadata.ATTRIBUTE_META_DATA); q2.eq(AttributeMetadata.ID, toUpdateAttributeId); q2.and(); q2.eq(AttributeMetadata.TYPE, getValueString(STRING)); assertEquals(searchService.count(q2, emdActual), 1); // Reset context toUpdateAttribute.setDataType(EMAIL); runAsSystem(() -> { metaDataService.deleteEntityType(entityTypeDynamic.getName()); metaDataService.addEntityType(entityTypeDynamic); }); waitForWorkToBeFinished(indexService, LOG); } /** * Test metadata removing an attribute */ public static void testIndexUpdateMetaDataRemoveAttribute(EntityType emd, String attributeName, SearchService searchService, MetaDataService metaDataService, IndexService indexService) { // 1. verify that sys_test_TypeTestDynamic exists in mapping Query<Entity> q = new QueryImpl<>(); q.eq(EntityTypeMetadata.FULL_NAME, emd.getName()); assertEquals(searchService.count(q, metaDataService.getEntityType(EntityTypeMetadata.ENTITY_TYPE_META_DATA)), 1); // 2. remove attribute Attribute toRemoveAttribute = emd.getAttribute(attributeName); emd.removeAttribute(toRemoveAttribute); // 3. Preform update runAsSystem(() -> { metaDataService.updateEntityType(emd); }); waitForWorkToBeFinished(indexService, LOG); assertTrue(searchService.hasMapping(emd)); // 4. Verify metadata changed Query<Entity> q2 = new QueryImpl<>(); EntityType emdActual = metaDataService.getEntityType(AttributeMetadata.ATTRIBUTE_META_DATA); q2.eq(AttributeMetadata.ID, toRemoveAttribute.getIdValue()); assertEquals(searchService.count(q2, emdActual), 0); // Reset context emd.addAttribute(toRemoveAttribute); runAsSystem(() -> { metaDataService.updateEntityType(emd); }); waitForWorkToBeFinished(indexService, LOG); } }