teraslice 3.0.0 → 3.1.0

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.
@@ -6,7 +6,7 @@ import { RecoveryCleanupType } from '@terascope/job-components';
6
6
  import { parseErrorInfo, parseList, logError, TSError, startsWith, pWhile, isKey } from '@terascope/core-utils';
7
7
  import { ExecutionStatusEnum } from '@terascope/types';
8
8
  import { makeLogger } from '../../workers/helpers/terafoundation.js';
9
- import { makeTable, sendError, handleTerasliceRequest, getSearchOptions, createJobActiveQuery, addDeletedToQuery } from '../../utils/api_utils.js';
9
+ import { makeTable, sendError, handleTerasliceRequest, getSearchOptions, createJobActiveQuery, addDeletedToQuery, addFilterToQuery } from '../../utils/api_utils.js';
10
10
  import { getPackageJSON } from '../../utils/file_utils.js';
11
11
  const terasliceVersion = getPackageJSON().version;
12
12
  function validateCleanupType(cleanupType) {
@@ -221,12 +221,13 @@ export class ApiService {
221
221
  });
222
222
  v1routes.get('/jobs', (req, res) => {
223
223
  const { active = '', deleted = 'false', ex } = req.query;
224
- const { size, from, sort } = getSearchOptions(req);
224
+ const { size, from, sort, filter } = getSearchOptions(req);
225
225
  const requestHandler = handleTerasliceRequest(req, res, 'Could not retrieve list of jobs');
226
226
  requestHandler(() => {
227
227
  validateGetDeletedOption(deleted);
228
- const partialQuery = createJobActiveQuery(active);
229
- const query = addDeletedToQuery(deleted, partialQuery);
228
+ let partialQuery = createJobActiveQuery(active);
229
+ partialQuery = addDeletedToQuery(deleted, partialQuery);
230
+ const query = addFilterToQuery(partialQuery, filter);
230
231
  return typeof ex === 'string'
231
232
  ? this.jobsService.getJobsWithExInfo(query, from, size, sort, ex.split(','))
232
233
  : this.jobsStorage.search(query, from, size, sort);
@@ -356,21 +357,20 @@ export class ApiService {
356
357
  });
357
358
  v1routes.get([
358
359
  '/jobs/:jobId/errors',
359
- '/jobs/:jobId/errors/:exId',
360
360
  '/ex/:exId/errors',
361
361
  '/ex/errors',
362
362
  ], (req, res) => {
363
- const { size, from, sort } = getSearchOptions(req);
363
+ const { size, from, sort, filter } = getSearchOptions(req);
364
364
  const requestHandler = handleTerasliceRequest(req, res, 'Could not get errors for job');
365
365
  requestHandler(async () => {
366
366
  const exId = await this._getExIdFromRequest(req, true);
367
- const query = `state:error AND ex_id:"${exId}"`;
367
+ const query = addFilterToQuery(`state:error AND ex_id:"${exId}"`, filter);
368
368
  return this.stateStorage.search(query, from, size, sort);
369
369
  });
370
370
  });
371
371
  v1routes.get('/ex', (req, res) => {
372
372
  const { status = '', deleted = 'false' } = req.query;
373
- const { size, from, sort } = getSearchOptions(req);
373
+ const { size, from, sort, filter } = getSearchOptions(req);
374
374
  const requestHandler = handleTerasliceRequest(req, res, 'Could not retrieve list of execution contexts');
375
375
  requestHandler(async () => {
376
376
  validateGetDeletedOption(deleted);
@@ -380,7 +380,8 @@ export class ApiService {
380
380
  const statusTerms = statuses.map((s) => `_status:"${s}"`).join(' OR ');
381
381
  partialQuery += ` AND (${statusTerms})`;
382
382
  }
383
- const query = addDeletedToQuery(deleted, partialQuery);
383
+ partialQuery = addDeletedToQuery(deleted, partialQuery);
384
+ const query = addFilterToQuery(partialQuery, filter);
384
385
  return this.executionStorage.search(query, from, size, sort);
385
386
  });
386
387
  });
@@ -439,7 +440,7 @@ export class ApiService {
439
440
  });
440
441
  this.app.get('/txt/jobs', (req, res) => {
441
442
  const { active = '', deleted = 'false' } = req.query;
442
- const { size, from, sort } = getSearchOptions(req);
443
+ const { size, from, sort, filter } = getSearchOptions(req);
443
444
  const defaults = ['job_id', 'name', 'active', 'lifecycle', 'slicers', 'workers', '_created', '_updated'];
444
445
  const requestHandler = handleTerasliceRequest(req, res, 'Could not get all jobs');
445
446
  requestHandler(async () => {
@@ -447,15 +448,16 @@ export class ApiService {
447
448
  if (deleted !== 'false') {
448
449
  defaults.push('_deleted_on');
449
450
  }
450
- const partialQuery = createJobActiveQuery(active);
451
- const query = addDeletedToQuery(deleted, partialQuery);
451
+ let partialQuery = createJobActiveQuery(active);
452
+ partialQuery = addDeletedToQuery(deleted, partialQuery);
453
+ const query = addFilterToQuery(partialQuery, filter);
452
454
  const jobs = await this.jobsStorage.search(query, from, size, sort);
453
455
  return makeTable(req, defaults, jobs);
454
456
  });
455
457
  });
456
458
  this.app.get('/txt/ex', (req, res) => {
457
459
  const { deleted = 'false' } = req.query;
458
- const { size, from, sort } = getSearchOptions(req);
460
+ const { size, from, sort, filter } = getSearchOptions(req);
459
461
  const defaults = ['name', 'lifecycle', 'slicers', 'workers', '_status', 'ex_id', 'job_id', '_created', '_updated'];
460
462
  const requestHandler = handleTerasliceRequest(req, res, 'Could not get all executions');
461
463
  requestHandler(async () => {
@@ -463,8 +465,9 @@ export class ApiService {
463
465
  if (deleted !== 'false') {
464
466
  defaults.push('_deleted_on');
465
467
  }
466
- const partialQuery = 'ex_id:*';
467
- const query = addDeletedToQuery(deleted, partialQuery);
468
+ let partialQuery = 'ex_id:*';
469
+ partialQuery = addDeletedToQuery(deleted, partialQuery);
470
+ const query = addFilterToQuery(partialQuery, filter);
468
471
  const exs = await this.executionStorage.search(query, from, size, sort);
469
472
  return makeTable(req, defaults, exs);
470
473
  });
@@ -90,7 +90,8 @@ export function getSearchOptions(req, defaultSort = '_updated:desc') {
90
90
  const sort = req.query.sort || defaultSort;
91
91
  const size = parseQueryInt(req, 'size', 100);
92
92
  const from = parseQueryInt(req, 'from', 0);
93
- return { size, from, sort };
93
+ const filter = req.query.filter || '';
94
+ return { size, from, sort, filter };
94
95
  }
95
96
  export function logTerasliceRequest(req) {
96
97
  const queryInfo = Object.entries(req.query)
@@ -114,4 +115,14 @@ export function addDeletedToQuery(deleted, query) {
114
115
  }
115
116
  return `${query} AND _deleted:true`;
116
117
  }
118
+ /**
119
+ * Combines a base query from an endpoint with an optional filter using AND from lucene.
120
+ * @param query - The base Lucene query string
121
+ * @param filter - Optional filter query to append. getSearchOptions() will return an empty string
122
+ * if no filter is present.
123
+ * @returns The combined query, or original query if filter is empty
124
+ */
125
+ export function addFilterToQuery(query, filter) {
126
+ return filter ? `(${query}) AND (${filter})` : query;
127
+ }
117
128
  //# sourceMappingURL=api_utils.js.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "teraslice",
3
3
  "displayName": "Teraslice",
4
- "version": "3.0.0",
4
+ "version": "3.1.0",
5
5
  "description": "Distributed computing platform for processing JSON data",
6
6
  "homepage": "https://github.com/terascope/teraslice#readme",
7
7
  "bugs": {
@@ -62,7 +62,8 @@
62
62
  "semver": "~7.7.2",
63
63
  "socket.io": "~4.8.1",
64
64
  "socket.io-client": "~4.8.1",
65
- "terafoundation": "~2.0.0",
65
+ "terafoundation": "~2.0.1",
66
+ "terafoundation_kafka_connector": "~2.0.0",
66
67
  "uuid": "~13.0.0"
67
68
  },
68
69
  "devDependencies": {