From 1d897ce63e05d49a0965e29646ff540461e990ac Mon Sep 17 00:00:00 2001 From: Shane Loeffler Date: Thu, 29 Feb 2024 17:56:39 -0600 Subject: [PATCH 1/4] rework band info creation to make sure output contains all selector vals --- src/utils.js | 53 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/src/utils.js b/src/utils.js index ed5e5c5..8ea5e02 100644 --- a/src/utils.js +++ b/src/utils.js @@ -365,36 +365,35 @@ export const getPyramidMetadata = (multiscales) => { * @returns Object containing bandName, {[dimension]: dimensionValue} pairs */ export const getBandInformation = (selector) => { - const combinedBands = Object.keys(selector) - .filter((key) => Array.isArray(selector[key])) - .reduce((bandMapping, selectorKey) => { - const values = selector[selectorKey] - let keys - if (typeof values[0] === 'string') { - keys = values + const keys = Object.keys(selector).filter((key) => + Array.isArray(selector[key]) + ) + if (keys.length === 0) return {} + let combinedBands = {} + keys.forEach((key) => { + const newCombinedBands = {} + selector[key].forEach((value) => { + const valueKey = typeof value === 'string' ? value : key + '_' + value + if (Object.keys(combinedBands).length === 0) { + newCombinedBands[valueKey] = { [key]: value } } else { - keys = values.map((d) => selectorKey + '_' + d) + Object.keys(combinedBands).forEach((existingKey) => { + newCombinedBands[existingKey + '_' + valueKey] = { + ...combinedBands[existingKey], + [key]: value, + } + }) } - - const bands = Object.keys(bandMapping) - const updatedBands = {} - keys.forEach((key, i) => { - if (bands.length > 0) { - bands.forEach((band) => { - const bandKey = `${band}_${key}` - updatedBands[bandKey] = { - ...bandMapping[band], - [selectorKey]: values[i], - } - }) - } else { - updatedBands[key] = { [selectorKey]: values[i] } - } + }) + combinedBands = newCombinedBands + }) + Object.keys(selector).forEach((key) => { + if (!Array.isArray(selector[key])) { + Object.keys(combinedBands).forEach((combinedKey) => { + combinedBands[combinedKey][key] = selector[key] }) - - return updatedBands - }, {}) - + } + }) return combinedBands } From c5d175e1fc25bed3240506fc31e80672981b412c Mon Sep 17 00:00:00 2001 From: katamartin Date: Fri, 1 Mar 2024 12:12:00 -0500 Subject: [PATCH 2/4] Add test --- src/utils.test.js | 71 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/utils.test.js diff --git a/src/utils.test.js b/src/utils.test.js new file mode 100644 index 0000000..2b33e2e --- /dev/null +++ b/src/utils.test.js @@ -0,0 +1,71 @@ +import { getBandInformation } from './utils' + +describe('utils', () => { + describe('getBandInformation()', () => { + it('returns no bands for empty selectors', () => { + expect(getBandInformation({})).toEqual({}) + }) + + it('returns no bands for non-array selector values', () => { + expect(getBandInformation({ time: 0 })).toEqual({}) + expect(getBandInformation({ time: 0, variable: 'pr' })).toEqual({}) + }) + + it('handles array selector values', () => { + expect(getBandInformation({ time: ['jan', 'feb'] })).toEqual({ + jan: { time: 'jan' }, + feb: { time: 'feb' }, + }) + }) + + it('handles array selector values with number entries', () => { + expect(getBandInformation({ time: [1, 2] })).toEqual({ + time_1: { time: 1 }, + time_2: { time: 2 }, + }) + }) + + it('handles multiple array selector values', () => { + expect( + getBandInformation({ time: ['jan', 'feb'], variable: ['pr', 'tavg'] }) + ).toEqual({ + jan_pr: { time: 'jan', variable: 'pr' }, + feb_pr: { time: 'feb', variable: 'pr' }, + jan_tavg: { time: 'jan', variable: 'tavg' }, + feb_tavg: { time: 'feb', variable: 'tavg' }, + }) + }) + + it('handles multiple array selector values with number entries', () => { + expect( + getBandInformation({ time: [1, 2], variable: ['pr', 'tavg'] }) + ).toEqual({ + time_1_pr: { time: 1, variable: 'pr' }, + time_2_pr: { time: 2, variable: 'pr' }, + time_1_tavg: { time: 1, variable: 'tavg' }, + time_2_tavg: { time: 2, variable: 'tavg' }, + }) + expect(getBandInformation({ time: [1, 2], variable: [3, 4] })).toEqual({ + time_1_variable_3: { time: 1, variable: 3 }, + time_2_variable_3: { time: 2, variable: 3 }, + time_1_variable_4: { time: 1, variable: 4 }, + time_2_variable_4: { time: 2, variable: 4 }, + }) + }) + + it('handles mix of array selector values with non-array selector values', () => { + expect( + getBandInformation({ time: ['jan', 'feb'], variable: 'pr' }) + ).toEqual({ + jan: { time: 'jan', variable: 'pr' }, + feb: { time: 'feb', variable: 'pr' }, + }) + expect(getBandInformation({ time: ['jan', 'feb'], variable: 3 })).toEqual( + { + jan: { time: 'jan', variable: 3 }, + feb: { time: 'feb', variable: 3 }, + } + ) + }) + }) +}) From 553c8a1680b3d2ab72253a464e19e0072a3c9cef Mon Sep 17 00:00:00 2001 From: Shane Loeffler Date: Fri, 1 Mar 2024 12:50:05 -0600 Subject: [PATCH 3/4] revert rewrite of reducer paradigm --- src/utils.js | 48 ++++++++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/src/utils.js b/src/utils.js index 8ea5e02..cb35f99 100644 --- a/src/utils.js +++ b/src/utils.js @@ -365,28 +365,36 @@ export const getPyramidMetadata = (multiscales) => { * @returns Object containing bandName, {[dimension]: dimensionValue} pairs */ export const getBandInformation = (selector) => { - const keys = Object.keys(selector).filter((key) => - Array.isArray(selector[key]) - ) - if (keys.length === 0) return {} - let combinedBands = {} - keys.forEach((key) => { - const newCombinedBands = {} - selector[key].forEach((value) => { - const valueKey = typeof value === 'string' ? value : key + '_' + value - if (Object.keys(combinedBands).length === 0) { - newCombinedBands[valueKey] = { [key]: value } + const combinedBands = Object.keys(selector) + .filter((key) => Array.isArray(selector[key])) + .reduce((bandMapping, selectorKey) => { + const values = selector[selectorKey] + let keys + if (typeof values[0] === 'string') { + keys = values } else { - Object.keys(combinedBands).forEach((existingKey) => { - newCombinedBands[existingKey + '_' + valueKey] = { - ...combinedBands[existingKey], - [key]: value, - } - }) + keys = values.map((d) => selectorKey + '_' + d) } - }) - combinedBands = newCombinedBands - }) + + const bands = Object.keys(bandMapping) + const updatedBands = {} + keys.forEach((key, i) => { + if (bands.length > 0) { + bands.forEach((band) => { + const bandKey = `${band}_${key}` + updatedBands[bandKey] = { + ...bandMapping[band], + [selectorKey]: values[i], + } + }) + } else { + updatedBands[key] = { [selectorKey]: values[i] } + } + }) + + return updatedBands + }, {}) + Object.keys(selector).forEach((key) => { if (!Array.isArray(selector[key])) { Object.keys(combinedBands).forEach((combinedKey) => { From 9fa3ee34716bc57326d3edd9083ac9f7c87752e4 Mon Sep 17 00:00:00 2001 From: Shane Loeffler Date: Tue, 12 Mar 2024 12:21:14 -0500 Subject: [PATCH 4/4] 3.1.3 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index b3ad103..a8289be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@carbonplan/maps", - "version": "3.1.0", + "version": "3.1.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@carbonplan/maps", - "version": "3.1.0", + "version": "3.1.3", "license": "MIT", "dependencies": { "@turf/turf": "^6.5.0", diff --git a/package.json b/package.json index 2416f91..e2ff58a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@carbonplan/maps", - "version": "3.1.2", + "version": "3.1.3", "description": "interactive data-driven web maps", "main": "dst/index.js", "module": "dst/index.esm.js",