common_query/
native_histogram.rs1use std::sync::Arc;
21
22use datatypes::data_type::ConcreteDataType;
23use datatypes::types::{StructField, StructType};
24use once_cell::sync::Lazy;
25
26pub const NATIVE_HISTOGRAM_FIELD: &str = "greptime_native_histogram";
27pub const SCHEMA_FIELD: &str = "schema";
28pub const ZERO_THRESHOLD_FIELD: &str = "zero_threshold";
29pub const SUM_FIELD: &str = "sum";
30pub const RESET_HINT_FIELD: &str = "reset_hint";
31pub const START_TIMESTAMP_FIELD: &str = "start_timestamp";
32pub const CUSTOM_VALUES_FIELD: &str = "custom_values";
33pub const POSITIVE_SPAN_OFFSETS_FIELD: &str = "positive_span_offsets";
34pub const POSITIVE_SPAN_LENGTHS_FIELD: &str = "positive_span_lengths";
35pub const NEGATIVE_SPAN_OFFSETS_FIELD: &str = "negative_span_offsets";
36pub const NEGATIVE_SPAN_LENGTHS_FIELD: &str = "negative_span_lengths";
37pub const COUNT_U64_FIELD: &str = "count_u64";
38pub const ZERO_COUNT_U64_FIELD: &str = "zero_count_u64";
39pub const POSITIVE_BUCKETS_I64_FIELD: &str = "positive_buckets_i64";
40pub const NEGATIVE_BUCKETS_I64_FIELD: &str = "negative_buckets_i64";
41pub const COUNT_F64_FIELD: &str = "count_f64";
42pub const ZERO_COUNT_F64_FIELD: &str = "zero_count_f64";
43pub const POSITIVE_BUCKETS_F64_FIELD: &str = "positive_buckets_f64";
44pub const NEGATIVE_BUCKETS_F64_FIELD: &str = "negative_buckets_f64";
45
46pub const NATIVE_HISTOGRAM_FIELD_NAMES: &[&str] = &[
49 SCHEMA_FIELD,
50 ZERO_THRESHOLD_FIELD,
51 SUM_FIELD,
52 RESET_HINT_FIELD,
53 START_TIMESTAMP_FIELD,
54 CUSTOM_VALUES_FIELD,
55 POSITIVE_SPAN_OFFSETS_FIELD,
56 POSITIVE_SPAN_LENGTHS_FIELD,
57 NEGATIVE_SPAN_OFFSETS_FIELD,
58 NEGATIVE_SPAN_LENGTHS_FIELD,
59 COUNT_U64_FIELD,
60 ZERO_COUNT_U64_FIELD,
61 POSITIVE_BUCKETS_I64_FIELD,
62 NEGATIVE_BUCKETS_I64_FIELD,
63 COUNT_F64_FIELD,
64 ZERO_COUNT_F64_FIELD,
65 POSITIVE_BUCKETS_F64_FIELD,
66 NEGATIVE_BUCKETS_F64_FIELD,
67];
68
69static NATIVE_HISTOGRAM_VALUE_TYPE: Lazy<ConcreteDataType> = Lazy::new(|| {
70 let fields = NATIVE_HISTOGRAM_FIELD_NAMES
71 .iter()
72 .filter_map(|name| {
73 let data_type = native_histogram_field_type(name)?;
74 Some(StructField::new((*name).to_string(), data_type, true))
75 })
76 .collect();
77 ConcreteDataType::struct_datatype(StructType::new(Arc::new(fields)))
78});
79
80pub fn native_histogram_field_type(name: &str) -> Option<ConcreteDataType> {
82 match name {
83 SCHEMA_FIELD | RESET_HINT_FIELD => Some(ConcreteDataType::int32_datatype()),
84 ZERO_THRESHOLD_FIELD | SUM_FIELD | COUNT_F64_FIELD | ZERO_COUNT_F64_FIELD => {
85 Some(ConcreteDataType::float64_datatype())
86 }
87 START_TIMESTAMP_FIELD => Some(ConcreteDataType::timestamp_millisecond_datatype()),
88 CUSTOM_VALUES_FIELD | POSITIVE_BUCKETS_F64_FIELD | NEGATIVE_BUCKETS_F64_FIELD => Some(
89 ConcreteDataType::list_datatype(Arc::new(ConcreteDataType::float64_datatype())),
90 ),
91 POSITIVE_SPAN_OFFSETS_FIELD | NEGATIVE_SPAN_OFFSETS_FIELD => Some(
92 ConcreteDataType::list_datatype(Arc::new(ConcreteDataType::int32_datatype())),
93 ),
94 POSITIVE_SPAN_LENGTHS_FIELD | NEGATIVE_SPAN_LENGTHS_FIELD => Some(
95 ConcreteDataType::list_datatype(Arc::new(ConcreteDataType::uint32_datatype())),
96 ),
97 COUNT_U64_FIELD | ZERO_COUNT_U64_FIELD => Some(ConcreteDataType::uint64_datatype()),
98 POSITIVE_BUCKETS_I64_FIELD | NEGATIVE_BUCKETS_I64_FIELD => Some(
99 ConcreteDataType::list_datatype(Arc::new(ConcreteDataType::int64_datatype())),
100 ),
101 _ => None,
102 }
103}
104
105pub fn native_histogram_value_type() -> &'static ConcreteDataType {
106 &NATIVE_HISTOGRAM_VALUE_TYPE
107}
108
109pub fn is_native_histogram_value_schema(name: &str, data_type: &ConcreteDataType) -> bool {
110 name == NATIVE_HISTOGRAM_FIELD && data_type == native_histogram_value_type()
111}