@@ -1072,6 +1072,9 @@ type aggregation_terms = {
10721072type aggregation =
10731073 | Terms of aggregation_terms
10741074
1075+ let string_of_aggregation = function
1076+ | Terms _ -> " terms"
1077+
10751078type search_args = {
10761079 host : string ;
10771080 index : string ;
@@ -1183,13 +1186,16 @@ let search ({ verbose; es_version; _ } as common_args) {
11831186 | Some _ -> Exn. fail " providing query body and aggregations at the same time is not supported"
11841187 | None ->
11851188 let aggregations =
1189+ let cons name map hd tl = match hd with Some hd -> (name, map hd) :: tl | None -> tl in
1190+ let int x = `Int x in
11861191 List. map begin fun (name , aggregation ) ->
1187- let aggregation =
1192+ let aggregation_params =
11881193 match aggregation with
11891194 | Terms { field; size; } ->
1190- `Assoc ((" field" , `String field) :: match size with Some size -> [ " size" , `Int size; ] | None -> [] )
1195+ let params = cons " size" int size [] in
1196+ (" field" , `String field) :: params
11911197 in
1192- name, aggregation
1198+ name, `Assoc [ string_of_aggregation aggregation, `Assoc aggregation_params; ]
11931199 end aggregations
11941200 in
11951201 Some (Util_j. string_of_assoc [ " aggs" , `Assoc aggregations; ])
@@ -1893,38 +1899,48 @@ let refresh_tool =
18931899
18941900let search_tool =
18951901 let aggregation =
1896- let module Let_syntax = struct let map ~f = function Ok x -> f x | Error _ as error -> error end in
1902+ let module Let_syntax =
1903+ struct
1904+ let map ~f = function Ok x -> f x | Error _ as error -> error
1905+ let bind ~f = function [] -> f (None , [] ) | hd :: tl -> f (Some hd, tl)
1906+ end
1907+ in
1908+ let missing_field name = Error (`Msg (sprintf " terms aggregation %s missing field" name)) in
1909+ let parse conv =
1910+ let parse = Arg. conv_parser conv in
1911+ fun x -> Option. map_default (fun x -> let % map x = parse x in Ok (Some x)) (Ok None ) x
1912+ in
1913+ let parse_int = parse Arg. int in
18971914 let parse_terms name = function
1898- | [] -> Error ( `Msg (sprintf " terms aggregation %s missing field " name))
1915+ | [] -> missing_field name
18991916 | field :: params ->
1900- let agg = { field; size = None ; } in
1901- let % map (agg, params) =
1902- match params with
1903- | [] -> Ok (agg, [] )
1904- | size :: params ->
1905- let % map size = Arg. (conv_parser int ) size in
1906- Ok ({ agg with size = Some size; }, params)
1907- in
1908- match params with
1909- | _ :: _ -> Error (`Msg (sprintf " terms aggregation %s unknown extra parameters: %s" name (String. concat " :" params)))
1910- | [] -> Ok (Terms agg)
1917+ let % bind (size, params) = params in
1918+ let % map size = parse_int size in
1919+ let agg = { field; size; } in
1920+ Ok (Terms agg, params)
19111921 in
19121922 let parse agg =
19131923 match Stre. nsplitc agg ':' with
19141924 | [] -> assert false
19151925 | name :: [] -> Error (`Msg (sprintf " aggregation %s missing type" name))
19161926 | name :: type_ :: params ->
1917- let % map agg =
1927+ let % map ( agg, params) =
19181928 match type_ with
1919- | "t" | "term" | " terms" -> parse_terms name params
1929+ | "t" | "terms" -> parse_terms name params
19201930 | agg -> Error (`Msg (sprintf " unknown aggregation type: %s" agg))
19211931 in
1922- Ok (name, agg)
1932+ match params with
1933+ | [] -> Ok (name, agg)
1934+ | _ :: _ ->
1935+ let msg = sprintf " %s aggregation %s unknown extra parameters: %s" (string_of_aggregation agg) name (String. concat " :" params) in
1936+ Error (`Msg msg)
19231937 in
19241938 let print fmt (name , agg ) =
1939+ let cons map hd tl = match hd with Some hd -> map hd :: tl | None -> tl in
19251940 let params =
19261941 match agg with
1927- | Terms { field; size } -> name :: field :: (match size with Some size -> [ string_of_int size; ] | None -> [] )
1942+ | Terms { field; size } ->
1943+ name :: field :: cons string_of_int size []
19281944 in
19291945 Format. fprintf fmt " %s" (String. concat " :" params)
19301946 in
0 commit comments