TimeSeries: Fix stacking when first value is negative zero (#57257) (#57472)

* TimeSeries: Fix stacking when first value is negative zero

* More test + refactor

(cherry picked from commit 7f3b567657)

Co-authored-by: Zoltán Bedi <zoltan.bedi@gmail.com>
This commit is contained in:
Grot (@grafanabot)
2022-10-21 15:12:16 -04:00
committed by GitHub
co-authored by Zoltán Bedi
parent 559ef42767
commit a318b15cab
2 changed files with 22 additions and 12 deletions
@@ -1061,6 +1061,11 @@ describe('auto stacking groups', () => {
values: [0, 0, 0],
config: { custom: { stacking: { mode: StackingMode.Normal } } },
},
{
name: 'd',
values: [-0, -10, -20],
config: { custom: { stacking: { mode: StackingMode.Normal } } },
},
],
});
@@ -1070,6 +1075,7 @@ describe('auto stacking groups', () => {
"dir": -1,
"series": Array [
1,
4,
],
},
Object {
@@ -1102,6 +1108,11 @@ describe('auto stacking groups', () => {
values: [0, 0, 0],
config: { custom: { stacking: { mode: StackingMode.Normal } } },
},
{
name: 'd',
values: [-0, null, 3],
config: { custom: { stacking: { mode: StackingMode.Normal }, transform: GraphTransform.NegativeY } },
},
],
});
@@ -1113,6 +1124,7 @@ describe('auto stacking groups', () => {
1,
2,
3,
4,
],
},
]
@@ -117,18 +117,7 @@ export function getStackingGroups(frame: DataFrame) {
let vals = values.toArray();
let transform = custom.transform;
let firstValue = vals.find((v) => v != null);
let stackDir =
transform === GraphTransform.Constant
? firstValue >= 0
? StackDirection.Pos
: StackDirection.Neg
: transform === GraphTransform.NegativeY
? firstValue >= 0
? StackDirection.Neg
: StackDirection.Pos
: firstValue >= 0
? StackDirection.Pos
: StackDirection.Neg;
let stackDir = getStackDirection(transform, firstValue);
let drawStyle = custom.drawStyle as GraphDrawStyle;
let drawStyle2 =
@@ -352,6 +341,15 @@ export function findMidPointYPosition(u: uPlot, idx: number) {
return y;
}
function getStackDirection(transform: GraphTransform, firstValue: number) {
// Check if first value is negative zero. This can happen with a binary operation transform.
const isNegativeZero = Object.is(firstValue, -0);
if (transform === GraphTransform.NegativeY) {
return !isNegativeZero && firstValue >= 0 ? StackDirection.Neg : StackDirection.Pos;
}
return !isNegativeZero && firstValue >= 0 ? StackDirection.Pos : StackDirection.Neg;
}
// Dev helpers
/** @internal */