• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

geo-engine / geoengine / 3676601107

pending completion
3676601107

push

github

GitHub
Merge #695

42001 of 50014 relevant lines covered (83.98%)

2.01 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

31.4
/operators/src/engine/query_processor.rs
1
use super::query::QueryContext;
2
use crate::processing::RasterTypeConversionQueryProcessor;
3
use crate::util::Result;
4
use async_trait::async_trait;
5
use futures::stream::BoxStream;
6
use geoengine_datatypes::collections::{
7
    DataCollection, MultiLineStringCollection, MultiPolygonCollection,
8
};
9
use geoengine_datatypes::plots::{PlotData, PlotOutputFormat};
10
use geoengine_datatypes::primitives::{
11
    AxisAlignedRectangle, BoundingBox2D, PlotQueryRectangle, QueryRectangle, RasterQueryRectangle,
12
    SpatialPartition2D, VectorQueryRectangle,
13
};
14
use geoengine_datatypes::raster::Pixel;
15
use geoengine_datatypes::{collections::MultiPointCollection, raster::RasterTile2D};
16

17
/// An instantiation of an operator that produces a stream of results for a query
18
#[async_trait]
19
pub trait QueryProcessor: Send + Sync {
20
    type Output;
21
    type SpatialBounds: AxisAlignedRectangle + Send + Sync;
22

23
    /// inner logic of the processor
24
    async fn _query<'a>(
25
        &'a self,
26
        query: QueryRectangle<Self::SpatialBounds>,
27
        ctx: &'a dyn QueryContext,
28
    ) -> Result<BoxStream<'a, Result<Self::Output>>>;
29

30
    async fn query<'a>(
59✔
31
        &'a self,
32
        query: QueryRectangle<Self::SpatialBounds>,
33
        ctx: &'a dyn QueryContext,
34
    ) -> Result<BoxStream<'a, Result<Self::Output>>> {
35
        Ok(Box::pin(
59✔
36
            ctx.abort_registration()
118✔
37
                .wrap(self._query(query, ctx).await?),
132✔
38
        ))
39
    }
40
}
41

42
/// An instantiation of a raster operator that produces a stream of raster results for a query
43
#[async_trait]
44
pub trait RasterQueryProcessor: Sync + Send {
45
    type RasterType: Pixel;
46

47
    async fn raster_query<'a>(
48
        &'a self,
49
        query: RasterQueryRectangle,
50
        ctx: &'a dyn QueryContext,
51
    ) -> Result<BoxStream<'a, Result<RasterTile2D<Self::RasterType>>>>;
52

53
    fn boxed(self) -> Box<dyn RasterQueryProcessor<RasterType = Self::RasterType>>
30✔
54
    where
55
        Self: Sized + 'static,
56
    {
57
        Box::new(self)
25✔
58
    }
59
}
60

61
pub type BoxRasterQueryProcessor<P> = Box<dyn RasterQueryProcessor<RasterType = P>>;
62

63
#[async_trait]
64
impl<S, T> RasterQueryProcessor for S
65
where
66
    S: QueryProcessor<Output = RasterTile2D<T>, SpatialBounds = SpatialPartition2D> + Sync + Send,
67
    T: Pixel,
68
{
69
    type RasterType = T;
70
    async fn raster_query<'a>(
33✔
71
        &'a self,
72
        query: RasterQueryRectangle,
73
        ctx: &'a dyn QueryContext,
74
    ) -> Result<BoxStream<'a, Result<RasterTile2D<Self::RasterType>>>> {
75
        self.query(query, ctx).await
34✔
76
    }
77
}
78

79
/// An instantiation of a vector operator that produces a stream of vector results for a query
80
#[async_trait]
81
pub trait VectorQueryProcessor: Sync + Send {
82
    type VectorType;
83
    async fn vector_query<'a>(
84
        &'a self,
85
        query: VectorQueryRectangle,
86
        ctx: &'a dyn QueryContext,
87
    ) -> Result<BoxStream<'a, Result<Self::VectorType>>>;
88

89
    fn boxed(self) -> Box<dyn VectorQueryProcessor<VectorType = Self::VectorType>>
23✔
90
    where
91
        Self: Sized + 'static,
92
    {
93
        Box::new(self)
22✔
94
    }
95
}
96

97
#[async_trait]
98
impl<S, VD> VectorQueryProcessor for S
99
where
100
    S: QueryProcessor<Output = VD, SpatialBounds = BoundingBox2D> + Sync + Send,
101
{
102
    type VectorType = VD;
103

104
    async fn vector_query<'a>(
14✔
105
        &'a self,
106
        query: VectorQueryRectangle,
107
        ctx: &'a dyn QueryContext,
108
    ) -> Result<BoxStream<'a, Result<Self::VectorType>>> {
109
        self.query(query, ctx).await
20✔
110
    }
111
}
112

113
/// An instantiation of a plot operator that produces a stream of vector results for a query
114
#[async_trait]
115
pub trait PlotQueryProcessor: Sync + Send {
116
    type OutputFormat;
117

118
    fn plot_type(&self) -> &'static str;
119

120
    async fn plot_query<'a>(
121
        &'a self,
122
        query: PlotQueryRectangle,
123
        ctx: &'a dyn QueryContext,
124
    ) -> Result<Self::OutputFormat>;
125

126
    fn boxed(self) -> Box<dyn PlotQueryProcessor<OutputFormat = Self::OutputFormat>>
13✔
127
    where
128
        Self: Sized + 'static,
129
    {
130
        Box::new(self)
13✔
131
    }
132
}
133

134
#[async_trait]
135
impl<T, S> QueryProcessor for Box<dyn QueryProcessor<Output = T, SpatialBounds = S>>
136
where
137
    S: AxisAlignedRectangle + Send + Sync,
138
{
139
    type Output = T;
140
    type SpatialBounds = S;
141

142
    async fn _query<'a>(
143
        &'a self,
144
        query: QueryRectangle<S>,
145
        ctx: &'a dyn QueryContext,
146
    ) -> Result<BoxStream<'a, Result<Self::Output>>> {
147
        self.as_ref().query(query, ctx).await
×
148
    }
149
}
150

151
#[async_trait]
152
impl<T> QueryProcessor for Box<dyn RasterQueryProcessor<RasterType = T>>
153
where
154
    T: Pixel,
155
{
156
    type Output = RasterTile2D<T>;
157
    type SpatialBounds = SpatialPartition2D;
158

159
    async fn _query<'a>(
8✔
160
        &'a self,
161
        query: RasterQueryRectangle,
162
        ctx: &'a dyn QueryContext,
163
    ) -> Result<BoxStream<'a, Result<Self::Output>>> {
164
        self.as_ref().raster_query(query, ctx).await
8✔
165
    }
166
}
167

168
#[async_trait]
169
impl<V> QueryProcessor for Box<dyn VectorQueryProcessor<VectorType = V>>
170
where
171
    V: 'static,
172
{
173
    type Output = V;
174
    type SpatialBounds = BoundingBox2D;
175

176
    async fn _query<'a>(
7✔
177
        &'a self,
178
        query: VectorQueryRectangle,
179
        ctx: &'a dyn QueryContext,
180
    ) -> Result<BoxStream<'a, Result<Self::Output>>> {
181
        self.as_ref().vector_query(query, ctx).await
12✔
182
    }
183
}
184

185
/// An enum to differentiate between outputs of raster processors
186
pub enum TypedRasterQueryProcessor {
187
    U8(Box<dyn RasterQueryProcessor<RasterType = u8>>),
188
    U16(Box<dyn RasterQueryProcessor<RasterType = u16>>),
189
    U32(Box<dyn RasterQueryProcessor<RasterType = u32>>),
190
    U64(Box<dyn RasterQueryProcessor<RasterType = u64>>),
191
    I8(Box<dyn RasterQueryProcessor<RasterType = i8>>),
192
    I16(Box<dyn RasterQueryProcessor<RasterType = i16>>),
193
    I32(Box<dyn RasterQueryProcessor<RasterType = i32>>),
194
    I64(Box<dyn RasterQueryProcessor<RasterType = i64>>),
195
    F32(Box<dyn RasterQueryProcessor<RasterType = f32>>),
196
    F64(Box<dyn RasterQueryProcessor<RasterType = f64>>),
197
}
198

199
impl std::fmt::Debug for TypedRasterQueryProcessor {
200
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
×
201
        let interals = "RasterQueryProcessor"; // TODO: implement debug for children
×
202
        match self {
×
203
            Self::U8(_) => f.debug_tuple("U8").field(&interals).finish(),
×
204
            Self::U16(_) => f.debug_tuple("U16").field(&interals).finish(),
×
205
            Self::U32(_) => f.debug_tuple("U32").field(&interals).finish(),
×
206
            Self::U64(_) => f.debug_tuple("U64").field(&interals).finish(),
×
207
            Self::I8(_) => f.debug_tuple("I8").field(&interals).finish(),
×
208
            Self::I16(_) => f.debug_tuple("I16").field(&interals).finish(),
×
209
            Self::I32(_) => f.debug_tuple("I32").field(&interals).finish(),
×
210
            Self::I64(_) => f.debug_tuple("I64").field(&interals).finish(),
×
211
            Self::F32(_) => f.debug_tuple("F32").field(&interals).finish(),
×
212
            Self::F64(_) => f.debug_tuple("F64").field(&interals).finish(),
×
213
        }
214
    }
215
}
216

217
impl TypedRasterQueryProcessor {
218
    pub fn get_u8(self) -> Option<Box<dyn RasterQueryProcessor<RasterType = u8>>> {
2✔
219
        match self {
2✔
220
            Self::U8(r) => Some(r),
2✔
221
            _ => None,
×
222
        }
223
    }
224
    pub fn get_u16(self) -> Option<Box<dyn RasterQueryProcessor<RasterType = u16>>> {
2✔
225
        match self {
2✔
226
            Self::U16(r) => Some(r),
2✔
227
            _ => None,
×
228
        }
229
    }
230
    pub fn get_u32(self) -> Option<Box<dyn RasterQueryProcessor<RasterType = u32>>> {
×
231
        match self {
×
232
            Self::U32(r) => Some(r),
×
233
            _ => None,
×
234
        }
235
    }
236
    pub fn get_u64(self) -> Option<Box<dyn RasterQueryProcessor<RasterType = u64>>> {
×
237
        match self {
×
238
            Self::U64(r) => Some(r),
×
239
            _ => None,
×
240
        }
241
    }
242
    pub fn get_i8(self) -> Option<Box<dyn RasterQueryProcessor<RasterType = i8>>> {
1✔
243
        match self {
1✔
244
            Self::I8(r) => Some(r),
1✔
245
            _ => None,
×
246
        }
247
    }
248
    pub fn get_i16(self) -> Option<Box<dyn RasterQueryProcessor<RasterType = i16>>> {
×
249
        match self {
×
250
            Self::I16(r) => Some(r),
×
251
            _ => None,
×
252
        }
253
    }
254
    pub fn get_i32(self) -> Option<Box<dyn RasterQueryProcessor<RasterType = i32>>> {
×
255
        match self {
×
256
            Self::I32(r) => Some(r),
×
257
            _ => None,
×
258
        }
259
    }
260
    pub fn get_i64(self) -> Option<Box<dyn RasterQueryProcessor<RasterType = i64>>> {
×
261
        match self {
×
262
            Self::I64(r) => Some(r),
×
263
            _ => None,
×
264
        }
265
    }
266
    pub fn get_f32(self) -> Option<Box<dyn RasterQueryProcessor<RasterType = f32>>> {
1✔
267
        match self {
1✔
268
            Self::F32(r) => Some(r),
1✔
269
            _ => None,
×
270
        }
271
    }
272
    pub fn get_f64(self) -> Option<Box<dyn RasterQueryProcessor<RasterType = f64>>> {
1✔
273
        match self {
1✔
274
            Self::F64(r) => Some(r),
1✔
275
            _ => None,
×
276
        }
277
    }
278

279
    pub fn into_u8(self) -> BoxRasterQueryProcessor<u8> {
×
280
        match self {
×
281
            Self::U8(r) => r,
×
282
            Self::U16(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
283
            Self::U32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
284
            Self::U64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
285
            Self::I8(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
286
            Self::I16(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
287
            Self::I32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
288
            Self::I64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
289
            Self::F32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
290
            Self::F64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
291
        }
292
    }
293

294
    pub fn into_u16(self) -> BoxRasterQueryProcessor<u16> {
1✔
295
        match self {
2✔
296
            Self::U8(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
2✔
297
            Self::U16(r) => r,
×
298
            Self::U32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
299
            Self::U64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
300
            Self::I8(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
301
            Self::I16(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
302
            Self::I32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
303
            Self::I64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
304
            Self::F32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
305
            Self::F64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
306
        }
307
    }
308

309
    pub fn into_u32(self) -> BoxRasterQueryProcessor<u32> {
×
310
        match self {
×
311
            Self::U8(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
312
            Self::U16(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
313
            Self::U32(r) => r,
×
314
            Self::U64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
315
            Self::I8(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
316
            Self::I16(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
317
            Self::I32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
318
            Self::I64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
319
            Self::F32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
320
            Self::F64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
321
        }
322
    }
323

324
    pub fn into_u64(self) -> BoxRasterQueryProcessor<u64> {
×
325
        match self {
×
326
            Self::U8(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
327
            Self::U16(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
328
            Self::U32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
329
            Self::U64(r) => r,
×
330
            Self::I8(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
331
            Self::I16(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
332
            Self::I32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
333
            Self::I64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
334
            Self::F32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
335
            Self::F64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
336
        }
337
    }
338

339
    pub fn into_f32(self) -> BoxRasterQueryProcessor<f32> {
1✔
340
        match self {
2✔
341
            Self::U8(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
342
            Self::U16(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
343
            Self::U32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
344
            Self::U64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
345
            Self::I8(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
346
            Self::I16(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
347
            Self::I32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
2✔
348
            Self::I64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
349
            Self::F32(r) => r,
×
350
            Self::F64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
351
        }
352
    }
353

354
    pub fn into_i8(self) -> BoxRasterQueryProcessor<i8> {
×
355
        match self {
×
356
            Self::U8(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
357
            Self::U16(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
358
            Self::U32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
359
            Self::U64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
360
            Self::I8(r) => r,
×
361
            Self::I16(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
362
            Self::I32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
363
            Self::I64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
364
            Self::F32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
365
            Self::F64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
366
        }
367
    }
368

369
    pub fn into_i16(self) -> BoxRasterQueryProcessor<i16> {
×
370
        match self {
×
371
            Self::U8(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
372
            Self::U16(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
373
            Self::U32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
374
            Self::U64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
375
            Self::I8(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
376
            Self::I16(r) => r,
×
377
            Self::I32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
378
            Self::I64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
379
            Self::F32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
380
            Self::F64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
381
        }
382
    }
383

384
    pub fn into_i32(self) -> BoxRasterQueryProcessor<i32> {
×
385
        match self {
×
386
            Self::U8(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
387
            Self::U16(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
388
            Self::U32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
389
            Self::U64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
390
            Self::I8(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
391
            Self::I16(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
392
            Self::I32(r) => r,
×
393
            Self::I64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
394
            Self::F32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
395
            Self::F64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
396
        }
397
    }
398

399
    pub fn into_i64(self) -> BoxRasterQueryProcessor<i64> {
×
400
        match self {
×
401
            Self::U8(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
402
            Self::U16(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
403
            Self::U32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
404
            Self::U64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
405
            Self::I8(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
406
            Self::I16(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
407
            Self::I32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
408
            Self::I64(r) => r,
×
409
            Self::F32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
410
            Self::F64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
411
        }
412
    }
413

414
    pub fn into_f64(self) -> BoxRasterQueryProcessor<f64> {
1✔
415
        match self {
2✔
416
            Self::U8(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
2✔
417
            Self::U16(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
418
            Self::U32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
419
            Self::U64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
420
            Self::I8(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
2✔
421
            Self::I16(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
422
            Self::I32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
423
            Self::I64(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
424
            Self::F32(r) => RasterTypeConversionQueryProcessor::new(r).boxed(),
×
425
            Self::F64(r) => r,
×
426
        }
427
    }
428
}
429

430
impl From<Box<dyn RasterQueryProcessor<RasterType = u8>>> for TypedRasterQueryProcessor {
431
    fn from(value: Box<dyn RasterQueryProcessor<RasterType = u8>>) -> Self {
1✔
432
        TypedRasterQueryProcessor::U8(value)
1✔
433
    }
434
}
435

436
impl From<Box<dyn RasterQueryProcessor<RasterType = i8>>> for TypedRasterQueryProcessor {
437
    fn from(value: Box<dyn RasterQueryProcessor<RasterType = i8>>) -> Self {
1✔
438
        TypedRasterQueryProcessor::I8(value)
1✔
439
    }
440
}
441

442
impl From<Box<dyn RasterQueryProcessor<RasterType = u16>>> for TypedRasterQueryProcessor {
443
    fn from(value: Box<dyn RasterQueryProcessor<RasterType = u16>>) -> Self {
1✔
444
        TypedRasterQueryProcessor::U16(value)
1✔
445
    }
446
}
447

448
impl From<Box<dyn RasterQueryProcessor<RasterType = i16>>> for TypedRasterQueryProcessor {
449
    fn from(value: Box<dyn RasterQueryProcessor<RasterType = i16>>) -> Self {
×
450
        TypedRasterQueryProcessor::I16(value)
×
451
    }
452
}
453

454
impl From<Box<dyn RasterQueryProcessor<RasterType = u32>>> for TypedRasterQueryProcessor {
455
    fn from(value: Box<dyn RasterQueryProcessor<RasterType = u32>>) -> Self {
×
456
        TypedRasterQueryProcessor::U32(value)
×
457
    }
458
}
459

460
impl From<Box<dyn RasterQueryProcessor<RasterType = i32>>> for TypedRasterQueryProcessor {
461
    fn from(value: Box<dyn RasterQueryProcessor<RasterType = i32>>) -> Self {
2✔
462
        TypedRasterQueryProcessor::I32(value)
2✔
463
    }
464
}
465

466
impl From<Box<dyn RasterQueryProcessor<RasterType = u64>>> for TypedRasterQueryProcessor {
467
    fn from(value: Box<dyn RasterQueryProcessor<RasterType = u64>>) -> Self {
×
468
        TypedRasterQueryProcessor::U64(value)
×
469
    }
470
}
471
impl From<Box<dyn RasterQueryProcessor<RasterType = i64>>> for TypedRasterQueryProcessor {
472
    fn from(value: Box<dyn RasterQueryProcessor<RasterType = i64>>) -> Self {
×
473
        TypedRasterQueryProcessor::I64(value)
×
474
    }
475
}
476
impl From<Box<dyn RasterQueryProcessor<RasterType = f32>>> for TypedRasterQueryProcessor {
477
    fn from(value: Box<dyn RasterQueryProcessor<RasterType = f32>>) -> Self {
1✔
478
        TypedRasterQueryProcessor::F32(value)
1✔
479
    }
480
}
481
impl From<Box<dyn RasterQueryProcessor<RasterType = f64>>> for TypedRasterQueryProcessor {
482
    fn from(value: Box<dyn RasterQueryProcessor<RasterType = f64>>) -> Self {
×
483
        TypedRasterQueryProcessor::F64(value)
×
484
    }
485
}
486

487
/// An enum that contains all possible query processor variants
488
pub enum TypedVectorQueryProcessor {
489
    Data(Box<dyn VectorQueryProcessor<VectorType = DataCollection>>),
490
    MultiPoint(Box<dyn VectorQueryProcessor<VectorType = MultiPointCollection>>),
491
    MultiLineString(Box<dyn VectorQueryProcessor<VectorType = MultiLineStringCollection>>),
492
    MultiPolygon(Box<dyn VectorQueryProcessor<VectorType = MultiPolygonCollection>>),
493
}
494

495
impl TypedVectorQueryProcessor {
496
    pub fn data(self) -> Option<Box<dyn VectorQueryProcessor<VectorType = DataCollection>>> {
1✔
497
        if let TypedVectorQueryProcessor::Data(p) = self {
2✔
498
            Some(p)
1✔
499
        } else {
500
            None
×
501
        }
502
    }
503

504
    pub fn multi_point(
2✔
505
        self,
506
    ) -> Option<Box<dyn VectorQueryProcessor<VectorType = MultiPointCollection>>> {
507
        if let TypedVectorQueryProcessor::MultiPoint(p) = self {
4✔
508
            Some(p)
2✔
509
        } else {
510
            None
×
511
        }
512
    }
513

514
    pub fn multi_line_string(
1✔
515
        self,
516
    ) -> Option<Box<dyn VectorQueryProcessor<VectorType = MultiLineStringCollection>>> {
517
        if let TypedVectorQueryProcessor::MultiLineString(p) = self {
2✔
518
            Some(p)
1✔
519
        } else {
520
            None
×
521
        }
522
    }
523

524
    pub fn multi_polygon(
1✔
525
        self,
526
    ) -> Option<Box<dyn VectorQueryProcessor<VectorType = MultiPolygonCollection>>> {
527
        if let TypedVectorQueryProcessor::MultiPolygon(p) = self {
2✔
528
            Some(p)
1✔
529
        } else {
530
            None
×
531
        }
532
    }
533
}
534

535
impl From<Box<dyn VectorQueryProcessor<VectorType = DataCollection>>>
536
    for TypedVectorQueryProcessor
537
{
538
    fn from(value: Box<dyn VectorQueryProcessor<VectorType = DataCollection>>) -> Self {
×
539
        TypedVectorQueryProcessor::Data(value)
×
540
    }
541
}
542

543
impl From<Box<dyn VectorQueryProcessor<VectorType = MultiPointCollection>>>
544
    for TypedVectorQueryProcessor
545
{
546
    fn from(value: Box<dyn VectorQueryProcessor<VectorType = MultiPointCollection>>) -> Self {
1✔
547
        TypedVectorQueryProcessor::MultiPoint(value)
1✔
548
    }
549
}
550

551
impl From<Box<dyn VectorQueryProcessor<VectorType = MultiLineStringCollection>>>
552
    for TypedVectorQueryProcessor
553
{
554
    fn from(value: Box<dyn VectorQueryProcessor<VectorType = MultiLineStringCollection>>) -> Self {
×
555
        TypedVectorQueryProcessor::MultiLineString(value)
×
556
    }
557
}
558

559
impl From<Box<dyn VectorQueryProcessor<VectorType = MultiPolygonCollection>>>
560
    for TypedVectorQueryProcessor
561
{
562
    fn from(value: Box<dyn VectorQueryProcessor<VectorType = MultiPolygonCollection>>) -> Self {
×
563
        TypedVectorQueryProcessor::MultiPolygon(value)
×
564
    }
565
}
566

567
/// An enum that contains all possible query processor variants
568
pub enum TypedPlotQueryProcessor {
569
    JsonPlain(Box<dyn PlotQueryProcessor<OutputFormat = serde_json::Value>>),
570
    JsonVega(Box<dyn PlotQueryProcessor<OutputFormat = PlotData>>),
571
    ImagePng(Box<dyn PlotQueryProcessor<OutputFormat = Vec<u8>>>),
572
}
573

574
impl From<&TypedPlotQueryProcessor> for PlotOutputFormat {
575
    fn from(typed_processor: &TypedPlotQueryProcessor) -> Self {
1✔
576
        match typed_processor {
1✔
577
            TypedPlotQueryProcessor::JsonPlain(_) => PlotOutputFormat::JsonPlain,
1✔
578
            TypedPlotQueryProcessor::JsonVega(_) => PlotOutputFormat::JsonVega,
1✔
579
            TypedPlotQueryProcessor::ImagePng(_) => PlotOutputFormat::ImagePng,
×
580
        }
581
    }
582
}
583

584
impl TypedPlotQueryProcessor {
585
    pub fn plot_type(&self) -> &'static str {
1✔
586
        match self {
1✔
587
            TypedPlotQueryProcessor::JsonPlain(p) => p.plot_type(),
1✔
588
            TypedPlotQueryProcessor::JsonVega(p) => p.plot_type(),
1✔
589
            TypedPlotQueryProcessor::ImagePng(p) => p.plot_type(),
×
590
        }
591
    }
592

593
    pub fn json_plain(
1✔
594
        self,
595
    ) -> Option<Box<dyn PlotQueryProcessor<OutputFormat = serde_json::Value>>> {
596
        if let TypedPlotQueryProcessor::JsonPlain(p) = self {
2✔
597
            Some(p)
1✔
598
        } else {
599
            None
×
600
        }
601
    }
602

603
    pub fn json_vega(self) -> Option<Box<dyn PlotQueryProcessor<OutputFormat = PlotData>>> {
1✔
604
        if let TypedPlotQueryProcessor::JsonVega(p) = self {
2✔
605
            Some(p)
1✔
606
        } else {
607
            None
×
608
        }
609
    }
610

611
    pub fn image_png(self) -> Option<Box<dyn PlotQueryProcessor<OutputFormat = Vec<u8>>>> {
×
612
        if let TypedPlotQueryProcessor::ImagePng(p) = self {
×
613
            Some(p)
×
614
        } else {
615
            None
×
616
        }
617
    }
618
}
619

620
/// Maps a `TypedVectorQueryProcessor` to another `TypedVectorQueryProcessor` by calling a function on its variant.
621
/// Call via `map_typed_query_processor!(input, processor => function)`.
622
#[macro_export]
623
macro_rules! map_typed_query_processor {
624
    ($input:expr, $processor:ident => $function_call:expr) => {
625
        map_typed_query_processor!(
626
            @variants $input, $processor => $function_call,
627
            Data, MultiPoint, MultiLineString, MultiPolygon
628
        )
629
    };
630

631
    (@variants $input:expr, $processor:ident => $function_call:expr, $($variant:tt),+) => {
632
        match $input {
633
            $(
634
                $crate::engine::TypedVectorQueryProcessor::$variant($processor) => {
635
                    $crate::engine::TypedVectorQueryProcessor::$variant($function_call)
636
                }
637
            )+
638
        }
639
    };
640
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc