Skip to content

Commit c5d16e7

Browse files
authored
Merge pull request #176 from jacomago/propertymetrics
Fix the property metrics for prometheus
2 parents f607d2a + 87b1861 commit c5d16e7

File tree

11 files changed

+562
-231
lines changed

11 files changed

+562
-231
lines changed

src/main/java/org/phoebus/channelfinder/ChannelRepository.java

Lines changed: 95 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -465,95 +465,126 @@ private BuiltQuery getBuiltQuery(MultiValueMap<String, String> searchParameters)
465465
}
466466
switch (key) {
467467
case "~name":
468-
for (String value : parameter.getValue()) {
469-
DisMaxQuery.Builder nameQuery = new DisMaxQuery.Builder();
470-
for (String pattern : value.split(valueSplitPattern)) {
471-
nameQuery.queries(getSingleValueQuery("name", pattern.trim()));
472-
}
473-
boolQuery.must(nameQuery.build()._toQuery());
474-
}
468+
addNameQuery(parameter, valueSplitPattern, boolQuery);
475469
break;
476470
case "~tag":
477-
for (String value : parameter.getValue()) {
478-
DisMaxQuery.Builder tagQuery = new DisMaxQuery.Builder();
479-
for (String pattern : value.split(valueSplitPattern)) {
480-
tagQuery.queries(
481-
NestedQuery.of(n -> n.path("tags").query(
482-
getSingleValueQuery("tags.name", pattern.trim())))._toQuery());
483-
}
484-
if (isNot) {
485-
boolQuery.mustNot(tagQuery.build()._toQuery());
486-
} else {
487-
boolQuery.must(tagQuery.build()._toQuery());
488-
}
489-
490-
}
471+
addTagsQuery(parameter, valueSplitPattern, isNot, boolQuery);
491472
break;
492473
case "~size":
493-
Optional<String> maxSize = parameter.getValue().stream().max(Comparator.comparing(Integer::valueOf));
494-
if (maxSize.isPresent()) {
495-
size = Integer.parseInt(maxSize.get());
496-
}
474+
size = parseCountParameter(parameter, size);
497475
break;
498476
case "~from":
499-
Optional<String> maxFrom = parameter.getValue().stream().max(Comparator.comparing(Integer::valueOf));
500-
if (maxFrom.isPresent()) {
501-
from = Integer.parseInt(maxFrom.get());
502-
}
477+
from = parseCountParameter(parameter, from);
503478
break;
504479
case "~search_after":
505480
searchAfter = parameter.getValue().stream().findFirst();
506481
break;
507482

508483
case "~track_total_hits":
509-
Optional<String> firstTrackTotalHits = parameter.getValue().stream().findFirst();
510-
if (firstTrackTotalHits.isPresent()) {
511-
trackTotalHits = Boolean.parseBoolean(firstTrackTotalHits.get());
512-
}
484+
trackTotalHits = isTrackTotalHits(parameter, trackTotalHits);
513485
break;
514486
default:
515-
DisMaxQuery.Builder propertyQuery = new DisMaxQuery.Builder();
516-
for (String value : parameter.getValue()) {
517-
for (String pattern : value.split(valueSplitPattern)) {
518-
String finalKey = key;
519-
BoolQuery bq;
520-
if (isNot) {
521-
bq = BoolQuery.of(p -> p.must(getSingleValueQuery("properties.name", finalKey))
522-
.mustNot(getSingleValueQuery("properties.value", pattern.trim())));
523-
} else {
524-
bq = BoolQuery.of(p -> p.must(getSingleValueQuery("properties.name", finalKey))
525-
.must(getSingleValueQuery("properties.value", pattern.trim())));
526-
}
527-
propertyQuery.queries(
528-
NestedQuery.of(n -> n.path("properties").query(bq._toQuery()))._toQuery()
529-
);
530-
}
531-
}
487+
DisMaxQuery.Builder propertyQuery = calculatePropertiesQuery(parameter, valueSplitPattern, key, isNot);
532488
boolQuery.must(propertyQuery.build()._toQuery());
533489
break;
534490
}
535491
}
536492
return new BuiltQuery(boolQuery, size, from, searchAfter, trackTotalHits);
537493
}
538494

495+
private static DisMaxQuery.Builder calculatePropertiesQuery(Map.Entry<String, List<String>> parameter, String valueSplitPattern, String key, boolean isNot) {
496+
DisMaxQuery.Builder propertyQuery = new DisMaxQuery.Builder();
497+
for (String value : parameter.getValue()) {
498+
for (String pattern : value.split(valueSplitPattern)) {
499+
BoolQuery bq;
500+
bq = calculatePropertyQuery(key, isNot, pattern);
501+
addPropertyQuery(isNot, pattern, propertyQuery, bq);
502+
}
503+
}
504+
return propertyQuery;
505+
}
506+
507+
private static void addPropertyQuery(boolean isNot, String pattern, DisMaxQuery.Builder propertyQuery, BoolQuery bq) {
508+
if (isNot && pattern.trim().equals("*")) {
509+
510+
propertyQuery.queries(
511+
BoolQuery.of( p -> p.mustNot(
512+
NestedQuery.of(n -> n.path("properties").query(bq._toQuery()))._toQuery()
513+
))._toQuery()
514+
);
515+
} else {
516+
517+
propertyQuery.queries(
518+
NestedQuery.of(n -> n.path("properties").query(bq._toQuery()))._toQuery()
519+
);
520+
}
521+
}
522+
523+
private static BoolQuery calculatePropertyQuery(String key, boolean isNot, String pattern) {
524+
BoolQuery bq;
525+
if (isNot) {
526+
if (pattern.trim().equals("*")) {
527+
bq = BoolQuery.of(p -> p.must(getSingleValueQuery("properties.name", key)));
528+
} else {
529+
bq = BoolQuery.of(p -> p.must(getSingleValueQuery("properties.name", key))
530+
.mustNot(getSingleValueQuery("properties.value", pattern.trim())));
531+
}
532+
} else {
533+
bq = BoolQuery.of(p -> p.must(getSingleValueQuery("properties.name", key))
534+
.must(getSingleValueQuery("properties.value", pattern.trim())));
535+
}
536+
return bq;
537+
}
538+
539+
private static boolean isTrackTotalHits(Map.Entry<String, List<String>> parameter, boolean trackTotalHits) {
540+
Optional<String> firstTrackTotalHits = parameter.getValue().stream().findFirst();
541+
if (firstTrackTotalHits.isPresent()) {
542+
trackTotalHits = Boolean.parseBoolean(firstTrackTotalHits.get());
543+
}
544+
return trackTotalHits;
545+
}
546+
547+
private static int parseCountParameter(Map.Entry<String, List<String>> parameter, int size) {
548+
Optional<String> maxSize = parameter.getValue().stream().max(Comparator.comparing(Integer::valueOf));
549+
if (maxSize.isPresent()) {
550+
size = Integer.parseInt(maxSize.get());
551+
}
552+
return size;
553+
}
554+
555+
private static void addTagsQuery(Map.Entry<String, List<String>> parameter, String valueSplitPattern, boolean isNot, BoolQuery.Builder boolQuery) {
556+
for (String value : parameter.getValue()) {
557+
DisMaxQuery.Builder tagQuery = new DisMaxQuery.Builder();
558+
for (String pattern : value.split(valueSplitPattern)) {
559+
tagQuery.queries(
560+
NestedQuery.of(n -> n.path("tags").query(
561+
getSingleValueQuery("tags.name", pattern.trim())))._toQuery());
562+
}
563+
if (isNot) {
564+
boolQuery.mustNot(tagQuery.build()._toQuery());
565+
} else {
566+
boolQuery.must(tagQuery.build()._toQuery());
567+
}
568+
569+
}
570+
}
571+
572+
private static void addNameQuery(Map.Entry<String, List<String>> parameter, String valueSplitPattern, BoolQuery.Builder boolQuery) {
573+
for (String value : parameter.getValue()) {
574+
DisMaxQuery.Builder nameQuery = new DisMaxQuery.Builder();
575+
for (String pattern : value.split(valueSplitPattern)) {
576+
nameQuery.queries(getSingleValueQuery("name", pattern.trim()));
577+
}
578+
boolQuery.must(nameQuery.build()._toQuery());
579+
}
580+
}
581+
539582
private static Query getSingleValueQuery(String name, String pattern) {
540583
return WildcardQuery.of(w -> w.field(name).caseInsensitive(true).value(pattern))._toQuery();
541584
}
542585

543-
private static class BuiltQuery {
544-
public final BoolQuery.Builder boolQuery;
545-
public final Integer size;
546-
public final Integer from;
547-
public final Optional<String> searchAfter;
548-
public final boolean trackTotalHits;
549-
550-
public BuiltQuery(BoolQuery.Builder boolQuery, Integer size, Integer from, Optional<String> searchAfter, boolean trackTotalHits) {
551-
this.boolQuery = boolQuery;
552-
this.size = size;
553-
this.from = from;
554-
this.searchAfter = searchAfter;
555-
this.trackTotalHits = trackTotalHits;
556-
}
586+
private record BuiltQuery(BoolQuery.Builder boolQuery, Integer size, Integer from, Optional<String> searchAfter,
587+
boolean trackTotalHits) {
557588
}
558589

559590
/**

0 commit comments

Comments
 (0)