Skip to content

Commit d761484

Browse files
committed
search: fix aggregations
1 parent 8b16e05 commit d761484

1 file changed

Lines changed: 36 additions & 20 deletions

File tree

src/es.ml

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1072,6 +1072,9 @@ type aggregation_terms = {
10721072
type aggregation =
10731073
| Terms of aggregation_terms
10741074

1075+
let string_of_aggregation = function
1076+
| Terms _ -> "terms"
1077+
10751078
type 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

18941900
let 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

Comments
 (0)