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("Encode null value"))]
78 IndexEncodeNull {
79 #[snafu(implicit)]
80 location: Location,
81 },
82
83 #[snafu(display("Failed to evaluate filter"))]
84 EvaluateFilter {
85 #[snafu(source(from(common_recordbatch::error::Error, Box::new)))]
86 source: Box<common_recordbatch::error::Error>,
87 #[snafu(implicit)]
88 location: Location,
89 },
90}
91
92pub type Result<T, E = Error> = std::result::Result<T, E>;
93
94impl ErrorExt for Error {
95 fn status_code(&self) -> StatusCode {
96 use Error::*;
97
98 match self {
99 FieldTypeMismatch { source, .. } => source.status_code(),
100 SerializeField { .. } | DeserializeField { .. } | IndexEncodeNull { .. } => {
101 StatusCode::InvalidArguments
102 }
103 NotSupportedField { .. } | UnsupportedOperation { .. } => StatusCode::Unsupported,
104 InvalidSparsePrimaryKey { .. } => StatusCode::InvalidArguments,
105 EvaluateFilter { source, .. } => source.status_code(),
106 }
107 }
108
109 fn as_any(&self) -> &dyn Any {
110 self
111 }
112}