@outliant/sunrise-utils 1.2.1 → 1.2.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "editor.formatOnSave": true,
3
3
  "editor.codeActionsOnSave": {
4
- "source.fixAll.eslint": true,
5
- "source.organizeImports": false
4
+ "source.fixAll.eslint": "explicit",
5
+ "source.organizeImports": "never"
6
6
  }
7
7
  }
package/CHANGELOG.md CHANGED
@@ -4,8 +4,22 @@ 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.3](https://github.com/outliant/sunrise-utils/compare/1.2.2...1.2.3)
8
+
9
+ - chore: updated pause column department validator #86b29g6de [`5fb0258`](https://github.com/outliant/sunrise-utils/commit/5fb025812f3a92c34d4dc733e9454a466f9148a1)
10
+
11
+ #### [1.2.2](https://github.com/outliant/sunrise-utils/compare/1.2.1...1.2.2)
12
+
13
+ > 26 September 2024
14
+
15
+ - chore: pipeline improvements #86b27p240 [`911f6dd`](https://github.com/outliant/sunrise-utils/commit/911f6dd7bdf2e26986aec0671d1610d18ebe5cfc)
16
+ - chore(release): 1.2.2 [`1683047`](https://github.com/outliant/sunrise-utils/commit/1683047141b96f4c47c95aaf9e22dddd92526aeb)
17
+
7
18
  #### [1.2.1](https://github.com/outliant/sunrise-utils/compare/1.2.0...1.2.1)
8
19
 
20
+ > 7 September 2024
21
+
22
+ - chore(release): 1.2.1 [`a10f2ea`](https://github.com/outliant/sunrise-utils/commit/a10f2ea60e39f40de1a9d5a33372e9209e53c935)
9
23
  - chore: add credit-hold for project banners options [`94669b7`](https://github.com/outliant/sunrise-utils/commit/94669b7ba216596f5fb413d96a8a9dc466ca0c1e)
10
24
 
11
25
  #### [1.2.0](https://github.com/outliant/sunrise-utils/compare/1.1.32...1.2.0)
@@ -14,34 +14,40 @@ 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
- validate: (validator) => validator && validator.isCommercial(),
49
+ validate: (validator) =>
50
+ validator && (validator.isCommercial() || validator.isService()),
45
51
  name: 'Is Paused',
46
52
  value: 'is_paused',
47
53
  type: 'is_paused',
@@ -55,56 +61,65 @@ module.exports.defaultCustomColumns = [
55
61
  label: 'No',
56
62
  value: 'No'
57
63
  }
58
- ]
64
+ ],
65
+ select_fields: ['is_paused']
59
66
  },
60
67
  {
61
68
  name: 'Is Generated',
62
69
  value: 'is_generated',
63
70
  type: 'is_generated',
64
- field_type: 'select'
71
+ field_type: 'select',
72
+ select_fields: ['is_generated']
65
73
  },
66
74
  {
67
75
  name: 'Project ID',
68
76
  value: 'project_id',
69
77
  type: 'project_id',
70
- field_type: 'text'
78
+ field_type: 'text',
79
+ select_fields: ['_id']
71
80
  },
72
81
  {
73
82
  name: 'Last Pulse Comment',
74
83
  value: 'lastPulseComment',
75
84
  type: 'lastPulseComment',
76
- field_type: 'textarea'
85
+ field_type: 'textarea',
86
+ select_fields: ['last_pulse_data']
77
87
  },
78
88
  {
79
89
  name: 'Last Pulse Comment User',
80
90
  value: 'lastPulseCommentUser',
81
91
  type: 'lastPulseCommentUser',
82
- field_type: 'select'
92
+ field_type: 'select',
93
+ select_fields: ['last_pulse_data']
83
94
  },
84
95
  {
85
96
  name: 'Last Pulse Comment Date',
86
97
  value: 'lastPulseCommentDate',
87
98
  type: 'lastPulseCommentDate',
88
- field_type: 'date'
99
+ field_type: 'date',
100
+ select_fields: ['last_pulse_data']
89
101
  },
90
102
  {
91
103
  name: 'Created',
92
104
  value: 'created_at',
93
105
  type: 'created_at',
94
- field_type: 'date'
106
+ field_type: 'date',
107
+ select_fields: ['created_at']
95
108
  },
96
109
  {
97
110
  name: 'Updated',
98
111
  value: 'updated_at',
99
112
  type: 'updated_at',
100
- field_type: 'date'
113
+ field_type: 'date',
114
+ select_fields: ['updated_at']
101
115
  },
102
116
  {
103
117
  name: 'Banners',
104
118
  value: 'banner',
105
119
  type: 'banner',
106
120
  field_type: 'checkbox',
107
- options: PROJECT_BANNERS
121
+ options: PROJECT_BANNERS,
122
+ select_fields: ['banner']
108
123
  }
109
124
  ];
110
125
 
@@ -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
+ };
@@ -35,7 +35,8 @@ module.exports.taskStatusOptions = [
35
35
  value: 'overdue'
36
36
  },
37
37
  {
38
- validate: (validator) => validator && validator.isCommercial(),
38
+ validate: (validator) =>
39
+ validator && (validator.isCommercial() || validator.isService()),
39
40
  label: 'Paused',
40
41
  value: 'paused'
41
42
  }
@@ -66,51 +67,65 @@ module.exports.defaultCustomColumns = [
66
67
  value: 'owner',
67
68
  type: 'owner',
68
69
  field_type: 'select',
69
- options: []
70
+ options: [],
71
+ select_fields: ['user_id', 'team_id']
70
72
  },
71
73
  {
72
74
  name: 'Age',
73
75
  value: 'ready_at',
74
76
  type: 'ready_at',
75
- field_type: 'date'
77
+ field_type: 'date',
78
+ select_fields: [
79
+ 'is_complete',
80
+ 'completed_at',
81
+ 'is_ready',
82
+ 'ready_at',
83
+ 'created_at'
84
+ ]
76
85
  },
77
86
  {
78
87
  name: 'Days to Complete',
79
88
  value: 'days_to_complete',
80
89
  type: 'days_to_complete',
81
- field_type: 'number'
90
+ field_type: 'number',
91
+ select_fields: ['ready_at', 'completed_at']
82
92
  },
83
93
  {
84
94
  name: 'Pending Date',
85
95
  value: 'pending_date',
86
96
  type: 'pending_date',
87
- field_type: 'date'
97
+ field_type: 'date',
98
+ select_fields: ['ready_at']
88
99
  },
89
100
  {
90
101
  name: 'Project ID',
91
102
  value: 'project_id',
92
103
  type: 'project_id',
93
- field_type: 'text'
104
+ field_type: 'text',
105
+ select_fields: ['project_id']
94
106
  },
95
107
  {
96
108
  name: 'Status',
97
109
  value: 'status',
98
110
  type: 'status',
99
111
  field_type: 'select',
100
- options: []
112
+ options: [],
113
+ select_fields: ['is_complete', 'is_ready']
101
114
  },
102
115
  {
103
116
  name: 'Region',
104
117
  value: 'region',
105
118
  type: 'region',
106
119
  field_type: 'checkbox',
107
- options: []
120
+ options: [],
121
+ select_fields: ['region_id']
108
122
  },
109
123
  {
110
124
  name: 'Description',
111
125
  value: 'notes',
112
126
  type: 'notes',
113
- field_type: 'textarea'
127
+ field_type: 'textarea',
128
+ select_fields: ['notes']
114
129
  },
115
130
  {
116
131
  name: 'Cancelled',
@@ -126,10 +141,12 @@ module.exports.defaultCustomColumns = [
126
141
  label: 'No',
127
142
  value: 'No'
128
143
  }
129
- ]
144
+ ],
145
+ select_fields: ['on_hold']
130
146
  },
131
147
  {
132
- validate: (validator) => validator && validator.isCommercial(),
148
+ validate: (validator) =>
149
+ validator && (validator.isCommercial() || validator.isService()),
133
150
  name: 'Is Paused',
134
151
  value: 'is_paused',
135
152
  type: 'is_paused',
@@ -143,57 +160,66 @@ module.exports.defaultCustomColumns = [
143
160
  label: 'No',
144
161
  value: 'No'
145
162
  }
146
- ]
163
+ ],
164
+ select_fields: ['is_paused']
147
165
  },
148
166
  {
149
167
  name: 'Last Comment',
150
168
  value: 'last_comment',
151
169
  type: 'last_comment',
152
- field_type: 'textarea'
170
+ field_type: 'textarea',
171
+ select_fields: ['last_comment_data']
153
172
  },
154
173
  {
155
174
  name: 'Last Comment Date',
156
175
  value: 'last_comment_date',
157
176
  type: 'last_comment_date',
158
- field_type: 'date'
177
+ field_type: 'date',
178
+ select_fields: ['last_comment_data']
159
179
  },
160
180
  {
161
181
  name: 'Due Date',
162
182
  value: 'due_date',
163
183
  type: 'due_date',
164
- field_type: 'date'
184
+ field_type: 'date',
185
+ select_fields: ['due_date']
165
186
  },
166
187
  {
167
188
  name: 'Completed By',
168
189
  value: 'completed_by',
169
190
  type: 'completed_by',
170
191
  field_type: 'select',
171
- options: []
192
+ options: [],
193
+ select_fields: ['owner', 'completed_by']
172
194
  },
173
195
  {
174
196
  name: 'Completed At',
175
197
  value: 'completed_at',
176
198
  type: 'completed_at',
177
- field_type: 'date'
199
+ field_type: 'date',
200
+ select_fields: ['completed_at']
178
201
  },
179
202
  {
180
203
  name: 'Created',
181
204
  value: 'created_at',
182
205
  type: 'created_at',
183
- field_type: 'date'
206
+ field_type: 'date',
207
+ select_fields: ['created_at']
184
208
  },
185
209
  {
186
210
  name: 'Updated',
187
211
  value: 'updated_at',
188
212
  type: 'updated_at',
189
- field_type: 'date'
213
+ field_type: 'date',
214
+ select_fields: ['updated_at']
190
215
  },
191
216
  {
192
217
  name: 'Critical Path Stage',
193
218
  value: 'critical_path_stage',
194
219
  type: 'critical_path_stage',
195
220
  field_type: 'select',
196
- options: []
221
+ options: [],
222
+ select_fields: ['critical_path']
197
223
  },
198
224
  {
199
225
  name: 'Was Marked Incomplete',
@@ -209,26 +235,30 @@ module.exports.defaultCustomColumns = [
209
235
  label: 'No',
210
236
  value: 'No'
211
237
  }
212
- ]
238
+ ],
239
+ select_fields: ['was_marked_incomplete']
213
240
  },
214
241
  {
215
242
  name: 'Marked Incomplete At',
216
243
  value: 'marked_incomplete_at',
217
244
  type: 'marked_incomplete_at',
218
- field_type: 'date'
245
+ field_type: 'date',
246
+ select_fields: ['marked_incomplete_at']
219
247
  },
220
248
  {
221
249
  name: 'Banners',
222
250
  value: 'project_banner',
223
251
  type: 'project_banner',
224
252
  field_type: 'checkbox',
225
- options: PROJECT_BANNERS
253
+ options: PROJECT_BANNERS,
254
+ select_fields: ['project_banner']
226
255
  },
227
256
  {
228
257
  name: 'Is Starred',
229
258
  value: 'is_starred',
230
259
  type: 'is_starred',
231
- field_type: 'boolean'
260
+ field_type: 'boolean',
261
+ select_fields: ['is_starred']
232
262
  }
233
263
  ];
234
264
 
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.3",
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
  });