Skip to content

Commit 1302cd0

Browse files
committed
fix CI
1 parent 4e7848a commit 1302cd0

File tree

1 file changed

+44
-17
lines changed

1 file changed

+44
-17
lines changed

table_engine/src/provider.rs

+44-17
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ use std::{
2323

2424
use arrow::datatypes::SchemaRef;
2525
use async_trait::async_trait;
26-
use common_types::{projected_schema::ProjectedSchema, request_id::RequestId, schema::Schema, UPDATE_MODE};
26+
use common_types::{
27+
projected_schema::ProjectedSchema, request_id::RequestId, schema::Schema, UPDATE_MODE,
28+
};
2729
use datafusion::{
2830
config::{ConfigEntry, ConfigExtension, ExtensionOptions},
2931
datasource::TableProvider,
@@ -184,18 +186,13 @@ impl TableProviderAdapter {
184186
}
185187

186188
fn check_and_build_predicate_from_filters(&self, filters: &[Expr]) -> PredicateRef {
187-
let unique_keys = self.read_schema.unique_keys();
188-
189-
let options = &self.table.options();
190-
let is_append = match options.get(UPDATE_MODE) {
191-
Some(mode)if mode == "APPEND" => true,
192-
_ => false
193-
};
189+
let pushdowns = self.pushdown_inner(&filters.iter().collect::<Vec<_>>());
194190

195-
let push_down_filters = filters
191+
let pushdown_pushdown_filters = filters
196192
.iter()
197-
.filter_map(|filter| {
198-
if Self::only_filter_unique_key_columns(filter, &unique_keys) && is_append {
193+
.zip(pushdowns.iter())
194+
.filter_map(|(filter, pushdown)| {
195+
if matches!(pushdown, &TableProviderFilterPushDown::Exact) {
199196
Some(filter.clone())
200197
} else {
201198
None
@@ -204,8 +201,8 @@ impl TableProviderAdapter {
204201
.collect::<Vec<_>>();
205202

206203
PredicateBuilder::default()
207-
.add_pushdown_exprs(&push_down_filters)
208-
.extract_time_range(&self.read_schema, &push_down_filters)
204+
.add_pushdown_exprs(&pushdown_pushdown_filters)
205+
.extract_time_range(&self.read_schema, filters)
209206
.build()
210207
}
211208

@@ -220,6 +217,30 @@ impl TableProviderAdapter {
220217
}
221218
true
222219
}
220+
221+
fn pushdown_inner(&self, filters: &[&Expr]) -> Vec<TableProviderFilterPushDown> {
222+
let unique_keys = self.read_schema.unique_keys();
223+
224+
// TODO: add pushdown check in table trait
225+
let options = &self.table.options();
226+
let is_append = matches!(options.get(UPDATE_MODE), Some(mode) if mode == "APPEND");
227+
let is_system_engine = self.table.engine_type() == "system";
228+
229+
filters
230+
.iter()
231+
.map(|filter| {
232+
if is_system_engine {
233+
return TableProviderFilterPushDown::Inexact;
234+
}
235+
236+
if is_append || Self::only_filter_unique_key_columns(filter, &unique_keys) {
237+
TableProviderFilterPushDown::Exact
238+
} else {
239+
TableProviderFilterPushDown::Inexact
240+
}
241+
})
242+
.collect()
243+
}
223244
}
224245

225246
#[async_trait]
@@ -243,8 +264,11 @@ impl TableProvider for TableProviderAdapter {
243264
self.scan_table(state, projection, filters, limit).await
244265
}
245266

246-
fn supports_filter_pushdown(&self, _filter: &Expr) -> Result<TableProviderFilterPushDown> {
247-
Ok(TableProviderFilterPushDown::Exact)
267+
fn supports_filters_pushdown(
268+
&self,
269+
filters: &[&Expr],
270+
) -> Result<Vec<TableProviderFilterPushDown>> {
271+
Ok(self.pushdown_inner(filters))
248272
}
249273

250274
/// Get the type of this table for metadata/catalog purposes.
@@ -270,8 +294,11 @@ impl TableSource for TableProviderAdapter {
270294

271295
/// Tests whether the table provider can make use of a filter expression
272296
/// to optimize data retrieval.
273-
fn supports_filter_pushdown(&self, _filter: &Expr) -> Result<TableProviderFilterPushDown> {
274-
Ok(TableProviderFilterPushDown::Exact)
297+
fn supports_filters_pushdown(
298+
&self,
299+
filters: &[&Expr],
300+
) -> Result<Vec<TableProviderFilterPushDown>> {
301+
Ok(self.pushdown_inner(filters))
275302
}
276303
}
277304

0 commit comments

Comments
 (0)