Skip to content

Commit 4e6cedd

Browse files
committed
Add total rule type counts to list calls and xpack usage
1 parent 8db9181 commit 4e6cedd

File tree

9 files changed

+283
-59
lines changed

9 files changed

+283
-59
lines changed

docs/reference/search/retriever.asciidoc

Lines changed: 200 additions & 37 deletions
Large diffs are not rendered by default.

server/src/main/java/org/elasticsearch/TransportVersions.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ static TransportVersion def(int id) {
188188
public static final TransportVersion ESQL_CCS_EXEC_INFO_WITH_FAILURES = def(8_783_00_0);
189189
public static final TransportVersion LOGSDB_TELEMETRY = def(8_784_00_0);
190190
public static final TransportVersion LOGSDB_TELEMETRY_STATS = def(8_785_00_0);
191+
public static final TransportVersion QUERY_RULES_LIST_INCLUDES_TYPES = def(8_786_00_0);
191192

192193
/*
193194
* STOP! READ THIS FIRST! No, really,

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/application/EnterpriseSearchFeatureSetUsage.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public class EnterpriseSearchFeatureSetUsage extends XPackFeatureUsage {
3434
public static final String MIN_RULE_COUNT = "min_rule_count";
3535
public static final String MAX_RULE_COUNT = "max_rule_count";
3636
public static final String RULE_CRITERIA_TOTAL_COUNTS = "rule_criteria_total_counts";
37+
public static final String RULE_TYPE_TOTAL_COUNTS = "rule_type_total_counts";
3738

3839
private final Map<String, Object> searchApplicationsUsage;
3940
private final Map<String, Object> analyticsCollectionsUsage;

x-pack/plugin/ent-search/qa/rest/src/yamlRestTest/resources/rest-api-spec/test/entsearch/20_usage.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ teardown:
144144
- 'id1'
145145
- 'id2'
146146
- rule_id: query-rule-id2
147-
type: pinned
147+
type: exclude
148148
criteria:
149149
- type: exact
150150
metadata: query_string
@@ -199,7 +199,7 @@ teardown:
199199
available: true,
200200
search_applications: { count: 1 },
201201
analytics_collections: { count: 0 },
202-
query_rulesets: { total_count: 2, total_rule_count: 5, min_rule_count: 2, max_rule_count: 3, rule_criteria_total_counts: { exact: 5 } }
202+
query_rulesets: { total_count: 2, total_rule_count: 5, min_rule_count: 2, max_rule_count: 3, rule_criteria_total_counts: { exact: 5 }, rule_type_total_counts: { pinned: 4, exclude: 1 } }
203203
}
204204
}
205205

@@ -216,7 +216,7 @@ teardown:
216216
available: true,
217217
search_applications: { count: 1 },
218218
analytics_collections: { count: 0 },
219-
query_rulesets: { total_count: 1, total_rule_count: 2, min_rule_count: 2, max_rule_count: 2, rule_criteria_total_counts: { exact: 2 } }
219+
query_rulesets: { total_count: 1, total_rule_count: 2, min_rule_count: 2, max_rule_count: 2, rule_criteria_total_counts: { exact: 2 }, rule_type_total_counts: { pinned: 1, exclude: 1 } }
220220
}
221221
}
222222

x-pack/plugin/ent-search/qa/rest/src/yamlRestTest/resources/rest-api-spec/test/entsearch/rules/20_query_ruleset_list.yml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,14 +152,17 @@ teardown:
152152
- match: { results.0.ruleset_id: "test-query-ruleset-1" }
153153
- match: { results.0.rule_total_count: 3 }
154154
- match: { results.0.rule_criteria_types_counts: { exact: 3 } }
155+
- match: { results.0.rule_type_counts: { pinned: 3, } }
155156

156157
- match: { results.1.ruleset_id: "test-query-ruleset-2" }
157158
- match: { results.1.rule_total_count: 5 }
158159
- match: { results.1.rule_criteria_types_counts: { exact: 4, fuzzy: 1 } }
160+
- match: { results.1.rule_type_counts: { pinned: 4, exclude: 1 } }
159161

160162
- match: { results.2.ruleset_id: "test-query-ruleset-3" }
161163
- match: { results.2.rule_total_count: 2 }
162164
- match: { results.2.rule_criteria_types_counts: { exact: 2 } }
165+
- match: { results.2.rule_type_counts: { pinned: 2 } }
163166

164167
---
165168
"List Query Rulesets - with from":
@@ -173,10 +176,12 @@ teardown:
173176
- match: { results.0.ruleset_id: "test-query-ruleset-2" }
174177
- match: { results.0.rule_total_count: 5 }
175178
- match: { results.0.rule_criteria_types_counts: { exact: 4, fuzzy: 1 } }
179+
- match: { results.0.rule_type_counts: { pinned: 4, exclude: 1 } }
176180

177181
- match: { results.1.ruleset_id: "test-query-ruleset-3" }
178182
- match: { results.1.rule_total_count: 2 }
179183
- match: { results.1.rule_criteria_types_counts: { exact: 2 } }
184+
- match: { results.1.rule_type_counts: { pinned: 2 } }
180185

181186
---
182187
"List Query Rulesets - with size":
@@ -190,10 +195,12 @@ teardown:
190195
- match: { results.0.ruleset_id: "test-query-ruleset-1" }
191196
- match: { results.0.rule_total_count: 3 }
192197
- match: { results.0.rule_criteria_types_counts: { exact: 3 } }
198+
- match: { results.0.rule_type_counts: { pinned: 3 } }
193199

194200
- match: { results.1.ruleset_id: "test-query-ruleset-2" }
195201
- match: { results.1.rule_total_count: 5 }
196202
- match: { results.1.rule_criteria_types_counts: { exact: 4, fuzzy: 1 } }
203+
- match: { results.1.rule_type_counts: { pinned: 4, exclude: 1 } }
197204

198205
---
199206
"List Query Rulesets - empty":
@@ -222,7 +229,7 @@ teardown:
222229
body:
223230
rules:
224231
- rule_id: query-rule-id1
225-
type: pinned
232+
type: exclude
226233
criteria:
227234
- type: exact
228235
metadata: query_string
@@ -294,6 +301,7 @@ teardown:
294301
prefix: 1
295302
suffix: 1
296303
always: 1
304+
- match: { results.0.rule_type_counts: { pinned: 4, exclude: 1 } }
297305

298306
---
299307
'List Query Rulesets - Insufficient privilege':

x-pack/plugin/ent-search/src/main/java/org/elasticsearch/xpack/application/EnterpriseSearchUsageTransportAction.java

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import org.elasticsearch.threadpool.ThreadPool;
2828
import org.elasticsearch.transport.TransportService;
2929
import org.elasticsearch.xpack.application.analytics.action.GetAnalyticsCollectionAction;
30-
import org.elasticsearch.xpack.application.rules.QueryRuleCriteriaType;
3130
import org.elasticsearch.xpack.application.rules.QueryRulesIndexService;
3231
import org.elasticsearch.xpack.application.rules.QueryRulesetListItem;
3332
import org.elasticsearch.xpack.application.rules.action.ListQueryRulesetsAction;
@@ -41,7 +40,6 @@
4140
import org.elasticsearch.xpack.core.application.EnterpriseSearchFeatureSetUsage;
4241

4342
import java.util.Collections;
44-
import java.util.EnumMap;
4543
import java.util.HashMap;
4644
import java.util.IntSummaryStatistics;
4745
import java.util.List;
@@ -226,20 +224,29 @@ private void addQueryRulesetUsage(ListQueryRulesetsAction.Response response, Map
226224
List<QueryRulesetListItem> results = response.queryPage().results();
227225
IntSummaryStatistics ruleStats = results.stream().mapToInt(QueryRulesetListItem::ruleTotalCount).summaryStatistics();
228226

229-
Map<QueryRuleCriteriaType, Integer> criteriaTypeCountMap = new EnumMap<>(QueryRuleCriteriaType.class);
230-
results.stream()
231-
.flatMap(result -> result.criteriaTypeToCountMap().entrySet().stream())
232-
.forEach(entry -> criteriaTypeCountMap.merge(entry.getKey(), entry.getValue(), Integer::sum));
227+
Map<String, Object> ruleCriteriaTypeCountMap = new HashMap<>();
228+
Map<String, Object> ruleTypeCountMap = new HashMap<>();
233229

234-
Map<String, Object> rulesTypeCountMap = new HashMap<>();
235-
criteriaTypeCountMap.forEach((criteriaType, count) -> rulesTypeCountMap.put(criteriaType.name().toLowerCase(Locale.ROOT), count));
230+
results.forEach(result -> {
231+
populateCounts(ruleCriteriaTypeCountMap, result.criteriaTypeToCountMap());
232+
populateCounts(ruleTypeCountMap, result.ruleTypeToCountMap());
233+
});
236234

237235
queryRulesUsage.put(TOTAL_COUNT, response.queryPage().count());
238236
queryRulesUsage.put(TOTAL_RULE_COUNT, ruleStats.getSum());
239237
queryRulesUsage.put(MIN_RULE_COUNT, results.isEmpty() ? 0 : ruleStats.getMin());
240238
queryRulesUsage.put(MAX_RULE_COUNT, results.isEmpty() ? 0 : ruleStats.getMax());
241-
if (rulesTypeCountMap.isEmpty() == false) {
242-
queryRulesUsage.put(RULE_CRITERIA_TOTAL_COUNTS, rulesTypeCountMap);
239+
if (ruleCriteriaTypeCountMap.isEmpty() == false) {
240+
queryRulesUsage.put(RULE_CRITERIA_TOTAL_COUNTS, ruleCriteriaTypeCountMap);
241+
}
242+
if (ruleTypeCountMap.isEmpty() == false) {
243+
queryRulesUsage.put(EnterpriseSearchFeatureSetUsage.RULE_TYPE_TOTAL_COUNTS, ruleTypeCountMap);
243244
}
244245
}
246+
247+
private void populateCounts(Map<String, Object> targetMap, Map<? extends Enum<?>, Integer> sourceMap) {
248+
sourceMap.forEach(
249+
(key, value) -> targetMap.merge(key.name().toLowerCase(Locale.ROOT), value, (v1, v2) -> (Integer) v1 + (Integer) v2)
250+
);
251+
}
245252
}

x-pack/plugin/ent-search/src/main/java/org/elasticsearch/xpack/application/rules/QueryRulesIndexService.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,7 @@ private static QueryRulesetListItem hitToQueryRulesetListItem(SearchHit searchHi
445445
final List<LinkedHashMap<?, ?>> rules = ((List<LinkedHashMap<?, ?>>) sourceMap.get(QueryRuleset.RULES_FIELD.getPreferredName()));
446446
final int numRules = rules.size();
447447
final Map<QueryRuleCriteriaType, Integer> queryRuleCriteriaTypeToCountMap = new EnumMap<>(QueryRuleCriteriaType.class);
448+
final Map<QueryRule.QueryRuleType, Integer> ruleTypeToCountMap = new EnumMap<>(QueryRule.QueryRuleType.class);
448449
for (LinkedHashMap<?, ?> rule : rules) {
449450
@SuppressWarnings("unchecked")
450451
List<LinkedHashMap<?, ?>> criteriaList = ((List<LinkedHashMap<?, ?>>) rule.get(QueryRule.CRITERIA_FIELD.getPreferredName()));
@@ -453,9 +454,12 @@ private static QueryRulesetListItem hitToQueryRulesetListItem(SearchHit searchHi
453454
final QueryRuleCriteriaType queryRuleCriteriaType = QueryRuleCriteriaType.type(criteriaType);
454455
queryRuleCriteriaTypeToCountMap.compute(queryRuleCriteriaType, (k, v) -> v == null ? 1 : v + 1);
455456
}
457+
final String ruleType = ((String) rule.get(QueryRule.TYPE_FIELD.getPreferredName()));
458+
final QueryRule.QueryRuleType queryRuleType = QueryRule.QueryRuleType.queryRuleType(ruleType);
459+
ruleTypeToCountMap.compute(queryRuleType, (k, v) -> v == null ? 1 : v + 1);
456460
}
457461

458-
return new QueryRulesetListItem(rulesetId, numRules, queryRuleCriteriaTypeToCountMap);
462+
return new QueryRulesetListItem(rulesetId, numRules, queryRuleCriteriaTypeToCountMap, ruleTypeToCountMap);
459463
}
460464

461465
public record QueryRulesetResult(List<QueryRulesetListItem> rulesets, long totalResults) {}

x-pack/plugin/ent-search/src/main/java/org/elasticsearch/xpack/application/rules/QueryRulesetListItem.java

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,12 @@ public class QueryRulesetListItem implements Writeable, ToXContentObject {
3232
public static final ParseField RULESET_ID_FIELD = new ParseField("ruleset_id");
3333
public static final ParseField RULE_TOTAL_COUNT_FIELD = new ParseField("rule_total_count");
3434
public static final ParseField RULE_CRITERIA_TYPE_COUNTS_FIELD = new ParseField("rule_criteria_types_counts");
35+
public static final ParseField RULE_TYPE_COUNTS_FIELD = new ParseField("rule_type_counts");
3536

3637
private final String rulesetId;
3738
private final int ruleTotalCount;
3839
private final Map<QueryRuleCriteriaType, Integer> criteriaTypeToCountMap;
40+
private final Map<QueryRule.QueryRuleType, Integer> ruleTypeToCountMap;
3941

4042
/**
4143
* Constructs a QueryRulesetListItem.
@@ -44,11 +46,17 @@ public class QueryRulesetListItem implements Writeable, ToXContentObject {
4446
* @param ruleTotalCount The number of rules contained within the ruleset.
4547
* @param criteriaTypeToCountMap A map of criteria type to the number of rules of that type.
4648
*/
47-
public QueryRulesetListItem(String rulesetId, int ruleTotalCount, Map<QueryRuleCriteriaType, Integer> criteriaTypeToCountMap) {
49+
public QueryRulesetListItem(
50+
String rulesetId,
51+
int ruleTotalCount,
52+
Map<QueryRuleCriteriaType, Integer> criteriaTypeToCountMap,
53+
Map<QueryRule.QueryRuleType, Integer> ruleTypeToCountMap
54+
) {
4855
Objects.requireNonNull(rulesetId, "rulesetId cannot be null on a QueryRuleListItem");
4956
this.rulesetId = rulesetId;
5057
this.ruleTotalCount = ruleTotalCount;
5158
this.criteriaTypeToCountMap = criteriaTypeToCountMap;
59+
this.ruleTypeToCountMap = ruleTypeToCountMap;
5260
}
5361

5462
public QueryRulesetListItem(StreamInput in) throws IOException {
@@ -59,6 +67,11 @@ public QueryRulesetListItem(StreamInput in) throws IOException {
5967
} else {
6068
this.criteriaTypeToCountMap = Map.of();
6169
}
70+
if (in.getTransportVersion().onOrAfter(TransportVersions.QUERY_RULES_LIST_INCLUDES_TYPES)) {
71+
this.ruleTypeToCountMap = in.readMap(m -> in.readEnum(QueryRule.QueryRuleType.class), StreamInput::readInt);
72+
} else {
73+
this.ruleTypeToCountMap = Map.of();
74+
}
6275
}
6376

6477
@Override
@@ -71,6 +84,11 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
7184
builder.field(criteriaType.name().toLowerCase(Locale.ROOT), criteriaTypeToCountMap.get(criteriaType));
7285
}
7386
builder.endObject();
87+
builder.startObject(RULE_TYPE_COUNTS_FIELD.getPreferredName());
88+
for (QueryRule.QueryRuleType ruleType : ruleTypeToCountMap.keySet()) {
89+
builder.field(ruleType.name().toLowerCase(Locale.ROOT), ruleTypeToCountMap.get(ruleType));
90+
}
91+
builder.endObject();
7492
builder.endObject();
7593
return builder;
7694
}
@@ -82,6 +100,9 @@ public void writeTo(StreamOutput out) throws IOException {
82100
if (out.getTransportVersion().onOrAfter(EXPANDED_RULESET_COUNT_TRANSPORT_VERSION)) {
83101
out.writeMap(criteriaTypeToCountMap, StreamOutput::writeEnum, StreamOutput::writeInt);
84102
}
103+
if (out.getTransportVersion().onOrAfter(TransportVersions.QUERY_RULES_LIST_INCLUDES_TYPES)) {
104+
out.writeMap(ruleTypeToCountMap, StreamOutput::writeEnum, StreamOutput::writeInt);
105+
}
85106
}
86107

87108
/**
@@ -106,18 +127,23 @@ public Map<QueryRuleCriteriaType, Integer> criteriaTypeToCountMap() {
106127
return criteriaTypeToCountMap;
107128
}
108129

130+
public Map<QueryRule.QueryRuleType, Integer> ruleTypeToCountMap() {
131+
return ruleTypeToCountMap;
132+
}
133+
109134
@Override
110135
public boolean equals(Object o) {
111136
if (this == o) return true;
112137
if (o == null || getClass() != o.getClass()) return false;
113138
QueryRulesetListItem that = (QueryRulesetListItem) o;
114139
return ruleTotalCount == that.ruleTotalCount
115140
&& Objects.equals(rulesetId, that.rulesetId)
116-
&& Objects.equals(criteriaTypeToCountMap, that.criteriaTypeToCountMap);
141+
&& Objects.equals(criteriaTypeToCountMap, that.criteriaTypeToCountMap)
142+
&& Objects.equals(ruleTypeToCountMap, that.ruleTypeToCountMap);
117143
}
118144

119145
@Override
120146
public int hashCode() {
121-
return Objects.hash(rulesetId, ruleTotalCount, criteriaTypeToCountMap);
147+
return Objects.hash(rulesetId, ruleTotalCount, criteriaTypeToCountMap, ruleTypeToCountMap);
122148
}
123149
}

x-pack/plugin/ent-search/src/test/java/org/elasticsearch/xpack/application/rules/action/ListQueryRulesetsActionResponseBWCSerializingTests.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@
88
package org.elasticsearch.xpack.application.rules.action;
99

1010
import org.elasticsearch.TransportVersion;
11+
import org.elasticsearch.TransportVersions;
1112
import org.elasticsearch.common.io.stream.Writeable;
1213
import org.elasticsearch.xpack.application.EnterpriseSearchModuleTestUtils;
14+
import org.elasticsearch.xpack.application.rules.QueryRule;
1315
import org.elasticsearch.xpack.application.rules.QueryRuleCriteriaType;
1416
import org.elasticsearch.xpack.application.rules.QueryRuleset;
1517
import org.elasticsearch.xpack.application.rules.QueryRulesetListItem;
@@ -32,9 +34,13 @@ private static ListQueryRulesetsAction.Response randomQueryRulesetListItem() {
3234
QueryRuleset queryRuleset = EnterpriseSearchModuleTestUtils.randomQueryRuleset();
3335
Map<QueryRuleCriteriaType, Integer> criteriaTypeToCountMap = Map.of(
3436
randomFrom(QueryRuleCriteriaType.values()),
35-
randomIntBetween(0, 10)
37+
randomIntBetween(1, 10)
3638
);
37-
return new QueryRulesetListItem(queryRuleset.id(), queryRuleset.rules().size(), criteriaTypeToCountMap);
39+
Map<QueryRule.QueryRuleType, Integer> ruleTypeToCountMap = Map.of(
40+
randomFrom(QueryRule.QueryRuleType.values()),
41+
randomIntBetween(1, 10)
42+
);
43+
return new QueryRulesetListItem(queryRuleset.id(), queryRuleset.rules().size(), criteriaTypeToCountMap, ruleTypeToCountMap);
3844
}), randomLongBetween(0, 1000));
3945
}
4046

@@ -53,12 +59,20 @@ protected ListQueryRulesetsAction.Response mutateInstanceForVersion(
5359
ListQueryRulesetsAction.Response instance,
5460
TransportVersion version
5561
) {
56-
if (version.onOrAfter(QueryRulesetListItem.EXPANDED_RULESET_COUNT_TRANSPORT_VERSION)) {
62+
if (version.onOrAfter(TransportVersions.QUERY_RULES_LIST_INCLUDES_TYPES)) {
5763
return instance;
64+
} else if (version.onOrAfter(QueryRulesetListItem.EXPANDED_RULESET_COUNT_TRANSPORT_VERSION)) {
65+
List<QueryRulesetListItem> updatedResults = new ArrayList<>();
66+
for (QueryRulesetListItem listItem : instance.queryPage.results()) {
67+
updatedResults.add(
68+
new QueryRulesetListItem(listItem.rulesetId(), listItem.ruleTotalCount(), listItem.criteriaTypeToCountMap(), Map.of())
69+
);
70+
}
71+
return new ListQueryRulesetsAction.Response(updatedResults, instance.queryPage.count());
5872
} else {
5973
List<QueryRulesetListItem> updatedResults = new ArrayList<>();
6074
for (QueryRulesetListItem listItem : instance.queryPage.results()) {
61-
updatedResults.add(new QueryRulesetListItem(listItem.rulesetId(), listItem.ruleTotalCount(), Map.of()));
75+
updatedResults.add(new QueryRulesetListItem(listItem.rulesetId(), listItem.ruleTotalCount(), Map.of(), Map.of()));
6276
}
6377
return new ListQueryRulesetsAction.Response(updatedResults, instance.queryPage.count());
6478
}

0 commit comments

Comments
 (0)