15
15
import org .opensearch .index .query .QueryShapeVisitor ;
16
16
import org .opensearch .search .aggregations .AggregatorFactories ;
17
17
import org .opensearch .search .builder .SearchSourceBuilder ;
18
+ import org .opensearch .search .sort .FieldSortBuilder ;
18
19
import org .opensearch .search .sort .SortBuilder ;
19
20
import org .opensearch .telemetry .metrics .MetricsRegistry ;
20
21
import org .opensearch .telemetry .metrics .tags .Tags ;
21
22
23
+ import java .util .ArrayList ;
24
+ import java .util .Collections ;
22
25
import java .util .List ;
23
26
import java .util .ListIterator ;
24
27
28
31
*/
29
32
final class SearchQueryCategorizer {
30
33
31
- private static final Logger log = LogManager .getLogger (SearchQueryCategorizer .class );
34
+ private static final Logger logger = LogManager .getLogger (SearchQueryCategorizer .class );
35
+ public static final String TWO_SPACE_INDENT = " " ;
32
36
33
37
final SearchQueryCounters searchQueryCounters ;
34
38
@@ -43,8 +47,12 @@ public void categorize(SearchSourceBuilder source) {
43
47
QueryBuilder topLevelQueryBuilder = source .query ();
44
48
logQueryShape (topLevelQueryBuilder );
45
49
incrementQueryTypeCounters (topLevelQueryBuilder );
50
+
46
51
incrementQueryAggregationCounters (source .aggregations ());
52
+ logAggregationsShape (source .aggregations ());
53
+
47
54
incrementQuerySortCounters (source .sorts ());
55
+ logSortShape (source .sorts (), true );
48
56
}
49
57
50
58
private void incrementQuerySortCounters (List <SortBuilder <?>> sorts ) {
@@ -79,7 +87,45 @@ private void logQueryShape(QueryBuilder topLevelQueryBuilder) {
79
87
}
80
88
QueryShapeVisitor shapeVisitor = new QueryShapeVisitor ();
81
89
topLevelQueryBuilder .visit (shapeVisitor );
82
- log .trace ("Query shape : {}" , shapeVisitor .prettyPrintTree (" " ));
90
+ logger .trace (shapeVisitor .prettyPrintTree (TWO_SPACE_INDENT ));
91
+ System .out .println (shapeVisitor .prettyPrintTree (TWO_SPACE_INDENT ));
83
92
}
84
93
94
+ private void logAggregationsShape (AggregatorFactories .Builder aggregationsBuilder ) {
95
+ if (aggregationsBuilder == null ) {
96
+ return ;
97
+ }
98
+ StringBuilder aggregationShape = aggregationsBuilder .visit (new StringBuilder (), 0 , true );
99
+ logger .trace (aggregationShape .toString ());
100
+ System .out .println (aggregationShape );
101
+ }
102
+
103
+ private void logSortShape (List <SortBuilder <?>> sortBuilderList , Boolean showFields ) {
104
+ if (sortBuilderList .isEmpty ()) {
105
+ return ;
106
+ }
107
+ StringBuilder sortShape = new StringBuilder ();
108
+ sortShape .append ("sort:\n " );
109
+
110
+ List <String > shapeStrings = new ArrayList <>();
111
+ for (SortBuilder sortBuilder : sortBuilderList ) {
112
+ StringBuilder stringBuilder = new StringBuilder ();
113
+ stringBuilder .append (TWO_SPACE_INDENT + sortBuilder .order () + ":" );
114
+ if (showFields ) {
115
+ if (sortBuilder instanceof FieldSortBuilder ) {
116
+ stringBuilder .append (" [" + ((FieldSortBuilder ) sortBuilder ).getFieldName () + "]" );
117
+ } else {
118
+ stringBuilder .append (" []" );
119
+ }
120
+ }
121
+ shapeStrings .add (stringBuilder .toString ());
122
+ }
123
+
124
+ Collections .sort (shapeStrings );
125
+ for (String line : shapeStrings ) {
126
+ sortShape .append (line ).append ("\n " );
127
+ }
128
+ logger .trace (sortShape .toString ());
129
+ System .out .println (sortShape );
130
+ }
85
131
}
0 commit comments