Skip to content

Commit 35aa43d

Browse files
fix(measures): add device groups field to origin of measures documents (#441)
1 parent 742f38d commit 35aa43d

File tree

7 files changed

+87
-60
lines changed

7 files changed

+87
-60
lines changed

lib/modules/decoder/PayloadService.ts

Lines changed: 47 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { Decoder } from "./Decoder";
1818
import { DecodingState } from "./DecodingState";
1919
import { SkipError } from "./SkipError";
2020
import { AskPayloadReceiveFormated } from "./types/PayloadEvents";
21+
import { DeviceMeasureSource } from "../measure/types/MeasureSources";
2122

2223
export class PayloadService extends BaseService {
2324
constructor(plugin: DeviceManagerPlugin) {
@@ -110,12 +111,14 @@ export class PayloadService extends BaseService {
110111
const devices = await this.retrieveDevices(
111112
decoder.deviceModel,
112113
decodedPayload.references,
113-
{ refresh },
114+
{
115+
refresh,
116+
},
114117
);
115118
for (const device of devices) {
116119
const {
117120
_id,
118-
_source: { reference, model, metadata, linkedMeasures, engineId },
121+
_source: { reference, linkedMeasures, engineId },
119122
} = device;
120123
// ? Done here to avoid invoque Measure service only for device metadata change (if no engineId)
121124
const deviceMetadataChanges = decodedPayload.getMetadata(reference);
@@ -145,14 +148,10 @@ export class PayloadService extends BaseService {
145148
{
146149
measurements,
147150
payloadUuids: [uuid],
148-
source: {
149-
deviceMetadata: metadata,
150-
id: _id,
151-
metadata: deviceMetadataChanges,
152-
model: model,
153-
reference: reference,
154-
type: "device",
155-
},
151+
source: this.getDeviceMeasureSource(
152+
device,
153+
deviceMetadataChanges,
154+
),
156155
target: {
157156
assetId: null,
158157
indexId: engineId,
@@ -175,14 +174,10 @@ export class PayloadService extends BaseService {
175174
{
176175
measurements: assetMeasurements,
177176
payloadUuids: [uuid],
178-
source: {
179-
deviceMetadata: metadata,
180-
id: _id,
181-
metadata: deviceMetadataChanges,
182-
model: model,
183-
reference: reference,
184-
type: "device",
185-
},
177+
source: this.getDeviceMeasureSource(
178+
device,
179+
deviceMetadataChanges,
180+
),
186181
target: {
187182
assetId: assetId,
188183
indexId: engineId,
@@ -206,14 +201,10 @@ export class PayloadService extends BaseService {
206201
{
207202
measurements: unlinkedMeasurements,
208203
payloadUuids: [uuid],
209-
source: {
210-
deviceMetadata: metadata,
211-
id: _id,
212-
metadata: deviceMetadataChanges,
213-
model: model,
214-
reference: reference,
215-
type: "device",
216-
},
204+
source: this.getDeviceMeasureSource(
205+
device,
206+
deviceMetadataChanges,
207+
),
217208
target: {
218209
assetId: null,
219210
indexId: engineId,
@@ -235,8 +226,7 @@ export class PayloadService extends BaseService {
235226
) {
236227
const apiAction = "device-manager/devices:receiveMeasure";
237228
const {
238-
_id,
239-
_source: { reference, model, metadata, linkedMeasures, engineId },
229+
_source: { model, linkedMeasures, engineId },
240230
} = device;
241231

242232
// TODO: do we want update a metadata from formatted payload to ?
@@ -260,13 +250,10 @@ export class PayloadService extends BaseService {
260250
{
261251
measurements: assetMeasurements,
262252
payloadUuids,
263-
source: {
264-
deviceMetadata: metadata,
265-
id: _id,
266-
model: model,
267-
reference: reference,
268-
type: "device",
269-
},
253+
source: this.getDeviceMeasureSource(
254+
device,
255+
device._source.metadata,
256+
),
270257
target: {
271258
assetId: assetId,
272259
indexId: engineId,
@@ -290,13 +277,10 @@ export class PayloadService extends BaseService {
290277
{
291278
measurements: unlinkedMeasurements,
292279
payloadUuids,
293-
source: {
294-
deviceMetadata: metadata,
295-
id: _id,
296-
model: model,
297-
reference: reference,
298-
type: "device",
299-
},
280+
source: this.getDeviceMeasureSource(
281+
device,
282+
device._source.metadata,
283+
),
300284
target: {
301285
assetId: null,
302286
indexId: engineId,
@@ -386,9 +370,7 @@ export class PayloadService extends BaseService {
386370
updatedDevices.push(...newDevices);
387371
} else {
388372
this.app.log.info(
389-
`Skipping new devices "${errors.join(
390-
", ",
391-
)}". Auto-provisioning is disabled.`,
373+
`Skipping new devices "${errors.join(", ")}". Auto-provisioning is disabled.`,
392374
);
393375
}
394376
}
@@ -473,7 +455,9 @@ export class PayloadService extends BaseService {
473455
const deleted = await this.sdk.bulk.deleteByQuery(
474456
this.config.platformIndex,
475457
"payloads",
476-
{ query: { bool: { filter } } },
458+
{
459+
query: { bool: { filter } },
460+
},
477461
);
478462

479463
return deleted;
@@ -486,4 +470,21 @@ export class PayloadService extends BaseService {
486470
) {
487471
await this.savePayload(deviceModel, uuidv4(), false, payload, apiAction);
488472
}
473+
474+
private getDeviceMeasureSource(
475+
device: KDocument<DeviceContent>,
476+
deviceMetadataChanges: JSONObject,
477+
): DeviceMeasureSource {
478+
const { reference, model, metadata, groups } = device._source;
479+
480+
return {
481+
deviceMetadata: metadata,
482+
groups,
483+
id: device._id,
484+
metadata: deviceMetadataChanges,
485+
model: model,
486+
reference: reference,
487+
type: "device",
488+
};
489+
}
489490
}

lib/modules/measure/MeasureService.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,7 @@ export class MeasureService extends BaseService {
7070
) {
7171
const { id: dataSourceId } = source;
7272
const { indexId, assetId } = target;
73-
74-
if (!measurements) {
73+
if (!measurements || measurements.length === 0) {
7574
this.app.log.warn(
7675
`No measurements provided for "${dataSourceId}" measures ingest`,
7776
);

lib/modules/measure/MeasureSourcesBuilder.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,12 @@ export function deviceSourceToOriginDevice(
2525
payloadUuids: string[],
2626
deviceMetadata: Metadata,
2727
): MeasureOriginDevice {
28-
const { id: dataSourceId, model, reference } = source;
28+
const { id: dataSourceId, model, reference, groups } = source;
2929
return {
3030
_id: dataSourceId,
3131
deviceMetadata,
3232
deviceModel: model,
33+
groups,
3334
measureName,
3435
payloadUuids,
3536
reference: reference,

lib/modules/measure/collections/measuresMappings.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,7 @@ export const measuresMappings: CollectionMappings = {
3434
},
3535
groups: {
3636
properties: {
37-
path: {
38-
type: "keyword",
39-
fields: { text: { type: "text" } },
40-
},
37+
path: { type: "keyword", fields: { text: { type: "text" } } },
4138
date: { type: "date" },
4239
},
4340
},
@@ -58,11 +55,13 @@ export const measuresMappings: CollectionMappings = {
5855
// populated with device models metadata mappings
5956
},
6057
},
61-
62-
apiMetadata: {
63-
dynamic: "false",
64-
properties: {},
58+
groups: {
59+
properties: {
60+
path: { type: "keyword", fields: { text: { type: "text" } } },
61+
date: { type: "date" },
62+
},
6563
},
64+
apiMetadata: { dynamic: "false", properties: {} },
6665

6766
payloadUuids: { type: "keyword" },
6867

lib/modules/measure/types/MeasureContent.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ export interface MeasureOriginDevice extends AbstractMeasureOrigin {
4545
*/
4646
deviceMetadata?: Metadata;
4747

48+
/**
49+
* Origin device groups
50+
*/
51+
groups: Array<{ path: string; date: number }>;
52+
4853
/**
4954
* Device ID
5055
*/

lib/modules/measure/types/MeasureSources.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ export interface DeviceMeasureSource extends AbstractMeasureSource {
1212
deviceMetadata: Metadata;
1313
model: string;
1414
lastMeasuredAt?: number;
15+
groups: Array<{
16+
path: string;
17+
date: number;
18+
}>;
1519
}
1620

1721
export interface ApiMeasureSource extends AbstractMeasureSource {

tests/scenario/migrated/measure-ingestion-pipeline.test.ts

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,7 @@ describe('features/Measure/IngestionPipeline', () => {
126126
});
127127

128128
it('Should enrich measure with the origin device metadata', async () => {
129-
const metadata = {
130-
color: 'blue',
131-
};
129+
const metadata = { color: 'blue' };
132130

133131
await sdk.query({
134132
controller: 'device-manager/devices',
@@ -186,4 +184,24 @@ describe('features/Measure/IngestionPipeline', () => {
186184
],
187185
});
188186
});
187+
188+
it('Should enrich measure with the origin device groups', async () => {
189+
await sendPayloads(sdk, 'dummy-temp-position', [
190+
{ deviceEUI: 'linked2', temperature: 35, location: { lon: 12, lat: 12 } },
191+
]);
192+
193+
await sdk.collection.refresh('engine-ayse', 'measures');
194+
195+
const response = await sdk.query({
196+
controller: 'document',
197+
action: 'search',
198+
index: 'engine-ayse',
199+
collection: 'measures',
200+
body: { query: { term: { 'origin.reference': 'linked2' } } },
201+
});
202+
203+
expect(response.result.hits[0]._source.origin.groups[0]).toMatchObject({
204+
path: 'test-parent-asset',
205+
});
206+
});
189207
});

0 commit comments

Comments
 (0)