diff --git a/x-pack/plugins/ml/server/models/job_validation/__tests__/job_validation.js b/x-pack/plugins/ml/server/models/job_validation/__tests__/job_validation.js index 46a47f4de979..d11a07e85541 100644 --- a/x-pack/plugins/ml/server/models/job_validation/__tests__/job_validation.js +++ b/x-pack/plugins/ml/server/models/job_validation/__tests__/job_validation.js @@ -291,6 +291,40 @@ describe('ML - validateJob', () => { ); }); + it('categorization job using mlcategory passes aggregatable field check', () => { + const payload = { + job: { + job_id: 'categorization_test', + analysis_config: { + bucket_span: '15m', + detectors: [{ + function: 'count', + by_field_name: 'mlcategory' + }], + categorization_field_name: 'message_text', + influencers: [] + }, + data_description: { time_field: '@timestamp' }, + datafeed_config: { indices: [] } + }, + fields: { testField: {} } + }; + + return validateJob(callWithRequest, payload).then( + (messages) => { + const ids = messages.map(m => m.id); + expect(ids).to.eql([ + 'job_id_valid', + 'detectors_function_not_empty', + 'index_fields_valid', + 'success_cardinality', + 'time_field_invalid', + 'influencer_low_suggestion' + ]); + } + ); + }); + // the following two tests validate the correct template rendering of // urls in messages with {{version}} in them to be replaced with the // specified version. (defaulting to 'current') diff --git a/x-pack/plugins/ml/server/models/job_validation/validate_cardinality.js b/x-pack/plugins/ml/server/models/job_validation/validate_cardinality.js index dc6e4166b0c7..0cee9d888556 100644 --- a/x-pack/plugins/ml/server/models/job_validation/validate_cardinality.js +++ b/x-pack/plugins/ml/server/models/job_validation/validate_cardinality.js @@ -65,10 +65,17 @@ const validateFactory = (callWithRequest, job) => { }); } } else { - messages.push({ - id: 'field_not_aggregatable', - fieldName: uniqueFieldName - }); + // when the job is using categorization and the field name is set to 'mlcategory', + // then don't report the field as not being able to be aggregated. + if (!( + typeof job.analysis_config.categorization_field_name !== 'undefined' && + uniqueFieldName === 'mlcategory' + )) { + messages.push({ + id: 'field_not_aggregatable', + fieldName: uniqueFieldName + }); + } } }); } catch (e) {