Skip to content

Commit e36b440

Browse files
committed
search: + many metrics aggregations
1 parent d761484 commit e36b440

1 file changed

Lines changed: 119 additions & 0 deletions

File tree

src/es.ml

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1064,16 +1064,58 @@ let refresh { verbose; _ } {
10641064
| Error error -> fail_lwt "refresh error:\n%s" error
10651065
| Ok result -> Lwt_io.printl result
10661066

1067+
type aggregation_field = {
1068+
field : string;
1069+
}
1070+
1071+
type aggregation_stats = {
1072+
field : string;
1073+
missing : string option;
1074+
}
1075+
1076+
type aggregation_cardinality = {
1077+
common : aggregation_stats;
1078+
precision_threshold : int option;
1079+
}
1080+
1081+
type aggregation_extended_stats = {
1082+
common : aggregation_stats;
1083+
sigma : float option;
1084+
}
1085+
1086+
type aggregation_string_stats = {
1087+
common : aggregation_stats;
1088+
show_distribution : bool option;
1089+
}
1090+
10671091
type aggregation_terms = {
10681092
field : string;
10691093
size : int option;
10701094
}
10711095

10721096
type aggregation =
1097+
| Avg of aggregation_stats
1098+
| Cardinality of aggregation_cardinality
1099+
| ExtendedStats of aggregation_extended_stats
1100+
| Max of aggregation_stats
1101+
| Min of aggregation_stats
1102+
| Stats of aggregation_stats
1103+
| Sum of aggregation_stats
1104+
| StringStats of aggregation_string_stats
10731105
| Terms of aggregation_terms
1106+
| ValueCount of aggregation_field
10741107

10751108
let string_of_aggregation = function
1109+
| Avg _ -> "avg"
1110+
| Cardinality _ -> "cardinality"
1111+
| ExtendedStats _ -> "extended_stats"
1112+
| Max _ -> "max"
1113+
| Min _ -> "min"
1114+
| Stats _ -> "stats"
1115+
| Sum _ -> "sum"
1116+
| StringStats _ -> "string_stats"
10761117
| Terms _ -> "terms"
1118+
| ValueCount _ -> "value_count"
10771119

10781120
type search_args = {
10791121
host : string;
@@ -1187,13 +1229,33 @@ let search ({ verbose; es_version; _ } as common_args) {
11871229
| None ->
11881230
let aggregations =
11891231
let cons name map hd tl = match hd with Some hd -> (name, map hd) :: tl | None -> tl in
1232+
let bool x = `Bool x in
1233+
let float x = `Float x in
11901234
let int x = `Int x in
1235+
let string x = `String x in
1236+
let metrics { field; missing; } params =
1237+
let params = cons "missing" string missing params in
1238+
("field", `String field) :: params
1239+
in
11911240
List.map begin fun (name, aggregation) ->
11921241
let aggregation_params =
11931242
match aggregation with
1243+
| Avg params | Max params | Min params | Stats params | Sum params ->
1244+
metrics params []
1245+
| Cardinality { common; precision_threshold; } ->
1246+
let params = cons "precision_threshold" int precision_threshold [] in
1247+
metrics common params
1248+
| ExtendedStats { common; sigma; } ->
1249+
let params = cons "sigma" float sigma [] in
1250+
metrics common params
1251+
| StringStats { common; show_distribution; } ->
1252+
let params = cons "show_distribution" bool show_distribution [] in
1253+
metrics common params
11941254
| Terms { field; size; } ->
11951255
let params = cons "size" int size [] in
11961256
("field", `String field) :: params
1257+
| ValueCount { field; } ->
1258+
("field", `String field) :: []
11971259
in
11981260
name, `Assoc [ string_of_aggregation aggregation, `Assoc aggregation_params; ]
11991261
end aggregations
@@ -1910,7 +1972,34 @@ let search_tool =
19101972
let parse = Arg.conv_parser conv in
19111973
fun x -> Option.map_default (fun x -> let%map x = parse x in Ok (Some x)) (Ok None) x
19121974
in
1975+
let parse_bool = parse Arg.bool in
1976+
let parse_float = parse Arg.float in
19131977
let parse_int = parse Arg.int in
1978+
let parse_metrics name = function
1979+
| [] -> missing_field name
1980+
| field :: params ->
1981+
let%bind (missing, params) = params in
1982+
let agg = { field; missing; } in
1983+
Ok (agg, params)
1984+
in
1985+
let parse_cardinality name params =
1986+
let%map (common, params) = parse_metrics name params in
1987+
let%bind (precision_threshold, params) = params in
1988+
let%map precision_threshold = parse_int precision_threshold in
1989+
Ok (Cardinality { common; precision_threshold; }, params)
1990+
in
1991+
let parse_extended_stats name params =
1992+
let%map (common, params) = parse_metrics name params in
1993+
let%bind (sigma, params) = params in
1994+
let%map sigma = parse_float sigma in
1995+
Ok (ExtendedStats { common; sigma; }, params)
1996+
in
1997+
let parse_string_stats name params =
1998+
let%map (common, params) = parse_metrics name params in
1999+
let%bind (show_distribution, params) = params in
2000+
let%map show_distribution = parse_bool show_distribution in
2001+
Ok (StringStats { common; show_distribution; }, params)
2002+
in
19142003
let parse_terms name = function
19152004
| [] -> missing_field name
19162005
| field :: params ->
@@ -1919,14 +2008,27 @@ let search_tool =
19192008
let agg = { field; size; } in
19202009
Ok (Terms agg, params)
19212010
in
2011+
let parse_field name = function
2012+
| [] -> missing_field name
2013+
| field :: params -> Ok ({ field; }, params)
2014+
in
19222015
let parse agg =
19232016
match Stre.nsplitc agg ':' with
19242017
| [] -> assert false
19252018
| name :: [] -> Error (`Msg (sprintf "aggregation %s missing type" name))
19262019
| name :: type_ :: params ->
19272020
let%map (agg, params) =
19282021
match type_ with
2022+
| "a" | "avg" -> let%map (agg, params) = parse_metrics name params in Ok (Avg agg, params)
2023+
| "u" | "cardinal" | "cardinality" -> parse_cardinality name params
2024+
| "e" | "est" | "extended_stats" -> parse_extended_stats name params
2025+
| "min" -> let%map (agg, params) = parse_metrics name params in Ok (Min agg, params)
2026+
| "max" -> let%map (agg, params) = parse_metrics name params in Ok (Max agg, params)
2027+
| "st" | "stats" -> let%map (agg, params) = parse_metrics name params in Ok (Stats agg, params)
2028+
| "sst" | "string_stats" -> parse_string_stats name params
2029+
| "s" | "sum" -> let%map (agg, params) = parse_metrics name params in Ok (Sum agg, params)
19292030
| "t" | "terms" -> parse_terms name params
2031+
| "n" | "count" | "value_count" -> let%map (agg, params) = parse_field name params in Ok (ValueCount agg, params)
19302032
| agg -> Error (`Msg (sprintf "unknown aggregation type: %s" agg))
19312033
in
19322034
match params with
@@ -1939,8 +2041,25 @@ let search_tool =
19392041
let cons map hd tl = match hd with Some hd -> map hd :: tl | None -> tl in
19402042
let params =
19412043
match agg with
2044+
| Avg params | Max params | Min params | Stats params | Sum params ->
2045+
let { field; missing } = params in
2046+
name :: field :: cons id missing []
2047+
| Cardinality { common = { field; missing; }; precision_threshold; } ->
2048+
let params = cons string_of_int precision_threshold [] in
2049+
let params = cons id missing params in
2050+
name :: field :: params
2051+
| ExtendedStats { common = { field; missing; }; sigma; } ->
2052+
let params = cons string_of_float sigma [] in
2053+
let params = cons id missing params in
2054+
name :: field :: params
2055+
| StringStats { common = { field; missing; }; show_distribution; } ->
2056+
let params = cons string_of_bool show_distribution [] in
2057+
let params = cons id missing params in
2058+
name :: field :: params
19422059
| Terms { field; size } ->
19432060
name :: field :: cons string_of_int size []
2061+
| ValueCount { field; } ->
2062+
name :: field :: []
19442063
in
19452064
Format.fprintf fmt "%s" (String.concat ":" params)
19462065
in

0 commit comments

Comments
 (0)