Skip to content

Commit

Permalink
Don't copy ModelItem index to another indexed parent
Browse files Browse the repository at this point in the history
- When copying an item containing child ModelItems, copy the child indices
- When copying a ModelItem itself, don't copy the index
  • Loading branch information
joe-crawford committed Mar 4, 2022
1 parent 5b33e4b commit c7d40dc
Show file tree
Hide file tree
Showing 14 changed files with 116 additions and 71 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import groovy.util.logging.Slf4j
class CopyInformation implements Validateable {

String copyLabel
boolean copyIndex = false

Map<String, TreeMap<UUID, List<MultiFacetItemAware>>> preloadedFacets = [:]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,9 @@ abstract class ModelItemService<K extends ModelItem> extends CatalogueItemServic
K copyModelItemInformation(K original, K copy, User copier, UserSecurityPolicyManager userSecurityPolicyManager,
CopyInformation copyInformation = null) {
copy = super.copyCatalogueItemInformation(original, copy, copier, userSecurityPolicyManager, copyInformation)
copy.idx = original.idx
if (copyInformation?.copyIndex) {
copy.idx = original.idx
}
copy
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ trait IndexedSiblingAware {
if (mi.hasChanged('idx') && mi.id) {
mi.save(flush: false, validate: false)
}
log.trace('After >> EV {} has idx {} (Dirty: {})', mi.label, mi.idx, mi.isDirty())
log.trace('After >> MI {} has idx {} (Dirty: {})', mi.label, mi.idx, mi.isDirty())
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -735,8 +735,8 @@ class DataModelService extends ModelService<DataModel> implements SummaryMetadat

List<DataType> dataTypes = DataType.byDataModelId(original.id).join('classifiers').list()
List<DataClass> rootDataClasses = DataClass.byRootDataClassOfDataModelId(original.id).join('classifiers').list()
CopyInformation dataClassCache = cacheFacetInformationForCopy(rootDataClasses.collect {it.id})
CopyInformation dataTypeCache = cacheFacetInformationForCopy(dataTypes.collect {it.id})
CopyInformation dataClassCache = cacheFacetInformationForCopy(rootDataClasses.collect {it.id}, new CopyInformation(copyIndex: true))
CopyInformation dataTypeCache = cacheFacetInformationForCopy(dataTypes.collect {it.id}, new CopyInformation(copyIndex: true))

// Copy all the datatypes
dataTypes.sort().each {dt ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -736,14 +736,14 @@ WHERE
copy.dataClasses = []

List<DataClass> dataClasses = DataClass.byParentDataClassId(original.id).join('classifiers').list()
CopyInformation dataClassCache = cacheFacetInformationForCopy(dataClasses.collect { it.id })
CopyInformation dataClassCache = cacheFacetInformationForCopy(dataClasses.collect { it.id }, new CopyInformation(copyIndex: true))
dataClasses.sort().each { child ->
copyDataClass(copiedDataModel, child, copier, userSecurityPolicyManager, copy, copySummaryMetadata, dataClassCache)
}
copy.dataElements = []

List<DataElement> dataElements = DataElement.byDataClassId(original.id).join('classifiers').list()
CopyInformation dataElementCache = cacheFacetInformationForCopy(dataElements.collect { it.id })
CopyInformation dataElementCache = cacheFacetInformationForCopy(dataElements.collect { it.id }, new CopyInformation(copyIndex: true))
dataElements.sort().each { element ->
copy.addToDataElements(
dataElementService
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ class DataTypeService extends ModelItemService<DataType> implements DefaultDataT
dataType.breadcrumbTree.removeFromParent()

List<DataElement> dataElements = dataElementService.findAllByDataType(dataType)
dataElements.each { dataElementService.delete(it) }
dataElements.each {dataElementService.delete(it)}

switch (dataType.domainType) {
case DataType.PRIMITIVE_DOMAIN_TYPE:
Expand Down Expand Up @@ -187,13 +187,13 @@ class DataTypeService extends ModelItemService<DataType> implements DefaultDataT
enumerationTypeService.propagateContentsInformation(catalogueItem as EnumerationType, previousVersionCatalogueItem as EnumerationType)
}

previousVersionCatalogueItem.summaryMetadata.each { previousSummaryMetadata ->
if (catalogueItem.summaryMetadata.any { it.label == previousSummaryMetadata.label }) return
previousVersionCatalogueItem.summaryMetadata.each {previousSummaryMetadata ->
if (catalogueItem.summaryMetadata.any {it.label == previousSummaryMetadata.label}) return
SummaryMetadata summaryMetadata = new SummaryMetadata(label: previousSummaryMetadata.label,
description: previousSummaryMetadata.description,
summaryMetadataType: previousSummaryMetadata.summaryMetadataType)

previousSummaryMetadata.summaryMetadataReports.each { previousSummaryMetadataReport ->
previousSummaryMetadata.summaryMetadataReports.each {previousSummaryMetadataReport ->
summaryMetadata.addToSummaryMetadataReports(reportDate: previousSummaryMetadataReport.reportDate,
reportValue: previousSummaryMetadataReport.reportValue,
createdBy: previousSummaryMetadataReport.createdBy
Expand Down Expand Up @@ -232,7 +232,7 @@ class DataTypeService extends ModelItemService<DataType> implements DefaultDataT
new PrimitiveType(label: 'Timestamp', description: 'A timestamp'),
new PrimitiveType(label: 'Boolean', description: 'A true or false value'),
new PrimitiveType(label: 'Duration', description: 'A time period in arbitrary units')
].collect { new DefaultDataType(it) }
].collect {new DefaultDataType(it)}
}

@Override
Expand Down Expand Up @@ -271,7 +271,7 @@ class DataTypeService extends ModelItemService<DataType> implements DefaultDataT
super.checkBreadcrumbTreeAfterSavingCatalogueItem(dataType)

if (dataType.instanceOf(EnumerationType)) {
dataType.enumerationValues.each { enumerationValue ->
dataType.enumerationValues.each {enumerationValue ->
super.checkBreadcrumbTreeAfterSavingCatalogueItem(enumerationValue)
}
}
Expand All @@ -280,16 +280,16 @@ class DataTypeService extends ModelItemService<DataType> implements DefaultDataT
@Override
void checkBreadcrumbTreeAfterSavingCatalogueItems(Collection<DataType> dataTypes) {
super.checkBreadcrumbTreeAfterSavingCatalogueItems(dataTypes)
super.checkBreadcrumbTreeAfterSavingCatalogueItems(dataTypes.findAll{it.instanceOf(EnumerationType)}.collectMany {it.enumerationValues})
super.checkBreadcrumbTreeAfterSavingCatalogueItems(dataTypes.findAll {it.instanceOf(EnumerationType)}.collectMany {it.enumerationValues})
}

@Override
DataType checkFacetsAfterImportingCatalogueItem(DataType catalogueItem) {
if (catalogueItem.summaryMetadata) {
catalogueItem.summaryMetadata.each { sm ->
catalogueItem.summaryMetadata.each {sm ->
sm.multiFacetAwareItemId = catalogueItem.id
sm.createdBy = sm.createdBy ?: catalogueItem.createdBy
sm.summaryMetadataReports.each { smr ->
sm.summaryMetadataReports.each {smr ->
smr.createdBy = catalogueItem.createdBy
}
}
Expand All @@ -312,7 +312,7 @@ class DataTypeService extends ModelItemService<DataType> implements DefaultDataT
if (dataType.instanceOf(EnumerationType)) {
EnumerationType enumerationType = (dataType as EnumerationType)
enumerationType.fullSortOfChildren(enumerationType.enumerationValues)
enumerationType.enumerationValues.each { ev ->
enumerationType.enumerationValues.each {ev ->
ev.createdBy = importingUser.emailAddress
ev.checkPath()
}
Expand All @@ -337,8 +337,8 @@ class DataTypeService extends ModelItemService<DataType> implements DefaultDataT
}

void matchReferenceClasses(DataModel dataModel, Collection<ReferenceType> referenceTypes, Collection<Map> bindingMaps = []) {
referenceTypes.sort { it.label }.each { rdt ->
Map dataTypeBindingMap = bindingMaps.find { it.label == rdt.label } ?: [:]
referenceTypes.sort {it.label}.each {rdt ->
Map dataTypeBindingMap = bindingMaps.find {it.label == rdt.label} ?: [:]
Map refClassBindingMap = dataTypeBindingMap.referenceClass ?: [:]
matchReferenceClass(dataModel, rdt, refClassBindingMap)
}
Expand All @@ -357,7 +357,7 @@ class DataTypeService extends ModelItemService<DataType> implements DefaultDataT
else {
log.
trace('No referenceClass could be found to match label tree for {}, attempting no label tree', referenceType.referenceClass.label)
def possibles = dataModel.dataClasses.findAll { it.label == referenceType.referenceClass.label }
def possibles = dataModel.dataClasses.findAll {it.label == referenceType.referenceClass.label}
if (possibles.size() == 1) {
log.trace('Single possible referenceClass found, safely using')
possibles.first().addToReferenceTypes(referenceType)
Expand All @@ -371,7 +371,7 @@ class DataTypeService extends ModelItemService<DataType> implements DefaultDataT
}
} else {
log.trace('Making best guess for matching reference class as no path nor bound class')
DataClass dataClass = dataModel.dataClasses.find { it.label == bindingMap.referenceClass.label }
DataClass dataClass = dataModel.dataClasses.find {it.label == bindingMap.referenceClass.label}
if (dataClass) dataClass.addToReferenceTypes(referenceType)
}
}
Expand Down Expand Up @@ -404,8 +404,10 @@ class DataTypeService extends ModelItemService<DataType> implements DefaultDataT
break
case DataType.ENUMERATION_DOMAIN_TYPE:
copy = new EnumerationType()
original.enumerationValues.sort().each { ev ->
copy.addToEnumerationValues(enumerationValueService.copy(copiedDataModel, ev, copy, userSecurityPolicyManager))
CopyInformation copyInformation = new CopyInformation(copyIndex: true)
original.enumerationValues.sort().each {ev ->
copy.addToEnumerationValues(
enumerationValueService.copyEnumerationValue(copiedDataModel, ev, copy, userSecurityPolicyManager.user, userSecurityPolicyManager, copyInformation))
}
break
case DataType.REFERENCE_DOMAIN_TYPE:
Expand All @@ -423,11 +425,11 @@ class DataTypeService extends ModelItemService<DataType> implements DefaultDataT
}

DataType copyModelItemInformation(DataType original,
DataType copy,
User copier,
UserSecurityPolicyManager userSecurityPolicyManager,
boolean copySummaryMetadata,
copyInformation) {
DataType copy,
User copier,
UserSecurityPolicyManager userSecurityPolicyManager,
boolean copySummaryMetadata,
copyInformation) {
copy = super.copyModelItemInformation(original, copy, copier, userSecurityPolicyManager, copyInformation)
if (copySummaryMetadata) {
copy = copySummaryMetadataFromOriginal(original, copy, copier, copyInformation)
Expand All @@ -437,9 +439,9 @@ class DataTypeService extends ModelItemService<DataType> implements DefaultDataT

@Override
DataType copyModelItemInformation(DataType original,
DataType copy,
User copier,
UserSecurityPolicyManager userSecurityPolicyManager, CopyInformation copyInformation) {
DataType copy,
User copier,
UserSecurityPolicyManager userSecurityPolicyManager, CopyInformation copyInformation) {
copyModelItemInformation(original, copy, copier, userSecurityPolicyManager, false, copyInformation)
}

Expand Down Expand Up @@ -477,19 +479,19 @@ class DataTypeService extends ModelItemService<DataType> implements DefaultDataT
}

void mergeDataTypes(DataType keep, DataType replace) {
replace.dataElements?.each { de ->
replace.dataElements?.each {de ->
keep.addToDataElements(de)
}
List<Metadata> mds = []
mds += replace.metadata ?: []
mds.findAll { !keep.findMetadataByNamespaceAndKey(it.namespace, it.key) }.each { md ->
mds.findAll {!keep.findMetadataByNamespaceAndKey(it.namespace, it.key)}.each {md ->
replace.removeFromMetadata(md)
keep.addToMetadata(md.namespace, md.key, md.value, md.createdBy)
}
}

DataType findDataType(DataModel dataModel, String label) {
dataModel.dataTypes.find { it.label == label.trim() }
dataModel.dataTypes.find {it.label == label.trim()}
}

/*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import uk.ac.ox.softeng.maurodatamapper.core.container.Classifier
import uk.ac.ox.softeng.maurodatamapper.core.model.CatalogueItem
import uk.ac.ox.softeng.maurodatamapper.core.model.Model
import uk.ac.ox.softeng.maurodatamapper.core.model.ModelItemService
import uk.ac.ox.softeng.maurodatamapper.core.rest.transport.model.CopyInformation
import uk.ac.ox.softeng.maurodatamapper.datamodel.DataModel
import uk.ac.ox.softeng.maurodatamapper.datamodel.DataModelService
import uk.ac.ox.softeng.maurodatamapper.datamodel.facet.SummaryMetadataService
Expand Down Expand Up @@ -181,18 +182,15 @@ class EnumerationValueService extends ModelItemService<EnumerationValue> impleme
}

EnumerationValue copyEnumerationValue(DataModel copiedDataModel, EnumerationValue original, EnumerationType enumerationTypeToCopyInto,
User copier,
UserSecurityPolicyManager userSecurityPolicyManager) {
EnumerationValue copy = new EnumerationValue(key: original.key,
value: original.value)
User copier, UserSecurityPolicyManager userSecurityPolicyManager, CopyInformation copyInformation = null) {
EnumerationValue copy = new EnumerationValue(key: original.key, value: original.value, category: original.category)

copy = copyModelItemInformation(original, copy, copier, userSecurityPolicyManager)
copy = copyModelItemInformation(original, copy, copier, userSecurityPolicyManager, copyInformation)
setCatalogueItemRefinesCatalogueItem(copy, original, copier)

EnumerationType enumerationType = enumerationTypeToCopyInto ?: copiedDataModel.findEnumerationTypeByLabel(original.enumerationType.label)
enumerationType.addToEnumerationValues(copy)
copy

}

List<EnumerationValue> findAllByDataModelId(Serializable dataModelId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import uk.ac.ox.softeng.maurodatamapper.core.model.ModelService
import uk.ac.ox.softeng.maurodatamapper.core.provider.dataloader.DataLoaderProviderService
import uk.ac.ox.softeng.maurodatamapper.core.provider.importer.ModelImporterProviderService
import uk.ac.ox.softeng.maurodatamapper.core.provider.importer.parameter.ModelImporterProviderServiceParameters
import uk.ac.ox.softeng.maurodatamapper.core.rest.transport.model.CopyInformation
import uk.ac.ox.softeng.maurodatamapper.core.traits.domain.MultiFacetItemAware
import uk.ac.ox.softeng.maurodatamapper.path.Path
import uk.ac.ox.softeng.maurodatamapper.referencedata.facet.ReferenceSummaryMetadata
Expand Down Expand Up @@ -457,18 +458,20 @@ class ReferenceDataModelService extends ModelService<ReferenceDataModel> impleme

copy.trackChanges()

CopyInformation referenceDataTypeCopyInformation = new CopyInformation(copyIndex: true)
if (original.referenceDataTypes) {
// Copy all the referencedatatypes
original.referenceDataTypes.sort().each { dt ->
referenceDataTypeService.copyReferenceDataType(copy, dt, copier, userSecurityPolicyManager)
referenceDataTypeService.copyReferenceDataType(copy, dt, copier, userSecurityPolicyManager, copySummaryMetadata, referenceDataTypeCopyInformation)
}
}

CopyInformation referenceDataElementCopyInformation = new CopyInformation(copyIndex: true)
if (original.referenceDataElements) {
// Copy all the referencedataelements
original.referenceDataElements.sort().each { de ->
log.debug("copy element ${de}")
referenceDataElementService.copyReferenceDataElement(copy, de, copier, userSecurityPolicyManager)
referenceDataElementService.copyReferenceDataElement(copy, de, copier, userSecurityPolicyManager, copySummaryMetadata, referenceDataElementCopyInformation)
}
}

Expand Down
Loading

0 comments on commit c7d40dc

Please sign in to comment.