From 754b972f9693aa3bd23b5f88e2ae02fa9005a187 Mon Sep 17 00:00:00 2001 From: Craig Taverner Date: Fri, 24 Mar 2023 17:08:36 +0100 Subject: [PATCH 1/2] Enhance geo_bounds tests to match cartesian The cartesian_bounds tests were much more extensive, so we split them out and enhanched the geo_bounds test to cover the same scope. --- .../rest-api-spec/test/spatial/10_bounds.yml | 260 ------------------ .../test/spatial/10_cartesian_bounds.yml | 208 ++++++++++++++ .../test/spatial/10_geo_bounds.yml | 208 ++++++++++++++ 3 files changed, 416 insertions(+), 260 deletions(-) delete mode 100644 x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/spatial/10_bounds.yml create mode 100644 x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/spatial/10_cartesian_bounds.yml create mode 100644 x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/spatial/10_geo_bounds.yml diff --git a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/spatial/10_bounds.yml b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/spatial/10_bounds.yml deleted file mode 100644 index dcf0b1e6f1d94..0000000000000 --- a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/spatial/10_bounds.yml +++ /dev/null @@ -1,260 +0,0 @@ ---- -"Test geo_bounds aggregation on geo_shape field": - - do: - indices.create: - index: locations - body: - mappings: - properties: - location: - type: geo_shape - - - do: - index: - index: locations - id: point_with_doc_values - body: { location: "POINT(34.25 -21.76)" } - - - do: - indices.refresh: {} - - - do: - search: - rest_total_hits_as_int: true - index: locations - size: 0 - body: - aggs: - my_agg: - geo_bounds: - field: location - wrap_longitude: true - - match: { hits.total: 1 } - - match: { aggregations.my_agg.bounds.top_left.lat: -21.760000032372773 } - - match: { aggregations.my_agg.bounds.top_left.lon: 34.24999997019768 } - ---- -"Test cartesian_bounds aggregation on point field with point": - - do: - indices.create: - index: locations - body: - mappings: - properties: - location: - type: point - - - do: - index: - index: locations - id: point_with_doc_values - body: { location: "POINT(342.5 -217.6)" } - - - do: - indices.refresh: {} - - - do: - search: - rest_total_hits_as_int: true - index: locations - size: 0 - body: - aggs: - my_agg: - cartesian_bounds: - field: location - - match: { hits.total: 1 } - - match: { aggregations.my_agg.bounds.top_left.x: 342.5 } - - match: { aggregations.my_agg.bounds.top_left.y: -217.60000610351562 } - - match: { aggregations.my_agg.bounds.bottom_right.x: 342.5 } - - match: { aggregations.my_agg.bounds.bottom_right.y: -217.60000610351562 } - ---- -"Test cartesian_bounds aggregation on shape field with point": - - do: - indices.create: - index: locations - body: - mappings: - properties: - location: - type: shape - - - do: - index: - index: locations - id: point_with_doc_values - body: { location: "POINT(342.5 -217.6)" } - - - do: - indices.refresh: {} - - - do: - search: - rest_total_hits_as_int: true - index: locations - size: 0 - body: - aggs: - my_agg: - cartesian_bounds: - field: location - - match: { hits.total: 1 } - - match: { aggregations.my_agg.bounds.top_left.x: 342.5 } - - match: { aggregations.my_agg.bounds.top_left.y: -217.60000610351562 } - - match: { aggregations.my_agg.bounds.bottom_right.x: 342.5 } - - match: { aggregations.my_agg.bounds.bottom_right.y: -217.60000610351562 } - ---- -"Test cartesian_bounds aggregation on point field with points": - - do: - indices.create: - index: locations - body: - mappings: - properties: - location: - type: point - - - do: - bulk: - refresh: true - body: - - index: - _index: locations - _id: "1" - - '{"location": "POINT(491.2350 5237.4081)", "city": "Amsterdam", "name": "NEMO Science Museum"}' - - index: - _index: locations - _id: "2" - - '{"location": "POINT(490.1618 5236.9219)", "city": "Amsterdam", "name": "Museum Het Rembrandthuis"}' - - index: - _index: locations - _id: "3" - - '{"location": "POINT(491.4722 5237.1667)", "city": "Amsterdam", "name": "Nederlands Scheepvaartmuseum"}' - - index: - _index: locations - _id: "4" - - '{"location": "POINT(440.5200 5122.2900)", "city": "Antwerp", "name": "Letterenhuis"}' - - index: - _index: locations - _id: "5" - - '{"location": "POINT(233.6389 4886.1111)", "city": "Paris", "name": "Musée du Louvre"}' - - index: - _index: locations - _id: "6" - - '{"location": "POINT(232.7000 4886.0000)", "city": "Paris", "name": "Musée dOrsay"}' - - - do: - indices.refresh: {} - - - do: - search: - rest_total_hits_as_int: true - index: locations - size: 0 - body: - aggs: - my_agg: - cartesian_bounds: - field: location - - match: { hits.total: 6 } - - match: { aggregations.my_agg.bounds.top_left.x: 232.6999969482422 } - - match: { aggregations.my_agg.bounds.top_left.y: 5237.408203125 } - - match: { aggregations.my_agg.bounds.bottom_right.x: 491.4721984863281 } - - match: { aggregations.my_agg.bounds.bottom_right.y: 4886.0 } - ---- -"Test cartesian_bounds aggregation on shape field with points": - - do: - indices.create: - index: locations - body: - mappings: - properties: - location: - type: shape - - - do: - bulk: - refresh: true - body: - - index: - _index: locations - _id: "1" - - '{"location": "POINT(491.2350 5237.4081)", "city": "Amsterdam", "name": "NEMO Science Museum"}' - - index: - _index: locations - _id: "2" - - '{"location": "POINT(490.1618 5236.9219)", "city": "Amsterdam", "name": "Museum Het Rembrandthuis"}' - - index: - _index: locations - _id: "3" - - '{"location": "POINT(491.4722 5237.1667)", "city": "Amsterdam", "name": "Nederlands Scheepvaartmuseum"}' - - index: - _index: locations - _id: "4" - - '{"location": "POINT(440.5200 5122.2900)", "city": "Antwerp", "name": "Letterenhuis"}' - - index: - _index: locations - _id: "5" - - '{"location": "POINT(233.6389 4886.1111)", "city": "Paris", "name": "Musée du Louvre"}' - - index: - _index: locations - _id: "6" - - '{"location": "POINT(232.7000 4886.0000)", "city": "Paris", "name": "Musée dOrsay"}' - - - do: - indices.refresh: {} - - - do: - search: - rest_total_hits_as_int: true - index: locations - size: 0 - body: - aggs: - my_agg: - cartesian_bounds: - field: location - - match: { hits.total: 6 } - - match: { aggregations.my_agg.bounds.top_left.x: 232.6999969482422 } - - match: { aggregations.my_agg.bounds.top_left.y: 5237.408203125 } - - match: { aggregations.my_agg.bounds.bottom_right.x: 491.4721984863281 } - - match: { aggregations.my_agg.bounds.bottom_right.y: 4886.0000 } - ---- -"Test cartesian_bounds aggregation on shape field with polygon": - - do: - indices.create: - index: locations - body: - mappings: - properties: - location: - type: shape - - - do: - index: - index: locations - id: big_rectangle - body: { location: "POLYGON((-1000 -1000, 1000 -1000, 1000 1000, -1000 1000, -1000 -1000))" } - - - do: - indices.refresh: {} - - - do: - search: - rest_total_hits_as_int: true - index: locations - size: 0 - body: - aggs: - my_agg: - cartesian_bounds: - field: location - - match: { hits.total: 1 } - - match: { aggregations.my_agg.bounds.top_left.x: -1000.0 } - - match: { aggregations.my_agg.bounds.top_left.y: 1000.0 } - - match: { aggregations.my_agg.bounds.bottom_right.x: 1000.0 } - - match: { aggregations.my_agg.bounds.bottom_right.y: -1000.0 } diff --git a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/spatial/10_cartesian_bounds.yml b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/spatial/10_cartesian_bounds.yml new file mode 100644 index 0000000000000..ce88bcdac5e4b --- /dev/null +++ b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/spatial/10_cartesian_bounds.yml @@ -0,0 +1,208 @@ +--- +setup: + - skip: + features: close_to + +--- +"Test cartesian_bounds aggregation on point field with point": + - do: + indices.create: + index: locations + body: + mappings: + properties: + location: + type: point + + - do: + index: + index: locations + id: point_with_doc_values + body: { location: "POINT(342.5 -217.6)" } + + - do: + indices.refresh: {} + + - do: + search: + rest_total_hits_as_int: true + index: locations + size: 0 + body: + aggs: + my_agg: + cartesian_bounds: + field: location + - match: { hits.total: 1 } + - close_to: { aggregations.my_agg.bounds.top_left.x: { value: 342.5, error: 0.001 } } + - close_to: { aggregations.my_agg.bounds.top_left.y: { value: -217.6, error: 0.001 } } + - close_to: { aggregations.my_agg.bounds.bottom_right.x: { value: 342.5, error: 0.001 } } + - close_to: { aggregations.my_agg.bounds.bottom_right.y: { value: -217.6, error: 0.001 } } + +--- +"Test cartesian_bounds aggregation on shape field with point": + - do: + indices.create: + index: locations + body: + mappings: + properties: + location: + type: shape + + - do: + index: + index: locations + id: point_with_doc_values + body: { location: "POINT(342.5 -217.6)" } + + - do: + indices.refresh: {} + + - do: + search: + rest_total_hits_as_int: true + index: locations + size: 0 + body: + aggs: + my_agg: + cartesian_bounds: + field: location + - match: { hits.total: 1 } + - close_to: { aggregations.my_agg.bounds.top_left.x: { value: 342.5, error: 0.001 } } + - close_to: { aggregations.my_agg.bounds.top_left.y: { value: -217.6, error: 0.001 } } + - close_to: { aggregations.my_agg.bounds.bottom_right.x: { value: 342.5, error: 0.001 } } + - close_to: { aggregations.my_agg.bounds.bottom_right.y: { value: -217.6, error: 0.001 } } + +--- +"Test cartesian_bounds aggregation on point field with points": + - do: + indices.create: + index: locations + body: + mappings: + properties: + location: + type: point + + - do: + bulk: + refresh: true + index: locations + body: | + {"index":{}} + {"location": "POINT(491.2350 5237.4081)", "city": "Amsterdam", "name": "NEMO Science Museum"} + {"index":{}} + {"location": "POINT(490.1618 5236.9219)", "city": "Amsterdam", "name": "Museum Het Rembrandthuis"} + {"index":{}} + {"location": "POINT(491.4722 5237.1667)", "city": "Amsterdam", "name": "Nederlands Scheepvaartmuseum"} + {"index":{}} + {"location": "POINT(440.5200 5122.2900)", "city": "Antwerp", "name": "Letterenhuis"} + {"index":{}} + {"location": "POINT(233.6389 4886.1111)", "city": "Paris", "name": "Musée du Louvre"} + {"index":{}} + {"location": "POINT(232.7000 4886.0000)", "city": "Paris", "name": "Musée dOrsay"} + + - do: + indices.refresh: {} + + - do: + search: + rest_total_hits_as_int: true + index: locations + size: 0 + body: + aggs: + my_agg: + cartesian_bounds: + field: location + - match: { hits.total: 6 } + - close_to: { aggregations.my_agg.bounds.top_left.x: { value: 232.7, error: 0.001 } } + - close_to: { aggregations.my_agg.bounds.top_left.y: { value: 5237.4081, error: 0.001 } } + - close_to: { aggregations.my_agg.bounds.bottom_right.x: { value: 491.4722, error: 0.001 } } + - close_to: { aggregations.my_agg.bounds.bottom_right.y: { value: 4886.0, error: 0.001 } } + +--- +"Test cartesian_bounds aggregation on shape field with points": + - do: + indices.create: + index: locations + body: + mappings: + properties: + location: + type: shape + + - do: + bulk: + refresh: true + index: locations + body: | + {"index":{}} + {"location": "POINT(491.2350 5237.4081)", "city": "Amsterdam", "name": "NEMO Science Museum"} + {"index":{}} + {"location": "POINT(490.1618 5236.9219)", "city": "Amsterdam", "name": "Museum Het Rembrandthuis"} + {"index":{}} + {"location": "POINT(491.4722 5237.1667)", "city": "Amsterdam", "name": "Nederlands Scheepvaartmuseum"} + {"index":{}} + {"location": "POINT(440.5200 5122.2900)", "city": "Antwerp", "name": "Letterenhuis"} + {"index":{}} + {"location": "POINT(233.6389 4886.1111)", "city": "Paris", "name": "Musée du Louvre"} + {"index":{}} + {"location": "POINT(232.7000 4886.0000)", "city": "Paris", "name": "Musée dOrsay"} + + - do: + indices.refresh: {} + + - do: + search: + rest_total_hits_as_int: true + index: locations + size: 0 + body: + aggs: + my_agg: + cartesian_bounds: + field: location + - match: { hits.total: 6 } + - close_to: { aggregations.my_agg.bounds.top_left.x: { value: 232.7, error: 0.001 } } + - close_to: { aggregations.my_agg.bounds.top_left.y: { value: 5237.4081, error: 0.001 } } + - close_to: { aggregations.my_agg.bounds.bottom_right.x: { value: 491.4722, error: 0.001 } } + - close_to: { aggregations.my_agg.bounds.bottom_right.y: { value: 4886.0, error: 0.001 } } + +--- +"Test cartesian_bounds aggregation on shape field with polygon": + - do: + indices.create: + index: locations + body: + mappings: + properties: + location: + type: shape + + - do: + index: + index: locations + id: big_rectangle + body: { location: "POLYGON((-1000 -1000, 1000 -1000, 1000 1000, -1000 1000, -1000 -1000))" } + + - do: + indices.refresh: {} + + - do: + search: + rest_total_hits_as_int: true + index: locations + size: 0 + body: + aggs: + my_agg: + cartesian_bounds: + field: location + - match: { hits.total: 1 } + - close_to: { aggregations.my_agg.bounds.top_left.x: { value: -1000.0, error: 0.001 } } + - close_to: { aggregations.my_agg.bounds.top_left.y: { value: 1000.0, error: 0.001 } } + - close_to: { aggregations.my_agg.bounds.bottom_right.x: { value: 1000.0, error: 0.001 } } + - close_to: { aggregations.my_agg.bounds.bottom_right.y: { value: -1000.0, error: 0.001 } } diff --git a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/spatial/10_geo_bounds.yml b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/spatial/10_geo_bounds.yml new file mode 100644 index 0000000000000..bfc1a2d15e08f --- /dev/null +++ b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/spatial/10_geo_bounds.yml @@ -0,0 +1,208 @@ +--- +setup: + - skip: + features: close_to + +--- +"Test geo_bounds aggregation on geo_point field with point": + - do: + indices.create: + index: locations + body: + mappings: + properties: + location: + type: geo_point + + - do: + index: + index: locations + id: point_with_doc_values + body: { location: "POINT(34.25 -21.76)" } + + - do: + indices.refresh: {} + + - do: + search: + rest_total_hits_as_int: true + index: locations + size: 0 + body: + aggs: + my_agg: + geo_bounds: + field: location + - match: { hits.total: 1 } + - close_to: { aggregations.my_agg.bounds.top_left.lat: { value: -21.76, error: 0.00001 } } + - close_to: { aggregations.my_agg.bounds.top_left.lon: { value: 34.25, error: 0.00001 } } + - close_to: { aggregations.my_agg.bounds.bottom_right.lat: { value: -21.76, error: 0.00001 } } + - close_to: { aggregations.my_agg.bounds.bottom_right.lon: { value: 34.25, error: 0.00001 } } + +--- +"Test geo_bounds aggregation on geo_shape field with point": + - do: + indices.create: + index: locations + body: + mappings: + properties: + location: + type: geo_shape + + - do: + index: + index: locations + id: point_with_doc_values + body: { location: "POINT(34.25 -21.76)" } + + - do: + indices.refresh: {} + + - do: + search: + rest_total_hits_as_int: true + index: locations + size: 0 + body: + aggs: + my_agg: + geo_bounds: + field: location + - match: { hits.total: 1 } + - close_to: { aggregations.my_agg.bounds.top_left.lat: { value: -21.76, error: 0.00001 } } + - close_to: { aggregations.my_agg.bounds.top_left.lon: { value: 34.25, error: 0.00001 } } + - close_to: { aggregations.my_agg.bounds.bottom_right.lat: { value: -21.76, error: 0.00001 } } + - close_to: { aggregations.my_agg.bounds.bottom_right.lon: { value: 34.25, error: 0.00001 } } + +--- +"Test geo_bounds aggregation on geo_point field with points": + - do: + indices.create: + index: locations + body: + mappings: + properties: + location: + type: geo_point + + - do: + bulk: + refresh: true + index: locations + body: | + {"index":{}} + {"location": "POINT(4.912350 52.374081)", "city": "Amsterdam", "name": "NEMO Science Museum"} + {"index":{}} + {"location": "POINT(4.901618 52.369219)", "city": "Amsterdam", "name": "Museum Het Rembrandthuis"} + {"index":{}} + {"location": "POINT(4.914722 52.371667)", "city": "Amsterdam", "name": "Nederlands Scheepvaartmuseum"} + {"index":{}} + {"location": "POINT(4.405200 51.222900)", "city": "Antwerp", "name": "Letterenhuis"} + {"index":{}} + {"location": "POINT(2.336389 48.861111)", "city": "Paris", "name": "Musée du Louvre"} + {"index":{}} + {"location": "POINT(2.327000 48.860000)", "city": "Paris", "name": "Musée dOrsay"} + + - do: + indices.refresh: {} + + - do: + search: + rest_total_hits_as_int: true + index: locations + size: 0 + body: + aggs: + my_agg: + geo_bounds: + field: location + - match: { hits.total: 6 } + - close_to: { aggregations.my_agg.bounds.top_left.lat: { value: 52.374081, error: 0.00001 } } + - close_to: { aggregations.my_agg.bounds.top_left.lon: { value: 2.327000, error: 0.00001 } } + - close_to: { aggregations.my_agg.bounds.bottom_right.lat: { value: 48.860000, error: 0.00001 } } + - close_to: { aggregations.my_agg.bounds.bottom_right.lon: { value: 4.914722, error: 0.00001 } } + +--- +"Test geo_bounds aggregation on geo_shape field with geo_points": + - do: + indices.create: + index: locations + body: + mappings: + properties: + location: + type: geo_shape + + - do: + bulk: + refresh: true + index: locations + body: | + {"index":{}} + {"location": "POINT(4.912350 52.374081)", "city": "Amsterdam", "name": "NEMO Science Museum"} + {"index":{}} + {"location": "POINT(4.901618 52.369219)", "city": "Amsterdam", "name": "Museum Het Rembrandthuis"} + {"index":{}} + {"location": "POINT(4.914722 52.371667)", "city": "Amsterdam", "name": "Nederlands Scheepvaartmuseum"} + {"index":{}} + {"location": "POINT(4.405200 51.222900)", "city": "Antwerp", "name": "Letterenhuis"} + {"index":{}} + {"location": "POINT(2.336389 48.861111)", "city": "Paris", "name": "Musée du Louvre"} + {"index":{}} + {"location": "POINT(2.327000 48.860000)", "city": "Paris", "name": "Musée dOrsay"} + + - do: + indices.refresh: {} + + - do: + search: + rest_total_hits_as_int: true + index: locations + size: 0 + body: + aggs: + my_agg: + geo_bounds: + field: location + - match: { hits.total: 6 } + - close_to: { aggregations.my_agg.bounds.top_left.lat: { value: 52.374081, error: 0.00001 } } + - close_to: { aggregations.my_agg.bounds.top_left.lon: { value: 2.327000, error: 0.00001 } } + - close_to: { aggregations.my_agg.bounds.bottom_right.lat: { value: 48.860000, error: 0.00001 } } + - close_to: { aggregations.my_agg.bounds.bottom_right.lon: { value: 4.914722, error: 0.00001 } } + +--- +"Test geo_bounds aggregation on geo_shape field with polygon": + - do: + indices.create: + index: locations + body: + mappings: + properties: + location: + type: geo_shape + + - do: + index: + index: locations + id: big_rectangle + body: { location: "POLYGON((-10 -10, 10 -10, 10 10, -10 10, -10 -10))" } + + - do: + indices.refresh: {} + + - do: + search: + rest_total_hits_as_int: true + index: locations + size: 0 + body: + aggs: + my_agg: + geo_bounds: + field: location + - match: { hits.total: 1 } + - close_to: { aggregations.my_agg.bounds.top_left.lat: { value: 10.0, error: 0.00001 } } + - close_to: { aggregations.my_agg.bounds.top_left.lon: { value: -10.0, error: 0.00001 } } + - close_to: { aggregations.my_agg.bounds.bottom_right.lat: { value: -10.0, error: 0.00001 } } + - close_to: { aggregations.my_agg.bounds.bottom_right.lon: { value: 10.0, error: 0.00001 } } From 01f35bfaea809b30e3450b7c2742638169404ca3 Mon Sep 17 00:00:00 2001 From: Craig Taverner Date: Fri, 24 Mar 2023 17:20:01 +0100 Subject: [PATCH 2/2] Add tests for crossing the dateline With and without the wrap_longitude toggle --- .../test/spatial/10_geo_bounds.yml | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/spatial/10_geo_bounds.yml b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/spatial/10_geo_bounds.yml index bfc1a2d15e08f..d4748efef5395 100644 --- a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/spatial/10_geo_bounds.yml +++ b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/spatial/10_geo_bounds.yml @@ -206,3 +206,78 @@ setup: - close_to: { aggregations.my_agg.bounds.top_left.lon: { value: -10.0, error: 0.00001 } } - close_to: { aggregations.my_agg.bounds.bottom_right.lat: { value: -10.0, error: 0.00001 } } - close_to: { aggregations.my_agg.bounds.bottom_right.lon: { value: 10.0, error: 0.00001 } } + +--- +"Test geo_bounds aggregation on geo_shape crossing dateline": + - do: + indices.create: + index: locations + body: + mappings: + properties: + location: + type: geo_shape + + - do: + index: + index: locations + id: big_rectangle + body: { location: "POLYGON((170 -10, -170 -10, -170 10, 170 10, 170 -10))" } + + - do: + indices.refresh: {} + + - do: + search: + rest_total_hits_as_int: true + index: locations + size: 0 + body: + aggs: + my_agg: + geo_bounds: + field: location + wrap_longitude: true + - match: { hits.total: 1 } + - close_to: { aggregations.my_agg.bounds.top_left.lat: { value: 10.0, error: 0.00001 } } + - close_to: { aggregations.my_agg.bounds.top_left.lon: { value: 170.0, error: 0.00001 } } + - close_to: { aggregations.my_agg.bounds.bottom_right.lat: { value: -10.0, error: 0.00001 } } + - close_to: { aggregations.my_agg.bounds.bottom_right.lon: { value: -170.0, error: 0.00001 } } + + +--- +"Test geo_bounds aggregation on geo_shape crossing dateline without wrap_longitude": + - do: + indices.create: + index: locations + body: + mappings: + properties: + location: + type: geo_shape + + - do: + index: + index: locations + id: big_rectangle + body: { location: "POLYGON((170 -10, -170 -10, -170 10, 170 10, 170 -10))" } + + - do: + indices.refresh: {} + + - do: + search: + rest_total_hits_as_int: true + index: locations + size: 0 + body: + aggs: + my_agg: + geo_bounds: + field: location + wrap_longitude: false + - match: { hits.total: 1 } + - close_to: { aggregations.my_agg.bounds.top_left.lat: { value: 10.0, error: 0.00001 } } + - close_to: { aggregations.my_agg.bounds.top_left.lon: { value: -180.0, error: 0.00001 } } + - close_to: { aggregations.my_agg.bounds.bottom_right.lat: { value: -10.0, error: 0.00001 } } + - close_to: { aggregations.my_agg.bounds.bottom_right.lon: { value: 180.0, error: 0.00001 } }