fun layerMappingsAndCombinedData()

in plot-stem/src/commonMain/kotlin/org/jetbrains/letsPlot/core/spec/config/DataConfigUtil.kt [56:135]


    fun layerMappingsAndCombinedData(
        layerOptions: Map<*, *>,
        geomKind: GeomKind,
        stat: Stat,

        sharedData: DataFrame,
        layerData: DataFrame,

        combinedDiscreteMappings: Map<String, String>,

        consumedAesMappings: Map<*, *>,
        explicitConstantAes: List<Aes<*>>,

        isYOrientation: Boolean,
        clientSide: Boolean,
    ): Triple<Map<Aes<*>, DataFrame.Variable>, Map<Aes<*>, DataFrame.Variable>, DataFrame> {

        val isGeoConfigApplicable = GeoConfig.isApplicable(geomKind, layerOptions, clientSide)
        val isDataGeoDF = GeoConfig.isGeoDataframe(layerOptions, Option.PlotBase.DATA)

        val keepData: Boolean =
            // Do not drop data on the client: some of stat-vars are mapped by default.
            clientSide && stat != Stats.IDENTITY
                    // Do not touch GeoDataframe - empty mapping is OK in this case.
                    || isDataGeoDF || isGeoConfigApplicable

        // If layer has no mappings then no data is needed.
        val dropData: Boolean = consumedAesMappings.isEmpty() && !keepData

        var combinedData = when {
            dropData -> DataFrame.Builder.emptyFrame()
            !(sharedData.isEmpty || layerData.isEmpty) && sharedData.rowCount() == layerData.rowCount() -> {
                DataFrameUtil.appendReplace(sharedData, layerData)
            }

            !layerData.isEmpty -> layerData
            else -> sharedData
        }

        // Client side : copy variable marked as 'as_discrete' with name "aes.var-name"
        if (clientSide) {
            combinedData = appendAsDiscreteData(combinedData, combinedDiscreteMappings)
        }

        var aesMappings: Map<Aes<*>, DataFrame.Variable>
        val geoMappings: Map<Aes<*>, DataFrame.Variable>
        if (isGeoConfigApplicable) {
            val geoConfig = GeoConfig(
                geomKind,
                combinedData,
                layerOptions,
                consumedAesMappings
            )
            combinedData = geoConfig.dataAndCoordinates
            aesMappings = geoConfig.mappings
            geoMappings = geoConfig.geoMappings

        } else {
            aesMappings = ConfigUtil.createAesMapping(combinedData, consumedAesMappings)
            geoMappings = emptyMap()
        }

        if (clientSide) {
            // add stat default mappings
            val statDefMapping = Stats.defaultMapping(stat).let {
                when (isYOrientation) {
                    true -> YOrientationBaseUtil.flipAesKeys(it)
                    false -> it
                }
            }
            // Only keys (aes) in 'statDefMapping' that are not already present in 'aesMappinds'.
            aesMappings = statDefMapping + aesMappings
        }

        // drop from aes mapping constant that were defined explicitly.
        @Suppress("ConvertArgumentToSet")
        aesMappings = aesMappings - explicitConstantAes

        return Triple(aesMappings, geoMappings, combinedData)
    }