Skip to content

Commit 452bfb0

Browse files
authored
Merge pull request #2842 from finos/fix-integer-cast-function
Fix `integer` cast expression function
2 parents 992bf93 + 7b88aa1 commit 452bfb0

File tree

5 files changed

+53
-5
lines changed

5 files changed

+53
-5
lines changed

cpp/perspective/src/cpp/scalar.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1165,6 +1165,10 @@ t_tscalar::to_double() const {
11651165

11661166
t_tscalar
11671167
t_tscalar::coerce_numeric_dtype(t_dtype dtype) const {
1168+
if (dtype == m_type) {
1169+
return *this;
1170+
}
1171+
11681172
switch (dtype) {
11691173
case DTYPE_INT64: {
11701174
return coerce_numeric<std::int64_t>();

cpp/perspective/src/cpp/sparse_tree.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1146,6 +1146,7 @@ t_stree::update_agg_table(
11461146

11471147
// is_nan returns false for non-float types
11481148
if (is_expr || old_value.is_nan()) {
1149+
11491150
// if we previously had a NaN, add can't make it finite
11501151
// again; recalculate entire sum in case it is now finite
11511152
auto pkeys = get_pkeys(nidx);
@@ -1156,27 +1157,28 @@ t_stree::update_agg_table(
11561157
expression_master_table,
11571158
spec.get_dependencies()[0].name(),
11581159
pkeys,
1159-
[](std::vector<t_tscalar>& values) {
1160+
[&](std::vector<t_tscalar>& values) {
11601161
if (values.empty()) {
11611162
return mknone();
11621163
}
11631164

11641165
t_tscalar rval;
11651166
rval.set(std::uint64_t(0));
1166-
rval.m_type = values[0].m_type;
1167-
1167+
rval.m_type = dst->get_dtype();
11681168
for (const auto& v : values) {
11691169
if (v.is_nan()) {
11701170
continue;
11711171
}
1172-
rval = rval.add(v);
1172+
1173+
rval = rval.add(
1174+
v.coerce_numeric_dtype(dst->get_dtype())
1175+
);
11731176
}
11741177

11751178
return rval;
11761179
}
11771180
)
11781181
);
1179-
dst->set_scalar(dst_ridx, new_value);
11801182
} else {
11811183
new_value.set(dst_scalar.add(src_scalar));
11821184
}

packages/perspective-workspace/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
"author": "",
3333
"license": "Apache-2.0",
3434
"dependencies": {
35+
"@finos/perspective": "workspace:^",
3536
"@finos/perspective-viewer": "workspace:^",
3637
"@lumino/algorithm": ">=2 <3",
3738
"@lumino/commands": ">=2 <3",

pnpm-lock.yaml

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/perspective-js/test/js/expressions/numeric.spec.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,44 @@ function validate_binary_operations(output, expressions, operator) {
706706
});
707707
});
708708

709+
test.describe("Integers", function () {
710+
test("Integer outputs with negative values dont overflow", async function () {
711+
var data = [
712+
{ x: -1, y: "a", z: true },
713+
{ x: -2, y: "b", z: false },
714+
{ x: -3, y: "c", z: true },
715+
{ x: -4, y: "d", z: false },
716+
];
717+
718+
var table = await perspective.table({
719+
x: "integer",
720+
y: "string",
721+
z: "boolean",
722+
});
723+
724+
await table.update(data);
725+
726+
var view = await table.view({
727+
group_by: ["z"],
728+
columns: ["x", "w"],
729+
expressions: {
730+
w: 'integer("x")',
731+
},
732+
});
733+
734+
var answer = [
735+
{ __ROW_PATH__: [], x: -10, w: -10 },
736+
{ __ROW_PATH__: [false], x: -6, w: -6 },
737+
{ __ROW_PATH__: [true], x: -4, w: -4 },
738+
];
739+
740+
let result = await view.to_json();
741+
expect(result).toEqual(answer);
742+
view.delete();
743+
table.delete();
744+
});
745+
});
746+
709747
test.describe("Functions", function () {
710748
test("min", async function () {
711749
const table = await perspective.table({

0 commit comments

Comments
 (0)