@things-factory/dataset 5.0.0 → 5.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +25 -0
  2. package/assets/data-samples.jpg +0 -0
  3. package/client/pages/data-key-set/data-key-item-list.js +196 -0
  4. package/client/pages/data-key-set/data-key-set-importer.js +107 -0
  5. package/client/pages/data-key-set/data-key-set-list-page.js +354 -0
  6. package/client/pages/data-ooc/data-ooc-list-page.js +60 -0
  7. package/client/pages/data-sample/data-sample-list-page.js +60 -0
  8. package/client/pages/data-sample/data-sample-search-page.js +439 -0
  9. package/client/pages/data-set/data-set-list-page.js +20 -1
  10. package/client/route.js +9 -1
  11. package/dist-server/controllers/create-data-sample.js +15 -3
  12. package/dist-server/controllers/create-data-sample.js.map +1 -1
  13. package/dist-server/service/data-key-set/data-key-item-type.js +58 -0
  14. package/dist-server/service/data-key-set/data-key-item-type.js.map +1 -0
  15. package/dist-server/service/data-key-set/data-key-set-mutation.js +179 -0
  16. package/dist-server/service/data-key-set/data-key-set-mutation.js.map +1 -0
  17. package/dist-server/service/data-key-set/data-key-set-query.js +110 -0
  18. package/dist-server/service/data-key-set/data-key-set-query.js.map +1 -0
  19. package/dist-server/service/data-key-set/data-key-set-type.js +94 -0
  20. package/dist-server/service/data-key-set/data-key-set-type.js.map +1 -0
  21. package/dist-server/service/data-key-set/data-key-set.js +101 -0
  22. package/dist-server/service/data-key-set/data-key-set.js.map +1 -0
  23. package/dist-server/service/data-key-set/index.js +9 -0
  24. package/dist-server/service/data-key-set/index.js.map +1 -0
  25. package/dist-server/service/data-ooc/data-ooc.js +32 -0
  26. package/dist-server/service/data-ooc/data-ooc.js.map +1 -1
  27. package/dist-server/service/data-sample/data-sample-query.js +27 -1
  28. package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
  29. package/dist-server/service/data-sample/data-sample.js +41 -0
  30. package/dist-server/service/data-sample/data-sample.js.map +1 -1
  31. package/dist-server/service/data-set/data-item-type.js +1 -1
  32. package/dist-server/service/data-set/data-item-type.js.map +1 -1
  33. package/dist-server/service/data-set/data-set-mutation.js +8 -8
  34. package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
  35. package/dist-server/service/data-set/data-set-query.js +16 -1
  36. package/dist-server/service/data-set/data-set-query.js.map +1 -1
  37. package/dist-server/service/data-set/data-set-type.js +14 -6
  38. package/dist-server/service/data-set/data-set-type.js.map +1 -1
  39. package/dist-server/service/data-set/data-set.js +32 -54
  40. package/dist-server/service/data-set/data-set.js.map +1 -1
  41. package/dist-server/service/data-set-history/data-set-history-query.js +3 -1
  42. package/dist-server/service/data-set-history/data-set-history-query.js.map +1 -1
  43. package/dist-server/service/index.js +4 -1
  44. package/dist-server/service/index.js.map +1 -1
  45. package/package.json +12 -12
  46. package/server/controllers/create-data-sample.ts +19 -12
  47. package/server/service/data-key-set/data-key-item-type.ts +31 -0
  48. package/server/service/data-key-set/data-key-set-mutation.ts +198 -0
  49. package/server/service/data-key-set/data-key-set-query.ts +65 -0
  50. package/server/service/data-key-set/data-key-set-type.ts +57 -0
  51. package/server/service/data-key-set/data-key-set.ts +81 -0
  52. package/server/service/data-key-set/index.ts +6 -0
  53. package/server/service/data-ooc/data-ooc.ts +20 -0
  54. package/server/service/data-sample/data-sample-query.ts +27 -0
  55. package/server/service/data-sample/data-sample.ts +33 -0
  56. package/server/service/data-set/data-item-type.ts +1 -1
  57. package/server/service/data-set/data-set-mutation.ts +8 -8
  58. package/server/service/data-set/data-set-query.ts +13 -1
  59. package/server/service/data-set/data-set-type.ts +6 -0
  60. package/server/service/data-set/data-set.ts +24 -48
  61. package/server/service/data-set-history/data-set-history-query.ts +3 -1
  62. package/server/service/index.ts +4 -1
  63. package/things-factory.config.js +8 -0
  64. package/translations/en.json +11 -0
  65. package/translations/ko.json +11 -0
  66. package/translations/ms.json +12 -1
  67. package/translations/zh.json +11 -0
@@ -217,6 +217,61 @@ export class DataOocListPage extends connect(store)(localize(i18next)(PageView))
217
217
  width: 120,
218
218
  imex: true
219
219
  },
220
+ {
221
+ type: 'string',
222
+ name: 'key01',
223
+ header: i18next.t('field.key-01'),
224
+ record: {
225
+ editable: false
226
+ },
227
+ sortable: true,
228
+ width: 120,
229
+ imex: true
230
+ },
231
+ {
232
+ type: 'string',
233
+ name: 'key02',
234
+ header: i18next.t('field.key-02'),
235
+ record: {
236
+ editable: false
237
+ },
238
+ sortable: true,
239
+ width: 120,
240
+ imex: true
241
+ },
242
+ {
243
+ type: 'string',
244
+ name: 'key03',
245
+ header: i18next.t('field.key-03'),
246
+ record: {
247
+ editable: false
248
+ },
249
+ sortable: true,
250
+ width: 120,
251
+ imex: true
252
+ },
253
+ {
254
+ type: 'string',
255
+ name: 'key04',
256
+ header: i18next.t('field.key-04'),
257
+ record: {
258
+ editable: false
259
+ },
260
+ sortable: true,
261
+ width: 120,
262
+ imex: true
263
+ },
264
+ {
265
+ type: 'string',
266
+ name: 'key05',
267
+ header: i18next.t('field.key-05'),
268
+ record: {
269
+ editable: false
270
+ },
271
+ sortable: true,
272
+ width: 120,
273
+ imex: true
274
+ },
220
275
  {
221
276
  type: 'json5',
222
277
  name: 'partitionKeys',
@@ -321,6 +376,11 @@ export class DataOocListPage extends connect(store)(localize(i18next)(PageView))
321
376
  id
322
377
  name
323
378
  }
379
+ key01
380
+ key02
381
+ key03
382
+ key04
383
+ key05
324
384
  partitionKeys
325
385
  dataItems {
326
386
  name
@@ -158,6 +158,61 @@ export class DataSampleListPage extends connect(store)(localize(i18next)(PageVie
158
158
  width: 120,
159
159
  imex: true
160
160
  },
161
+ {
162
+ type: 'string',
163
+ name: 'key01',
164
+ header: i18next.t('field.key-01'),
165
+ record: {
166
+ editable: false
167
+ },
168
+ sortable: true,
169
+ width: 120,
170
+ imex: true
171
+ },
172
+ {
173
+ type: 'string',
174
+ name: 'key02',
175
+ header: i18next.t('field.key-02'),
176
+ record: {
177
+ editable: false
178
+ },
179
+ sortable: true,
180
+ width: 120,
181
+ imex: true
182
+ },
183
+ {
184
+ type: 'string',
185
+ name: 'key03',
186
+ header: i18next.t('field.key-03'),
187
+ record: {
188
+ editable: false
189
+ },
190
+ sortable: true,
191
+ width: 120,
192
+ imex: true
193
+ },
194
+ {
195
+ type: 'string',
196
+ name: 'key04',
197
+ header: i18next.t('field.key-04'),
198
+ record: {
199
+ editable: false
200
+ },
201
+ sortable: true,
202
+ width: 120,
203
+ imex: true
204
+ },
205
+ {
206
+ type: 'string',
207
+ name: 'key05',
208
+ header: i18next.t('field.key-05'),
209
+ record: {
210
+ editable: false
211
+ },
212
+ sortable: true,
213
+ width: 120,
214
+ imex: true
215
+ },
161
216
  {
162
217
  type: 'json5',
163
218
  name: 'partitionKeys',
@@ -284,6 +339,11 @@ export class DataSampleListPage extends connect(store)(localize(i18next)(PageVie
284
339
  name
285
340
  description
286
341
  useCase
342
+ key01
343
+ key02
344
+ key03
345
+ key04
346
+ key05
287
347
  dataSet {
288
348
  id
289
349
  name
@@ -0,0 +1,439 @@
1
+ import '@operato/data-grist'
2
+ import './data-sample-view.js'
3
+
4
+ import gql from 'graphql-tag'
5
+ import { css, html } from 'lit'
6
+ import { connect } from 'pwa-helpers/connect-mixin'
7
+
8
+ import { client } from '@operato/graphql'
9
+ import { i18next, localize } from '@operato/i18n'
10
+ import { openPopup } from '@operato/layout'
11
+ import { PageView, store } from '@operato/shell'
12
+ import { CommonGristStyles, ScrollbarStyles } from '@operato/styles'
13
+ import { isMobileDevice } from '@operato/utils'
14
+
15
+ export class DataSampleSearchPage extends connect(store)(localize(i18next)(PageView)) {
16
+ static get properties() {
17
+ return {
18
+ dataKeySetId: String,
19
+ dataKeySet: Object,
20
+ active: String,
21
+ gristConfig: Object,
22
+ mode: String
23
+ }
24
+ }
25
+
26
+ static get styles() {
27
+ return [
28
+ ScrollbarStyles,
29
+ CommonGristStyles,
30
+ css`
31
+ :host {
32
+ display: flex;
33
+ flex-direction: column;
34
+
35
+ overflow: hidden;
36
+ }
37
+
38
+ ox-grist {
39
+ overflow-y: auto;
40
+ flex: 1;
41
+ }
42
+ `
43
+ ]
44
+ }
45
+
46
+ get context() {
47
+ return {
48
+ title: i18next.t('title.data-sample search'),
49
+ help: 'dataset/data-sample-search',
50
+ actions: [],
51
+ exportable: {
52
+ name: i18next.t('title.data-sample search'),
53
+ data: this._exportableData.bind(this)
54
+ }
55
+ }
56
+ }
57
+
58
+ render() {
59
+ const mode = this.mode || (isMobileDevice() ? 'LIST' : 'GRID')
60
+
61
+ return html`
62
+ <ox-grist
63
+ .mode=${mode}
64
+ .config=${this.gristConfig}
65
+ .fetchHandler=${this.fetchHandler.bind(this)}
66
+ ?url-params-sensitive=${this.active}
67
+ >
68
+ <div slot="headroom">
69
+ <div id="filters">
70
+ <ox-filters-form autofocus></ox-filters-form>
71
+ </div>
72
+
73
+ <div id="sorters">
74
+ Sort
75
+ <mwc-icon
76
+ @click=${e => {
77
+ const target = e.currentTarget
78
+ this.renderRoot.querySelector('#sorter-control').open({
79
+ right: 0,
80
+ top: target.offsetTop + target.offsetHeight
81
+ })
82
+ }}
83
+ >expand_more</mwc-icon
84
+ >
85
+ <ox-popup id="sorter-control">
86
+ <ox-sorters-control> </ox-sorters-control>
87
+ </ox-popup>
88
+ </div>
89
+
90
+ <div id="modes">
91
+ <mwc-icon @click=${() => (this.mode = 'GRID')} ?active=${mode == 'GRID'}>grid_on</mwc-icon>
92
+ <mwc-icon @click=${() => (this.mode = 'LIST')} ?active=${mode == 'LIST'}>format_list_bulleted</mwc-icon>
93
+ <mwc-icon @click=${() => (this.mode = 'CARD')} ?active=${mode == 'CARD'}>apps</mwc-icon>
94
+ </div>
95
+ </div>
96
+ </ox-grist>
97
+ `
98
+ }
99
+
100
+ get grist() {
101
+ return this.renderRoot.querySelector('ox-grist')
102
+ }
103
+
104
+ pageUpdated(changes, lifecycle) {
105
+ if (this.active) {
106
+ this.dataKeySetId = lifecycle.resourceId
107
+ return
108
+ }
109
+ }
110
+
111
+ async updated(changes) {
112
+ if (changes.has('dataKeySetId')) {
113
+ const response = await client.query({
114
+ query: gql`
115
+ query ($id: String!) {
116
+ dataKeySet(id: $id) {
117
+ id
118
+ name
119
+ description
120
+ dataKeyItems {
121
+ name
122
+ description
123
+ dataKey
124
+ tKey
125
+ }
126
+ }
127
+ }
128
+ `,
129
+ variables: {
130
+ id: this.dataKeySetId
131
+ }
132
+ })
133
+
134
+ this.dataKeySet = response.data.dataKeySet
135
+ this.refreshGristConfig()
136
+ }
137
+ }
138
+
139
+ getDataKeyColumns() {
140
+ return (
141
+ this.dataKeySet?.dataKeyItems.map((item, index) => {
142
+ return {
143
+ type: 'string',
144
+ name: `key0${index + 1}`,
145
+ header: i18next.t(item.tKey),
146
+ record: {
147
+ editable: false
148
+ },
149
+ sortable: true,
150
+ filter: 'i_like',
151
+ width: 120,
152
+ imex: true
153
+ }
154
+ }) || []
155
+ )
156
+ }
157
+
158
+ refreshGristConfig() {
159
+ this.gristConfig = {
160
+ list: { fields: ['dataSet', 'data', 'updater', 'updatedAt'] },
161
+ columns: [
162
+ { type: 'gutter', gutterName: 'sequence' },
163
+ { type: 'gutter', gutterName: 'row-selector', multiple: true },
164
+ {
165
+ type: 'gutter',
166
+ gutterName: 'button',
167
+ icon: 'assignment',
168
+ handlers: {
169
+ click: (columns, data, column, record, rowIndex) => {
170
+ openPopup(
171
+ html` <data-sample-view .dataSample=${record} style="background-color: white;"></data-sample-view> `,
172
+ {
173
+ backdrop: true,
174
+ size: 'large',
175
+ title: i18next.t('title.data-sample view')
176
+ }
177
+ )
178
+ }
179
+ }
180
+ },
181
+ {
182
+ type: 'string',
183
+ name: 'name',
184
+ label: true,
185
+ header: i18next.t('field.name'),
186
+ record: {
187
+ editable: false
188
+ },
189
+ filter: 'search',
190
+ sortable: true,
191
+ width: 120,
192
+ imex: true
193
+ },
194
+ {
195
+ type: 'string',
196
+ name: 'description',
197
+ label: true,
198
+ header: i18next.t('field.description'),
199
+ record: {
200
+ editable: false
201
+ },
202
+ filter: 'search',
203
+ width: 150,
204
+ imex: true
205
+ },
206
+ {
207
+ type: 'resource-object',
208
+ name: 'dataSet',
209
+ header: i18next.t('field.data-set'),
210
+ record: {
211
+ editable: false
212
+ },
213
+ sortable: true,
214
+ width: 120,
215
+ imex: true
216
+ },
217
+ ...this.getDataKeyColumns(),
218
+ {
219
+ type: 'json5',
220
+ name: 'partitionKeys',
221
+ header: i18next.t('field.partition-keys'),
222
+ record: {
223
+ editable: false
224
+ },
225
+ width: 200,
226
+ imex: true
227
+ },
228
+ {
229
+ type: 'checkbox',
230
+ name: 'ooc',
231
+ header: i18next.t('field.ooc'),
232
+ record: {
233
+ editable: false
234
+ },
235
+ width: 30
236
+ },
237
+ {
238
+ type: 'checkbox',
239
+ name: 'oos',
240
+ header: i18next.t('field.oos'),
241
+ record: {
242
+ editable: false
243
+ },
244
+ width: 30
245
+ },
246
+ {
247
+ type: 'json5',
248
+ name: 'data',
249
+ header: i18next.t('field.data'),
250
+ record: {
251
+ editable: false
252
+ },
253
+ width: 200,
254
+ imex: true
255
+ },
256
+ {
257
+ type: 'text',
258
+ name: 'rawData',
259
+ header: i18next.t('field.raw-data'),
260
+ record: {
261
+ editable: false
262
+ },
263
+ width: 200,
264
+ imex: true
265
+ },
266
+ {
267
+ type: 'string',
268
+ name: 'workDate',
269
+ header: i18next.t('field.work-date'),
270
+ sortable: true,
271
+ width: 80,
272
+ imex: true
273
+ },
274
+ {
275
+ type: 'string',
276
+ name: 'workShift',
277
+ header: i18next.t('field.work-shift'),
278
+ sortable: true,
279
+ width: 40,
280
+ imex: true
281
+ },
282
+ {
283
+ type: 'datetime',
284
+ name: 'collectedAt',
285
+ header: i18next.t('field.collected-at'),
286
+ sortable: true,
287
+ width: 180,
288
+ imex: true
289
+ },
290
+ {
291
+ type: 'resource-object',
292
+ name: 'updater',
293
+ header: i18next.t('field.updater'),
294
+ sortable: true,
295
+ width: 120,
296
+ imex: true
297
+ },
298
+ {
299
+ type: 'datetime',
300
+ name: 'updatedAt',
301
+ header: i18next.t('field.updated_at'),
302
+ sortable: true,
303
+ width: 180,
304
+ imex: true
305
+ }
306
+ ],
307
+ rows: {
308
+ appendable: false,
309
+ selectable: {
310
+ multiple: true
311
+ },
312
+ classifier: function (record, rowIndex) {
313
+ var emphasized
314
+ if (record['oos']) {
315
+ emphasized = ['red']
316
+ } else if (record['ooc']) {
317
+ emphasized = 'orange'
318
+ }
319
+
320
+ return {
321
+ emphasized
322
+ }
323
+ }
324
+ },
325
+ sorters: [
326
+ {
327
+ name: 'collectedAt',
328
+ desc: true
329
+ }
330
+ ]
331
+ }
332
+ }
333
+
334
+ async fetchHandler({ page, limit, sortings = [], filters = [] }) {
335
+ const response = await client.query({
336
+ query: gql`
337
+ query ($dataKeySetId: String!, $filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
338
+ responses: dataSamplesByDataKeySet(
339
+ dataKeySetId: $dataKeySetId
340
+ filters: $filters
341
+ pagination: $pagination
342
+ sortings: $sortings
343
+ ) {
344
+ items {
345
+ id
346
+ name
347
+ description
348
+ useCase
349
+ key01
350
+ key02
351
+ key03
352
+ key04
353
+ key05
354
+ dataSet {
355
+ id
356
+ name
357
+ description
358
+ }
359
+ partitionKeys
360
+ dataItems {
361
+ name
362
+ description
363
+ tag
364
+ unit
365
+ spec
366
+ }
367
+ data
368
+ rawData
369
+ ooc
370
+ oos
371
+ judgment
372
+ workDate
373
+ workShift
374
+ updater {
375
+ id
376
+ name
377
+ }
378
+ updatedAt
379
+ collectedAt
380
+ }
381
+ total
382
+ }
383
+ }
384
+ `,
385
+ variables: {
386
+ dataKeySetId: this.dataKeySetId,
387
+ filters,
388
+ pagination: { page, limit },
389
+ sortings
390
+ }
391
+ })
392
+
393
+ return {
394
+ total: response.data.responses.total || 0,
395
+ records: response.data.responses.items || []
396
+ }
397
+ }
398
+
399
+ _exportableData() {
400
+ let records = []
401
+ if (this.grist.selected && this.grist.selected.length > 0) {
402
+ records = this.grist.selected
403
+ } else {
404
+ records = this.grist.data.records
405
+ }
406
+
407
+ var headerSetting = this.grist.compiledConfig.columns
408
+ .filter(column => column.type !== 'gutter' && column.record !== undefined && column.imex !== undefined)
409
+ .map(column => {
410
+ return column.imex === true
411
+ ? {
412
+ header: column.header.renderer(),
413
+ key: column.name,
414
+ width: column.width,
415
+ type: column.type
416
+ }
417
+ : column.imex
418
+ })
419
+
420
+ var data = records.map(item => {
421
+ return {
422
+ id: item.id,
423
+ ...this.gristConfig.columns
424
+ .filter(column => column.type !== 'gutter' && column.record !== undefined && column.imex !== undefined)
425
+ .reduce((record, column) => {
426
+ const key = column.imex === true ? column.name : column.imex.key
427
+ record[key] = key
428
+ .split('.')
429
+ .reduce((obj, key) => (obj && obj[key] !== 'undefined' ? obj[key] : undefined), item)
430
+ return record
431
+ }, {})
432
+ }
433
+ })
434
+
435
+ return { header: headerSetting, data: data }
436
+ }
437
+ }
438
+
439
+ window.customElements.define('data-sample-search-page', DataSampleSearchPage)
@@ -337,6 +337,20 @@ export class DataSetListPage extends connect(store)(localize(i18next)(PageView))
337
337
  filter: true,
338
338
  width: 80
339
339
  },
340
+ {
341
+ type: 'resource-object',
342
+ name: 'dataKeySet',
343
+ header: i18next.t('field.data-key-set'),
344
+ record: {
345
+ editable: true,
346
+ options: {
347
+ queryName: 'dataKeySets'
348
+ }
349
+ },
350
+ sortable: true,
351
+ filter: false,
352
+ width: 120
353
+ },
340
354
  {
341
355
  type: 'partition-keys',
342
356
  name: 'partitionKeys',
@@ -385,6 +399,7 @@ export class DataSetListPage extends connect(store)(localize(i18next)(PageView))
385
399
  key: 'timezone'
386
400
  }
387
401
  },
402
+
388
403
  {
389
404
  type: 'resource-object',
390
405
  name: 'supervisoryRole',
@@ -396,7 +411,7 @@ export class DataSetListPage extends connect(store)(localize(i18next)(PageView))
396
411
  }
397
412
  },
398
413
  sortable: true,
399
- filter: 'like',
414
+ filter: false,
400
415
  width: 120
401
416
  },
402
417
  {
@@ -554,6 +569,10 @@ export class DataSetListPage extends connect(store)(localize(i18next)(PageView))
554
569
  useCase
555
570
  schedule
556
571
  timezone
572
+ dataKeySet {
573
+ id
574
+ name
575
+ }
557
576
  entryRole {
558
577
  id
559
578
  name
package/client/route.js CHANGED
@@ -12,6 +12,10 @@ export default function route(page) {
12
12
  import('./pages/data-sample/data-sample-list-page.js')
13
13
  return page
14
14
 
15
+ case 'data-sample-search':
16
+ import('./pages/data-sample/data-sample-search-page.js')
17
+ return page
18
+
15
19
  case 'data-ooc-list':
16
20
  import('./pages/data-ooc/data-ooc-list-page.js')
17
21
  return page
@@ -31,7 +35,7 @@ export default function route(page) {
31
35
  case 'jasper-report-samples-crosstab':
32
36
  import('./pages/data-report/jasper-report-samples-crosstab-page.js')
33
37
  return page
34
-
38
+
35
39
  case 'jasper-report-oocs':
36
40
  import('./pages/data-report/jasper-report-oocs-page.js')
37
41
  return page
@@ -39,5 +43,9 @@ export default function route(page) {
39
43
  case 'data-report-embed':
40
44
  import('./pages/data-report/data-report-embed-page')
41
45
  return page
46
+
47
+ case 'data-key-set-list':
48
+ import('./pages/data-key-set/data-key-set-list-page.js')
49
+ return page
42
50
  }
43
51
  }
@@ -12,6 +12,16 @@ const data_sample_1 = require("../service/data-sample/data-sample");
12
12
  const data_set_1 = require("../service/data-set/data-set");
13
13
  const data_use_case_1 = require("./data-use-case");
14
14
  const debug = require('debug')('things-factory:dataset:controller/save-data-sample');
15
+ const fillDataKeys = (dataKeySet, data) => {
16
+ const keys = (dataKeySet === null || dataKeySet === void 0 ? void 0 : dataKeySet.dataKeyItems) || [];
17
+ return keys.reduce((sum, key, index) => {
18
+ const value = data[key.dataKey];
19
+ if (value != null) {
20
+ sum[`key0${index + 1}`] = value instanceof Array ? value[0] : value;
21
+ }
22
+ return sum;
23
+ }, {});
24
+ };
15
25
  // parse variable javascript string pattern
16
26
  const replaceVariables = (keys, dic) => {
17
27
  for (const k in keys) {
@@ -38,7 +48,8 @@ const formatDate = (keys, _moment) => {
38
48
  async function createDataSample(dataSample, context) {
39
49
  const { domain, user, tx } = context.state;
40
50
  const dataSet = await tx.getRepository(data_set_1.DataSet).findOne({
41
- where: { id: dataSample.dataSet.id }
51
+ where: { id: dataSample.dataSet.id },
52
+ relations: ['dataKeySet']
42
53
  });
43
54
  const dataItems = dataSet.dataItems;
44
55
  const collectedAt = dataSample.collectedAt || new Date();
@@ -57,9 +68,10 @@ async function createDataSample(dataSample, context) {
57
68
  };
58
69
  var partitionKeys = Object.assign(Object.assign({}, defaultPartitionKeys), dataSet.partitionKeys);
59
70
  partitionKeys = formatDate(partitionKeys, localDateTz);
60
- partitionKeys = replaceVariables(partitionKeys, Object.assign({}, dataSample.data));
71
+ partitionKeys = replaceVariables(partitionKeys, dataSample.data);
72
+ const dataKeys = fillDataKeys(dataSet === null || dataSet === void 0 ? void 0 : dataSet.dataKeySet, dataSample.data);
61
73
  const { ooc, oos, judgment } = data_use_case_1.DataUseCase.evaluate(dataSet, dataItems, dataSample.data) || {};
62
- const result = await tx.getRepository(data_sample_1.DataSample).save(Object.assign(Object.assign({ name: dataSet.name, description: dataSet.description, useCase: dataSet.useCase }, dataSample), { dataSetVersion: dataSet.version, domain,
74
+ const result = await tx.getRepository(data_sample_1.DataSample).save(Object.assign(Object.assign(Object.assign({ name: dataSet.name, description: dataSet.description, useCase: dataSet.useCase }, dataSample), dataKeys), { dataSetVersion: dataSet.version, domain,
63
75
  partitionKeys,
64
76
  ooc,
65
77
  oos,