in dnq-transient-store/src/main/kotlin/com/jetbrains/teamsys/dnq/database/ConstraintsUtil.kt [110:150]
fun checkAssociationsCardinality(changesTracker: TransientChangesTracker, modelMetaData: ModelMetaData): Set<DataIntegrityViolationException> {
return changesTracker.changedEntities
.asSequence()
.filter { !it.isRemoved }
.mapNotNull { changedEntity ->
val entityMetaData = modelMetaData.getEntityMetaData(changedEntity.type)
if (entityMetaData != null) {
changedEntity to entityMetaData
} else {
logger.debug { "Cannot check links cardinality for entity $changedEntity. Entity metadata for its type [${changedEntity.type}] is undefined" }
null
}
}
.flatMap { (changedEntity, entityMetaData) ->
// if entity is new - check cardinality of all links
// if entity saved - check cardinality of changed links only
// meta-data may be null for persistent enums
// check only changed links of saved entity
when {
changedEntity.isNew -> entityMetaData.associationEndsMetaData
.asSequence()
.filter { !checkCardinality(changedEntity, it) }
.map { CardinalityViolationException(changedEntity, it) }
changedEntity.isSaved -> changesTracker.getChangedLinksDetailed(changedEntity)
?.keys.orEmpty()
.asSequence()
.mapNotNull { changedLinkName ->
entityMetaData.getAssociationEndMetaData(changedLinkName)
.also { associationEndMetaData ->
if (associationEndMetaData == null) {
logger.debug("Cannot check cardinality for link [${changedEntity.type}.$changedLinkName]. Association end metadata for it is undefined")
}
}
}
.filter { associationEndMetaData -> !checkCardinality(changedEntity, associationEndMetaData) }
.map { associationEndMetaData -> CardinalityViolationException(changedEntity, associationEndMetaData) }
else -> emptySequence()
}
}
.toCollection(HashSetDecorator())
}