1use std::any::Any;
16
17use common_error::ext::ErrorExt;
18use common_error::status_code::StatusCode;
19use common_macro::stack_trace_debug;
20use datatypes::prelude::ConcreteDataType;
21use snafu::{Location, Snafu};
22
23#[derive(Snafu)]
25#[snafu(visibility(pub))]
26#[stack_trace_debug]
27pub enum Error {
28 #[snafu(display("Row value mismatches field data type"))]
29 FieldTypeMismatch {
30 #[snafu(source(from(datatypes::error::Error, Box::new)))]
32 source: Box<datatypes::error::Error>,
33 #[snafu(implicit)]
34 location: Location,
35 },
36
37 #[snafu(display("Failed to serialize field"))]
38 SerializeField {
39 #[snafu(source)]
40 error: memcomparable::Error,
41 #[snafu(implicit)]
42 location: Location,
43 },
44
45 #[snafu(display(
46 "Data type: {} does not support serialization/deserialization",
47 data_type,
48 ))]
49 NotSupportedField {
50 data_type: ConcreteDataType,
51 #[snafu(implicit)]
52 location: Location,
53 },
54
55 #[snafu(display("Failed to deserialize field"))]
56 DeserializeField {
57 #[snafu(source)]
58 error: memcomparable::Error,
59 #[snafu(implicit)]
60 location: Location,
61 },
62
63 #[snafu(display("Operation not supported: {}", err_msg))]
64 UnsupportedOperation {
65 err_msg: String,
66 #[snafu(implicit)]
67 location: Location,
68 },
69
70 #[snafu(display("Invalid sparse primary key: {}", reason))]
71 InvalidSparsePrimaryKey {
72 reason: String,
73 #[snafu(implicit)]
74 location: Location,
75 },
76
77 #[snafu(display("Invalid dense primary key: {}", reason))]
78 InvalidDensePrimaryKey {
79 reason: String,
80 #[snafu(implicit)]
81 location: Location,
82 },
83
84 #[snafu(display("Encode null value"))]
85 IndexEncodeNull {
86 #[snafu(implicit)]
87 location: Location,
88 },
89
90 #[snafu(display("Failed to evaluate filter"))]
91 EvaluateFilter {
92 #[snafu(source(from(common_recordbatch::error::Error, Box::new)))]
93 source: Box<common_recordbatch::error::Error>,
94 #[snafu(implicit)]
95 location: Location,
96 },
97}
98
99pub type Result<T, E = Error> = std::result::Result<T, E>;
100
101impl ErrorExt for Error {
102 fn status_code(&self) -> StatusCode {
103 use Error::*;
104
105 match self {
106 FieldTypeMismatch { source, .. } => source.status_code(),
107 SerializeField { .. } | DeserializeField { .. } | IndexEncodeNull { .. } => {
108 StatusCode::InvalidArguments
109 }
110 NotSupportedField { .. } | UnsupportedOperation { .. } => StatusCode::Unsupported,
111 InvalidSparsePrimaryKey { .. } | InvalidDensePrimaryKey { .. } => {
112 StatusCode::InvalidArguments
113 }
114 EvaluateFilter { source, .. } => source.status_code(),
115 }
116 }
117
118 fn as_any(&self) -> &dyn Any {
119 self
120 }
121}