@@ -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+
10671091type aggregation_terms = {
10681092 field : string ;
10691093 size : int option ;
10701094}
10711095
10721096type 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
10751108let 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
10781120type 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