@outliant/sunrise-utils 1.2.1 → 1.2.2

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.
package/CHANGELOG.md CHANGED
@@ -4,8 +4,15 @@ All notable changes to this project will be documented in this file. Dates are d
4
4
 
5
5
  Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
6
6
 
7
+ #### [1.2.2](https://github.com/outliant/sunrise-utils/compare/1.2.1...1.2.2)
8
+
9
+ - chore: pipeline improvements #86b27p240 [`911f6dd`](https://github.com/outliant/sunrise-utils/commit/911f6dd7bdf2e26986aec0671d1610d18ebe5cfc)
10
+
7
11
  #### [1.2.1](https://github.com/outliant/sunrise-utils/compare/1.2.0...1.2.1)
8
12
 
13
+ > 7 September 2024
14
+
15
+ - chore(release): 1.2.1 [`a10f2ea`](https://github.com/outliant/sunrise-utils/commit/a10f2ea60e39f40de1a9d5a33372e9209e53c935)
9
16
  - chore: add credit-hold for project banners options [`94669b7`](https://github.com/outliant/sunrise-utils/commit/94669b7ba216596f5fb413d96a8a9dc466ca0c1e)
10
17
 
11
18
  #### [1.2.0](https://github.com/outliant/sunrise-utils/compare/1.1.32...1.2.0)
@@ -14,31 +14,36 @@ module.exports.defaultCustomColumns = [
14
14
  name: 'Region',
15
15
  value: 'region',
16
16
  type: 'region',
17
- field_type: 'checkbox'
17
+ field_type: 'checkbox',
18
+ select_fields: ['region_id']
18
19
  },
19
20
  {
20
21
  name: 'Tags',
21
22
  value: 'tags',
22
23
  type: 'tags',
23
- field_type: 'checkbox'
24
+ field_type: 'checkbox',
25
+ select_fields: ['tag_ids']
24
26
  },
25
27
  {
26
28
  name: 'Critical Path Stage',
27
29
  value: 'criticalPathStage',
28
30
  type: 'criticalPathStage',
29
- field_type: 'select'
31
+ field_type: 'select',
32
+ select_fields: ['critical_path']
30
33
  },
31
34
  {
32
35
  name: 'Critical Path Age',
33
36
  value: 'criticalPathAge',
34
37
  type: 'criticalPathAge',
35
- field_type: 'number'
38
+ field_type: 'number',
39
+ select_fields: ['critical_path']
36
40
  },
37
41
  {
38
42
  name: 'Cancelled',
39
43
  value: 'on_hold',
40
44
  type: 'on_hold',
41
- field_type: 'select'
45
+ field_type: 'select',
46
+ select_fields: ['on_hold']
42
47
  },
43
48
  {
44
49
  validate: (validator) => validator && validator.isCommercial(),
@@ -55,56 +60,65 @@ module.exports.defaultCustomColumns = [
55
60
  label: 'No',
56
61
  value: 'No'
57
62
  }
58
- ]
63
+ ],
64
+ select_fields: ['is_paused']
59
65
  },
60
66
  {
61
67
  name: 'Is Generated',
62
68
  value: 'is_generated',
63
69
  type: 'is_generated',
64
- field_type: 'select'
70
+ field_type: 'select',
71
+ select_fields: ['is_generated']
65
72
  },
66
73
  {
67
74
  name: 'Project ID',
68
75
  value: 'project_id',
69
76
  type: 'project_id',
70
- field_type: 'text'
77
+ field_type: 'text',
78
+ select_fields: ['_id']
71
79
  },
72
80
  {
73
81
  name: 'Last Pulse Comment',
74
82
  value: 'lastPulseComment',
75
83
  type: 'lastPulseComment',
76
- field_type: 'textarea'
84
+ field_type: 'textarea',
85
+ select_fields: ['last_pulse_data']
77
86
  },
78
87
  {
79
88
  name: 'Last Pulse Comment User',
80
89
  value: 'lastPulseCommentUser',
81
90
  type: 'lastPulseCommentUser',
82
- field_type: 'select'
91
+ field_type: 'select',
92
+ select_fields: ['last_pulse_data']
83
93
  },
84
94
  {
85
95
  name: 'Last Pulse Comment Date',
86
96
  value: 'lastPulseCommentDate',
87
97
  type: 'lastPulseCommentDate',
88
- field_type: 'date'
98
+ field_type: 'date',
99
+ select_fields: ['last_pulse_data']
89
100
  },
90
101
  {
91
102
  name: 'Created',
92
103
  value: 'created_at',
93
104
  type: 'created_at',
94
- field_type: 'date'
105
+ field_type: 'date',
106
+ select_fields: ['created_at']
95
107
  },
96
108
  {
97
109
  name: 'Updated',
98
110
  value: 'updated_at',
99
111
  type: 'updated_at',
100
- field_type: 'date'
112
+ field_type: 'date',
113
+ select_fields: ['updated_at']
101
114
  },
102
115
  {
103
116
  name: 'Banners',
104
117
  value: 'banner',
105
118
  type: 'banner',
106
119
  field_type: 'checkbox',
107
- options: PROJECT_BANNERS
120
+ options: PROJECT_BANNERS,
121
+ select_fields: ['banner']
108
122
  }
109
123
  ];
110
124
 
@@ -0,0 +1,45 @@
1
+ const { validate: isUuid } = require('uuid');
2
+ const _ = require('lodash');
3
+
4
+ module.exports = (columns = [], filterColumns = []) => {
5
+ let _source = [];
6
+ if (_.isEmpty(columns)) return { _source };
7
+
8
+ const projectFields = [];
9
+ _.each(columns, (c) => {
10
+ if (isUuid(c)) {
11
+ projectFields.push(`'${c}'`);
12
+ } else {
13
+ const columnData = filterColumns.find((x) => x.type === c);
14
+ if (columnData && !_.isEmpty(columnData.select_fields)) {
15
+ _source = _.concat(_source, columnData.select_fields);
16
+ } else {
17
+ _source.push(c);
18
+ }
19
+ }
20
+ });
21
+
22
+ _source = _.uniq(_source);
23
+
24
+ if (_.isEmpty(projectFields)) return { _source };
25
+
26
+ return {
27
+ _source,
28
+ script_fields: {
29
+ filtered_fields: {
30
+ script: {
31
+ source: `
32
+ def fieldIds = [${projectFields.join(',')}];
33
+ def result = [];
34
+ for (f in params['_source']['fields']) {
35
+ if (fieldIds.contains(f['id'])) {
36
+ result.add(f);
37
+ }
38
+ }
39
+ return result;
40
+ `
41
+ }
42
+ }
43
+ }
44
+ };
45
+ };
@@ -66,51 +66,65 @@ module.exports.defaultCustomColumns = [
66
66
  value: 'owner',
67
67
  type: 'owner',
68
68
  field_type: 'select',
69
- options: []
69
+ options: [],
70
+ select_fields: ['user_id', 'team_id']
70
71
  },
71
72
  {
72
73
  name: 'Age',
73
74
  value: 'ready_at',
74
75
  type: 'ready_at',
75
- field_type: 'date'
76
+ field_type: 'date',
77
+ select_fields: [
78
+ 'is_complete',
79
+ 'completed_at',
80
+ 'is_ready',
81
+ 'ready_at',
82
+ 'created_at'
83
+ ]
76
84
  },
77
85
  {
78
86
  name: 'Days to Complete',
79
87
  value: 'days_to_complete',
80
88
  type: 'days_to_complete',
81
- field_type: 'number'
89
+ field_type: 'number',
90
+ select_fields: ['ready_at', 'completed_at']
82
91
  },
83
92
  {
84
93
  name: 'Pending Date',
85
94
  value: 'pending_date',
86
95
  type: 'pending_date',
87
- field_type: 'date'
96
+ field_type: 'date',
97
+ select_fields: ['ready_at']
88
98
  },
89
99
  {
90
100
  name: 'Project ID',
91
101
  value: 'project_id',
92
102
  type: 'project_id',
93
- field_type: 'text'
103
+ field_type: 'text',
104
+ select_fields: ['project_id']
94
105
  },
95
106
  {
96
107
  name: 'Status',
97
108
  value: 'status',
98
109
  type: 'status',
99
110
  field_type: 'select',
100
- options: []
111
+ options: [],
112
+ select_fields: ['is_complete', 'is_ready']
101
113
  },
102
114
  {
103
115
  name: 'Region',
104
116
  value: 'region',
105
117
  type: 'region',
106
118
  field_type: 'checkbox',
107
- options: []
119
+ options: [],
120
+ select_fields: ['region_id']
108
121
  },
109
122
  {
110
123
  name: 'Description',
111
124
  value: 'notes',
112
125
  type: 'notes',
113
- field_type: 'textarea'
126
+ field_type: 'textarea',
127
+ select_fields: ['notes']
114
128
  },
115
129
  {
116
130
  name: 'Cancelled',
@@ -126,7 +140,8 @@ module.exports.defaultCustomColumns = [
126
140
  label: 'No',
127
141
  value: 'No'
128
142
  }
129
- ]
143
+ ],
144
+ select_fields: ['on_hold']
130
145
  },
131
146
  {
132
147
  validate: (validator) => validator && validator.isCommercial(),
@@ -143,57 +158,66 @@ module.exports.defaultCustomColumns = [
143
158
  label: 'No',
144
159
  value: 'No'
145
160
  }
146
- ]
161
+ ],
162
+ select_fields: ['is_paused']
147
163
  },
148
164
  {
149
165
  name: 'Last Comment',
150
166
  value: 'last_comment',
151
167
  type: 'last_comment',
152
- field_type: 'textarea'
168
+ field_type: 'textarea',
169
+ select_fields: ['last_comment_data']
153
170
  },
154
171
  {
155
172
  name: 'Last Comment Date',
156
173
  value: 'last_comment_date',
157
174
  type: 'last_comment_date',
158
- field_type: 'date'
175
+ field_type: 'date',
176
+ select_fields: ['last_comment_data']
159
177
  },
160
178
  {
161
179
  name: 'Due Date',
162
180
  value: 'due_date',
163
181
  type: 'due_date',
164
- field_type: 'date'
182
+ field_type: 'date',
183
+ select_fields: ['due_date']
165
184
  },
166
185
  {
167
186
  name: 'Completed By',
168
187
  value: 'completed_by',
169
188
  type: 'completed_by',
170
189
  field_type: 'select',
171
- options: []
190
+ options: [],
191
+ select_fields: ['owner', 'completed_by']
172
192
  },
173
193
  {
174
194
  name: 'Completed At',
175
195
  value: 'completed_at',
176
196
  type: 'completed_at',
177
- field_type: 'date'
197
+ field_type: 'date',
198
+ select_fields: ['completed_at']
178
199
  },
179
200
  {
180
201
  name: 'Created',
181
202
  value: 'created_at',
182
203
  type: 'created_at',
183
- field_type: 'date'
204
+ field_type: 'date',
205
+ select_fields: ['created_at']
184
206
  },
185
207
  {
186
208
  name: 'Updated',
187
209
  value: 'updated_at',
188
210
  type: 'updated_at',
189
- field_type: 'date'
211
+ field_type: 'date',
212
+ select_fields: ['updated_at']
190
213
  },
191
214
  {
192
215
  name: 'Critical Path Stage',
193
216
  value: 'critical_path_stage',
194
217
  type: 'critical_path_stage',
195
218
  field_type: 'select',
196
- options: []
219
+ options: [],
220
+ select_fields: ['critical_path']
197
221
  },
198
222
  {
199
223
  name: 'Was Marked Incomplete',
@@ -209,26 +233,30 @@ module.exports.defaultCustomColumns = [
209
233
  label: 'No',
210
234
  value: 'No'
211
235
  }
212
- ]
236
+ ],
237
+ select_fields: ['was_marked_incomplete']
213
238
  },
214
239
  {
215
240
  name: 'Marked Incomplete At',
216
241
  value: 'marked_incomplete_at',
217
242
  type: 'marked_incomplete_at',
218
- field_type: 'date'
243
+ field_type: 'date',
244
+ select_fields: ['marked_incomplete_at']
219
245
  },
220
246
  {
221
247
  name: 'Banners',
222
248
  value: 'project_banner',
223
249
  type: 'project_banner',
224
250
  field_type: 'checkbox',
225
- options: PROJECT_BANNERS
251
+ options: PROJECT_BANNERS,
252
+ select_fields: ['project_banner']
226
253
  },
227
254
  {
228
255
  name: 'Is Starred',
229
256
  value: 'is_starred',
230
257
  type: 'is_starred',
231
- field_type: 'boolean'
258
+ field_type: 'boolean',
259
+ select_fields: ['is_starred']
232
260
  }
233
261
  ];
234
262
 
package/index.d.ts CHANGED
@@ -10,6 +10,7 @@ declare namespace Utils {
10
10
  type: string;
11
11
  field_type: string;
12
12
  options?: FilterConditionOption[];
13
+ select_fields?: string[];
13
14
  }
14
15
 
15
16
  export interface Filter {
@@ -75,6 +76,7 @@ declare namespace Utils {
75
76
  export function getTaskAge(task: any): any;
76
77
  export function getTaskAgeColor(task: any): any;
77
78
  export function getDaysToComplete(task: any): undefined | number;
79
+ export function buildSourceParams(columns: string[]): any;
78
80
  }
79
81
 
80
82
  namespace projectPipeline {
@@ -89,6 +91,7 @@ declare namespace Utils {
89
91
  searchFields?: string[]
90
92
  ): any;
91
93
  export function buildSortScript(query?: Query, customSort?: any[]): any;
94
+ export function buildSourceParams(columns: string[]): any;
92
95
  }
93
96
 
94
97
  namespace queries {
@@ -6,6 +6,7 @@ const {
6
6
  } = require('../helpers/projectFilter');
7
7
  const searchFilter = require('../helpers/searchFilter');
8
8
  const sortScript = require('../helpers/sortScript');
9
+ const sourceParams = require('../helpers/sourceParams');
9
10
 
10
11
  class ProjectPipeline {
11
12
  defaultCustomColumns = defaultCustomColumns;
@@ -143,6 +144,14 @@ class ProjectPipeline {
143
144
 
144
145
  return projectPipelinesSort;
145
146
  }
147
+
148
+ /**
149
+ * Generates elasticsearch _source and script_fields params to only fetch selected fields specified as columns
150
+ * @returns {Object} - Elasticsearch params object.
151
+ */
152
+ buildSourceParams(columns = []) {
153
+ return sourceParams(columns, defaultCustomColumns);
154
+ }
146
155
  }
147
156
 
148
157
  module.exports = new ProjectPipeline();
@@ -12,6 +12,7 @@ const {
12
12
  const searchFilter = require('../helpers/searchFilter');
13
13
  const sortScript = require('../helpers/sortScript');
14
14
  const taskHelper = require('../helpers/task');
15
+ const sourceParams = require('../helpers/sourceParams');
15
16
 
16
17
  class TaskPipeline {
17
18
  taskStatusOptions = taskStatusOptions;
@@ -220,6 +221,14 @@ class TaskPipeline {
220
221
 
221
222
  return ageColor;
222
223
  }
224
+
225
+ /**
226
+ * Generates elasticsearch _source and script_fields params to only fetch selected fields specified as columns
227
+ * @returns {Object} - Elasticsearch params object.
228
+ */
229
+ buildSourceParams(columns = []) {
230
+ return sourceParams(columns, defaultCustomColumns);
231
+ }
223
232
  }
224
233
 
225
234
  module.exports = new TaskPipeline();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@outliant/sunrise-utils",
3
3
  "description": "Helper functions for project Sunrise",
4
- "version": "1.2.1",
4
+ "version": "1.2.2",
5
5
  "license": "ISC",
6
6
  "author": "Outliant",
7
7
  "main": "index.js",
@@ -35,28 +35,26 @@ describe('projectPipeline', function () {
35
35
  {
36
36
  wildcard: {
37
37
  id: {
38
- value: "*COM*"
38
+ value: '*COM*'
39
39
  }
40
40
  }
41
41
  },
42
42
  {
43
43
  wildcard: {
44
44
  id: {
45
- value: "*41853*"
45
+ value: '*41853*'
46
46
  }
47
47
  }
48
48
  },
49
49
  {
50
50
  multi_match: {
51
- query: "COM-41853",
52
- fields: [
53
- "project_id^5"
54
- ]
51
+ query: 'COM-41853',
52
+ fields: ['project_id^5']
55
53
  }
56
54
  },
57
55
  {
58
56
  match_phrase_prefix: {
59
- name: "COM-41853"
57
+ name: 'COM-41853'
60
58
  }
61
59
  }
62
60
  ]
@@ -91,28 +89,26 @@ describe('projectPipeline', function () {
91
89
  {
92
90
  wildcard: {
93
91
  id: {
94
- value: "*com*"
92
+ value: '*com*'
95
93
  }
96
94
  }
97
95
  },
98
96
  {
99
97
  wildcard: {
100
98
  id: {
101
- value: "*41853*"
99
+ value: '*41853*'
102
100
  }
103
101
  }
104
102
  },
105
103
  {
106
104
  multi_match: {
107
- query: "com-41853",
108
- fields: [
109
- "project_id^5"
110
- ]
105
+ query: 'com-41853',
106
+ fields: ['project_id^5']
111
107
  }
112
108
  },
113
109
  {
114
110
  match_phrase_prefix: {
115
- name: "com-41853"
111
+ name: 'com-41853'
116
112
  }
117
113
  }
118
114
  ]
@@ -120,7 +116,8 @@ describe('projectPipeline', function () {
120
116
  }
121
117
  ]
122
118
  }
123
- } },
119
+ }
120
+ },
124
121
  {
125
122
  search: '41853',
126
123
  expected: {
@@ -146,21 +143,19 @@ describe('projectPipeline', function () {
146
143
  {
147
144
  wildcard: {
148
145
  id: {
149
- value: "*41853*"
146
+ value: '*41853*'
150
147
  }
151
148
  }
152
149
  },
153
150
  {
154
151
  multi_match: {
155
- query: "41853",
156
- fields: [
157
- "project_id^5"
158
- ]
152
+ query: '41853',
153
+ fields: ['project_id^5']
159
154
  }
160
155
  },
161
156
  {
162
157
  match_phrase_prefix: {
163
- name: "41853"
158
+ name: '41853'
164
159
  }
165
160
  }
166
161
  ]
@@ -168,10 +163,11 @@ describe('projectPipeline', function () {
168
163
  }
169
164
  ]
170
165
  }
171
- } }
166
+ }
167
+ }
172
168
  ];
173
169
 
174
- entries.forEach(entry => {
170
+ entries.forEach((entry) => {
175
171
  it(`it should search Project ID correctly for ${entry.search}`, (done) => {
176
172
  const query = {
177
173
  search: entry.search
@@ -211,4 +207,70 @@ describe('projectPipeline', function () {
211
207
  });
212
208
  });
213
209
  });
210
+
211
+ describe('buildSourceParams', () => {
212
+ it('should generate es query source params', () => {
213
+ expect(projectPipeline.buildSourceParams([])).to.be.deep.equal({
214
+ _source: []
215
+ });
216
+ expect(
217
+ projectPipeline.buildSourceParams([
218
+ 'banner',
219
+ 'bca57cb8-59b0-4240-a776-9101564e1fab',
220
+ '981bf602-f636-49c6-8da2-d980064c88d7',
221
+ '11019ff2-1749-433d-83cf-51dea9cb7a7c',
222
+ 'region',
223
+ '38d423bf-fc24-4183-b8b7-15420c89e318',
224
+ '7fb0c729-478b-4c89-ae68-8d6e2360e39a',
225
+ '74496f2f-0ef5-4490-881c-c51a890c015b',
226
+ 'project_id',
227
+ '0b6852f7-826b-441a-8822-9a35e618a039',
228
+ 'c594b289-c28e-4baf-8a59-ee51bf89ea4b',
229
+ 'c0df7ba3-4f2c-4ff7-b8a7-40ad9ee65738',
230
+ 'on_hold',
231
+ 'tags',
232
+ '5bf3d5e3-2cac-42b1-a649-e98d4291ee72',
233
+ 'is_generated',
234
+ '29c629e4-82c1-4aec-a7d3-ab71390dd188',
235
+ '15ac5ffd-1830-4e18-ade6-3213690efbac',
236
+ 'criticalPathAge',
237
+ 'criticalPathStage',
238
+ 'created_at',
239
+ 'lastPulseComment',
240
+ 'lastPulseCommentUser',
241
+ 'lastPulseCommentDate',
242
+ '1c5508e9-ddd5-4dd6-8769-fabfb8752275',
243
+ 'ccd299a5-e4b3-4671-9372-493f9ea6af86',
244
+ '2abf2cb0-2c4f-4b53-926e-c04b0da21046',
245
+ 'c52a8efe-b33d-4cc0-8a35-0f63a1a20760',
246
+ 'updated_at',
247
+ '608830c0-11f2-4f79-9664-906f3fd56045',
248
+ '8d6d39d6-d2ac-4270-85e3-e62bcc098bf7',
249
+ '2acbd4b2-8242-46ec-9949-b058f783314b',
250
+ '0f56d018-547a-4481-ad91-a66f171d485e'
251
+ ])
252
+ ).to.be.deep.equal({
253
+ _source: [
254
+ 'banner',
255
+ 'region_id',
256
+ '_id',
257
+ 'on_hold',
258
+ 'tag_ids',
259
+ 'is_generated',
260
+ 'critical_path',
261
+ 'created_at',
262
+ 'last_pulse_data',
263
+ 'updated_at'
264
+ ],
265
+ script_fields: {
266
+ filtered_fields: {
267
+ script: {
268
+ source:
269
+ "\n def fieldIds = ['bca57cb8-59b0-4240-a776-9101564e1fab','981bf602-f636-49c6-8da2-d980064c88d7','11019ff2-1749-433d-83cf-51dea9cb7a7c','38d423bf-fc24-4183-b8b7-15420c89e318','7fb0c729-478b-4c89-ae68-8d6e2360e39a','74496f2f-0ef5-4490-881c-c51a890c015b','0b6852f7-826b-441a-8822-9a35e618a039','c594b289-c28e-4baf-8a59-ee51bf89ea4b','c0df7ba3-4f2c-4ff7-b8a7-40ad9ee65738','5bf3d5e3-2cac-42b1-a649-e98d4291ee72','29c629e4-82c1-4aec-a7d3-ab71390dd188','15ac5ffd-1830-4e18-ade6-3213690efbac','1c5508e9-ddd5-4dd6-8769-fabfb8752275','ccd299a5-e4b3-4671-9372-493f9ea6af86','2abf2cb0-2c4f-4b53-926e-c04b0da21046','c52a8efe-b33d-4cc0-8a35-0f63a1a20760','608830c0-11f2-4f79-9664-906f3fd56045','8d6d39d6-d2ac-4270-85e3-e62bcc098bf7','2acbd4b2-8242-46ec-9949-b058f783314b','0f56d018-547a-4481-ad91-a66f171d485e'];\n def result = [];\n for (f in params['_source']['fields']) {\n if (fieldIds.contains(f['id'])) {\n result.add(f);\n }\n }\n return result;\n "
270
+ }
271
+ }
272
+ }
273
+ });
274
+ });
275
+ });
214
276
  });
@@ -205,14 +205,14 @@ describe('taskPipeline', function () {
205
205
  {
206
206
  term: {
207
207
  organization_id: {
208
- value: "test-org"
208
+ value: 'test-org'
209
209
  }
210
210
  }
211
211
  },
212
212
  {
213
213
  term: {
214
214
  department_id: {
215
- value: "test-department"
215
+ value: 'test-department'
216
216
  }
217
217
  }
218
218
  },
@@ -228,7 +228,7 @@ describe('taskPipeline', function () {
228
228
  bool: {
229
229
  must_not: {
230
230
  exists: {
231
- field: "on_hold"
231
+ field: 'on_hold'
232
232
  }
233
233
  }
234
234
  }
@@ -379,140 +379,148 @@ describe('taskPipeline', function () {
379
379
  expect(sort).to.deep.equal([
380
380
  {
381
381
  _script: {
382
- type: "number",
382
+ type: 'number',
383
383
  script: {
384
- lang: "painless",
385
- source: "\n if (params.starredTaskIds.contains(doc._id.value)) {\n return 1;\n } else {\n return 0;\n }\n ",
384
+ lang: 'painless',
385
+ source:
386
+ '\n if (params.starredTaskIds.contains(doc._id.value)) {\n return 1;\n } else {\n return 0;\n }\n ',
386
387
  params: {
387
- starredTaskIds: [
388
- "task-1",
389
- "task-2"
390
- ]
388
+ starredTaskIds: ['task-1', 'task-2']
391
389
  }
392
390
  },
393
- order: "desc"
391
+ order: 'desc'
394
392
  }
395
393
  },
396
394
  {
397
395
  region_name: {
398
- order: "asc"
396
+ order: 'asc'
399
397
  }
400
398
  },
401
399
  {
402
400
  _script: {
403
- type: "string",
401
+ type: 'string',
404
402
  script: {
405
- lang: "painless",
406
- source: "\n try {\n String owner = doc['owner'].value;\n\n if (owner != '' && owner != null) {\n return owner.toLowerCase();\n }\n } catch (Exception err) {}\n\n return '';\n "
403
+ lang: 'painless',
404
+ source:
405
+ "\n try {\n String owner = doc['owner'].value;\n\n if (owner != '' && owner != null) {\n return owner.toLowerCase();\n }\n } catch (Exception err) {}\n\n return '';\n "
407
406
  },
408
- order: "asc"
407
+ order: 'asc'
409
408
  }
410
409
  },
411
410
  {
412
411
  _script: {
413
- type: "string",
412
+ type: 'string',
414
413
  script: {
415
- lang: "painless",
416
- source: "\n try {\n String owner = doc['owner'].value;\n\n if (owner != '' && owner != null) {\n return owner.toLowerCase();\n }\n } catch (Exception err) {}\n\n return '';\n "
414
+ lang: 'painless',
415
+ source:
416
+ "\n try {\n String owner = doc['owner'].value;\n\n if (owner != '' && owner != null) {\n return owner.toLowerCase();\n }\n } catch (Exception err) {}\n\n return '';\n "
417
417
  },
418
- order: "asc"
418
+ order: 'asc'
419
419
  }
420
420
  },
421
421
  {
422
422
  _script: {
423
- type: "string",
423
+ type: 'string',
424
424
  script: {
425
- lang: "painless",
426
- source: "\n try {\n boolean isReady = doc['is_ready'].value;\n boolean isComplete = doc['is_complete'].value;\n\n if (isReady == true) {\n if (isComplete == true) {\n return 'completed';\n }\n\n return 'pending';\n }\n\n return 'new';\n } catch (Exception err) {\n return '';\n }\n "
425
+ lang: 'painless',
426
+ source:
427
+ "\n try {\n boolean isReady = doc['is_ready'].value;\n boolean isComplete = doc['is_complete'].value;\n\n if (isReady == true) {\n if (isComplete == true) {\n return 'completed';\n }\n\n return 'pending';\n }\n\n return 'new';\n } catch (Exception err) {\n return '';\n }\n "
427
428
  },
428
- order: "desc"
429
+ order: 'desc'
429
430
  }
430
431
  },
431
432
  {
432
433
  _script: {
433
- type: "number",
434
+ type: 'number',
434
435
  script: {
435
- lang: "painless",
436
- source: "\n try {\n def stageIndex = doc['critical_path.stage_index'].value;\n if (stageIndex != null) {\n return stageIndex;\n }\n\n return 9999999;\n } catch (Exception err) {\n return 9999999;\n }\n "
436
+ lang: 'painless',
437
+ source:
438
+ "\n try {\n def stageIndex = doc['critical_path.stage_index'].value;\n if (stageIndex != null) {\n return stageIndex;\n }\n\n return 9999999;\n } catch (Exception err) {\n return 9999999;\n }\n "
437
439
  },
438
- order: "desc"
440
+ order: 'desc'
439
441
  }
440
442
  },
441
443
  {
442
444
  _script: {
443
- type: "number",
445
+ type: 'number',
444
446
  script: {
445
- lang: "painless",
446
- source: "\n def projectNumber = params._source.project_id;\n projectNumber = /[^0-9]/.matcher(projectNumber).replaceAll('');\n return Integer.parseInt(projectNumber);\n "
447
+ lang: 'painless',
448
+ source:
449
+ "\n def projectNumber = params._source.project_id;\n projectNumber = /[^0-9]/.matcher(projectNumber).replaceAll('');\n return Integer.parseInt(projectNumber);\n "
447
450
  },
448
- order: "desc"
451
+ order: 'desc'
449
452
  }
450
453
  },
451
454
  {
452
455
  _script: {
453
- type: "number",
456
+ type: 'number',
454
457
  script: {
455
- lang: "painless",
456
- source: "\n try {\n boolean isReady = doc['is_ready'].value;\n boolean isComplete = doc['is_complete'].value;\n\n if (isReady == true && isComplete == true && doc.containsKey('completed_at') && !doc['completed_at'].empty) {\n return doc['completed_at'].value.millis;\n } else if (isReady == true && doc.containsKey('ready_at') && !doc['ready_at'].empty) {\n return doc['ready_at'].value.millis;\n }\n\n return doc['created_at'].value.millis;\n } catch (Exception err) {\n return 0;\n }\n "
458
+ lang: 'painless',
459
+ source:
460
+ "\n try {\n boolean isReady = doc['is_ready'].value;\n boolean isComplete = doc['is_complete'].value;\n\n if (isReady == true && isComplete == true && doc.containsKey('completed_at') && !doc['completed_at'].empty) {\n return doc['completed_at'].value.millis;\n } else if (isReady == true && doc.containsKey('ready_at') && !doc['ready_at'].empty) {\n return doc['ready_at'].value.millis;\n }\n\n return doc['created_at'].value.millis;\n } catch (Exception err) {\n return 0;\n }\n "
457
461
  },
458
- order: "desc"
462
+ order: 'desc'
459
463
  }
460
464
  },
461
465
  {
462
466
  _script: {
463
- type: "number",
467
+ type: 'number',
464
468
  script: {
465
- lang: "painless",
466
- source: "\n return doc['was_marked_incomplete'].empty\n ? 0\n : doc['was_marked_incomplete'].value ? 1 : 0;\n "
469
+ lang: 'painless',
470
+ source:
471
+ "\n return doc['was_marked_incomplete'].empty\n ? 0\n : doc['was_marked_incomplete'].value ? 1 : 0;\n "
467
472
  },
468
- order: "desc"
473
+ order: 'desc'
469
474
  }
470
475
  },
471
476
  {
472
- "last_comment_data.created_at": {
473
- order: "desc"
477
+ 'last_comment_data.created_at': {
478
+ order: 'desc'
474
479
  }
475
480
  },
476
481
  {
477
482
  _script: {
478
- type: "number",
483
+ type: 'number',
479
484
  script: {
480
- lang: "painless",
481
- source: "\n return doc['is_paused'].empty\n ? 0\n : doc['is_paused'].value ? 1 : 0;\n "
485
+ lang: 'painless',
486
+ source:
487
+ "\n return doc['is_paused'].empty\n ? 0\n : doc['is_paused'].value ? 1 : 0;\n "
482
488
  },
483
- order: "desc"
489
+ order: 'desc'
484
490
  }
485
491
  },
486
492
  {
487
493
  _script: {
488
- type: "number",
494
+ type: 'number',
489
495
  script: {
490
- lang: "painless",
491
- source: "\n try {\n def fields = params._source.fields;\n\n for (int i=0; i<fields.size(); i++) {\n if (fields[i].id.equals(params.value)) {\n if (fields[i].number != null) {\n return fields[i].number;\n } else {\n return -999999;\n }\n }\n }\n\n return -999999;\n } catch (Exception err) {\n return -999999;\n }\n ",
496
+ lang: 'painless',
497
+ source:
498
+ '\n try {\n def fields = params._source.fields;\n\n for (int i=0; i<fields.size(); i++) {\n if (fields[i].id.equals(params.value)) {\n if (fields[i].number != null) {\n return fields[i].number;\n } else {\n return -999999;\n }\n }\n }\n\n return -999999;\n } catch (Exception err) {\n return -999999;\n }\n ',
492
499
  params: {
493
- value: "38d423bf-fc24-4183-b8b7-15420c89e318"
500
+ value: '38d423bf-fc24-4183-b8b7-15420c89e318'
494
501
  }
495
502
  },
496
- order: "desc"
503
+ order: 'desc'
497
504
  }
498
505
  },
499
506
  {
500
507
  _script: {
501
- type: "string",
508
+ type: 'string',
502
509
  script: {
503
- lang: "painless",
504
- source: "\n try {\n String textInfo = '';\n def fields = params._source.fields;\n\n for (int i=0; i<fields.size(); i++) {\n if (fields[i].id.equals(params.value)) {\n\n if (fields[i].number != null) {\n return '';\n }\n\n textInfo = fields[i].text == null ? '' : fields[i].text;\n if (fields[i].containsKey('computedText')) {\n textInfo = fields[i].computedText == null ? textInfo : fields[i].computedText;\n }\n }\n }\n\n return textInfo;\n } catch (Exception err) {\n return '';\n }\n ",
510
+ lang: 'painless',
511
+ source:
512
+ "\n try {\n String textInfo = '';\n def fields = params._source.fields;\n\n for (int i=0; i<fields.size(); i++) {\n if (fields[i].id.equals(params.value)) {\n\n if (fields[i].number != null) {\n return '';\n }\n\n textInfo = fields[i].text == null ? '' : fields[i].text;\n if (fields[i].containsKey('computedText')) {\n textInfo = fields[i].computedText == null ? textInfo : fields[i].computedText;\n }\n }\n }\n\n return textInfo;\n } catch (Exception err) {\n return '';\n }\n ",
505
513
  params: {
506
- value: "38d423bf-fc24-4183-b8b7-15420c89e318"
514
+ value: '38d423bf-fc24-4183-b8b7-15420c89e318'
507
515
  }
508
516
  },
509
- order: "desc"
517
+ order: 'desc'
510
518
  }
511
519
  },
512
520
  {
513
521
  id: {
514
- order: "desc",
515
- missing: "_last"
522
+ order: 'desc',
523
+ missing: '_last'
516
524
  }
517
525
  }
518
526
  ]);
@@ -670,4 +678,95 @@ describe('taskPipeline', function () {
670
678
  });
671
679
  });
672
680
  });
681
+
682
+ describe('buildSourceParams', () => {
683
+ it('should generate es query source params', () => {
684
+ expect(taskPipeline.buildSourceParams([])).to.be.deep.equal({
685
+ _source: []
686
+ });
687
+ expect(
688
+ taskPipeline.buildSourceParams([
689
+ 'project_id',
690
+ 'owner',
691
+ 'ready_at',
692
+ 'last_comment',
693
+ 'last_comment_date',
694
+ 'completed_at',
695
+ 'on_hold',
696
+ '3a987cf6-e9e5-47ea-850d-2a913bd3973f',
697
+ '6dcf3721-ba72-4ba7-ba35-5c9bb59cd094',
698
+ '96f07b8e-b345-4e59-a4a4-6f09b6a23977',
699
+ '80878a1d-b688-4a4e-8bdd-f0a65496b444',
700
+ 'region',
701
+ '38d423bf-fc24-4183-b8b7-15420c89e318',
702
+ '11019ff2-1749-433d-83cf-51dea9cb7a7c',
703
+ '1c5508e9-ddd5-4dd6-8769-fabfb8752275',
704
+ 'notes',
705
+ 'project_banner',
706
+ 'completed_by',
707
+ 'created_at',
708
+ 'critical_path_stage',
709
+ '5f6a8066-cc1b-4004-aead-17fc2573934f',
710
+ 'days_to_complete',
711
+ 'due_date',
712
+ 'is_starred',
713
+ 'marked_incomplete_at',
714
+ 'pending_date',
715
+ '96f54434-d08e-4178-951b-24434c4ace46',
716
+ '81ebe833-9abe-48c3-88a4-7e7abc3f7bb2',
717
+ 'a0437397-918c-49a5-93e5-46c51d72d14d',
718
+ '43f1866a-0fa4-4d39-9a1e-65ec3754efa5',
719
+ 'af31fd1b-a289-4d25-8ae4-56a81eaf214a',
720
+ '049a46cc-df47-4c49-8c80-e9f3c73363ee',
721
+ 'was_marked_incomplete',
722
+ 'c81315d1-21ab-48f7-a00f-99ca29fc02ea',
723
+ '066b8231-4689-437a-8872-a6cddabc6b8a',
724
+ '6ee1e6a6-b554-4fba-a786-2e6c49b24aba',
725
+ 'c6d14bbc-f9e8-4462-aaa8-9efafc07a7c8',
726
+ '2377f66b-f181-4452-8432-df78d875b455',
727
+ 'status',
728
+ 'updated_at',
729
+ '608830c0-11f2-4f79-9664-906f3fd56045',
730
+ '2abf2cb0-2c4f-4b53-926e-c04b0da21046',
731
+ '8d6d39d6-d2ac-4270-85e3-e62bcc098bf7',
732
+ '2acbd4b2-8242-46ec-9949-b058f783314b',
733
+ '7fb0c729-478b-4c89-ae68-8d6e2360e39a',
734
+ '18d7567f-873a-40a2-a94a-ee82242b0fa5',
735
+ '80e83585-91d3-463c-8fff-e4f0311f694f'
736
+ ])
737
+ ).to.be.deep.equal({
738
+ _source: [
739
+ 'project_id',
740
+ 'user_id',
741
+ 'team_id',
742
+ 'is_complete',
743
+ 'completed_at',
744
+ 'is_ready',
745
+ 'ready_at',
746
+ 'created_at',
747
+ 'last_comment_data',
748
+ 'on_hold',
749
+ 'region_id',
750
+ 'notes',
751
+ 'project_banner',
752
+ 'owner',
753
+ 'completed_by',
754
+ 'critical_path',
755
+ 'due_date',
756
+ 'is_starred',
757
+ 'marked_incomplete_at',
758
+ 'was_marked_incomplete',
759
+ 'updated_at'
760
+ ],
761
+ script_fields: {
762
+ filtered_fields: {
763
+ script: {
764
+ source:
765
+ "\n def fieldIds = ['3a987cf6-e9e5-47ea-850d-2a913bd3973f','6dcf3721-ba72-4ba7-ba35-5c9bb59cd094','96f07b8e-b345-4e59-a4a4-6f09b6a23977','80878a1d-b688-4a4e-8bdd-f0a65496b444','38d423bf-fc24-4183-b8b7-15420c89e318','11019ff2-1749-433d-83cf-51dea9cb7a7c','1c5508e9-ddd5-4dd6-8769-fabfb8752275','5f6a8066-cc1b-4004-aead-17fc2573934f','96f54434-d08e-4178-951b-24434c4ace46','81ebe833-9abe-48c3-88a4-7e7abc3f7bb2','a0437397-918c-49a5-93e5-46c51d72d14d','43f1866a-0fa4-4d39-9a1e-65ec3754efa5','af31fd1b-a289-4d25-8ae4-56a81eaf214a','049a46cc-df47-4c49-8c80-e9f3c73363ee','c81315d1-21ab-48f7-a00f-99ca29fc02ea','066b8231-4689-437a-8872-a6cddabc6b8a','6ee1e6a6-b554-4fba-a786-2e6c49b24aba','c6d14bbc-f9e8-4462-aaa8-9efafc07a7c8','2377f66b-f181-4452-8432-df78d875b455','608830c0-11f2-4f79-9664-906f3fd56045','2abf2cb0-2c4f-4b53-926e-c04b0da21046','8d6d39d6-d2ac-4270-85e3-e62bcc098bf7','2acbd4b2-8242-46ec-9949-b058f783314b','7fb0c729-478b-4c89-ae68-8d6e2360e39a','18d7567f-873a-40a2-a94a-ee82242b0fa5','80e83585-91d3-463c-8fff-e4f0311f694f'];\n def result = [];\n for (f in params['_source']['fields']) {\n if (fieldIds.contains(f['id'])) {\n result.add(f);\n }\n }\n return result;\n "
766
+ }
767
+ }
768
+ }
769
+ });
770
+ });
771
+ });
673
772
  });