1use std::sync::Arc;
19
20use api::v1::region::{RemoteDynFilterUnregister, RemoteDynFilterUpdate};
21use async_trait::async_trait;
22use common_error::ext::BoxedError;
23use common_meta::node_manager::NodeManagerRef;
24use common_query::request::QueryRequest;
25use common_recordbatch::SendableRecordBatchStream;
26use partition::manager::PartitionRuleManagerRef;
27use query::error::{RegionQuerySnafu, Result as QueryResult, UnimplementedSnafu};
28use query::region_query::{RegionQueryHandler, RegionQueryTarget};
29use session::ReadPreference;
30use snafu::ResultExt;
31use store_api::storage::RegionId;
32
33pub(crate) struct DatanodeRegionQueryHandler {
35 partition_manager: PartitionRuleManagerRef,
36 node_manager: NodeManagerRef,
37}
38
39impl DatanodeRegionQueryHandler {
40 pub fn arc(
41 partition_manager: PartitionRuleManagerRef,
42 node_manager: NodeManagerRef,
43 ) -> Arc<Self> {
44 Arc::new(Self {
45 partition_manager,
46 node_manager,
47 })
48 }
49}
50
51#[async_trait]
52impl RegionQueryHandler for DatanodeRegionQueryHandler {
53 async fn select_target(
54 &self,
55 _read_preference: ReadPreference,
56 region_id: RegionId,
57 ) -> QueryResult<RegionQueryTarget> {
58 let peer = self
61 .partition_manager
62 .find_region_leader(region_id)
63 .await
64 .map_err(BoxedError::new)
65 .context(RegionQuerySnafu)?;
66
67 Ok(RegionQueryTarget::new(peer))
68 }
69
70 async fn do_get(
71 &self,
72 target: &RegionQueryTarget,
73 request: QueryRequest,
74 ) -> QueryResult<SendableRecordBatchStream> {
75 self.node_manager
76 .datanode(target.peer())
77 .await
78 .handle_query(request)
79 .await
80 .map_err(BoxedError::new)
81 .context(RegionQuerySnafu)
82 }
83
84 async fn handle_remote_dyn_filter_update(
86 &self,
87 _target: &RegionQueryTarget,
88 _query_id: String,
89 _update: RemoteDynFilterUpdate,
90 ) -> QueryResult<()> {
91 UnimplementedSnafu {
92 operation: "remote dynamic filter update from a datanode",
93 }
94 .fail()
95 }
96
97 async fn handle_remote_dyn_filter_unregister(
99 &self,
100 _target: &RegionQueryTarget,
101 _query_id: String,
102 _unregister: RemoteDynFilterUnregister,
103 ) -> QueryResult<()> {
104 UnimplementedSnafu {
105 operation: "remote dynamic filter unregister from a datanode",
106 }
107 .fail()
108 }
109}