Skip to content

Commit bbfbc84

Browse files
refactor: reference data nested fields now accessible #87700 (#2476)
1 parent 2317241 commit bbfbc84

File tree

5 files changed

+113
-29
lines changed

5 files changed

+113
-29
lines changed

libs/shared/src/lib/components/ui/aggregation-builder/aggregation-builder.component.ts

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
} from '../../../models/aggregation.model';
2020
import { getReferenceMetadata } from '../../../utils/reference-data-metadata.util';
2121
import { PipelineStage } from './pipeline/pipeline-stage.enum';
22+
import { getReferenceDataAggregationFields } from '../../../utils/reference-data/aggregation-fields.util';
2223

2324
/**
2425
* Main component of Aggregation builder.
@@ -220,17 +221,10 @@ export class AggregationBuilderComponent
220221
);
221222
this.fields.next(fields);
222223
} else if (this.referenceData) {
223-
const fields = this.queryBuilder
224-
.getFields(this.referenceData.graphQLTypeName as string)
225-
.filter(
226-
(field: any) =>
227-
!(
228-
field.name.includes('_id') &&
229-
(field.type.name === 'ID' ||
230-
(field.type?.kind === 'LIST' &&
231-
field.type.ofType.name === 'ID'))
232-
)
233-
);
224+
const fields = getReferenceDataAggregationFields(
225+
this.referenceData,
226+
this.queryBuilder
227+
);
234228
this.fields.next(fields);
235229
}
236230
}

libs/shared/src/lib/components/widgets/map-settings/edit-layer-modal/edit-layer-modal.component.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,7 @@ export class EditLayerModalComponent
544544
);
545545
this.fields.next(
546546
this.aggregation
547-
? this.mapLayersService.getAggregationFields(
547+
? this.mapLayersService.getResourceAggregationFields(
548548
data.resource.queryName ?? '',
549549
this.aggregation
550550
)
@@ -583,8 +583,8 @@ export class EditLayerModalComponent
583583
);
584584
this.fields.next(
585585
this.aggregation
586-
? this.mapLayersService.getAggregationFields(
587-
data.referenceData.graphQLTypeName ?? '',
586+
? this.mapLayersService.getReferenceDataAggregationFields(
587+
data.referenceData,
588588
this.aggregation
589589
)
590590
: []

libs/shared/src/lib/services/aggregation-builder/aggregation-builder.service.ts

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { QueryBuilderService } from '../query-builder/query-builder.service';
88
import { Aggregation } from '../../models/aggregation.model';
99
import { Resource } from '../../models/resource.model';
1010
import { ReferenceData } from '../../models/reference-data.model';
11+
import getReferenceDataAggregationFields from '../../utils/reference-data/aggregation-fields.util';
1112

1213
/**
1314
* Shared aggregation service.
@@ -225,19 +226,25 @@ export class AggregationBuilderService {
225226
referenceData?: ReferenceData | null;
226227
}
227228
) {
228-
const queryName = options.resource
229-
? options.resource.queryName
230-
: options.referenceData?.graphQLTypeName;
231-
const fields = this.queryBuilder
232-
.getFields(queryName as string)
233-
.filter(
234-
(field: any) =>
235-
!(
236-
field.name.includes('_id') &&
237-
(field.type.name === 'ID' ||
238-
(field.type.kind === 'LIST' && field.type.ofType.name === 'ID'))
239-
)
229+
let fields: any[] = [];
230+
if (options.referenceData) {
231+
fields = getReferenceDataAggregationFields(
232+
options.referenceData,
233+
this.queryBuilder
240234
);
235+
} else {
236+
fields = this.queryBuilder
237+
.getFields(options.resource?.queryName as string)
238+
.filter(
239+
(field: any) =>
240+
!(
241+
field.name.includes('_id') &&
242+
(field.type.name === 'ID' ||
243+
(field.type.kind === 'LIST' && field.type.ofType.name === 'ID'))
244+
)
245+
);
246+
}
247+
241248
const selectedFields = aggregation.sourceFields
242249
.map((x: string) => {
243250
const field = fields.find((y) => x === y.name);

libs/shared/src/lib/services/map/map-layers.service.ts

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ import { ContextService } from '../context/context.service';
3535
import { DOCUMENT } from '@angular/common';
3636
import { MapPolygonsService } from './map-polygons.service';
3737
import { WidgetService } from '../widget/widget.service';
38+
import { ReferenceData } from '../../models/reference-data.model';
39+
import getReferenceDataAggregationFields from '../../utils/reference-data/aggregation-fields.util';
3840

3941
/**
4042
* Shared map layer service
@@ -212,14 +214,57 @@ export class MapLayersService {
212214
return get(layout, 'query.fields', []);
213215
}
214216

217+
/**
218+
* Get reference data aggregation fields
219+
*
220+
* @param referenceData Reference data
221+
* @param aggregation Current aggregation
222+
* @returns list of aggregation fields
223+
*/
224+
public getReferenceDataAggregationFields(
225+
referenceData: ReferenceData,
226+
aggregation: Aggregation | null
227+
) {
228+
const fields = getReferenceDataAggregationFields(
229+
referenceData,
230+
this.queryBuilder
231+
);
232+
const selectedFields = aggregation?.sourceFields
233+
.map((x: string) => {
234+
const field = fields.find((y) => x === y.name);
235+
if (!field) return null;
236+
if (field.type.kind !== 'SCALAR') {
237+
Object.assign(field, {
238+
fields: this.queryBuilder
239+
.getFieldsFromType(
240+
field.type.kind === 'OBJECT'
241+
? field.type.name
242+
: field.type.ofType.name
243+
)
244+
.filter((y) => y.type.name !== 'ID' && y.type.kind === 'SCALAR'),
245+
});
246+
}
247+
return field;
248+
})
249+
// @TODO To be improved - Get only the JSON type fields for this case
250+
.filter((x: any) => x !== null);
251+
return this.aggregationBuilder
252+
.fieldsAfter(selectedFields, aggregation?.pipeline)
253+
.map((field) => ({
254+
name: field.name,
255+
label: field.name,
256+
type: field.type.name,
257+
}));
258+
}
259+
215260
/**
216261
* Get fields from aggregation
217262
*
218263
* @param queryName query name to get the fields
219-
* @param aggregation A aggregation
220-
* @returns aggregation fields
264+
* @param aggregation Current aggregation
265+
* @returns list of aggregation fields
221266
*/
222-
public getAggregationFields(
267+
public getResourceAggregationFields(
223268
queryName: string,
224269
aggregation: Aggregation | null
225270
) {
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { ReferenceData } from '../../models/reference-data.model';
2+
import { QueryBuilderService } from '../../services/query-builder/query-builder.service';
3+
4+
/**
5+
* Get list of aggregation fields from reference data
6+
*
7+
* @param referenceData Reference data
8+
* @param queryBuilder query builder service instance
9+
* @returns list of fields
10+
*/
11+
export const getReferenceDataAggregationFields = (
12+
referenceData: ReferenceData,
13+
queryBuilder: QueryBuilderService
14+
) => {
15+
const fields = queryBuilder
16+
.getFields(referenceData.graphQLTypeName as string)
17+
.filter(
18+
(field: any) =>
19+
!(
20+
field.name.includes('_id') &&
21+
(field.type.name === 'ID' ||
22+
(field.type?.kind === 'LIST' && field.type.ofType.name === 'ID'))
23+
)
24+
);
25+
for (const field of referenceData.fields || []) {
26+
if (!fields.find((f) => f.name === field.name)) {
27+
// todo: there should be a switch using field type
28+
fields.push({
29+
name: field.name,
30+
type: { kind: 'SCALAR', name: 'String', fields: [] },
31+
args: [],
32+
});
33+
}
34+
}
35+
return fields;
36+
};
37+
38+
export default getReferenceDataAggregationFields;

0 commit comments

Comments
 (0)