Skip to content

Commit

Permalink
Merge pull request #280 from MauroDataMapper/feature/gh-241
Browse files Browse the repository at this point in the history
Copy index order with ModelItems
  • Loading branch information
olliefreeman authored Mar 28, 2022
2 parents 34b1c6f + ec1ac0a commit 7d2fa4c
Show file tree
Hide file tree
Showing 18 changed files with 770 additions and 168 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 @@ -20,6 +20,8 @@ package uk.ac.ox.softeng.maurodatamapper.core.model
import uk.ac.ox.softeng.maurodatamapper.api.exception.ApiNotYetImplementedException
import uk.ac.ox.softeng.maurodatamapper.core.container.Classifier
import uk.ac.ox.softeng.maurodatamapper.core.facet.Metadata
import uk.ac.ox.softeng.maurodatamapper.core.rest.transport.model.CopyInformation
import uk.ac.ox.softeng.maurodatamapper.security.User
import uk.ac.ox.softeng.maurodatamapper.security.UserSecurityPolicyManager
import uk.ac.ox.softeng.maurodatamapper.util.Utils

Expand Down Expand Up @@ -50,6 +52,15 @@ abstract class ModelItemService<K extends ModelItem> extends CatalogueItemServic
throw new ApiNotYetImplementedException('MIS03', "copy [for ModelItem ${getDomainClass().simpleName}]")
}

K copyModelItemInformation(K original, K copy, User copier, UserSecurityPolicyManager userSecurityPolicyManager,
CopyInformation copyInformation = null) {
copy = super.copyCatalogueItemInformation(original, copy, copier, userSecurityPolicyManager, copyInformation)
if (copyInformation?.copyIndex) {
copy.idx = original.idx
}
copy
}

boolean isModelItemInSameModelOrInFinalisedModel(K modelItem, K otherModelItem) {
otherModelItem.model.id == modelItem.model.id || modelItem.model.finalised
}
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,16 +735,16 @@ 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.each {dt ->
dataTypes.sort().each {dt ->
dataTypeService.copyDataType(copy, dt, copier, userSecurityPolicyManager, copySummaryMetadata, dataTypeCache)
}

// Copy all the dataclasses (this will also match up the reference types)
rootDataClasses.each {dc ->
rootDataClasses.sort().each {dc ->
dataClassService.copyDataClass(copy, dc, copier, userSecurityPolicyManager, null, copySummaryMetadata, dataClassCache)
}
log.debug('Copy of datamodel took {}', Utils.timeTaken(start))
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,7 @@ WHERE (de.dataClass.id = :dataClassId OR idc.id = :dataClassId)''', 'de', filter
DataElement copy = new DataElement(minMultiplicity: original.minMultiplicity,
maxMultiplicity: original.maxMultiplicity)

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

DataType dataType = copiedDataModel.findDataTypeByLabel(original.dataType.label)
Expand All @@ -396,26 +396,26 @@ WHERE (de.dataClass.id = :dataClassId OR idc.id = :dataClassId)''', 'de', filter
copy
}

DataElement copyCatalogueItemInformation(DataElement original,
DataElement copyModelItemInformation(DataElement original,
DataElement copy,
User copier,
UserSecurityPolicyManager userSecurityPolicyManager,
boolean copySummaryMetadata,
CopyInformation copyInformation) {
copy = super.copyCatalogueItemInformation(original, copy, copier, userSecurityPolicyManager, copyInformation)
copy = super.copyModelItemInformation(original, copy, copier, userSecurityPolicyManager, copyInformation)
if (copySummaryMetadata) {
copySummaryMetadataFromOriginal(original, copy, copier, copyInformation)
}
copy
}

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

DataElementSimilarityResult findAllSimilarDataElementsInDataModel(DataModel dataModelToSearch, DataElement dataElementToCompare, maxResults = 5) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,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 @@ -189,13 +189,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 @@ -234,7 +234,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 @@ -273,7 +273,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 @@ -282,16 +282,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 @@ -314,7 +314,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 @@ -339,8 +339,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 @@ -359,7 +359,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 @@ -373,7 +373,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 All @@ -386,17 +386,17 @@ class DataTypeService extends ModelItemService<DataType> implements DefaultDataT
DataType copyDataType(DataModel copiedDataModel, DataType original, User copier, UserSecurityPolicyManager userSecurityPolicyManager,
boolean copySummaryMetadata = false, CopyInformation copyInformation = new CopyInformation()) {

DataType copy = createNewDataTypeFromOriginal(original)
DataType copy = createNewDataTypeFromOriginal(copiedDataModel, original, userSecurityPolicyManager)

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

copiedDataModel.addToDataTypes(copy)

copy
}

DataType createNewDataTypeFromOriginal(DataType original) {
DataType createNewDataTypeFromOriginal(DataModel copiedDataModel, DataType original, UserSecurityPolicyManager userSecurityPolicyManager) {
DataType copy

String domainType = original.domainType
Expand All @@ -406,8 +406,10 @@ class DataTypeService extends ModelItemService<DataType> implements DefaultDataT
break
case DataType.ENUMERATION_DOMAIN_TYPE:
copy = new EnumerationType()
original.enumerationValues.each { ev ->
copy.addToEnumerationValues(key: ev.key, value: ev.value, category: ev.category)
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 @@ -424,25 +426,25 @@ class DataTypeService extends ModelItemService<DataType> implements DefaultDataT
copy
}

DataType copyCatalogueItemInformation(DataType original,
DataType copy,
User copier,
UserSecurityPolicyManager userSecurityPolicyManager,
boolean copySummaryMetadata,
copyInformation) {
copy = super.copyCatalogueItemInformation(original, copy, copier, userSecurityPolicyManager, copyInformation)
DataType copyModelItemInformation(DataType original,
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)
}
copy
}

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

DataModel addDefaultListOfDataTypesToDataModel(DataModel dataModel, List<DefaultDataType> defaultDataTypes) {
Expand Down Expand Up @@ -479,7 +481,7 @@ 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 = []
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 = copyCatalogueItemInformation(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
Loading

0 comments on commit 7d2fa4c

Please sign in to comment.