5
5
package org.jetbrains.kotlinx.kandy.dsl.internal
6
6
7
7
import org.jetbrains.kotlinx.dataframe.DataColumn
8
+ import org.jetbrains.kotlinx.dataframe.DataFrame
8
9
import org.jetbrains.kotlinx.kandy.ir.Layer
9
10
import org.jetbrains.kotlinx.kandy.ir.Plot
10
11
import org.jetbrains.kotlinx.kandy.ir.aes.AesName
11
12
import org.jetbrains.kotlinx.kandy.ir.bindings.*
13
+ import org.jetbrains.kotlinx.kandy.ir.data.NamedData
12
14
import org.jetbrains.kotlinx.kandy.ir.feature.FeatureName
13
15
import org.jetbrains.kotlinx.kandy.ir.feature.LayerFeature
14
16
import org.jetbrains.kotlinx.kandy.ir.feature.PlotFeature
@@ -50,10 +52,95 @@ public interface BaseContext {
50
52
*/
51
53
public abstract class LayerContext (parent : LayerCollectorContext ) : BindingContext {
52
54
override val bindingCollector: BindingCollector = BindingCollector ()
53
- override val datasetIndex: Int = parent.datasetIndex
55
+ override var datasetIndex: Int = parent.datasetIndex
54
56
public val features: MutableMap <FeatureName , LayerFeature > = mutableMapOf ()
55
57
override val plotContext: PlotContext = parent.plotContext
56
58
public abstract val requiredAes: Set <AesName >
59
+
60
+ private var firstMapping = true
61
+ private val handlerRowsCount: Int
62
+ get() {
63
+ val buffer = datasetHandler.buffer
64
+ return if (buffer == DataFrame .Empty ) {
65
+ datasetHandler.initialNamedData.dataFrame.rowsCount()
66
+ } else {
67
+ buffer.rowsCount()
68
+ }
69
+ }
70
+
71
+ private fun overrideDataset () {
72
+ plotContext.datasetHandlers.add(DatasetHandler (NamedData (DataFrame .Empty )))
73
+ datasetIndex = plotContext.datasetHandlers.size - 1
74
+ }
75
+
76
+ override fun <DomainType , RangeType > addNonPositionalMapping (
77
+ aesName : AesName ,
78
+ columnID : String ,
79
+ parameters : NonPositionalMappingParameters <DomainType , RangeType >?
80
+ ): NonPositionalMapping <DomainType , RangeType > {
81
+ firstMapping = false
82
+ return super .addNonPositionalMapping(aesName, columnID, parameters)
83
+ }
84
+
85
+ override fun <DomainType , RangeType > addNonPositionalMapping (
86
+ aesName : AesName ,
87
+ values : DataColumn <DomainType >,
88
+ parameters : NonPositionalMappingParameters <DomainType , RangeType >?
89
+ ): NonPositionalMapping <DomainType , RangeType > {
90
+ if (firstMapping && handlerRowsCount != values.size()) {
91
+ overrideDataset()
92
+ }
93
+ firstMapping = false
94
+ return super .addNonPositionalMapping(aesName, values, parameters)
95
+ }
96
+
97
+ override fun <DomainType , RangeType > addNonPositionalMapping (
98
+ aesName : AesName ,
99
+ values : List <DomainType >,
100
+ name : String? ,
101
+ parameters : NonPositionalMappingParameters <DomainType , RangeType >?
102
+ ): NonPositionalMapping <DomainType , RangeType > {
103
+ if (firstMapping && handlerRowsCount != values.size) {
104
+ overrideDataset()
105
+ }
106
+ firstMapping = false
107
+ return super .addNonPositionalMapping(aesName, values, name, parameters)
108
+ }
109
+
110
+ override fun <DomainType > addPositionalMapping (
111
+ aesName : AesName ,
112
+ columnID : String ,
113
+ parameters : PositionalMappingParameters <DomainType >?
114
+ ): PositionalMapping <DomainType > {
115
+ firstMapping = false
116
+ return super .addPositionalMapping(aesName, columnID, parameters)
117
+ }
118
+
119
+ override fun <DomainType > addPositionalMapping (
120
+ aesName : AesName ,
121
+ values : DataColumn <DomainType >,
122
+ parameters : PositionalMappingParameters <DomainType >?
123
+ ): PositionalMapping <DomainType > {
124
+ if (firstMapping && handlerRowsCount != values.size()) {
125
+ overrideDataset()
126
+ }
127
+ firstMapping = false
128
+ return super .addPositionalMapping(aesName, values, parameters)
129
+ }
130
+
131
+ override fun <DomainType > addPositionalMapping (
132
+ aesName : AesName ,
133
+ values : List <DomainType >,
134
+ name : String? ,
135
+ parameters : PositionalMappingParameters <DomainType >?
136
+ ): PositionalMapping <DomainType > {
137
+ if (firstMapping && handlerRowsCount != values.size) {
138
+ overrideDataset()
139
+ }
140
+ firstMapping = false
141
+ return super .addPositionalMapping(aesName, values, name, parameters)
142
+ }
143
+
57
144
}
58
145
59
146
/* *
@@ -77,7 +164,7 @@ public interface LayerCollectorContext : BaseContext {
77
164
} else null )
78
165
layers.add(
79
166
Layer (
80
- datasetIndex,
167
+ context. datasetIndex,
81
168
geom,
82
169
context.bindingCollector.mappings,
83
170
context.bindingCollector.settings,
0 commit comments