Skip to content

Commit

Permalink
Merge branch 'development' into 4206-data-history
Browse files Browse the repository at this point in the history
  • Loading branch information
minotogna authored Feb 15, 2025
2 parents 6aec025 + e7b7997 commit aeeca13
Show file tree
Hide file tree
Showing 15 changed files with 240 additions and 33 deletions.
2 changes: 1 addition & 1 deletion .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ module.exports = {
'@typescript-eslint/no-unused-vars': [2, { argsIgnorePattern: '^_' }],
'no-use-before-define': 'off',
'no-shadow': 'off',
'no-param-reassign': ['error', { props: true, ignorePropertyModificationsFor: ['state'] }],
'no-param-reassign': ['error', { props: true, ignorePropertyModificationsFor: ['state', 'acc'] }],
'@typescript-eslint/no-use-before-define': ['error'],
'@typescript-eslint/ban-ts-comment': 'off',
'no-restricted-exports': 'off',
Expand Down
10 changes: 9 additions & 1 deletion src/meta/assessment/assessments.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { Areas, AssessmentStatus, Country, CountryIso } from 'meta/area'
import { Cycles } from 'meta/assessment/cycles'

import { User, Users } from '../user'
import { Assessment } from './assessment'
import { Assessment, RecordAssessments } from './assessment'
import { AssessmentName } from './assessmentName'
import { Cycle } from './cycle'

Expand Down Expand Up @@ -93,8 +93,16 @@ const getLastCreatedCycle = (assessment: Assessment): Cycle | undefined => {
})
}

const getRecordAssessments = (assessments: Array<Assessment>): RecordAssessments => {
return assessments.reduce<RecordAssessments>((acc, assessment) => {
acc[assessment.props.name] = assessment
return acc
}, {})
}

export const Assessments = {
getShortLabel,
getLastPublishedCycle,
getLastCreatedCycle,
getRecordAssessments,
}
5 changes: 3 additions & 2 deletions src/meta/assessment/cycle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,13 @@ export enum CycleStatus {
export type CycleProps = {
dateCreated: string
dateDraft: string
dateEditing: string
datePublished: string
dateEditing?: string
datePublished?: string
status: CycleStatus
}

export interface Cycle {
readonly assessmentId: number
cycleUuidSource?: CycleUuid
id: number
name: CycleName
Expand Down
71 changes: 71 additions & 0 deletions src/meta/expressionEvaluator/context.mock.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import { Assessment, AssessmentNames, CycleStatus, RecordAssessments } from '../assessment'
import { Context } from './context'

const assessment = {
cycles: [
{
id: 1,
name: '2020',
uuid: '66817a08-dc93-4151-b5ed-176d8f04e9b7',
props: {
status: CycleStatus.published,
dateDraft: '2017-01-01T00:00:00.000Z',
dateCreated: '2018-01-01T00:00:00.000Z',
dateEditing: '2018-03-05T00:00:00.000Z',
datePublished: '2020-07-21T00:00:00.000Z',
},
assessmentId: 1,
cycleUuidSource: null,
},
{
id: 2,
name: '2025',
uuid: '66da2217-da42-492f-9ff4-c99a59e6675c',
props: {
status: CycleStatus.editing,
dateDraft: '2021-01-01T00:00:00.000Z',
dateCreated: '2022-01-01T00:00:00.000Z',
dateEditing: '2022-03-02T00:00:00.000Z',
},
assessmentId: 1,
cycleUuidSource: '66817a08-dc93-4151-b5ed-176d8f04e9b7',
},
{
id: 39,
name: 'latest',
uuid: '9fa1fd86-b4e3-46e4-bf48-125f082ea501',
props: {
status: CycleStatus.draft,
dateDraft: '2025-02-11T21:20:08.602Z',
dateCreated: '2025-02-11T21:20:08.602Z',
},
assessmentId: 1,
cycleUuidSource: '66da2217-da42-492f-9ff4-c99a59e6675c',
},
],
props: {
name: AssessmentNames.fra,
},
} as Assessment

const assessments: RecordAssessments = {
[AssessmentNames.fra]: assessment,
}

export const contextMock: Context = {
assessments,
assessment,
cycle: {
id: 2,
name: '2025',
uuid: '66da2217-da42-492f-9ff4-c99a59e6675c',
props: {
status: CycleStatus.editing,
dateDraft: '2021-01-01T00:00:00.000Z',
dateCreated: '2022-01-01T00:00:00.000Z',
dateEditing: '2022-03-02T00:00:00.000Z',
},
assessmentId: 1,
cycleUuidSource: '66817a08-dc93-4151-b5ed-176d8f04e9b7',
},
} as Context
10 changes: 9 additions & 1 deletion src/meta/expressionEvaluator/evaluators/member.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,29 @@ import { MemberEvaluator as ArenaMemberEvaluator } from '@openforis/arena-core/d

import { AssessmentMetaCaches } from 'meta/assessment'
import { RecordAssessmentDatas } from 'meta/data'
import { BaseContext } from 'meta/expressionEvaluator/util/_types'
import { parseMemberVariable } from 'meta/expressionEvaluator/util/parseMemberVariable'

import { Context } from '../context'

export class MemberEvaluator extends ArenaMemberEvaluator<Context> {
evaluate(expressionNode: MemberExpression): string | undefined {
const {
assessments,
assessment: assessmentContext,
cycle: cycleContext,
countryIso,
colName: colNameContext,
data,
} = this.context

const memberVariable = parseMemberVariable(expressionNode)
const baseContext: BaseContext = {
assessments,
assessmentName: assessmentContext.props.name,
cycleName: cycleContext.name,
}

const memberVariable = parseMemberVariable(expressionNode, baseContext)
const memberAssessmentName = memberVariable.assessmentName
const memberCycleName = memberVariable.cycleName

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,20 @@ export const validatorEqualToPreviousCycleForestArea: ExpressionFunction<Context
name: 'validatorEqualToPreviousCycleForestArea',
minArity: 2,
executor: () => {
return (forestArea2020?: string, forestArea2025?: string): NodeValueValidation => {
return (forestAreaPrevious?: string, forestAreaCurrent?: string): NodeValueValidation => {
const valid =
Objects.isEmpty(forestArea2020) ||
Objects.isEmpty(forestArea2025) ||
Numbers.eqWithTolerance(forestArea2025, forestArea2020)
Objects.isEmpty(forestAreaPrevious) ||
Objects.isEmpty(forestAreaCurrent) ||
Numbers.eqWithTolerance(forestAreaCurrent, forestAreaPrevious)

const messages: Array<NodeValueValidationMessage> = valid
? undefined
: [
{
key: 'generalValidation.forestAreaReportedIsDifferentFromPreviousCycle',
params: {
forestArea2020: Numbers.format(Number(forestArea2020)),
forestArea2025: Numbers.format(Number(forestArea2025)),
forestArea2020: Numbers.format(Number(forestAreaPrevious)),
forestArea2025: Numbers.format(Number(forestAreaCurrent)),
},
},
]
Expand Down
3 changes: 3 additions & 0 deletions src/meta/expressionEvaluator/util/_types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { AssessmentName, CycleName, RecordAssessments } from 'meta/assessment'

export type BaseContext = { assessments: RecordAssessments; assessmentName: AssessmentName; cycleName: CycleName }
76 changes: 71 additions & 5 deletions src/meta/expressionEvaluator/util/parseMemberVariable.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,19 @@
import { MemberExpression } from '@openforis/arena-core'

import { Context } from 'meta/expressionEvaluator/context'
import { BaseContext } from 'meta/expressionEvaluator/util/_types'
import { Member } from 'meta/expressions'

import { contextMock as context } from '../context.mock'
import { parseMemberVariable } from './parseMemberVariable'

const getBaseContext = (context: Context): BaseContext => {
const { assessments, assessment, cycle } = context
const assessmentName = assessment.props.name
const cycleName = cycle.name
return { assessmentName, cycleName, assessments }
}

describe('parseMemberVariable', () => {
test('fra["2025"].extentOfForest.forestArea["2025"]', () => {
const expected = {
Expand Down Expand Up @@ -55,7 +67,7 @@ describe('parseMemberVariable', () => {
},
}

expect(parseMemberVariable(memberExpression)).toEqual(expected)
expect(parseMemberVariable(memberExpression, getBaseContext(context))).toEqual(expected)
})
test('fra["2025"].extentOfForest.forestArea', () => {
const expected = {
Expand Down Expand Up @@ -100,7 +112,7 @@ describe('parseMemberVariable', () => {
},
}

expect(parseMemberVariable(memberExpression)).toEqual(expected)
expect(parseMemberVariable(memberExpression, getBaseContext(context))).toEqual(expected)
})
test('extentOfForest.forestArea["2025"]', () => {
const expected = {
Expand Down Expand Up @@ -138,7 +150,7 @@ describe('parseMemberVariable', () => {
},
}

expect(parseMemberVariable(memberExpression)).toEqual(expected)
expect(parseMemberVariable(memberExpression, getBaseContext(context))).toEqual(expected)
})
test('growingStockComposition2025.remainingIntroduced.growingStockMillionCubicMeter', () => {
const expected = {
Expand Down Expand Up @@ -175,7 +187,7 @@ describe('parseMemberVariable', () => {
},
}

expect(parseMemberVariable(memberExpression)).toEqual(expected)
expect(parseMemberVariable(memberExpression, getBaseContext(context))).toEqual(expected)
})

test('extentOfForest.forestArea', () => {
Expand Down Expand Up @@ -206,6 +218,60 @@ describe('parseMemberVariable', () => {
},
}

expect(parseMemberVariable(memberExpression)).toEqual(expected)
expect(parseMemberVariable(memberExpression, getBaseContext(context))).toEqual(expected)
})

test('fra[$prevCycle].extentOfForest.forestArea["2025"]', () => {
const expected = {
assessmentName: 'fra',
colName: '2025',
cycleName: '2020',
tableName: 'extentOfForest',
variableName: 'forestArea',
}

const memberExpression: MemberExpression = {
// @ts-ignore
type: 'MemberExpression',
computed: true,
object: {
// @ts-ignore
type: 'MemberExpression',
computed: false,
object: {
type: 'MemberExpression',
computed: false,
object: {
type: 'MemberExpression',
computed: true,
object: {
type: 'Identifier',
name: 'fra',
},
property: {
type: 'Literal',
value: Member.$prevCycle,
raw: `'${Member.$prevCycle}'`,
},
},
property: {
type: 'Identifier',
name: 'extentOfForest',
},
},
property: {
type: 'Identifier',
name: 'forestArea',
},
},
property: {
// @ts-ignore
type: 'Literal',
value: '2025',
raw: "'2025'",
},
}

expect(parseMemberVariable(memberExpression, getBaseContext(context))).toEqual(expected)
})
})
28 changes: 22 additions & 6 deletions src/meta/expressionEvaluator/util/parseMemberVariable.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,18 @@
import { MemberExpression } from '@openforis/arena-core'

import { VariableCache } from 'meta/assessment'
import { Cycles, VariableCache } from 'meta/assessment'
import { BaseContext } from 'meta/expressionEvaluator/util/_types'
import { Member } from 'meta/expressions'

const getCycleName = (cycleName: string, context: BaseContext) => {
if (cycleName === Member.$prevCycle) {
const { assessments, assessmentName, cycleName } = context
const assessment = assessments[assessmentName]
const cycle = assessment.cycles.find((c) => c.name === cycleName)
return Cycles.getPreviousCycle({ assessment, cycle }).name
}
return cycleName
}

const getExpressionDepth = (expressionNode: MemberExpression): number => {
let depth = 0
Expand All @@ -13,7 +25,7 @@ const getExpressionDepth = (expressionNode: MemberExpression): number => {
return depth
}

export const parseMemberVariable = (expressionNode: MemberExpression): VariableCache => {
export const parseMemberVariable = (expressionNode: MemberExpression, context: BaseContext): VariableCache => {
const depth = getExpressionDepth(expressionNode)

switch (depth) {
Expand Down Expand Up @@ -46,6 +58,9 @@ export const parseMemberVariable = (expressionNode: MemberExpression): VariableC

// Case when parsing a member expression: fra['2025'].extentOfForest.forestArea
case 3: {
// @ts-ignore
const cycleName = getCycleName(expressionNode.object.object.property.value, context)

return {
// @ts-ignore
tableName: expressionNode.object.property.name,
Expand All @@ -54,14 +69,16 @@ export const parseMemberVariable = (expressionNode: MemberExpression): VariableC
colName: undefined,
// @ts-ignore
assessmentName: expressionNode.object.object.object.name,
// @ts-ignore
cycleName: expressionNode.object.object.property.value,
cycleName,
}
}

// Case when parsing a member expression: fra['2025'].extentOfForest.forestArea['2025']
// @ts-ignore
case 4: {
// @ts-ignore
const cycleName = getCycleName(expressionNode.object.object.object.property.value, context)

return {
// @ts-ignore
tableName: expressionNode.object.object.property.name,
Expand All @@ -71,8 +88,7 @@ export const parseMemberVariable = (expressionNode: MemberExpression): VariableC
colName: expressionNode.property.value ?? expressionNode.property.name,
// @ts-ignore
assessmentName: expressionNode.object.object.object.object.name,
// @ts-ignore
cycleName: expressionNode.object.object.object.property.value,
cycleName,
}
}

Expand Down
1 change: 1 addition & 0 deletions src/meta/expressions/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { Member } from './member'
3 changes: 3 additions & 0 deletions src/meta/expressions/member.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export enum Member {
'$prevCycle' = '$prevCycle',
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { ExpressionContext } from '@openforis/arena-core'

import { Assessment, AssessmentName, CycleName, RowCache } from 'meta/assessment'
import { AssessmentName, CycleName, RecordAssessments, RowCache } from 'meta/assessment'

export interface Context extends ExpressionContext {
assessments: Array<Assessment>
assessments: RecordAssessments
assessmentName: AssessmentName
cycleName: CycleName
row: RowCache
Expand Down
Loading

0 comments on commit aeeca13

Please sign in to comment.