From c7b8452e80e57eae2c94ec97eb9201d717e40064 Mon Sep 17 00:00:00 2001 From: Benson Maruchu Date: Fri, 5 Jun 2020 09:22:12 +0300 Subject: [PATCH] improvement(case-aggregations): add occupations facet --- src/aggregations/case.aggregations.js | 30 ++++++++++++++++++++-- test/fixtures/cases.js | 7 +++++ test/integration/case.aggregations.spec.js | 1 + 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/aggregations/case.aggregations.js b/src/aggregations/case.aggregations.js index ed875a3..83d562f 100644 --- a/src/aggregations/case.aggregations.js +++ b/src/aggregations/case.aggregations.js @@ -153,7 +153,6 @@ export const CASE_FACET_GENDER = { * @since 0.8.0 * @version 0.1.0 */ - export const CASE_FACET_AGE_GROUPS = { ageGroups: [ { @@ -183,6 +182,31 @@ export const CASE_FACET_AGE_GROUPS = { ], }; +/** + * @constant + * @name CASE_FACET_OCCUPATIONS + * @description Cases victim occupations facet + * + * @author Benson Maruchu + * @license MIT + * @since 0.8.0 + * @version 0.1.0 + */ +export const CASE_FACET_OCCUPATIONS = { + occupations: [ + { + $group: { + _id: '$victim.occupation._id', + total: { $sum: 1 }, + namespace: { $first: '$victim.occupation.namespace' }, + name: { $first: '$victim.occupation.strings.name' }, + weight: { $first: '$victim.occupation.numbers.weight' }, + color: { $first: '$victim.occupation.strings.color' }, + }, + }, + ], +}; + // start: aggregations // order: base to specific @@ -261,6 +285,7 @@ export const getEventCaseAnalysis = (criteria, done) => { const facets = { ...CASE_FACET_GENDER, ...CASE_FACET_AGE_GROUPS, + ...CASE_FACET_OCCUPATIONS, }; base.facet(facets); @@ -269,7 +294,7 @@ export const getEventCaseAnalysis = (criteria, done) => { // Normalize data const normalize = (result, next) => { - const { gender, ageGroups } = safeMergeObjects(...result); + const { gender, ageGroups, occupations } = safeMergeObjects(...result); // add upper boundary for returned age groups const normalizedResultsAgeGroups = map(ageGroups, (group) => ({ @@ -290,6 +315,7 @@ export const getEventCaseAnalysis = (criteria, done) => { overall: { gender, ageGroups: normalizedAgeGroups, + occupations, }, }); diff --git a/test/fixtures/cases.js b/test/fixtures/cases.js index 07ca102..545bc90 100644 --- a/test/fixtures/cases.js +++ b/test/fixtures/cases.js @@ -88,6 +88,13 @@ const cases = [ }, model: 'Predefine', }, + 'victim.nationality': { + match: { + namespace: 'PartyNationality', + 'strings.name.en': 'Tanzanian', + }, + model: 'Predefine', + }, 'victim.area': { match: { namespace: 'AdministrativeArea', 'strings.name.en': 'Temeke' }, model: 'Predefine', diff --git a/test/integration/case.aggregations.spec.js b/test/integration/case.aggregations.spec.js index 66807f8..cbf537e 100644 --- a/test/integration/case.aggregations.spec.js +++ b/test/integration/case.aggregations.spec.js @@ -21,6 +21,7 @@ describe('EventCase Aggregations', () => { expect(report.data).to.exist.and.be.an('object'); expect(report.data.overall.gender).to.exist.and.be.an('array'); expect(report.data.overall.ageGroups).to.exist.and.be.an('array'); + expect(report.data.overall.occupations).to.exist.and.be.an('array'); expect(report.data.overall.ageGroups).to.have.lengthOf(21); done(error, report); });