Skip to content

Commit a718bca

Browse files
committed
fix CI
1 parent 4e7848a commit a718bca

File tree

1 file changed

+44
-18
lines changed

1 file changed

+44
-18
lines changed

table_engine/src/provider.rs

+44-18
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,12 @@ 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-
};
194-
195-
let push_down_filters = filters
189+
let pushdown_states = self.pushdown_inner(&filters.iter().collect::<Vec<_>>());
190+
let pushdown_filters = filters
196191
.iter()
197-
.filter_map(|filter| {
198-
if Self::only_filter_unique_key_columns(filter, &unique_keys) && is_append {
192+
.zip(pushdown_states.iter())
193+
.filter_map(|(filter, state)| {
194+
if matches!(state, &TableProviderFilterPushDown::Exact) {
199195
Some(filter.clone())
200196
} else {
201197
None
@@ -204,8 +200,8 @@ impl TableProviderAdapter {
204200
.collect::<Vec<_>>();
205201

206202
PredicateBuilder::default()
207-
.add_pushdown_exprs(&push_down_filters)
208-
.extract_time_range(&self.read_schema, &push_down_filters)
203+
.add_pushdown_exprs(&pushdown_filters)
204+
.extract_time_range(&self.read_schema, filters)
209205
.build()
210206
}
211207

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

225245
#[async_trait]
@@ -243,8 +263,11 @@ impl TableProvider for TableProviderAdapter {
243263
self.scan_table(state, projection, filters, limit).await
244264
}
245265

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

250273
/// Get the type of this table for metadata/catalog purposes.
@@ -270,8 +293,11 @@ impl TableSource for TableProviderAdapter {
270293

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

0 commit comments

Comments
 (0)