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