1111import org .elasticsearch .common .io .stream .Writeable ;
1212import org .elasticsearch .common .xcontent .ToXContentObject ;
1313import org .elasticsearch .common .xcontent .XContentBuilder ;
14+ import org .elasticsearch .search .aggregations .bucket .histogram .DateHistogramAggregationBuilder ;
15+ import org .elasticsearch .search .aggregations .bucket .histogram .HistogramAggregationBuilder ;
16+ import org .elasticsearch .search .aggregations .bucket .terms .TermsAggregationBuilder ;
17+ import org .elasticsearch .xpack .core .rollup .job .DateHistogramGroupConfig ;
18+ import org .elasticsearch .xpack .core .rollup .job .GroupConfig ;
19+ import org .elasticsearch .xpack .core .rollup .job .HistogramGroupConfig ;
20+ import org .elasticsearch .xpack .core .rollup .job .MetricConfig ;
1421import org .elasticsearch .xpack .core .rollup .job .RollupJobConfig ;
22+ import org .elasticsearch .xpack .core .rollup .job .TermsGroupConfig ;
1523
1624import java .io .IOException ;
1725import java .util .ArrayList ;
18- import java .util .Arrays ;
26+ import java .util .Collections ;
1927import java .util .HashMap ;
2028import java .util .List ;
2129import java .util .Map ;
2230import java .util .Objects ;
31+ import java .util .stream .Collectors ;
32+
33+ import static java .util .Collections .singletonMap ;
2334
2435/**
2536 * Represents the Rollup capabilities for a specific job on a single rollup index
@@ -42,52 +53,7 @@ public RollupJobCaps(RollupJobConfig job) {
4253 jobID = job .getId ();
4354 rollupIndex = job .getRollupIndex ();
4455 indexPattern = job .getIndexPattern ();
45- Map <String , Object > dateHistoAggCap = job .getGroupConfig ().getDateHistogram ().toAggCap ();
46- String dateField = job .getGroupConfig ().getDateHistogram ().getField ();
47- RollupFieldCaps fieldCaps = fieldCapLookup .get (dateField );
48- if (fieldCaps == null ) {
49- fieldCaps = new RollupFieldCaps ();
50- }
51- fieldCaps .addAgg (dateHistoAggCap );
52- fieldCapLookup .put (dateField , fieldCaps );
53-
54- if (job .getGroupConfig ().getHistogram () != null ) {
55- Map <String , Object > histoAggCap = job .getGroupConfig ().getHistogram ().toAggCap ();
56- Arrays .stream (job .getGroupConfig ().getHistogram ().getFields ()).forEach (field -> {
57- RollupFieldCaps caps = fieldCapLookup .get (field );
58- if (caps == null ) {
59- caps = new RollupFieldCaps ();
60- }
61- caps .addAgg (histoAggCap );
62- fieldCapLookup .put (field , caps );
63- });
64- }
65-
66- if (job .getGroupConfig ().getTerms () != null ) {
67- Map <String , Object > histoAggCap = job .getGroupConfig ().getTerms ().toAggCap ();
68- Arrays .stream (job .getGroupConfig ().getTerms ().getFields ()).forEach (field -> {
69- RollupFieldCaps caps = fieldCapLookup .get (field );
70- if (caps == null ) {
71- caps = new RollupFieldCaps ();
72- }
73- caps .addAgg (histoAggCap );
74- fieldCapLookup .put (field , caps );
75- });
76- }
77-
78- if (job .getMetricsConfig ().size () > 0 ) {
79- job .getMetricsConfig ().forEach (metricConfig -> {
80- List <Map <String , Object >> metrics = metricConfig .toAggCap ();
81- metrics .forEach (m -> {
82- RollupFieldCaps caps = fieldCapLookup .get (metricConfig .getField ());
83- if (caps == null ) {
84- caps = new RollupFieldCaps ();
85- }
86- caps .addAgg (m );
87- fieldCapLookup .put (metricConfig .getField (), caps );
88- });
89- });
90- }
56+ fieldCapLookup = createRollupFieldCaps (job );
9157 }
9258
9359 public RollupJobCaps (StreamInput in ) throws IOException {
@@ -149,15 +115,86 @@ public boolean equals(Object other) {
149115 RollupJobCaps that = (RollupJobCaps ) other ;
150116
151117 return Objects .equals (this .jobID , that .jobID )
152- && Objects .equals (this .rollupIndex , that .rollupIndex )
153- && Objects .equals (this .fieldCapLookup , that .fieldCapLookup );
118+ && Objects .equals (this .rollupIndex , that .rollupIndex )
119+ && Objects .equals (this .fieldCapLookup , that .fieldCapLookup );
154120 }
155121
156122 @ Override
157123 public int hashCode () {
158124 return Objects .hash (jobID , rollupIndex , fieldCapLookup );
159125 }
160126
127+ static Map <String , RollupFieldCaps > createRollupFieldCaps (final RollupJobConfig rollupJobConfig ) {
128+ final Map <String , RollupFieldCaps > fieldCapLookup = new HashMap <>();
129+
130+ final GroupConfig groupConfig = rollupJobConfig .getGroupConfig ();
131+ if (groupConfig != null ) {
132+ // Create RollupFieldCaps for the date histogram
133+ final DateHistogramGroupConfig dateHistogram = groupConfig .getDateHistogram ();
134+ final Map <String , Object > dateHistogramAggCap = new HashMap <>();
135+ dateHistogramAggCap .put ("agg" , DateHistogramAggregationBuilder .NAME );
136+ dateHistogramAggCap .put (DateHistogramGroupConfig .INTERVAL , dateHistogram .getInterval ().toString ());
137+ if (dateHistogram .getDelay () != null ) {
138+ dateHistogramAggCap .put (DateHistogramGroupConfig .DELAY , dateHistogram .getDelay ().toString ());
139+ }
140+ dateHistogramAggCap .put (DateHistogramGroupConfig .TIME_ZONE , dateHistogram .getTimeZone ());
141+
142+ final RollupFieldCaps dateHistogramFieldCaps = new RollupFieldCaps ();
143+ dateHistogramFieldCaps .addAgg (dateHistogramAggCap );
144+ fieldCapLookup .put (dateHistogram .getField (), dateHistogramFieldCaps );
145+
146+ // Create RollupFieldCaps for the histogram
147+ final HistogramGroupConfig histogram = groupConfig .getHistogram ();
148+ if (histogram != null ) {
149+ final Map <String , Object > histogramAggCap = new HashMap <>();
150+ histogramAggCap .put ("agg" , HistogramAggregationBuilder .NAME );
151+ histogramAggCap .put (HistogramGroupConfig .INTERVAL , histogram .getInterval ());
152+ for (String field : histogram .getFields ()) {
153+ RollupFieldCaps caps = fieldCapLookup .get (field );
154+ if (caps == null ) {
155+ caps = new RollupFieldCaps ();
156+ }
157+ caps .addAgg (histogramAggCap );
158+ fieldCapLookup .put (field , caps );
159+ }
160+ }
161+
162+ // Create RollupFieldCaps for the term
163+ final TermsGroupConfig terms = groupConfig .getTerms ();
164+ if (terms != null ) {
165+ final Map <String , Object > termsAggCap = singletonMap ("agg" , TermsAggregationBuilder .NAME );
166+ for (String field : terms .getFields ()) {
167+ RollupFieldCaps caps = fieldCapLookup .get (field );
168+ if (caps == null ) {
169+ caps = new RollupFieldCaps ();
170+ }
171+ caps .addAgg (termsAggCap );
172+ fieldCapLookup .put (field , caps );
173+ }
174+ }
175+ }
176+
177+ // Create RollupFieldCaps for the metrics
178+ final List <MetricConfig > metricsConfig = rollupJobConfig .getMetricsConfig ();
179+ if (metricsConfig .size () > 0 ) {
180+ metricsConfig .forEach (metricConfig -> {
181+ final List <Map <String , Object >> metrics = metricConfig .getMetrics ().stream ()
182+ .map (metric -> singletonMap ("agg" , (Object ) metric ))
183+ .collect (Collectors .toList ());
184+
185+ metrics .forEach (m -> {
186+ RollupFieldCaps caps = fieldCapLookup .get (metricConfig .getField ());
187+ if (caps == null ) {
188+ caps = new RollupFieldCaps ();
189+ }
190+ caps .addAgg (m );
191+ fieldCapLookup .put (metricConfig .getField (), caps );
192+ });
193+ });
194+ }
195+ return Collections .unmodifiableMap (fieldCapLookup );
196+ }
197+
161198 public static class RollupFieldCaps implements Writeable , ToXContentObject {
162199 private List <Map <String , Object >> aggs = new ArrayList <>();
163200
0 commit comments