From b1eef1e50c58a6127de30d9730eeea904f45b69b Mon Sep 17 00:00:00 2001 From: Martin Guillon Date: Mon, 20 Jan 2020 16:39:06 +0100 Subject: [PATCH] fix: handle empty set or null values --- src/charting/components/AxisBase.ts | 6 ++ src/charting/data/ChartData.ts | 56 +++++++++++-------- src/charting/data/CombinedData.java | 18 +++--- src/charting/data/DataSet.ts | 28 +++++----- src/charting/highlight/ChartHighlighter.ts | 2 +- .../highlight/CombinedHighlighter.java | 2 +- src/charting/highlight/RadarHighlighter.java | 2 +- src/charting/utils/Transformer.ts | 4 +- src/charting/utils/ViewPortHandler.ts | 12 ++-- 9 files changed, 74 insertions(+), 56 deletions(-) diff --git a/src/charting/components/AxisBase.ts b/src/charting/components/AxisBase.ts index e1e68d20..549d5ed1 100644 --- a/src/charting/components/AxisBase.ts +++ b/src/charting/components/AxisBase.ts @@ -705,6 +705,12 @@ export abstract class AxisBase extends ComponentBase { max = max + 1; min = min - 1; } + if (!Number.isFinite(min)) { + min = 0; + } + if (!Number.isFinite(max)) { + max = 0; + } this.mAxisMinimum = min; this.mAxisMaximum = max; diff --git a/src/charting/data/ChartData.ts b/src/charting/data/ChartData.ts index 5254c209..d77bb29a 100644 --- a/src/charting/data/ChartData.ts +++ b/src/charting/data/ChartData.ts @@ -7,30 +7,30 @@ export abstract class ChartData> { /** * maximum y-value in the value array across all axes */ - mYMax = -Number.MAX_VALUE; + mYMax = -Infinity; /** * the minimum y-value in the value array across all axes */ - mYMin = Number.MAX_VALUE; + mYMin = Infinity; /** * maximum x-value in the value array */ - mXMax = -Number.MAX_VALUE; + mXMax = -Infinity; /** * minimum x-value in the value array */ - mXMin = Number.MAX_VALUE; + mXMin = Infinity; - mLeftAxisMax = -Number.MAX_VALUE; + mLeftAxisMax = -Infinity; - mLeftAxisMin = Number.MAX_VALUE; + mLeftAxisMin = Infinity; - mRightAxisMax = -Number.MAX_VALUE; + mRightAxisMax = -Infinity; - mRightAxisMin = Number.MAX_VALUE; + mRightAxisMin = Infinity; /** * array that holds all DataSets the ChartData object represents @@ -112,10 +112,10 @@ export abstract class ChartData> { protected calcMinMax() { if (this.mDataSets == null) return; - this.mYMax = -Number.MAX_VALUE; - this.mYMin = Number.MAX_VALUE; - this.mXMax = -Number.MAX_VALUE; - this.mXMin = Number.MAX_VALUE; + this.mYMax = -Infinity; + this.mYMin = Infinity; + this.mXMax = -Infinity; + this.mXMin = Infinity; const visibleDatasets = this.getVisibleDataSets(); @@ -125,10 +125,10 @@ export abstract class ChartData> { } } - this.mLeftAxisMax = -Number.MAX_VALUE; - this.mLeftAxisMin = Number.MAX_VALUE; - this.mRightAxisMax = -Number.MAX_VALUE; - this.mRightAxisMin = Number.MAX_VALUE; + this.mLeftAxisMax = -Infinity; + this.mLeftAxisMin = Infinity; + this.mRightAxisMax = -Infinity; + this.mRightAxisMin = Infinity; // left axis const firstLeft = this.getFirstLeft(visibleDatasets); @@ -186,11 +186,17 @@ export abstract class ChartData> { return this.mYMin; } if (axis == AxisDependency.LEFT) { - if (this.mLeftAxisMin == Number.MAX_VALUE) { + if (!Number.isFinite(this.mLeftAxisMin)) { + if (!Number.isFinite(this.mRightAxisMin)) { + return 0; + } return this.mRightAxisMin; } else return this.mLeftAxisMin; } else { - if (this.mRightAxisMin == Number.MAX_VALUE) { + if (!Number.isFinite(this.mRightAxisMin)) { + if (!Number.isFinite(this.mLeftAxisMin)) { + return 0; + } return this.mLeftAxisMin; } else return this.mRightAxisMin; } @@ -207,11 +213,17 @@ export abstract class ChartData> { return this.mYMax; } if (axis == AxisDependency.LEFT) { - if (this.mLeftAxisMax == -Number.MAX_VALUE) { + if (!Number.isFinite(this.mLeftAxisMax)) { + if (!Number.isFinite(this.mRightAxisMax)) { + return 0; + } return this.mRightAxisMax; } else return this.mLeftAxisMax; } else { - if (this.mRightAxisMax == -Number.MAX_VALUE) { + if (!Number.isFinite(this.mRightAxisMax)) { + if (!Number.isFinite(this.mLeftAxisMax)) { + return 0; + } return this.mLeftAxisMax; } else return this.mRightAxisMax; } @@ -260,9 +272,9 @@ export abstract class ChartData> { */ protected getDataSetIndexByLabel(dataSets, label, ignorecase) { if (ignorecase) { - for (let i = 0; i < dataSets.length; i++) if (label.equalsIgnoreCase(dataSets.get(i).getLabel())) return i; + for (let i = 0; i < dataSets.length; i++) if (label.equalsIgnoreCase(dataSets[i].getLabel())) return i; } else { - for (let i = 0; i < dataSets.length; i++) if (label.equals(dataSets.get(i).getLabel())) return i; + for (let i = 0; i < dataSets.length; i++) if (label.equals(dataSets[i].getLabel())) return i; } return -1; diff --git a/src/charting/data/CombinedData.java b/src/charting/data/CombinedData.java index 97b9e28f..bc531db6 100644 --- a/src/charting/data/CombinedData.java +++ b/src/charting/data/CombinedData.java @@ -60,15 +60,15 @@ public calcMinMax() { } this.mDataSets.clear(); - this.mYMax = -Number.MAX_VALUE; - this.mYMin = Number.MAX_VALUE; - this.mXMax = -Number.MAX_VALUE; - this.mXMin = Number.MAX_VALUE; - - this.mLeftAxisMax = -Number.MAX_VALUE; - this.mLeftAxisMin = Number.MAX_VALUE; - this.mRightAxisMax = -Number.MAX_VALUE; - this.mRightAxisMin = Number.MAX_VALUE; + this.mYMax = -Infinity; + this.mYMin = Infinity; + this.mXMax = -Infinity; + this.mXMin = Infinity; + + this.mLeftAxisMax = -Infinity; + this.mLeftAxisMin = Infinity; + this.mRightAxisMax = -Infinity; + this.mRightAxisMin = Infinity; List allData = getAllData(); diff --git a/src/charting/data/DataSet.ts b/src/charting/data/DataSet.ts index b8639a4c..f3be5574 100644 --- a/src/charting/data/DataSet.ts +++ b/src/charting/data/DataSet.ts @@ -28,22 +28,22 @@ export abstract class DataSet extends BaseDataSet { /** * maximum y-value in the value array */ - protected mYMax = -Number.MAX_VALUE; + protected mYMax = -Infinity; /** * minimum y-value in the value array */ - protected mYMin = Number.MAX_VALUE; + protected mYMin = Infinity; /** * maximum x-value in the value array */ - protected mXMax = -Number.MAX_VALUE; + protected mXMax = -Infinity; /** * minimum x-value in the value array */ - protected mXMin = Number.MAX_VALUE; + protected mXMin = Infinity; /** * Creates a new DataSet object with the given values (entries) it represents. Also, a @@ -65,10 +65,10 @@ export abstract class DataSet extends BaseDataSet { calcMinMax() { if (this.mValues == null || this.mValues.length === 0) return; - this.mYMax = -Number.MAX_VALUE; - this.mYMin = Number.MAX_VALUE; - this.mXMax = -Number.MAX_VALUE; - this.mXMin = Number.MAX_VALUE; + this.mYMax = -Infinity; + this.mYMin = Infinity; + this.mXMax = -Infinity; + this.mXMin = Infinity; for (let e of this.mValues) { this.calcMinMaxForEntry(e); @@ -78,8 +78,8 @@ export abstract class DataSet extends BaseDataSet { public calcMinMaxYRange(fromX, toX) { if (this.mValues == null || this.mValues.length === 0) return; - this.mYMax = -Number.MAX_VALUE; - this.mYMin = Number.MAX_VALUE; + this.mYMax = -Infinity; + this.mYMin = Infinity; let indexFrom = this.getEntryIndexForXValue(fromX, NaN, Rounding.DOWN); let indexTo = this.getEntryIndexForXValue(toX, NaN, Rounding.UP); @@ -106,10 +106,10 @@ export abstract class DataSet extends BaseDataSet { if (!e) { if (this.mValues == null || this.mValues.length === 0) return; - this.mYMax = -Number.MAX_VALUE; - this.mYMin = Number.MAX_VALUE; - this.mXMax = -Number.MAX_VALUE; - this.mXMin = Number.MAX_VALUE; + this.mYMax = -Infinity; + this.mYMin = Infinity; + this.mXMax = -Infinity; + this.mXMin = Infinity; for (let e of this.mValues) { this.calcMinMaxForEntry(e); diff --git a/src/charting/highlight/ChartHighlighter.ts b/src/charting/highlight/ChartHighlighter.ts index 432c166e..fe03f7d1 100644 --- a/src/charting/highlight/ChartHighlighter.ts +++ b/src/charting/highlight/ChartHighlighter.ts @@ -78,7 +78,7 @@ export class ChartHighlighter * @return */ protected getMinimumDistance(closestValues: Highlight[], pos, axis) { - let distance = Number.MAX_VALUE; + let distance = Infinity; for (let i = 0; i < closestValues.length; i++) { const high = closestValues[i]; diff --git a/src/charting/highlight/CombinedHighlighter.java b/src/charting/highlight/CombinedHighlighter.java index c263596a..09557d28 100644 --- a/src/charting/highlight/CombinedHighlighter.java +++ b/src/charting/highlight/CombinedHighlighter.java @@ -73,7 +73,7 @@ protected List getHighlightsAtXValue(let xVal, let x, let y) { // protected Highlight getClosest(let x, let y, Highlight... highs) { // // Highlight closest = null; -// let minDistance = Number.MAX_VALUE; +// let minDistance = Infinity; // // for (Highlight high : highs) { // diff --git a/src/charting/highlight/RadarHighlighter.java b/src/charting/highlight/RadarHighlighter.java index be198bd4..868a890c 100644 --- a/src/charting/highlight/RadarHighlighter.java +++ b/src/charting/highlight/RadarHighlighter.java @@ -25,7 +25,7 @@ protected Highlight getClosestHighlight(let index, let x, let y) { let distanceToCenter = this.mChart.distanceToCenter(x, y) / this.mChart.getFactor(); Highlight closest = null; - let distance = Number.MAX_VALUE; + let distance = Infinity; for (let i = 0; i < highlights.length; i++) { diff --git a/src/charting/utils/Transformer.ts b/src/charting/utils/Transformer.ts index e2f14bf3..6c03d735 100644 --- a/src/charting/utils/Transformer.ts +++ b/src/charting/utils/Transformer.ts @@ -41,10 +41,10 @@ export class Transformer { public prepareMatrixValuePx(xChartMin, deltaX, deltaY, yChartMin) { let scaleX = this.mViewPortHandler.contentWidth() / deltaX; let scaleY = this.mViewPortHandler.contentHeight() / deltaY; - if (!Number.isFinite(scaleX)) { + if (!Number.isFinite(scaleX) || isNaN(scaleX)) { scaleX = 0; } - if (!Number.isFinite(scaleY)) { + if (!Number.isFinite(scaleY) || isNaN(scaleY)) { scaleY = 0; } diff --git a/src/charting/utils/ViewPortHandler.ts b/src/charting/utils/ViewPortHandler.ts index 3728a995..82fcc313 100644 --- a/src/charting/utils/ViewPortHandler.ts +++ b/src/charting/utils/ViewPortHandler.ts @@ -29,7 +29,7 @@ export class ViewPortHandler { /** * maximum scale value on the y-axis */ - private mMaxScaleY = Number.MAX_VALUE; + private mMaxScaleY = Infinity; /** * minimum scale value on the x-axis @@ -39,7 +39,7 @@ export class ViewPortHandler { /** * maximum scale value on the x-axis */ - private mMaxScaleX = Number.MAX_VALUE; + private mMaxScaleX = Infinity; /** * contains the current scale factor of the x-axis @@ -441,7 +441,7 @@ export class ViewPortHandler { * @param xScale */ public setMaximumScaleX(xScale) { - if (xScale == 0) xScale = Number.MAX_VALUE; + if (xScale == 0) xScale = Infinity; this.mMaxScaleX = xScale; @@ -457,7 +457,7 @@ export class ViewPortHandler { public setMinMaxScaleX(minScaleX, maxScaleX) { if (minScaleX < 1) minScaleX = 1; - if (maxScaleX == 0) maxScaleX = Number.MAX_VALUE; + if (maxScaleX == 0) maxScaleX = Infinity; this.mMinScaleX = minScaleX; this.mMaxScaleX = maxScaleX; @@ -484,7 +484,7 @@ export class ViewPortHandler { * @param yScale */ public setMaximumScaleY(yScale) { - if (yScale == 0) yScale = Number.MAX_VALUE; + if (yScale == 0) yScale = Infinity; this.mMaxScaleY = yScale; @@ -494,7 +494,7 @@ export class ViewPortHandler { public setMinMaxScaleY(minScaleY, maxScaleY) { if (minScaleY < 1) minScaleY = 1; - if (maxScaleY == 0) maxScaleY = Number.MAX_VALUE; + if (maxScaleY == 0) maxScaleY = Infinity; this.mMinScaleY = minScaleY; this.mMaxScaleY = maxScaleY;