cognite-sdk 0.6.2

SDK for the Cognite Data Fusion API
Documentation
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
use std::collections::HashMap;

use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;

use crate::{AdvancedFilter, PropertyIdentifier};

use super::LastUpdatedTimeFilter;

#[skip_serializing_none]
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
/// Object used to define the fixed bounds of a histogram.
pub struct Bounds<T> {
    /// Lower bound of the histogram.
    pub min: Option<T>,
    /// Upper bound of the histogram.
    pub max: Option<T>,
}

#[skip_serializing_none]
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
/// A simple aggregate on a property.
pub struct SimpleAggregate {
    /// Property to aggregate over.
    pub property: Vec<String>,
}

#[skip_serializing_none]
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
/// An aggregate that returns unique values of a property.
pub struct UniqueValuesAggregate {
    /// Property to aggregate over.
    pub property: Vec<String>,
    /// Nested aggregates, to further group the unique values.
    pub aggregates: Option<HashMap<String, RecordsAggregate>>,
    /// The number of top buckets returned. The default limit is 10 items.
    pub size: Option<u32>,
}

#[skip_serializing_none]
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
/// This aggregate is used to create a histogram of numeric values
/// from the specified property.
pub struct NumberHistogramAggregate {
    /// Property to aggregate over.
    pub property: Vec<String>,
    /// To limit the range of buckets in the histogram.
    /// It is particularly useful in the case of open data ranges
    /// that can result in a very large number of buckets.
    /// One or both bounds must be specified.
    pub hard_bounds: Option<Bounds<f64>>,
    /// The interval between each bucket.
    pub interval: f64,
    /// Nested aggregates, to further group the histogram values.
    pub aggregates: Option<HashMap<String, RecordsAggregate>>,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
/// Calendar interval between each bucket.
pub enum CalendarInterval {
    #[serde(rename = "1y")]
    /// 1 year
    Year,
    #[serde(rename = "1q")]
    /// 1 quarter
    Quarter,
    #[serde(rename = "1M")]
    /// 1 month
    Month,
    #[serde(rename = "1w")]
    /// 1 week
    Week,
    #[serde(rename = "1d")]
    /// 1 day
    Day,
    #[serde(rename = "1h")]
    /// 1 hour
    Hour,
    #[serde(rename = "1m")]
    /// 1 minute
    Minute,
    #[serde(rename = "1s")]
    /// 1 second
    Second,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
/// The interval between each bucket in a time histogram.
pub enum TimeHistogramInterval {
    /// Calendar interval
    CalendarInterval(CalendarInterval),
    /// Fixed interval, as a duration, e.g. 3m, 400h, 25d, etc.
    FixedInterval(String),
}

#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
/// A time histogram aggregator function. This function will generate a histogram
/// from the values of the specified property. It uses the specified
/// calendar or fixed interval.
pub struct TimeHistogramAggregate {
    /// Property to aggregate over.
    pub property: Vec<String>,
    #[serde(flatten)]
    /// The interval between each bucket.
    pub interval: TimeHistogramInterval,
    /// To limit the range of buckets in the histogram.
    /// It is particularly useful in the case of open data ranges
    /// that can result in a very large number of buckets.
    /// One or both bounds must be specified.
    pub hard_bounds: Option<Bounds<String>>,
    /// Nested aggregates, to further group the histogram values.
    pub aggregates: Option<HashMap<String, RecordsAggregate>>,
}

#[derive(Serialize, Deserialize, Clone, Debug)]

/// The moving function to use in the moving function aggregate.
pub enum MovingFunction {
    #[serde(rename = "MovingFunctions.max")]
    /// The maximum value in the window.
    Max,
    #[serde(rename = "MovingFunctions.min")]
    /// The minimum value in the window.
    Min,
    #[serde(rename = "MovingFunctions.sum")]
    /// The sum of the values in the window.
    Sum,
    #[serde(rename = "MovingFunctions.unweightedAvg")]
    /// The unweighted average of the values in the window.
    UnweightedAvg,
    #[serde(rename = "MovingFunctions.linearWeightedAvg")]
    /// The linear weighted average of the values in the window.
    LinearWeightedAvg,
    /// Some other function.
    #[serde(untagged)]
    Other(String),
}

#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
/// Given an ordered series of data, the Moving Function aggregation will slide
/// a window across the data and allow the user to specify a function
/// that is executed on each window of data. A number of common functions
/// are predefined such as min/max, moving averages, etc.
/// Customer defined functions are not allowed now.
/// The aggregate must be embedded inside of a numberHistogram or
/// timeHistogram aggregate. It can be embedded like any other metric aggregate.
pub struct MovingFunctionAggregate {
    /// The path to the buckets to use for the moving function.
    /// Syntax is `[AggregateName][MultiBucketKey]?(>[AggregateName])*`.
    /// See documentation for more details.
    pub buckets_path: String,
    /// The size of window to slide accross the histogram.
    pub window: u32,
    /// The function that should be executed on each window of data.
    pub function: MovingFunction,
}

#[skip_serializing_none]
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
/// A multi-bucket aggregation where each bucket contains the records that matches
/// a filter in the filters list.
///
/// Note: only 30 seuch buckets are allowed accross all filter aggregates in a
/// single request.
pub struct FilterAggregate {
    /// List of filters to describe each bucket.
    pub filters: Vec<AdvancedFilter>,
    /// Nested aggregates, to further group the filter values.
    pub aggregates: Option<HashMap<String, RecordsAggregate>>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
/// Aggregates on records.
pub enum RecordsAggregate {
    /// Average aggregate.
    Avg(SimpleAggregate),
    /// Count aggregate.
    Count(SimpleAggregate),
    /// Minimum aggregate.
    Min(SimpleAggregate),
    /// Maximum aggregate.
    Max(SimpleAggregate),
    /// Sum aggregate.
    Sum(SimpleAggregate),
    /// Unique values aggregate.
    UniqueValues(UniqueValuesAggregate),
    /// Number histogram aggregate.
    NumberHistogram(NumberHistogramAggregate),
    /// Time histogram aggregate.
    TimeHistogram(TimeHistogramAggregate),
    /// Moving function aggregate.
    MovingFunction(MovingFunctionAggregate),
    /// Filter aggregate.
    Filters(FilterAggregate),
}

impl RecordsAggregate {
    /// Create an average aggregate on the specified property.
    pub fn average(property: impl PropertyIdentifier) -> Self {
        RecordsAggregate::Avg(SimpleAggregate {
            property: property.into_identifier(),
        })
    }

    /// Create a count aggregate on the specified property.
    pub fn count(property: impl PropertyIdentifier) -> Self {
        RecordsAggregate::Count(SimpleAggregate {
            property: property.into_identifier(),
        })
    }

    /// Create a min aggregate on the specified property.
    pub fn min(property: impl PropertyIdentifier) -> Self {
        RecordsAggregate::Min(SimpleAggregate {
            property: property.into_identifier(),
        })
    }

    /// Create a max aggregate on the specified property.
    pub fn max(property: impl PropertyIdentifier) -> Self {
        RecordsAggregate::Max(SimpleAggregate {
            property: property.into_identifier(),
        })
    }

    /// Create a sum aggregate on the specified property.
    pub fn sum(property: impl PropertyIdentifier) -> Self {
        RecordsAggregate::Sum(SimpleAggregate {
            property: property.into_identifier(),
        })
    }

    /// Create a unique values aggregate on the specified property.
    ///
    /// * `size` is the maximum number of unique values to return, default is 10.
    /// * `aggregates` is a map of nested aggregates to further group the unique values.
    pub fn unique_values(
        property: impl PropertyIdentifier,
        size: Option<u32>,
        aggregates: Option<HashMap<String, RecordsAggregate>>,
    ) -> Self {
        RecordsAggregate::UniqueValues(UniqueValuesAggregate {
            property: property.into_identifier(),
            size,
            aggregates,
        })
    }

    /// Create a number histogram aggregate on the specified property.
    ///
    /// * `interval` is the interval between each bucket.
    /// * `hard_bounds` is the fixed bounds of the histogram.
    /// * `aggregates` is a map of nested aggregates to further group the histogram values.
    pub fn number_histogram(
        property: impl PropertyIdentifier,
        interval: f64,
        hard_bounds: Option<Bounds<f64>>,
        aggregates: Option<HashMap<String, RecordsAggregate>>,
    ) -> Self {
        RecordsAggregate::NumberHistogram(NumberHistogramAggregate {
            property: property.into_identifier(),
            hard_bounds,
            interval,
            aggregates,
        })
    }

    /// Create a time histogram aggregate on the specified property.
    ///
    /// * `interval` is the interval between each bucket.
    /// * `hard_bounds` is the fixed bounds of the histogram.
    /// * `aggregates` is a map of nested aggregates to further group the histogram values.
    pub fn time_histogram(
        property: impl PropertyIdentifier,
        interval: TimeHistogramInterval,
        hard_bounds: Option<Bounds<String>>,
        aggregates: Option<HashMap<String, RecordsAggregate>>,
    ) -> Self {
        RecordsAggregate::TimeHistogram(TimeHistogramAggregate {
            property: property.into_identifier(),
            interval,
            hard_bounds,
            aggregates,
        })
    }

    /// Create a moving function aggregate.
    ///
    /// * `buckets_path` is the path to the buckets to use for the moving function.
    /// * `window` is the size of window to slide across the histogram.
    /// * `function` is the function that should be executed on each window of data.
    pub fn moving_function(
        buckets_path: impl Into<String>,
        window: u32,
        function: MovingFunction,
    ) -> Self {
        RecordsAggregate::MovingFunction(MovingFunctionAggregate {
            buckets_path: buckets_path.into(),
            window,
            function,
        })
    }

    /// Create a filter aggregate.
    ///
    /// * `filters` is a list of filters to describe each bucket.
    /// * `aggregates` is a map of nested aggregates to further group the filter values.
    pub fn filters(
        filters: Vec<AdvancedFilter>,
        aggregates: Option<HashMap<String, RecordsAggregate>>,
    ) -> Self {
        RecordsAggregate::Filters(FilterAggregate {
            filters,
            aggregates,
        })
    }
}

/// Request for aggregates on records.
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RecordsAggregateRequest {
    /// Matches records with the last updated time within the provided range.
    /// This attribute is mandatory, and the maximum interval it can define
    /// is limited by the stream settings.
    pub last_updated_time: LastUpdatedTimeFilter,
    /// A custom filter to apply to the records to include in the aggregate result.
    pub filter: Option<AdvancedFilter>,
    /// A dictionary of requested aggregates with client defined names/identifiers.
    pub aggregates: HashMap<String, RecordsAggregate>,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
/// The value of a multivalued aggregate.
pub enum AggregateValue {
    /// A string value
    String(String),
    /// An integer value
    Integer(i64),
    /// A float value
    Number(f64),
    /// A boolean value
    Boolean(bool),
}

impl From<String> for AggregateValue {
    fn from(value: String) -> Self {
        AggregateValue::String(value)
    }
}

impl<'a> From<&'a str> for AggregateValue {
    fn from(value: &'a str) -> Self {
        AggregateValue::String(value.to_string())
    }
}
impl From<i64> for AggregateValue {
    fn from(value: i64) -> Self {
        AggregateValue::Integer(value)
    }
}
impl From<f64> for AggregateValue {
    fn from(value: f64) -> Self {
        AggregateValue::Number(value)
    }
}
impl From<bool> for AggregateValue {
    fn from(value: bool) -> Self {
        AggregateValue::Boolean(value)
    }
}

#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
/// A bucket of unique values in an aggregate.
pub struct UniqueValuesBucket {
    /// The number of items with the given value.
    pub count: u64,
    /// The unique value of this bucket.
    pub value: AggregateValue,
    /// The nested aggregates for this bucket.
    pub aggregates: Option<HashMap<String, AggregateResult>>,
}

#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
/// A bucket of a histogram aggregate.
pub struct HistogramBucket<T> {
    /// The number of values in this bucket.
    pub count: u64,
    /// The lower bound of this bucket.
    pub interval_start: T,
    /// The nested aggregates for this bucket.
    pub aggregates: Option<HashMap<String, AggregateResult>>,
}

#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
/// A bucket of a filter aggregate.
pub struct FilterBucket {
    /// The number of values in this bucket.
    pub count: u64,
    /// The nested aggregates for this bucket.
    pub aggregates: Option<HashMap<String, AggregateResult>>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
/// A bucket of an aggregate.
pub enum AggregateBuckets {
    /// A bucket of unique values.
    UniqueValues(Vec<UniqueValuesBucket>),
    /// A bucket of a histogram aggregate.
    NumberHistogram(Vec<HistogramBucket<f64>>),
    /// A bucket of a time histogram aggregate.
    TimeHistogram(Vec<HistogramBucket<String>>),
    /// A bucket of a filter aggregate.
    Filter(Vec<FilterBucket>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
/// The result of an aggregate.
pub enum AggregateResult {
    /// An average aggregate.
    Avg(f64),
    /// A count aggregate.
    Count(u64),
    /// A minimum aggregate.
    Min(f64),
    /// A maximum aggregate.
    Max(f64),
    /// A sum aggregate.
    Sum(f64),
    /// Buckets of a unique values or histogram aggregate.
    Buckets(AggregateBuckets),
    /// A moving function aggregate.
    MovingFunction(f64),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
/// The result of a request for aggregates.
pub struct RecordsAggregateResult {
    /// Retrieved aggregates, by user defined names.
    pub aggregates: HashMap<String, AggregateResult>,
}