Skip to content

Commit b2a5409

Browse files
committed
[ML] Adds support for a global calendar via _all (elastic#50372)
This adds `_all` to Calendar searches. This enables users to supply the `_all` string in the `job_ids` array when creating a Calendar. That calendar will now be applied to all jobs (existing and newly created). Closes elastic#45013
1 parent 8fb9bed commit b2a5409

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/ScheduledEventsIT.java

+49-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package org.elasticsearch.xpack.ml.integration;
77

88
import org.elasticsearch.action.search.SearchResponse;
9+
import org.elasticsearch.cluster.metadata.MetaData;
910
import org.elasticsearch.common.unit.TimeValue;
1011
import org.elasticsearch.index.query.QueryBuilders;
1112
import org.elasticsearch.search.SearchHit;
@@ -335,7 +336,54 @@ public void testAddOpenedJobToGroupWithCalendar() throws Exception {
335336
assertEquals(0, buckets.get(8).getScheduledEvents().size());
336337
}
337338

338-
private Job.Builder createJob(String jobId, TimeValue bucketSpan) {
339+
/**
340+
* An open job that later gets added to a calendar, should take the scheduled events into account
341+
*/
342+
public void testNewJobWithGlobalCalendar() throws Exception {
343+
String calendarId = "test-global-calendar";
344+
345+
// Create a new calendar referencing groupName
346+
putCalendar(calendarId, Collections.singletonList(MetaData.ALL), "testNewJobWithGlobalCalendar calendar");
347+
348+
long startTime = 1514764800000L;
349+
final int bucketCount = 3;
350+
TimeValue bucketSpan = TimeValue.timeValueMinutes(30);
351+
352+
// Put events in the calendar
353+
List<ScheduledEvent> events = new ArrayList<>();
354+
long eventStartTime = startTime;
355+
long eventEndTime = eventStartTime + (long) (1.5 * bucketSpan.millis());
356+
events.add(new ScheduledEvent.Builder().description("Some Event")
357+
.startTime((Instant.ofEpochMilli(eventStartTime)))
358+
.endTime((Instant.ofEpochMilli(eventEndTime)))
359+
.calendarId(calendarId).build());
360+
361+
postScheduledEvents(calendarId, events);
362+
363+
Job.Builder job = createJob("scheduled-events-add-to-new-job--with-global-calendar", bucketSpan);
364+
365+
// Open the job
366+
openJob(job.getId());
367+
368+
// write some buckets of data
369+
postData(job.getId(), generateData(startTime, bucketSpan, bucketCount + 1, bucketIndex -> randomIntBetween(100, 200))
370+
.stream().collect(Collectors.joining()));
371+
372+
// and close
373+
closeJob(job.getId());
374+
375+
GetBucketsAction.Request getBucketsRequest = new GetBucketsAction.Request(job.getId());
376+
List<Bucket> buckets = getBuckets(getBucketsRequest);
377+
378+
// 1st and 2nd buckets have the event but the last one does not
379+
assertEquals(1, buckets.get(0).getScheduledEvents().size());
380+
assertEquals("Some Event", buckets.get(0).getScheduledEvents().get(0));
381+
assertEquals(1, buckets.get(1).getScheduledEvents().size());
382+
assertEquals("Some Event", buckets.get(1).getScheduledEvents().get(0));
383+
assertEquals(0, buckets.get(2).getScheduledEvents().size());
384+
}
385+
386+
private Job.Builder createJob(String jobId, TimeValue bucketSpan) {
339387
Detector.Builder detector = new Detector.Builder("count", null);
340388
AnalysisConfig.Builder analysisConfig = new AnalysisConfig.Builder(Collections.singletonList(detector.build()));
341389
analysisConfig.setBucketSpan(bucketSpan);

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/persistence/CalendarQueryBuilder.java

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
package org.elasticsearch.xpack.ml.job.persistence;
77

8+
import org.elasticsearch.cluster.metadata.MetaData;
89
import org.elasticsearch.index.query.BoolQueryBuilder;
910
import org.elasticsearch.index.query.QueryBuilder;
1011
import org.elasticsearch.index.query.TermsQueryBuilder;
@@ -66,6 +67,7 @@ public SearchSourceBuilder build() {
6667
}
6768

6869
if (jobIdAndGroups.isEmpty() == false) {
70+
jobIdAndGroups.add(MetaData.ALL);
6971
qb = new BoolQueryBuilder()
7072
.filter(new TermsQueryBuilder(Calendar.TYPE.getPreferredName(), Calendar.CALENDAR_TYPE))
7173
.filter(new TermsQueryBuilder(Calendar.JOB_IDS.getPreferredName(), jobIdAndGroups));

0 commit comments

Comments
 (0)