1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
use crate::search::*;
use crate::util::*;
use serde::Serialize;
#[derive(Debug, Clone, PartialEq, Serialize)]
pub struct GeoBoundingBoxQuery {
#[serde(rename = "geo_bounding_box")]
inner: Inner,
}
#[derive(Debug, Clone, PartialEq, Serialize)]
struct Inner {
#[serde(flatten)]
pair: KeyValuePair<String, GeoBoundingBox>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
validation_method: Option<ValidationMethod>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
boost: Option<Boost>,
#[serde(skip_serializing_if = "ShouldSkip::should_skip")]
_name: Option<String>,
}
impl Query {
pub fn geo_bounding_box(
field: impl Into<String>,
value: impl Into<GeoBoundingBox>,
) -> GeoBoundingBoxQuery {
GeoBoundingBoxQuery {
inner: Inner {
pair: KeyValuePair::new(field.into(), value.into()),
validation_method: None,
boost: None,
_name: None,
},
}
}
}
impl GeoBoundingBoxQuery {
pub fn validation_method(mut self, validation_method: impl Into<ValidationMethod>) -> Self {
self.inner.validation_method = Some(validation_method.into());
self
}
add_boost_and_name!();
}
impl ShouldSkip for GeoBoundingBoxQuery {
fn should_skip(&self) -> bool {
self.inner.pair.key.should_skip()
}
}
#[cfg(test)]
mod tests {
use super::*;
test_serialization! {
geo_bounding_box_wkt(
Query::geo_bounding_box("pin.location", GeoBoundingBox::WellKnownText {
wkt: "BBOX (-74.1, -71.12, 40.73, 40.01)".into()
}), json!({
"geo_bounding_box": {
"pin.location": {
"wkt": "BBOX (-74.1, -71.12, 40.73, 40.01)"
}
}
})
);
geo_bounding_box_geopoint(
Query::geo_bounding_box("pin.location", GeoBoundingBox::MainDiagonal {
top_left: GeoPoint::Coordinates { longitude: -74.1, latitude: 40.73 },
bottom_right: GeoPoint::Coordinates { longitude: -71.12, latitude: 40.01 }
}).validation_method(ValidationMethod::Strict).name("test_name"),
json!({
"geo_bounding_box": {
"validation_method": "STRICT",
"_name": "test_name",
"pin.location": {
"top_left": [ -74.1, 40.73 ],
"bottom_right": [ -71.12, 40.01 ]
}
}
})
);
geo_bounding_box_vertices(
Query::geo_bounding_box("pin.location", GeoBoundingBox::Vertices {
top: 40.73,
left: -74.1,
bottom: 40.01,
right: -71.12
}).validation_method(ValidationMethod::Strict)
.name("test_name")
.boost(1),
json!({
"geo_bounding_box": {
"validation_method": "STRICT",
"_name": "test_name",
"boost": 1,
"pin.location": {
"top": 40.73,
"left": -74.1,
"bottom": 40.01,
"right": -71.12
}
}
})
)
}
}