mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	feat: add median per week calculation for the new flags in production widget (#10829)
This commit is contained in:
		
							parent
							
								
									0fda3e7cf1
								
							
						
					
					
						commit
						b18b128e52
					
				@ -0,0 +1,162 @@
 | 
			
		||||
import { calculateMedian } from './calculateMedian.ts';
 | 
			
		||||
 | 
			
		||||
test('works with empty data', () => {
 | 
			
		||||
    const result = calculateMedian([]);
 | 
			
		||||
    expect(result).toBe('N/A');
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test('correctly identifies the median in odd-length arrays', () => {
 | 
			
		||||
    const data = [
 | 
			
		||||
        {
 | 
			
		||||
            data: [
 | 
			
		||||
                {
 | 
			
		||||
                    week: '2024-01',
 | 
			
		||||
                    date: '2024-01-07 01:00:00',
 | 
			
		||||
                    newProductionFlags: 99,
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    week: '2024-02',
 | 
			
		||||
                    date: '2024-01-14 01:00:00',
 | 
			
		||||
                    newProductionFlags: 0,
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    week: '2024-03',
 | 
			
		||||
                    date: '2024-01-21 01:00:00',
 | 
			
		||||
                    newProductionFlags: 3,
 | 
			
		||||
                },
 | 
			
		||||
            ],
 | 
			
		||||
        },
 | 
			
		||||
    ];
 | 
			
		||||
    const result = calculateMedian(data);
 | 
			
		||||
    expect(result).toBe(3);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test('correctly identifies the median in even-length arrays', () => {
 | 
			
		||||
    const data = [
 | 
			
		||||
        {
 | 
			
		||||
            data: [
 | 
			
		||||
                {
 | 
			
		||||
                    week: '2024-01',
 | 
			
		||||
                    date: '2024-01-07 01:00:00',
 | 
			
		||||
                    newProductionFlags: 0,
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    week: '2024-02',
 | 
			
		||||
                    date: '2024-01-14 01:00:00',
 | 
			
		||||
                    newProductionFlags: 10,
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    week: '2024-03',
 | 
			
		||||
                    date: '2024-01-21 01:00:00',
 | 
			
		||||
                    newProductionFlags: 12,
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    week: '2024-04',
 | 
			
		||||
                    date: '2024-01-28 01:00:00',
 | 
			
		||||
                    newProductionFlags: 50,
 | 
			
		||||
                },
 | 
			
		||||
            ],
 | 
			
		||||
        },
 | 
			
		||||
    ];
 | 
			
		||||
    const result = calculateMedian(data);
 | 
			
		||||
    expect(result).toBe(11);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test('handles single week data', () => {
 | 
			
		||||
    const data = [
 | 
			
		||||
        {
 | 
			
		||||
            data: [
 | 
			
		||||
                {
 | 
			
		||||
                    week: '2024-01',
 | 
			
		||||
                    date: '2024-01-07 01:00:00',
 | 
			
		||||
                    newProductionFlags: 7,
 | 
			
		||||
                },
 | 
			
		||||
            ],
 | 
			
		||||
        },
 | 
			
		||||
    ];
 | 
			
		||||
    const result = calculateMedian(data);
 | 
			
		||||
    expect(result).toBe(7);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test('handles multiple projects with overlapping weeks', () => {
 | 
			
		||||
    const data = [
 | 
			
		||||
        {
 | 
			
		||||
            data: [
 | 
			
		||||
                {
 | 
			
		||||
                    week: '2024-01',
 | 
			
		||||
                    date: '2024-01-07 01:00:00',
 | 
			
		||||
                    newProductionFlags: 11,
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    week: '2024-02',
 | 
			
		||||
                    date: '2024-01-14 01:00:00',
 | 
			
		||||
                    newProductionFlags: 3,
 | 
			
		||||
                },
 | 
			
		||||
            ],
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            data: [
 | 
			
		||||
                {
 | 
			
		||||
                    week: '2024-02',
 | 
			
		||||
                    date: '2024-01-14 01:00:00',
 | 
			
		||||
                    newProductionFlags: 7,
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    week: '2024-03',
 | 
			
		||||
                    date: '2024-01-21 01:00:00',
 | 
			
		||||
                    newProductionFlags: 100,
 | 
			
		||||
                },
 | 
			
		||||
            ],
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            data: [
 | 
			
		||||
                {
 | 
			
		||||
                    week: '2024-01',
 | 
			
		||||
                    date: '2024-01-07 01:00:00',
 | 
			
		||||
                    newProductionFlags: 1,
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    week: '2024-04',
 | 
			
		||||
                    date: '2024-01-21 01:00:00',
 | 
			
		||||
                    newProductionFlags: 20,
 | 
			
		||||
                },
 | 
			
		||||
            ],
 | 
			
		||||
        },
 | 
			
		||||
    ];
 | 
			
		||||
    const result = calculateMedian(data);
 | 
			
		||||
    expect(result).toBe(16);
 | 
			
		||||
});
 | 
			
		||||
describe('handling weeks with no production flags data', () => {
 | 
			
		||||
    test('it disregards solo entries without production flags data', () => {
 | 
			
		||||
        const data = [
 | 
			
		||||
            { data: [{ week: '2024-02', date: '2024-01-14 01:00:00' }] },
 | 
			
		||||
        ];
 | 
			
		||||
        const result = calculateMedian(data);
 | 
			
		||||
        expect(result).toBe('N/A');
 | 
			
		||||
    });
 | 
			
		||||
    test('weeks without production flags data is disregarded in larger sets', () => {
 | 
			
		||||
        const data = [
 | 
			
		||||
            {
 | 
			
		||||
                data: [
 | 
			
		||||
                    { week: '2024-01', date: '2024-01-14 01:00:00' },
 | 
			
		||||
                    {
 | 
			
		||||
                        week: '2024-02',
 | 
			
		||||
                        date: '2024-01-14 01:00:00',
 | 
			
		||||
                        newProductionFlags: 7,
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        week: '2024-03',
 | 
			
		||||
                        date: '2024-01-21 01:00:00',
 | 
			
		||||
                        newProductionFlags: 3,
 | 
			
		||||
                    },
 | 
			
		||||
                ],
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                data: [{ week: '2024-03', date: '2024-01-21 01:00:00' }],
 | 
			
		||||
            },
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        const result = calculateMedian(data);
 | 
			
		||||
        expect(result).toBe(5);
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
@ -0,0 +1,27 @@
 | 
			
		||||
import type { WeekData } from 'component/insights/componentsChart/NewProductionFlagsChart/types.ts';
 | 
			
		||||
 | 
			
		||||
export const calculateMedian = (
 | 
			
		||||
    datasets: { data: WeekData[] }[],
 | 
			
		||||
): string | number => {
 | 
			
		||||
    const weekData: Record<string, number> = {};
 | 
			
		||||
    for (const set of datasets) {
 | 
			
		||||
        for (const { week, newProductionFlags } of set.data) {
 | 
			
		||||
            if (newProductionFlags === undefined) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            weekData[week] = (weekData[week] ?? 0) + newProductionFlags;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const values: number[] = Object.values(weekData).toSorted((a, b) => a - b);
 | 
			
		||||
    if (values.length === 0) {
 | 
			
		||||
        return 'N/A';
 | 
			
		||||
    }
 | 
			
		||||
    const middle = Math.floor(values.length / 2);
 | 
			
		||||
 | 
			
		||||
    if (values.length % 2 === 0) {
 | 
			
		||||
        return (values[middle - 1] + values[middle]) / 2;
 | 
			
		||||
    } else {
 | 
			
		||||
        return values[middle];
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user