Skip to content

Commit

Permalink
Refactor isAesDiscrete. Add unit-tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
RYangazov committed Apr 1, 2024
1 parent cc6744c commit 73a6d7d
Show file tree
Hide file tree
Showing 6 changed files with 337 additions and 108 deletions.
170 changes: 85 additions & 85 deletions docs/dev/notebooks/auto_orientation_discretes.ipynb

Large diffs are not rendered by default.

26 changes: 13 additions & 13 deletions docs/f-24b/auto_rotate.ipynb

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@ object DataFrameUtil {
)
}

fun findVariableOrNull(data: DataFrame, varName: String): DataFrame.Variable? {
if (!hasVariable(data, varName)) return null
return findVariableOrFail(data, varName)
}

fun isNumeric(data: DataFrame, varName: String): Boolean {
return data.isNumeric(findVariableOrFail(data, varName))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,18 +143,24 @@ internal object DataConfigUtil {
layerMappings: Map<String, String>,
combinedDiscreteMappings: Map<String, String>
): Boolean {
// Checking if the y-axis mark as_discrete
// Check if the aes is marked with as_discrete()
if (combinedDiscreteMappings.containsKey(aes.name)) return true

// Checking if the y-axis is discrete
val aesName = layerMappings[aes.name] ?: sharedMappings[aes.name] ?: return false
// The logic of choosing the data frame is the same as in the layerMappingsAndCombinedData function
if (DataFrameUtil.hasVariable(layerData, aesName)
&& DataFrameUtil.findVariableOrFail(layerData, aesName).let(layerData::isDiscrete)
) return true
// Check if the aes is discrete.
val varName = layerMappings[aes.name] ?: sharedMappings[aes.name] ?: return false
// The DataFrame selection logic is identical to that of the layerMappingsAndCombinedData() function.
val layerVar = DataFrameUtil.findVariableOrNull(layerData, varName)
val sharedVar = DataFrameUtil.findVariableOrNull(sharedData, varName)

return (DataFrameUtil.hasVariable(sharedData, aesName)
&& DataFrameUtil.findVariableOrFail(sharedData, aesName).let(sharedData::isDiscrete))
if (layerVar != null) {
return layerData.isDiscrete(layerVar)
}

if (sharedVar != null) {
return sharedData.isDiscrete(sharedVar)
}

return false
}

fun combinedDataWithDataMeta(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,9 @@ class LayerConfig(
layerMappings,
combinedDiscreteMappings
)
) setOrientationY()
) {
setOrientationY()
}

val consumedAesSet: Set<Aes<*>> = renderedAes.toSet().let {
when (clientSide) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,216 @@
/*
* Copyright (c) 2024. JetBrains s.r.o.
* Use of this source code is governed by the MIT license that can be found in the LICENSE file.
*/

package org.jetbrains.letsPlot.core.spec.config

import org.jetbrains.letsPlot.core.plot.base.Aes
import org.jetbrains.letsPlot.core.plot.base.data.DataFrameUtil
import kotlin.test.*

class IsAesDiscreteTest {
private val data = mapOf(
"code" to listOf("a", "b", "c"),
"code_num" to listOf(4.0, 5.0, 6.0),
"value" to listOf(1.0, -5.0, 6.0)
)

private val dataInv = mapOf(
"code" to listOf(2.0, 3.0, 7.0),
"value" to listOf("f", "g", "h")
)

@Test
fun `data and mapping in plot`() {
val plotData = DataFrameUtil.fromMap(data)
val layerData = DataFrameUtil.fromMap(emptyMap<String, String>())
val plotMapping = mapOf(
"x" to "code",
"y" to "value"
)
val layerMapping = emptyMap<String, String>()
val asDiscreteMapping = emptyMap<String, String>()

val isXDiscrete = DataConfigUtil.isAesDiscrete(
Aes.X,
plotData,
layerData,
plotMapping,
layerMapping,
asDiscreteMapping
)
val isYDiscrete = DataConfigUtil.isAesDiscrete(
Aes.Y,
plotData,
layerData,
plotMapping,
layerMapping,
asDiscreteMapping
)

assertTrue(isXDiscrete)
assertFalse(isYDiscrete)
}

@Test
fun `data and mapping in layer`(){
val plotData = DataFrameUtil.fromMap(emptyMap<String, String>())
val layerData = DataFrameUtil.fromMap(data)
val plotMapping = emptyMap<String, String>()
val layerMapping = mapOf(
"x" to "code",
"y" to "value"
)
val asDiscreteMapping = emptyMap<String, String>()

val isXDiscrete = DataConfigUtil.isAesDiscrete(
Aes.X,
plotData,
layerData,
plotMapping,
layerMapping,
asDiscreteMapping
)
val isYDiscrete = DataConfigUtil.isAesDiscrete(
Aes.Y,
plotData,
layerData,
plotMapping,
layerMapping,
asDiscreteMapping
)

assertTrue(isXDiscrete)
assertFalse(isYDiscrete)
}

@Test
fun `data in plot but mapping in layer`(){
val plotData = DataFrameUtil.fromMap(data)
val layerData = DataFrameUtil.fromMap(emptyMap<String, String>())
val plotMapping = emptyMap<String, String>()
val layerMapping = mapOf(
"x" to "code",
"y" to "value"
)
val asDiscreteMapping = emptyMap<String, String>()

val isXDiscrete = DataConfigUtil.isAesDiscrete(
Aes.X,
plotData,
layerData,
plotMapping,
layerMapping,
asDiscreteMapping
)
val isYDiscrete = DataConfigUtil.isAesDiscrete(
Aes.Y,
plotData,
layerData,
plotMapping,
layerMapping,
asDiscreteMapping
)

assertTrue(isXDiscrete)
assertFalse(isYDiscrete)
}


@Test
fun `aes use as_discrete()`() {
val plotData = DataFrameUtil.fromMap(data)
val layerData = DataFrameUtil.fromMap(emptyMap<String, String>())
val plotMapping = mapOf(
"x" to "code",
"y" to "value"
)
val layerMapping = emptyMap<String, String>()
val asDiscreteMapping = mapOf(
"x" to "code",
"y" to "value"
)

val isXDiscrete = DataConfigUtil.isAesDiscrete(
Aes.X,
plotData,
layerData,
plotMapping,
layerMapping,
asDiscreteMapping
)
val isYDiscrete = DataConfigUtil.isAesDiscrete(
Aes.Y,
plotData,
layerData,
plotMapping,
layerMapping,
asDiscreteMapping
)

assertTrue(isXDiscrete)
assertTrue(isYDiscrete)
}

@Test
fun `data and mapping in plot with layer`() {
val plotData = DataFrameUtil.fromMap(data)
val layerData = DataFrameUtil.fromMap(emptyMap<String, String>())
val plotMapping = mapOf(
"x" to "code",
"y" to "value"
)
val layerMapping = mapOf(
"x" to "code_num"
)
val asDiscreteMapping = emptyMap<String, String>()

val isXDiscrete = DataConfigUtil.isAesDiscrete(
Aes.X,
plotData,
layerData,
plotMapping,
layerMapping,
asDiscreteMapping
)
assertFalse(isXDiscrete)
}

@Test
fun `different data in plot and layer`() {
val plotData = DataFrameUtil.fromMap(data)
val layerData = DataFrameUtil.fromMap(dataInv)
val plotMapping = mapOf(
"x" to "code",
"y" to "value"
)
val layerMapping = mapOf(
"x" to "code",
"y" to "value"
)
val asDiscreteMapping = emptyMap<String, String>()

val isXDiscrete = DataConfigUtil.isAesDiscrete(
Aes.X,
plotData,
layerData,
plotMapping,
layerMapping,
asDiscreteMapping
)
val isYDiscrete = DataConfigUtil.isAesDiscrete(
Aes.Y,
plotData,
layerData,
plotMapping,
layerMapping,
asDiscreteMapping
)

assertFalse(isXDiscrete)
assertTrue(isYDiscrete)
}


}

0 comments on commit 73a6d7d

Please sign in to comment.