fun checkAssociationsCardinality()

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())
    }