Skip to content

Commit f5924df

Browse files
committed
Add isContiguous to dimension
1 parent 5dd2cd0 commit f5924df

File tree

12 files changed

+94
-41
lines changed

12 files changed

+94
-41
lines changed

src/apps/weblib/cinterface.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -298,14 +298,16 @@ void data_addDimension(APIHandles::Chart chart,
298298
const char **categories,
299299
std::uint32_t categoriesCount,
300300
const std::uint32_t *categoryIndices,
301-
std::uint32_t categoryIndicesCount)
301+
std::uint32_t categoryIndicesCount,
302+
bool isContiguous)
302303
{
303304
Interface::getInstance().addDimension(chart,
304305
name,
305306
categories,
306307
categoriesCount,
307308
categoryIndices,
308-
categoryIndicesCount);
309+
categoryIndicesCount,
310+
isContiguous);
309311
}
310312

311313
void data_addMeasure(APIHandles::Chart chart,

src/apps/weblib/cinterface.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ extern void data_addDimension(APIHandles::Chart chart,
8282
const char **categories,
8383
std::uint32_t categoriesCount,
8484
const std::uint32_t *categoryIndices,
85-
std::uint32_t categoryIndicesCount);
85+
std::uint32_t categoryIndicesCount,
86+
bool isContiguous);
8687
extern void data_addMeasure(APIHandles::Chart chart,
8788
const char *name,
8889
const char *unit,

src/apps/weblib/interface.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -319,13 +319,13 @@ void Interface::addDimension(ObjectRegistryHandle chart,
319319
const char **categories,
320320
std::uint32_t categoriesCount,
321321
const std::uint32_t *categoryIndices,
322-
std::uint32_t categoryIndicesCount)
322+
std::uint32_t categoryIndicesCount,
323+
bool isContiguous)
323324
{
324-
if (categories) {
325-
getChart(chart)->getTable().addColumn(name,
326-
{categories, categoriesCount},
327-
{categoryIndices, categoryIndicesCount});
328-
}
325+
getChart(chart)->getTable().addColumn(name,
326+
{categories, categoriesCount},
327+
{categoryIndices, categoryIndicesCount},
328+
isContiguous);
329329
}
330330

331331
void Interface::addMeasure(ObjectRegistryHandle chart,

src/apps/weblib/interface.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,8 @@ class Interface
100100
const char **categories,
101101
std::uint32_t categoriesCount,
102102
const std::uint32_t *categoryIndices,
103-
std::uint32_t categoryIndicesCount);
103+
std::uint32_t categoryIndicesCount,
104+
bool isContiguous);
104105
void addMeasure(ObjectRegistryHandle chart,
105106
const char *name,
106107
const char *unit,

src/apps/weblib/ts-api/cvizzu.types.d.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ export interface CVizzu {
103103
categories: CArrayPtr,
104104
categoriesCount: number,
105105
categoryIndices: CArrayPtr,
106-
categoryIndicesCount: number
106+
categoryIndicesCount: number,
107+
isContiguous: boolean
107108
): void
108109
_data_addMeasure(
109110
chart: CChartPtr,

src/apps/weblib/ts-api/data.ts

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -83,19 +83,25 @@ export class Data {
8383

8484
if (this._isIndexedDimension(series)) {
8585
this._validateIndexedDimension(series)
86-
this._addDimension(series.name, series.values ?? [], series.categories)
86+
this._addDimension(
87+
series.name,
88+
series.values ?? [],
89+
series.categories,
90+
series.isContiguous ?? false
91+
)
8792
} else {
8893
const values = series?.values ?? ([] as DataTypes[])
8994
const seriesType = series?.type ?? this._detectType(values)
9095

91-
if (seriesType === 'dimension') {
96+
if (this._isDetectedDimension(series, seriesType)) {
9297
const { indexes, categories } = this._convertDimension(values)
93-
this._addDimension(series.name, indexes, categories)
98+
this._addDimension(series.name, indexes, categories, series.isContiguous ?? false)
9499
} else if (this._isMeasure(series, seriesType)) {
95100
if (!series.unit) series.unit = ''
96101
this._addMeasure(series.name, series.unit, values)
97102
} else {
98-
throw new Error('invalid series type: ' + series.type)
103+
const seriesBase = series as D.SeriesBase
104+
throw new Error('invalid series type: ' + seriesBase.type)
99105
}
100106
}
101107
}
@@ -107,11 +113,15 @@ export class Data {
107113
return true
108114
}
109115

116+
private _isDetectedDimension(series: D.Series, type: string | null): series is D.Dimension {
117+
return (
118+
type === 'dimension' ||
119+
('isContiguous' in series && typeof series.isContiguous === 'boolean')
120+
)
121+
}
122+
110123
private _isMeasure(series: D.Series, type: string | null): series is D.Measure {
111-
if (type === 'measure' || ('unit' in series && typeof series.unit === 'string')) {
112-
return true
113-
}
114-
return false
124+
return type === 'measure' || ('unit' in series && typeof series.unit === 'string')
115125
}
116126

117127
private _validateIndexedDimension(series: D.IndexDimension): void {
@@ -151,7 +161,12 @@ export class Data {
151161
return null
152162
}
153163

154-
private _addDimension(name: string, indexes: number[], categories: string[]): void {
164+
private _addDimension(
165+
name: string,
166+
indexes: number[],
167+
categories: string[],
168+
isContiguous: boolean
169+
): void {
155170
if (typeof name !== 'string') {
156171
throw new Error('first parameter should be string')
157172
}
@@ -164,6 +179,10 @@ export class Data {
164179
throw new Error('third parameter should be an array')
165180
}
166181

182+
if (typeof isContiguous !== 'boolean') {
183+
throw new Error('fourth parameter should be boolean')
184+
}
185+
167186
if (!this._isStringArray(categories)) {
168187
throw new Error('third parameter should be an array of strings')
169188
}
@@ -172,7 +191,7 @@ export class Data {
172191
throw new Error('the measure index array element should be number')
173192
}
174193

175-
this._cData.addDimension(name, indexes, categories)
194+
this._cData.addDimension(name, indexes, categories, isContiguous)
176195
}
177196

178197
private _isStringArray(values: unknown[]): values is string[] {

src/apps/weblib/ts-api/module/cdata.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,15 @@ export class CData extends CObject {
3535
return { series: JSON.parse(info) }
3636
}
3737

38-
addDimension(name: string, indexes: number[], categories: string[]): void {
38+
addDimension(
39+
name: string,
40+
indexes: number[],
41+
categories: string[],
42+
isContiguous: boolean
43+
): void {
3944
const categoriesPointer = new Uint32Array(categories.length)
4045
for (let i = 0; i < categories.length; i++) {
41-
const categoryPointer = this._toCString(categories[i]!)
42-
categoriesPointer[i] = categoryPointer
46+
categoriesPointer[i] = this._toCString(categories[i]!)
4347
}
4448

4549
const categoriesPointerArrayLen = categories.length * 4
@@ -66,7 +70,8 @@ export class CData extends CObject {
6670
categoriesPtrArr,
6771
categories.length,
6872
indexesArr,
69-
indexes.length
73+
indexes.length,
74+
isContiguous
7075
)
7176
} finally {
7277
this._wasm._free(cname)

src/chart/generator/plotbuilder.cpp

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,22 +93,34 @@ Buckets PlotBuilder::generateMarkers(std::size_t &mainBucketSize)
9393
plot->markers.reserve(dataCube.df->get_record_count());
9494
}
9595

96-
std::multimap<Marker::MarkerIndex, Options::MarkerInfoId> map;
97-
for (auto &&[ix, mid] : plot->getOptions()->markersInfo)
98-
map.emplace(mid, ix);
99-
100-
for (auto first = map.begin(); auto &&index : dataCube)
96+
using CmpBySec = decltype(
97+
[] (const std::pair<const Options::MarkerInfoId, Marker::MarkerIndex>& lhs,
98+
const std::pair<const Options::MarkerInfoId, Marker::MarkerIndex>& rhs)
99+
{
100+
return lhs.second < rhs.second;
101+
});
102+
103+
std::multiset<std::reference_wrapper<
104+
const std::pair<const Options::MarkerInfoId,
105+
Marker::MarkerIndex>>,
106+
CmpBySec>
107+
set{plot->getOptions()->markersInfo.begin(),
108+
plot->getOptions()->markersInfo.end()};
109+
110+
for (auto first = set.begin(); auto &&index : dataCube)
101111
for (auto &marker =
102112
plot->markers.emplace_back(*plot->getOptions(),
103113
dataCube,
104114
stats,
105115
mainIds,
106116
subIds,
107117
index,
108-
map.contains(index.marker_id));
109-
first != map.end() && first->first == marker.idx;
118+
first != set.end()
119+
&& first->get().second == index.marker_id);
120+
first != set.end()
121+
&& first->get().second == index.marker_id;
110122
++first)
111-
plot->markersInfo.insert({first->second,
123+
plot->markersInfo.insert({first->get().first,
112124
Plot::MarkerInfo{Plot::MarkerInfoContent{marker}}});
113125

114126
if (!std::ranges::is_sorted(plot->markers, {}, &Marker::idx))

src/dataframe/impl/dataframe.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -656,9 +656,9 @@ std::string dataframe::as_string() const &
656656
default: error(error_type::series_not_found, name);
657657
case dimension: {
658658
const auto &[name, dim] = unsafe_get<dimension>(ser);
659-
obj("name", name)("type", "dimension")("unit",
660-
"")("length", dim.values.size())("categories",
661-
dim.categories);
659+
obj("name", name)("type", "dimension")("isContiguous",
660+
dim.info.at("isContiguous"))("length",
661+
dim.values.size())("categories", dim.categories);
662662
break;
663663
}
664664
case measure: {

src/dataframe/old/datatable.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,14 @@ void DataTable::addColumn(std::string_view name,
4040

4141
void DataTable::addColumn(std::string_view name,
4242
const std::span<const char *const> &categories,
43-
const std::span<const std::uint32_t> &values)
43+
const std::span<const std::uint32_t> &values,
44+
bool isContiguous)
4445
{
4546
df.add_dimension(categories,
4647
values,
4748
name.data(),
4849
dataframe::adding_type::create_or_override,
49-
{});
50+
{{std::pair{"contiguous", isContiguous ? "true" : "false"}}});
5051
}
5152

5253
void DataTable::pushRow(const std::span<const char *const> &cells)
@@ -247,6 +248,11 @@ std::string_view DataTable::getUnit(
247248
return df.get_series_info(colIx, "unit");
248249
}
249250

251+
bool DataTable::getIsContiguous(std::string_view const &colIx) const
252+
{
253+
return df.get_series_info(colIx, "contiguous") == "true";
254+
}
255+
250256
MarkerId DataCube::getId(const SeriesList &sl,
251257
const std::optional<std::size_t> &ll,
252258
const MultiIndex &mi) const

0 commit comments

Comments
 (0)