Thanks Becket,

The behavior description has been added to the Public Interfaces section.

Best,
Jiabao


> 2023年12月20日 08:17,Becket Qin <becket....@gmail.com> 写道:
> 
> Hi Jiabao,
> 
> Thanks for updating the FLIP.
> Can you add the behavior of the policies that are only applicable to some
> but not all of the databases? This is a part of the intended behavior of
> the proposed configuration. So, we should include that in the FLIP.
> Otherwise, the FLIP looks good to me.
> 
> Cheers,
> 
> Jiangjie (Becket) Qin
> 
> On Tue, Dec 19, 2023 at 11:00 PM Jiabao Sun <jiabao....@xtransfer.cn.invalid>
> wrote:
> 
>> Hi Becket,
>> 
>> I share the same view as you regarding the prefix for this configuration
>> option.
>> 
>> For the JDBC connector, I prefer setting 'filter.handling.policy' = 'FOO'
>> and throwing an exception when the database do not support that specific
>> policy.
>> 
>> Not using a prefix can reduce the learning curve for users and avoid
>> introducing a new set of configuration options for every supported JDBC
>> database.
>> I think the policies we provide can be compatible with most databases that
>> follow the JDBC protocol.
>> However, there may be cases where certain databases cannot support some
>> policies.
>> Nevertheless, we can ensure fast failure and allow users to choose a
>> suitable policy in such situations.
>> 
>> I have removed the contents about the configuration prefix.
>> Please help review it again.
>> 
>> Thanks,
>> Jiabao
>> 
>> 
>>> 2023年12月19日 19:46,Becket Qin <becket....@gmail.com> 写道:
>>> 
>>> Hi Jiabao,
>>> 
>>> Thanks for updating the FLIP.
>>> 
>>> One more question regarding the JDBC connector, since it is a connector
>>> shared by multiple databases, what if there is a filter handling policy
>>> that is only applicable to one of the databases, but not the others? In
>>> that case, how would the users specify that policy?
>>> Unlike the example of orc format with 2nd+ level config, JDBC connector
>>> only looks at the URL to decide which driver to use.
>>> 
>>> For example, MySql supports policy FOO while other databases do not. If
>>> users want to use FOO for MySql, what should they do? Will they set
>>> '*mysql.filter.hanlding.policy'
>>> = 'FOO', *which will only be picked up when the MySql driver is used?
>>> Or they should just set* 'filter.handling.policy' = 'FOO', *and throw
>>> exceptions when other JDBC drivers are used? Personally, I prefer the
>>> latter. If we pick that, do we still need to mention the following?
>>> 
>>> *The prefix is needed when the option is for a 2nd+ level. *
>>>> 'connector' = 'filesystem',
>>>> 'format' = 'orc',
>>>> 'orc.filter.handling.policy' = 'NUBERIC_ONY'
>>>> 
>>>> *In this case, the values of this configuration may be different
>> depending
>>>> on the format option. For example, orc format may have INDEXED_ONLY
>> while
>>>> parquet format may have something else. *
>>>> 
>>> 
>>> I found this is somewhat misleading, because the example here is not a
>> part
>>> of the proposal of this FLIP. It is just an example explaining when a
>>> prefix is needed, which seems orthogonal to the proposal in this FLIP.
>>> 
>>> Thanks,
>>> 
>>> Jiangjie (Becket) Qin
>>> 
>>> 
>>> On Tue, Dec 19, 2023 at 10:09 AM Jiabao Sun <jiabao....@xtransfer.cn
>> .invalid>
>>> wrote:
>>> 
>>>> Thanks Becket for the suggestions,
>>>> 
>>>> Updated.
>>>> Please help review it again when you have time.
>>>> 
>>>> Best,
>>>> Jiabao
>>>> 
>>>> 
>>>>> 2023年12月19日 09:06,Becket Qin <becket....@gmail.com> 写道:
>>>>> 
>>>>> Hi JIabao,
>>>>> 
>>>>> Thanks for updating the FLIP. It looks better. Some suggestions /
>>>> questions:
>>>>> 
>>>>> 1. In the motivation section:
>>>>> 
>>>>>> *Currently, Flink Table/SQL does not expose fine-grained control for
>>>> users
>>>>>> to control filter pushdown. **However, filter pushdown has some side
>>>>>> effects, such as additional computational pressure on external
>>>>>> systems. Moreover, Improper queries can lead to issues such as full
>>>> table
>>>>>> scans, which in turn can impact the stability of external systems.*
>>>>> 
>>>>> This statement sounds like the side effects are there for all the
>>>> systems,
>>>>> which is inaccurate. Maybe we can say:
>>>>> *Currently, Flink Table/SQL does not expose fine-grained control for
>>>> users
>>>>> to control filter pushdown. **However, filter pushdown may have side
>>>>> effects in some cases, **such as additional computational pressure on
>>>>> external systems. The JDBC source is a typical example of that. If a
>>>> filter
>>>>> is pushed down to the database, an expensive full table scan may happen
>>>> if
>>>>> the filter involves unindexed columns.*
>>>>> 
>>>>> 2. Regarding the prefix, usually a prefix is not required for the top
>>>> level
>>>>> connector options. This is because the *connector* option is already
>>>> there.
>>>>> So
>>>>>  'connector' = 'jdbc',
>>>>> 'filter.handling.policy' = 'ALWAYS'
>>>>> is sufficient.
>>>>> 
>>>>> The prefix is needed when the option is for a 2nd+ level. For example,
>>>>>  'connector' = 'jdbc',
>>>>>  'format' = 'orc',
>>>>>  'orc.some.option' = 'some_value'
>>>>> In this case, the prefix of "orc" is needed to make it clear this
>> option
>>>> is
>>>>> for the format.
>>>>> 
>>>>> I am guessing that the reason that currently the connector prefix is
>>>> there
>>>>> is because the values of this configuration may be different depending
>> on
>>>>> the connectors. For example, jdbc may have INDEXED_ONLY while MongoDB
>> may
>>>>> have something else. Personally speaking, I am fine if we do not have a
>>>>> prefix in this case because users have already specified the connector
>>>> type
>>>>> and it is intuitive enough that the option value is for that connector,
>>>> not
>>>>> others.
>>>>> 
>>>>> 3. can we clarify on the following statement:
>>>>> 
>>>>>> *Introduce the native configuration [prefix].filter.handling.policy in
>>>> the
>>>>>> connector.*
>>>>> 
>>>>> What do you mean by "native configuration"? From what I understand, the
>>>>> FLIP does the following:
>>>>> - introduces a new configuration to the JDBC and MongoDB connector.
>>>>> - Suggests a convention option name if other connectors are going to
>> add
>>>> an
>>>>> option for the same purpose.
>>>>> 
>>>>> Thanks,
>>>>> 
>>>>> Jiangjie (Becket) Qin
>>>>> 
>>>>> 
>>>>> 
>>>>> On Mon, Dec 18, 2023 at 5:45 PM Jiabao Sun <jiabao....@xtransfer.cn
>>>> .invalid>
>>>>> wrote:
>>>>> 
>>>>>> Hi Becket,
>>>>>> 
>>>>>> The FLIP document[1] has been updated.
>>>>>> Could you help take a look again?
>>>>>> 
>>>>>> Thanks,
>>>>>> Jiabao
>>>>>> 
>>>>>> [1]
>>>>>> 
>>>> 
>> https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=276105768
>>>>>> 
>>>>>> 
>>>>>>> 2023年12月18日 16:53,Becket Qin <becket....@gmail.com> 写道:
>>>>>>> 
>>>>>>> Yes, that sounds reasonable to me. We can start with ALWAYS and
>> NEVER,
>>>>>> and
>>>>>>> add more policies as needed.
>>>>>>> 
>>>>>>> Thanks,
>>>>>>> 
>>>>>>> Jiangjie (Becket) Qin
>>>>>>> 
>>>>>>> On Mon, Dec 18, 2023 at 4:48 PM Jiabao Sun <jiabao....@xtransfer.cn
>>>>>> .invalid>
>>>>>>> wrote:
>>>>>>> 
>>>>>>>> Thanks Bucket,
>>>>>>>> 
>>>>>>>> The jdbc.filter.handling.policy is good to me as it provides
>>>> sufficient
>>>>>>>> extensibility for future filter pushdown optimizations.
>>>>>>>> However, currently, we don't have an implementation for the AUTO
>> mode,
>>>>>> and
>>>>>>>> it seems that the AUTO mode can easily be confused with the ALWAYS
>>>> mode
>>>>>>>> because users don't have the opportunity to MANUALLY decide which
>>>>>> filters
>>>>>>>> to push down.
>>>>>>>> 
>>>>>>>> I suggest that we only introduce the ALWAYS and NEVER modes for now,
>>>> and
>>>>>>>> we can consider introducing more flexible policies in the future,
>>>>>>>> such as INDEX_ONLY, NUMBERIC_ONLY and so on.
>>>>>>>> 
>>>>>>>> WDYT?
>>>>>>>> 
>>>>>>>> Best,
>>>>>>>> Jiabao
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>>> 2023年12月18日 16:27,Becket Qin <becket....@gmail.com> 写道:
>>>>>>>>> 
>>>>>>>>> Hi Jiabao,
>>>>>>>>> 
>>>>>>>>> Please see the reply inline.
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>>> The MySQL connector is currently in the flink-connector-jdbc
>>>>>> repository
>>>>>>>>>> and is not a standalone connector.
>>>>>>>>>> Is it too unique to use "mysql" as the configuration option
>> prefix?
>>>>>>>>> 
>>>>>>>>> If the intended behavior makes sense to all the supported JDBC
>>>> drivers,
>>>>>>>> we
>>>>>>>>> can make this a JDBC connector configuration.
>>>>>>>>> 
>>>>>>>>> Also, I would like to ask about the difference in behavior between
>>>> AUTO
>>>>>>>> and
>>>>>>>>>> ALWAYS.
>>>>>>>>>> It seems that we cannot guarantee the pushing down of all filters
>> to
>>>>>> the
>>>>>>>>>> external system under the ALWAYS
>>>>>>>>>> mode because not all filters in Flink SQL are supported by the
>>>>>> external
>>>>>>>>>> system.
>>>>>>>>>> Should we throw an error when encountering a filter that cannot be
>>>>>>>> pushed
>>>>>>>>>> down in the ALWAYS mode?
>>>>>>>>> 
>>>>>>>>> The idea of AUTO is to do efficiency-aware pushdowns. The source
>> will
>>>>>>>> query
>>>>>>>>> the external system (MySQL, Oracle, SQL Server, etc) first to
>>>> retrieve
>>>>>>>> the
>>>>>>>>> information of the table. With that information, the source will
>>>> decide
>>>>>>>>> whether to further push a filter to the external system based on
>> the
>>>>>>>>> efficiency. E.g. only push the indexed fields. In contrast, ALWAYS
>>>> will
>>>>>>>>> just always push the supported filters to the external system,
>>>>>> regardless
>>>>>>>>> of the efficiency. In case there are filters that are not
>> supported,
>>>>>>>>> according to the current contract of SupportsFilterPushdown, these
>>>>>>>>> unsupported filters should just be returned by the
>>>>>>>>> *SupportsFilterPushdown.applyFilters()* method as remaining
>> filters.
>>>>>>>>> Therefore, there is no need to throw exceptions here. This is
>> likely
>>>>>> the
>>>>>>>>> desired behavior for most users, IMO. If there are cases that users
>>>>>>>> really
>>>>>>>>> want to get alerted when a filter cannot be pushed to the external
>>>>>>>> system,
>>>>>>>>> we can add another value like "ENFORCED_ALWAYS", which behaves like
>>>>>>>> ALWAYS,
>>>>>>>>> but throws exceptions when a filter cannot be applied to the
>> external
>>>>>>>>> system. But personally I don't see much value in doing this.
>>>>>>>>> 
>>>>>>>>> Thanks,
>>>>>>>>> 
>>>>>>>>> Jiangjie (Becket) Qin
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> On Mon, Dec 18, 2023 at 3:54 PM Jiabao Sun <
>> jiabao....@xtransfer.cn
>>>>>>>> .invalid>
>>>>>>>>> wrote:
>>>>>>>>> 
>>>>>>>>>> Hi Becket,
>>>>>>>>>> 
>>>>>>>>>> The MySQL connector is currently in the flink-connector-jdbc
>>>>>> repository
>>>>>>>>>> and is not a standalone connector.
>>>>>>>>>> Is it too unique to use "mysql" as the configuration option
>> prefix?
>>>>>>>>>> 
>>>>>>>>>> Also, I would like to ask about the difference in behavior between
>>>>>> AUTO
>>>>>>>>>> and ALWAYS.
>>>>>>>>>> It seems that we cannot guarantee the pushing down of all filters
>> to
>>>>>> the
>>>>>>>>>> external system under the ALWAYS
>>>>>>>>>> mode because not all filters in Flink SQL are supported by the
>>>>>> external
>>>>>>>>>> system.
>>>>>>>>>> Should we throw an error when encountering a filter that cannot be
>>>>>>>> pushed
>>>>>>>>>> down in the ALWAYS mode?
>>>>>>>>>> 
>>>>>>>>>> Thanks,
>>>>>>>>>> Jiabao
>>>>>>>>>> 
>>>>>>>>>>> 2023年12月18日 15:34,Becket Qin <becket....@gmail.com> 写道:
>>>>>>>>>>> 
>>>>>>>>>>> Hi JIabao,
>>>>>>>>>>> 
>>>>>>>>>>> Thanks for updating the FLIP. Maybe I did not explain it clearly
>>>>>>>> enough.
>>>>>>>>>> My
>>>>>>>>>>> point is that given there are various good flavors of behaviors
>>>>>>>> handling
>>>>>>>>>>> filters pushed down, we should not have a common config of
>>>>>>>>>>> "ignore.filter.pushdown", because the behavior is not *common*.
>>>>>>>>>>> 
>>>>>>>>>>> It looks like the original motivation of this FLIP is just for
>>>> MySql.
>>>>>>>>>> Let's
>>>>>>>>>>> focus on what is the best solution for MySql connector here
>> first.
>>>>>>>> After
>>>>>>>>>>> that, if people think the best behavior for MySql happens to be a
>>>>>>>> common
>>>>>>>>>>> one, we can then discuss whether that is worth being added to the
>>>>>> base
>>>>>>>>>>> implementation of source. For MySQL, if we are going to
>> introduce a
>>>>>>>>>> config
>>>>>>>>>>> to MySql, why not have something like
>>>> "mysql.filter.handling.policy"
>>>>>>>> with
>>>>>>>>>>> value of AUTO / NEVER / ALWAYS? Isn't that better than
>>>>>>>>>>> "ignore.filter.pushdown"?
>>>>>>>>>>> 
>>>>>>>>>>> Thanks,
>>>>>>>>>>> 
>>>>>>>>>>> Jiangjie (Becket) Qin
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> On Sun, Dec 17, 2023 at 11:30 PM Jiabao Sun <
>>>> jiabao....@xtransfer.cn
>>>>>>>>>> .invalid>
>>>>>>>>>>> wrote:
>>>>>>>>>>> 
>>>>>>>>>>>> Hi Becket,
>>>>>>>>>>>> 
>>>>>>>>>>>> The FLIP document has been updated as well.
>>>>>>>>>>>> Please take a look when you have time.
>>>>>>>>>>>> 
>>>>>>>>>>>> Thanks,
>>>>>>>>>>>> Jiabao
>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>>>> 2023年12月17日 22:54,Jiabao Sun <jiabao....@xtransfer.cn.INVALID>
>>>> 写道:
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Thanks Becket,
>>>>>>>>>>>>> 
>>>>>>>>>>>>> I apologize for not being able to continue with this proposal
>> due
>>>>>> to
>>>>>>>>>>>> being too busy during this period.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> The viewpoints you shared about the design of Flink Source make
>>>>>> sense
>>>>>>>>>> to
>>>>>>>>>>>> me
>>>>>>>>>>>>> The native configuration ‘ignore.filter.pushdown’ is good to
>> me.
>>>>>>>>>>>>> Having a unified name or naming style can indeed prevent
>>>> confusion
>>>>>>>> for
>>>>>>>>>>>> users regarding
>>>>>>>>>>>>> the inconsistent naming of this configuration across different
>>>>>>>>>>>> connectors.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Currently, there are not many external connectors that support
>>>>>> filter
>>>>>>>>>>>> pushdown.
>>>>>>>>>>>>> I propose that we first introduce it in flink-connector-jdbc
>> and
>>>>>>>>>>>> flink-connector-mongodb.
>>>>>>>>>>>>> Do you think this is feasible?
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Best,
>>>>>>>>>>>>> Jiabao
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 2023年11月16日 17:45,Becket Qin <becket....@gmail.com> 写道:
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Hi Jiabao,
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Arguments like "because Spark has it so Flink should also have
>>>> it"
>>>>>>>>>> does
>>>>>>>>>>>> not
>>>>>>>>>>>>>> make sense. Different projects have different API flavors and
>>>>>>>> styles.
>>>>>>>>>>>> What
>>>>>>>>>>>>>> is really important is the rationale and the design principle
>>>>>> behind
>>>>>>>>>> the
>>>>>>>>>>>>>> API. They should conform to the convention of the project.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> First of all, Spark Source API itself has a few issues and
>> they
>>>>>>>> ended
>>>>>>>>>> up
>>>>>>>>>>>>>> introduce DataSource V2 in Spark 3.0, which added the
>> decorative
>>>>>>>>>>>> interfaces
>>>>>>>>>>>>>> like SupportsPushdownXXX. Some of the configurations predating
>>>>>>>>>>>> DataSource
>>>>>>>>>>>>>> V2 may still be there.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> For the Spark configurations you mentioned, they are all the
>>>>>>>>>>>> configurations
>>>>>>>>>>>>>> for FileScanBuilder, which is equivalent to FileSource in
>> Flink.
>>>>>>>>>>>> Currently,
>>>>>>>>>>>>>> regardless of the format (ORC, Parquet, Avro, etc), the
>>>> FileSource
>>>>>>>>>>>> pushes
>>>>>>>>>>>>>> back all the filters to ensure correctness. The actual filters
>>>>>> that
>>>>>>>>>> got
>>>>>>>>>>>>>> applied to the specific format might still be different. This
>>>>>>>>>>>>>> implementation is the same in FileScanBuilder.pushFilters()
>> for
>>>>>>>>>> Spark. I
>>>>>>>>>>>>>> don't know why Spark got separate configurations for each
>>>> format.
>>>>>>>>>> Maybe
>>>>>>>>>>>> it
>>>>>>>>>>>>>> is because the filters are actually implemented differently
>> for
>>>>>>>>>>>> different
>>>>>>>>>>>>>> format.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> At least for the current implementation in FileScanBuilder,
>>>> these
>>>>>>>>>>>>>> configurations can be merged to one configuration like
>>>>>>>>>>>>>> `apply.filters.to.format.enabled`. Note that this config, as
>>>> well
>>>>>> as
>>>>>>>>>> the
>>>>>>>>>>>>>> separate configs you mentioned, are just visible and used by
>> the
>>>>>>>>>>>>>> FileScanBuilder. It determines whether the filters should be
>>>>>> passed
>>>>>>>>>>>> down to
>>>>>>>>>>>>>> the format of the FileScanBuilder instance. Regardless of the
>>>>>> value
>>>>>>>> of
>>>>>>>>>>>>>> these configs, FileScanBuilder.pushFilters() will always be
>>>>>> called,
>>>>>>>>>> and
>>>>>>>>>>>>>> FileScanBuilder (as well as FileSource in Flink) will always
>>>> push
>>>>>>>> back
>>>>>>>>>>>> all
>>>>>>>>>>>>>> the filters to the framework.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> A MySql source can have a very different way to handle this.
>> For
>>>>>>>>>>>> example, A
>>>>>>>>>>>>>> MySql source  A config in this case might be
>> "my.apply.filters"
>>>>>> with
>>>>>>>>>>>> three
>>>>>>>>>>>>>> different values:
>>>>>>>>>>>>>> - AUTO: The Source will issue a DESC Table request to
>> understand
>>>>>>>>>>>> whether a
>>>>>>>>>>>>>> filter can be applied efficiently. And decide which filters
>> can
>>>> be
>>>>>>>>>>>> applied
>>>>>>>>>>>>>> and which cannot based on that.
>>>>>>>>>>>>>> - NEVER: Never apply filtering. It will always do a full table
>>>>>> read
>>>>>>>>>> and
>>>>>>>>>>>>>> let Flink do the filtering.
>>>>>>>>>>>>>> - ALWAYS: Always apply the filtering to the MySql server.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> In the above examples of FileSource and MySql Source, I don't
>>>>>> think
>>>>>>>> it
>>>>>>>>>>>> is a
>>>>>>>>>>>>>> good idea to shoehorn the behaviors into a naive config of
>>>>>>>>>>>>>> `ignore.filter.pushdown`. That is why I don't think this is a
>>>>>> common
>>>>>>>>>>>> config.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> To recap, like I said, I do agree that in some cases, we may
>>>> want
>>>>>> to
>>>>>>>>>>>> behave
>>>>>>>>>>>>>> differently when filters are pushed down to the sources, even
>>>> if a
>>>>>>>>>>>> source
>>>>>>>>>>>>>> implements SupportsFilterPushDown, but I don't think there is
>> a
>>>>>>>>>> suitable
>>>>>>>>>>>>>> common config for this. The behavior is very likely source
>>>>>> specific.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Jiangjie (Becket) Qin
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> On Thu, Nov 16, 2023 at 3:41 PM Jiabao Sun <
>>>>>> jiabao....@xtransfer.cn
>>>>>>>>>>>> .invalid>
>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> Thanks Becket,
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> I still believe that adding a configuration at the source
>> level
>>>>>> to
>>>>>>>>>>>> disable
>>>>>>>>>>>>>>> filter pushdown is needed. This demand exists in spark as
>>>>>> well[1].
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> In Spark, most sources that support filter pushdown provide
>>>> their
>>>>>>>> own
>>>>>>>>>>>>>>> corresponding configuration options to enable or disable
>> filter
>>>>>>>>>>>> pushdown.
>>>>>>>>>>>>>>> For PRs[2-4] that support filter pushdown capability, they
>> also
>>>>>>>>>> provide
>>>>>>>>>>>>>>> configuration options to disable this capability.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> I believe this configuration is applicable to most scenarios,
>>>> and
>>>>>>>>>>>> there is
>>>>>>>>>>>>>>> no need to dwell on why this configuration option was not
>>>>>>>> introduced
>>>>>>>>>>>>>>> earlier than the SupportsFilterPushDown interface.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> spark.sql.parquet.filterPushdown
>>>>>>>>>>>>>>> spark.sql.orc.filterPushdown
>>>>>>>>>>>>>>> spark.sql.csv.filterPushdown.enabled
>>>>>>>>>>>>>>> spark.sql.json.filterPushdown.enabled
>>>>>>>>>>>>>>> spark.sql.avro.filterPushdown.enabled
>>>>>>>>>>>>>>> JDBC Option: pushDownPredicate
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> We can see that the lack of consistency is caused by each
>>>>>> connector
>>>>>>>>>>>>>>> introducing different configuration options for the same
>>>>>> behavior.
>>>>>>>>>>>>>>> This is one of the motivations for advocating the
>> introduction
>>>>>> of a
>>>>>>>>>>>>>>> unified configuration name.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> [1] https://issues.apache.org/jira/browse/SPARK-24288
>>>>>>>>>>>>>>> [2] https://github.com/apache/spark/pull/27366
>>>>>>>>>>>>>>> [3]https://github.com/apache/spark/pull/26973
>>>>>>>>>>>>>>> [4] https://github.com/apache/spark/pull/29145
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>> Jiabao
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 2023年11月16日 08:10,Becket Qin <becket....@gmail.com> 写道:
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Hi Jiabao,
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> While we can always fix the formality of the config, a more
>>>>>>>>>>>> fundamental
>>>>>>>>>>>>>>>> issue here is whether this configuration is common enough.
>>>>>>>>>> Personally
>>>>>>>>>>>> I
>>>>>>>>>>>>>>> am
>>>>>>>>>>>>>>>> still not convinced it is.
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Remember we don't have a common implementation for
>>>>>>>>>>>> SupportsFilterPushdown
>>>>>>>>>>>>>>>> itself. Why does a potential behavior of the
>>>>>>>>>>>>>>>> SupportsFilterPushdown.applyFilters() method deserve a
>> common
>>>>>>>>>>>>>>>> configuration? A common implementation should always come
>>>> first,
>>>>>>>>>> then
>>>>>>>>>>>> its
>>>>>>>>>>>>>>>> configuration becomes a common configuration as a natural
>>>>>> result.
>>>>>>>>>> But
>>>>>>>>>>>>>>> here
>>>>>>>>>>>>>>>> we are trying to add an impl to a configuration just to fix
>>>> its
>>>>>>>>>>>>>>> formality.
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> I agree that there might be a few Source implementations
>> that
>>>>>> may
>>>>>>>>>>>> want to
>>>>>>>>>>>>>>>> avoid additional burdens on the remote system in some
>>>>>>>> circumstances.
>>>>>>>>>>>> And
>>>>>>>>>>>>>>>> these circumstances are very specific:
>>>>>>>>>>>>>>>> 1. The source talks to a remote service that can help
>> perform
>>>>>> the
>>>>>>>>>>>> actual
>>>>>>>>>>>>>>>> filtering.
>>>>>>>>>>>>>>>> 2. The filtering done by the remote service is inefficient
>> for
>>>>>>>> some
>>>>>>>>>>>>>>> reason
>>>>>>>>>>>>>>>> (e.g. missing index)
>>>>>>>>>>>>>>>> 3. The external service does not want to perform the
>>>> inefficient
>>>>>>>>>>>>>>> filtering
>>>>>>>>>>>>>>>> for some reason (e.g. it is a shared service with others)
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> There are multiple approaches to address the issue. Pushing
>>>> back
>>>>>>>> the
>>>>>>>>>>>>>>>> filters is just one way of achieving this. So here we are
>>>>>> talking
>>>>>>>>>>>> about a
>>>>>>>>>>>>>>>> config for one of the possible solutions to a scenario with
>>>> all
>>>>>>>> the
>>>>>>>>>>>> above
>>>>>>>>>>>>>>>> situations. I don't think there is enough justification for
>>>> the
>>>>>>>>>>>> config to
>>>>>>>>>>>>>>>> be common.
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> There is always this trade-off between the proliferation of
>>>>>> public
>>>>>>>>>>>>>>>> interfaces and the API standardization. As an extreme
>> example,
>>>>>> we
>>>>>>>>>> can
>>>>>>>>>>>>>>> make
>>>>>>>>>>>>>>>> our public API a union of all the configs potentially used
>> in
>>>>>> all
>>>>>>>>>> the
>>>>>>>>>>>>>>> cases
>>>>>>>>>>>>>>>> in the name of standardization. Apparently this won't work.
>> So
>>>>>>>> there
>>>>>>>>>>>> must
>>>>>>>>>>>>>>>> be a bar here and this bar might be somewhat subjective. For
>>>>>> this
>>>>>>>>>>>> FLIP,
>>>>>>>>>>>>>>>> personally I don't think the config meets my bar for the
>>>> reason
>>>>>>>>>> stated
>>>>>>>>>>>>>>>> above.
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Therefore, my suggestion remains the same. Keep the config
>> as
>>>> a
>>>>>>>>>> Source
>>>>>>>>>>>>>>>> implementation specific configuration.
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Jiangjie (Becket) Qin
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> On Thu, Nov 16, 2023 at 12:36 AM Jiabao Sun <
>>>>>>>>>> jiabao....@xtransfer.cn
>>>>>>>>>>>>>>> .invalid>
>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> Thanks Becket for the feedback,
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> Regarding concerns about common configurations, I think we
>>>> can
>>>>>>>>>>>> introduce
>>>>>>>>>>>>>>>>> FiltersApplier to unify the behavior of various connectors.
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> public static class FiltersApplier {
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> private final ReadableConfig config;
>>>>>>>>>>>>>>>>> private final Function<List<ResolvedExpression>, Result>
>>>>>> action;
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> private FiltersApplier(
>>>>>>>>>>>>>>>>>    ReadableConfig config,
>>>>>>>>>>>>>>>>>    Function<List<ResolvedExpression>, Result> action) {
>>>>>>>>>>>>>>>>> this.config = config;
>>>>>>>>>>>>>>>>> this.action = action;
>>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> public Result applyFilters(List<ResolvedExpression>
>> filters)
>>>> {
>>>>>>>>>>>>>>>>> if (config.get(ENABLE_FILTER_PUSH_DOWN)) {
>>>>>>>>>>>>>>>>>    return action.apply(filters);
>>>>>>>>>>>>>>>>> } else {
>>>>>>>>>>>>>>>>>    return Result.of(Collections.emptyList(), filters);
>>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> public static FiltersApplier of(
>>>>>>>>>>>>>>>>>    ReadableConfig config,
>>>>>>>>>>>>>>>>>    Function<List<ResolvedExpression>, Result> action) {
>>>>>>>>>>>>>>>>> return new FiltersApplier(config, action);
>>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> For connectors implementation:
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> @Override
>>>>>>>>>>>>>>>>> public Result applyFilters(List<ResolvedExpression>
>> filters)
>>>> {
>>>>>>>>>>>>>>>>> return FiltersApplier.of(config,
>>>>>>>>>>>>>>>>>    f -> Result.of(new ArrayList<>(filters),
>>>>>>>>>>>>>>>>> Collections.emptyList()));
>>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> As for the name, whether it is
>>>>>> "source.filter-push-down.enabled"
>>>>>>>> or
>>>>>>>>>>>>>>>>> "source.ignore-pushed-down-filters.enabled", I think both
>> are
>>>>>>>> okay.
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> Do you think this change is feasible?
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>> Jiabao
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> 2023年11月15日 23:44,Becket Qin <becket....@gmail.com> 写道:
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> Hi Jiabao,
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> Yes, I still have concerns.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> The FLIP violates the following two principles regarding
>>>>>>>>>>>> configuration:
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> 1.* A config of a class should never negate the semantic
>> of
>>>> a
>>>>>>>>>>>>>>> decorative
>>>>>>>>>>>>>>>>>> interface implemented by that class. *
>>>>>>>>>>>>>>>>>> A decorative interface is a public contract with other
>>>>>>>> components,
>>>>>>>>>>>>>>> while
>>>>>>>>>>>>>>>>> a
>>>>>>>>>>>>>>>>>> config is only internal to the class itself. The
>>>>>> configurations
>>>>>>>>>> for
>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>> Sources are not (and should never be) visible or
>> understood
>>>> to
>>>>>>>>>>>>>>>>>> other components (e.g. optimizer). A configuration of a
>>>> Source
>>>>>>>>>> only
>>>>>>>>>>>>>>>>>> controls the behavior of that Source, provided it is not
>>>>>>>> violating
>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>> API
>>>>>>>>>>>>>>>>>> contract / semantic defined by the decorative interface.
>> So
>>>>>>>> when a
>>>>>>>>>>>>>>> Source
>>>>>>>>>>>>>>>>>> implementation implements SupportsFilterPushdown, this is
>> a
>>>>>>>> clear
>>>>>>>>>>>>>>> public
>>>>>>>>>>>>>>>>>> contract with Flink that filters should be pushed down to
>>>> that
>>>>>>>>>>>> Source.
>>>>>>>>>>>>>>>>>> Therefore, for the same source, there should not be a
>>>>>>>>>> configuration
>>>>>>>>>>>>>>>>>> "source.filter-push-down.enabled" which stops the filters
>>>> from
>>>>>>>>>> being
>>>>>>>>>>>>>>>>> pushed
>>>>>>>>>>>>>>>>>> down to that Source. However, that specific source
>>>>>>>> implementation
>>>>>>>>>>>> can
>>>>>>>>>>>>>>>>> have
>>>>>>>>>>>>>>>>>> its own config to control its internal behavior, e.g.
>>>>>>>>>>>>>>>>>> "ignore-pushed-down-filters.enabled" which may push back
>> all
>>>>>> the
>>>>>>>>>>>> pushed
>>>>>>>>>>>>>>>>>> down filters back to the Flink optimizer.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> 2. When we are talking about "common configs", in fact we
>>>> are
>>>>>>>>>>>> talking
>>>>>>>>>>>>>>>>> about
>>>>>>>>>>>>>>>>>> "configs for common (abstract) implementation classes".
>> With
>>>>>>>> that
>>>>>>>>>>>> as a
>>>>>>>>>>>>>>>>>> context, *a common config should always be backed by a
>>>> common
>>>>>>>>>>>>>>>>>> implementation class, so that consistent behavior can be
>>>>>>>>>>>> guaranteed. *
>>>>>>>>>>>>>>>>>> The LookupOptions you mentioned are configurations defined
>>>> for
>>>>>>>>>>>> classes
>>>>>>>>>>>>>>>>>> DefaultLookupCache / PeriodicCacheReloadTrigger /
>>>>>>>>>>>>>>>>> TimedCacheReloadTrigger.
>>>>>>>>>>>>>>>>>> These configs are considered as "common" only because the
>>>>>>>>>>>>>>> implementation
>>>>>>>>>>>>>>>>>> classes using them are common building blocks for lookup
>>>> table
>>>>>>>>>>>>>>>>>> implementations. It would not make sense to have a
>> dangling
>>>>>>>> config
>>>>>>>>>>>> in
>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>> LookupOptions without the underlying common implementation
>>>>>>>> class,
>>>>>>>>>>>> but
>>>>>>>>>>>>>>>>> only
>>>>>>>>>>>>>>>>>> relies on a specific source to implement the stated
>>>> behavior.
>>>>>>>>>>>>>>>>>> As a bad example, there is this outlier config
>> "max-retries"
>>>>>> in
>>>>>>>>>>>>>>>>>> LookupOptions, which I don't think should be here. This is
>>>>>>>> because
>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>> retry behavior can be very implementation specific. For
>>>>>> example,
>>>>>>>>>>>> there
>>>>>>>>>>>>>>>>> can
>>>>>>>>>>>>>>>>>> be many different flavors of retry related configurations,
>>>>>>>>>>>>>>> retry-backoff,
>>>>>>>>>>>>>>>>>> retry-timeout, retry-async, etc. Why only max-retry is put
>>>>>> here?
>>>>>>>>>>>> should
>>>>>>>>>>>>>>>>> all
>>>>>>>>>>>>>>>>>> of them be put here? If we put all such kinds of configs
>> in
>>>>>> the
>>>>>>>>>>>> common
>>>>>>>>>>>>>>>>>> configs for "standardization and unification", the number
>> of
>>>>>>>>>> "common
>>>>>>>>>>>>>>>>>> configs" can easily go crazy. And I don't see material
>>>>>> benefits
>>>>>>>> of
>>>>>>>>>>>>>>> doing
>>>>>>>>>>>>>>>>>> that. So here I don't think the configuration "max-retry"
>>>>>> should
>>>>>>>>>> be
>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>> LookupOptions, because it is not backed by any common
>>>>>>>>>> implementation
>>>>>>>>>>>>>>>>>> classes. If max-retry is implemented in the HBase source,
>> it
>>>>>>>>>> should
>>>>>>>>>>>>>>> stay
>>>>>>>>>>>>>>>>>> there. For the same reason, the config proposed in this
>> FLIP
>>>>>>>>>>>> (probably
>>>>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>>>> a name less confusing for the first reason mentioned
>> above)
>>>>>>>>>> should
>>>>>>>>>>>>>>> stay
>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>> the specific Source implementation.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> For the two reasons above, I am -1 to what the FLIP
>>>> currently
>>>>>>>>>>>> proposes.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> I think the right way to address the motivation here is
>>>> still
>>>>>> to
>>>>>>>>>>>> have a
>>>>>>>>>>>>>>>>>> config like "ignore-pushed-down-filters.enabled" for the
>>>>>>>> specific
>>>>>>>>>>>>>>> source
>>>>>>>>>>>>>>>>>> implementation. Please let me know if this solves the
>>>> problem
>>>>>>>> you
>>>>>>>>>>>> are
>>>>>>>>>>>>>>>>>> facing.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> Jiangjie (Becket) Qin
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> On Wed, Nov 15, 2023 at 11:52 AM Jiabao Sun <
>>>>>>>>>>>> jiabao....@xtransfer.cn
>>>>>>>>>>>>>>>>> .invalid>
>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> Hi Becket,
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> The purpose of introducing this configuration is that not
>>>> all
>>>>>>>>>>>> filter
>>>>>>>>>>>>>>>>>>> pushdowns can improve overall performance.
>>>>>>>>>>>>>>>>>>> If the filter can hit the external index, then pushdown
>> is
>>>>>>>>>>>> definitely
>>>>>>>>>>>>>>>>>>> worth it, as it can not only improve query time but also
>>>>>>>> decrease
>>>>>>>>>>>>>>>>> network
>>>>>>>>>>>>>>>>>>> overhead.
>>>>>>>>>>>>>>>>>>> However, for filters that do not hit the external index,
>> it
>>>>>> may
>>>>>>>>>>>>>>>>> increase a
>>>>>>>>>>>>>>>>>>> lot of performance overhead on the external system.
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> Undeniably, if the connector can make accurate decisions
>>>> for
>>>>>>>> good
>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>> bad
>>>>>>>>>>>>>>>>>>> filters, we may not need to introduce this configuration
>>>>>> option
>>>>>>>>>> to
>>>>>>>>>>>>>>>>> disable
>>>>>>>>>>>>>>>>>>> pushing down filters to the external system.
>>>>>>>>>>>>>>>>>>> However, it is currently not easy to achieve.
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> IMO, supporting filter pushdown does not mean that always
>>>>>>>> filter
>>>>>>>>>>>>>>>>> pushdown
>>>>>>>>>>>>>>>>>>> is better.
>>>>>>>>>>>>>>>>>>> In the absence of automatic decision-making, I think we
>>>>>> should
>>>>>>>>>>>> leave
>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>> decision to users.
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> The newly introduced configuration option is similar to
>>>>>>>>>>>> LookupOptions,
>>>>>>>>>>>>>>>>>>> providing unified naming and default values to avoid
>>>>>> confusion
>>>>>>>>>>>> caused
>>>>>>>>>>>>>>> by
>>>>>>>>>>>>>>>>>>> inconsistent naming in different connectors for users.
>>>>>>>>>>>>>>>>>>> Setting the default value to true allows it to maintain
>>>>>>>>>>>> compatibility
>>>>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>>>>> the default behavior of "always pushdown".
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> Do you have any other concerns about this proposal?
>> Please
>>>>>> let
>>>>>>>> me
>>>>>>>>>>>>>>> know.
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>> Jiabao
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> 2023年10月31日 17:29,Jiabao Sun <jiabao....@xtransfer.cn
>>>>>>>> .INVALID>
>>>>>>>>>>>> 写道:
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> Hi Becket,
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> Actually, for FileSystemSource, it is not always
>> desired,
>>>>>> only
>>>>>>>>>> OCR
>>>>>>>>>>>>>>> file
>>>>>>>>>>>>>>>>>>> formats support filter pushdown.
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> We can disable predicate pushdown for FileSystemSource
>> by
>>>>>>>>>> setting
>>>>>>>>>>>>>>>>>>> 'table.optimizer.source.predicate-pushdown-enabled' to
>>>> false.
>>>>>>>>>>>>>>>>>>>> I think we can also disable filter pushdown at a more
>>>>>> granular
>>>>>>>>>>>> level
>>>>>>>>>>>>>>>>>>> through fine-grained configuration.
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>> Jiabao
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> 2023年10月31日 16:50,Becket Qin <becket....@gmail.com>
>> 写道:
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> Hi Jiabao,
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> Thanks for the explanation. Maybe it's easier to
>> explain
>>>>>> with
>>>>>>>>>> an
>>>>>>>>>>>>>>>>>>> example.
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> Let's take FileSystemTableSource as an example.
>> Currently
>>>>>> it
>>>>>>>>>>>>>>>>> implements
>>>>>>>>>>>>>>>>>>>>> SupportsFilterPushDown interface. With your proposal,
>>>> does
>>>>>> it
>>>>>>>>>>>> have
>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>> support `source.filter-push-down.enabled` as well? But
>>>> this
>>>>>>>>>>>>>>>>>>> configuration
>>>>>>>>>>>>>>>>>>>>> does not quite make sense for the FileSystemTableSource
>>>>>>>> because
>>>>>>>>>>>>>>> filter
>>>>>>>>>>>>>>>>>>>>> pushdown is always desired. However, because this
>>>>>>>> configuration
>>>>>>>>>>>> is a
>>>>>>>>>>>>>>>>>>> part
>>>>>>>>>>>>>>>>>>>>> of the SupportsFilterPushDown interface (which sounds
>>>>>>>> confusing
>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>> begin
>>>>>>>>>>>>>>>>>>>>> with), the FileSystemTableSource can only do one of the
>>>>>>>>>>>> following:
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> 1. Ignore the user configuration to always apply the
>>>> pushed
>>>>>>>>>> down
>>>>>>>>>>>>>>>>>>> filters -
>>>>>>>>>>>>>>>>>>>>> this is an apparent anti-pattern because a
>> configuration
>>>>>>>> should
>>>>>>>>>>>>>>> always
>>>>>>>>>>>>>>>>>>> do
>>>>>>>>>>>>>>>>>>>>> what it says.
>>>>>>>>>>>>>>>>>>>>> 2. Throw an exception telling users that this
>>>> configuration
>>>>>>>> is
>>>>>>>>>>>> not
>>>>>>>>>>>>>>>>>>>>> applicable to the FileSystemTableSource.
>>>>>>>>>>>>>>>>>>>>> 3. Implement this configuration to push back the pushed
>>>>>> down
>>>>>>>>>>>>>>> filters,
>>>>>>>>>>>>>>>>>>> even
>>>>>>>>>>>>>>>>>>>>> though this is never desired.
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> None of the above options looks awkward. I am curious
>>>> what
>>>>>>>> your
>>>>>>>>>>>>>>>>>>> solution is
>>>>>>>>>>>>>>>>>>>>> here?
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> Jiangjie (Becket) Qin
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> On Tue, Oct 31, 2023 at 3:11 PM Jiabao Sun <
>>>>>>>>>>>> jiabao....@xtransfer.cn
>>>>>>>>>>>>>>>>>>> .invalid>
>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> Thanks Becket for the further explanation.
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> Perhaps I didn't explain it clearly.
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> 1. If a source does not implement the
>>>>>> SupportsFilterPushDown
>>>>>>>>>>>>>>>>> interface,
>>>>>>>>>>>>>>>>>>>>>> the newly added configurations do not need to be added
>>>> to
>>>>>>>>>> either
>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>> requiredOptions or optionalOptions.
>>>>>>>>>>>>>>>>>>>>>> Similar to LookupOptions, if a source does not
>> implement
>>>>>>>>>>>>>>>>>>>>>> LookupTableSource, there is no need to add
>> LookupOptions
>>>>>> to
>>>>>>>>>>>> either
>>>>>>>>>>>>>>>>>>>>>> requiredOptions or optionalOptions.
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> 2. "And these configs are specific to those sources,
>>>>>> instead
>>>>>>>>>> of
>>>>>>>>>>>>>>>>> common
>>>>>>>>>>>>>>>>>>>>>> configs."
>>>>>>>>>>>>>>>>>>>>>> The newly introduced configurations define
>> standardized
>>>>>>>> names
>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>> default
>>>>>>>>>>>>>>>>>>>>>> values.
>>>>>>>>>>>>>>>>>>>>>> They still belong to the configuration at the
>> individual
>>>>>>>>>> source
>>>>>>>>>>>>>>>>> level.
>>>>>>>>>>>>>>>>>>>>>> The purpose is to avoid scattered configuration items
>>>> when
>>>>>>>>>>>>>>> different
>>>>>>>>>>>>>>>>>>>>>> sources implement the same logic.
>>>>>>>>>>>>>>>>>>>>>> Whether a source should accept these configurations is
>>>>>>>>>>>> determined
>>>>>>>>>>>>>>> by
>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>> source's Factory.
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>> Jiabao
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> 2023年10月31日 13:47,Becket Qin <becket....@gmail.com>
>>>> 写道:
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> Hi Jiabao,
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> Please see the replies inline.
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> Introducing common configurations does not mean that
>>>> all
>>>>>>>>>>>> sources
>>>>>>>>>>>>>>>>> must
>>>>>>>>>>>>>>>>>>>>>>>> accept these configuration options.
>>>>>>>>>>>>>>>>>>>>>>>> The configuration options supported by a source are
>>>>>>>>>>>> determined by
>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> requiredOptions and optionalOptions in the Factory
>>>>>>>>>> interface.
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> This is not true. Both required and optional options
>>>> are
>>>>>>>>>>>>>>> SUPPORTED.
>>>>>>>>>>>>>>>>>>> That
>>>>>>>>>>>>>>>>>>>>>>> means they are implemented and if one specifies an
>>>>>> optional
>>>>>>>>>>>> config
>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>>> will
>>>>>>>>>>>>>>>>>>>>>>> still take effect. An OptionalConfig is "Optional"
>>>>>> because
>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>>>>>> configuration has a default value. Hence, it is OK
>> that
>>>>>>>> users
>>>>>>>>>>>> do
>>>>>>>>>>>>>>> not
>>>>>>>>>>>>>>>>>>>>>>> specify their own value. In another word, it is
>>>>>> "optional"
>>>>>>>>>> for
>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>> end
>>>>>>>>>>>>>>>>>>>>>>> users to set the config, but the implementation and
>>>>>> support
>>>>>>>>>> for
>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>>> config
>>>>>>>>>>>>>>>>>>>>>>> is NOT optional. In case a source does not support a
>>>>>> common
>>>>>>>>>>>>>>> config,
>>>>>>>>>>>>>>>>> an
>>>>>>>>>>>>>>>>>>>>>>> exception must be thrown when the config is provided
>> by
>>>>>> the
>>>>>>>>>> end
>>>>>>>>>>>>>>>>> users.
>>>>>>>>>>>>>>>>>>>>>>> However, the config we are talking about in this FLIP
>>>> is
>>>>>> a
>>>>>>>>>>>> common
>>>>>>>>>>>>>>>>>>> config
>>>>>>>>>>>>>>>>>>>>>>> optional to implement, meaning that sometimes the
>>>> claimed
>>>>>>>>>>>> behavior
>>>>>>>>>>>>>>>>>>> won't
>>>>>>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>>> there even if users specify that config.
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> Similar to sources that do not implement the
>>>>>>>>>> LookupTableSource
>>>>>>>>>>>>>>>>>>> interface,
>>>>>>>>>>>>>>>>>>>>>>>> sources that do not implement the
>>>> SupportsFilterPushDown
>>>>>>>>>>>>>>> interface
>>>>>>>>>>>>>>>>>>> also
>>>>>>>>>>>>>>>>>>>>>> do
>>>>>>>>>>>>>>>>>>>>>>>> not need to accept newly introduced options.
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> First of all, filter pushdown is a behavior of the
>>>> query
>>>>>>>>>>>>>>> optimizer,
>>>>>>>>>>>>>>>>>>> not
>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>> behavior of Sources. The Sources tells the optimizer
>>>> that
>>>>>>>> it
>>>>>>>>>>>> has
>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>> ability to accept pushed down filters by implementing
>>>> the
>>>>>>>>>>>>>>>>>>>>>>> SupportsFilterPushDown interface. And this is the
>> only
>>>>>>>>>> contract
>>>>>>>>>>>>>>>>>>> between
>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>> Source and Optimizer regarding whether filters should
>>>> be
>>>>>>>>>> pushed
>>>>>>>>>>>>>>>>> down.
>>>>>>>>>>>>>>>>>>> As
>>>>>>>>>>>>>>>>>>>>>>> long as a specific source implements this decorative
>>>>>>>>>> interface,
>>>>>>>>>>>>>>>>> filter
>>>>>>>>>>>>>>>>>>>>>>> pushdown should always take place, i.e.
>>>>>>>>>>>>>>>>>>>>>>> *SupportsFilterPushDown.applyFilters()* will be
>> called.
>>>>>>>> There
>>>>>>>>>>>>>>> should
>>>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>> no
>>>>>>>>>>>>>>>>>>>>>>> other config to disable that call. However, Sources
>> can
>>>>>>>>>> decide
>>>>>>>>>>>> how
>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>> behave based on their own configurations after
>>>>>>>>>>>> *applyFilters()* is
>>>>>>>>>>>>>>>>>>>>>> called.
>>>>>>>>>>>>>>>>>>>>>>> And these configs are specific to those sources,
>>>> instead
>>>>>> of
>>>>>>>>>>>> common
>>>>>>>>>>>>>>>>>>>>>> configs.
>>>>>>>>>>>>>>>>>>>>>>> Please see the examples I mentioned in the previous
>>>>>> email.
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> Jiangjie (Becket) Qin
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> On Tue, Oct 31, 2023 at 10:27 AM Jiabao Sun <
>>>>>>>>>>>>>>>>> jiabao....@xtransfer.cn
>>>>>>>>>>>>>>>>>>>>>> .invalid>
>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> Hi Becket,
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> Sorry, there was a typo in the second point. Let me
>>>>>>>> correct
>>>>>>>>>>>> it:
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> Introducing common configurations does not mean that
>>>> all
>>>>>>>>>>>> sources
>>>>>>>>>>>>>>>>> must
>>>>>>>>>>>>>>>>>>>>>>>> accept these configuration options.
>>>>>>>>>>>>>>>>>>>>>>>> The configuration options supported by a source are
>>>>>>>>>>>> determined by
>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> requiredOptions and optionalOptions in the Factory
>>>>>>>>>> interface.
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> Similar to sources that do not implement the
>>>>>>>>>> LookupTableSource
>>>>>>>>>>>>>>>>>>>>>> interface,
>>>>>>>>>>>>>>>>>>>>>>>> sources that do not implement the
>>>> SupportsFilterPushDown
>>>>>>>>>>>>>>> interface
>>>>>>>>>>>>>>>>>>> also
>>>>>>>>>>>>>>>>>>>>>> do
>>>>>>>>>>>>>>>>>>>>>>>> not need to accept newly introduced options.
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>> Jiabao
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> 2023年10月31日 10:13,Jiabao Sun <
>>>> jiabao....@xtransfer.cn
>>>>>>>>>>>> .INVALID>
>>>>>>>>>>>>>>>>> 写道:
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> Thanks Becket for the feedback.
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> 1. Currently, the
>> SupportsFilterPushDown#applyFilters
>>>>>>>>>> method
>>>>>>>>>>>>>>>>>>> returns a
>>>>>>>>>>>>>>>>>>>>>>>> result that includes acceptedFilters and
>>>>>> remainingFilters.
>>>>>>>>>> The
>>>>>>>>>>>>>>>>> source
>>>>>>>>>>>>>>>>>>>>>> can
>>>>>>>>>>>>>>>>>>>>>>>> decide to push down some filters or not accept any
>> of
>>>>>>>> them.
>>>>>>>>>>>>>>>>>>>>>>>>> 2. Introducing common configuration options does
>> not
>>>>>> mean
>>>>>>>>>>>> that a
>>>>>>>>>>>>>>>>>>> source
>>>>>>>>>>>>>>>>>>>>>>>> that supports the SupportsFilterPushDown capability
>>>> must
>>>>>>>>>>>> accept
>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>>>>>>> configuration. Similar to LookupOptions, only
>> sources
>>>>>> that
>>>>>>>>>>>>>>>>> implement
>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> LookupTableSource interface are necessary to accept
>>>>>> these
>>>>>>>>>>>>>>>>>>> configuration
>>>>>>>>>>>>>>>>>>>>>>>> options.
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>> Jiabao
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> 2023年10月31日 07:49,Becket Qin <
>> becket....@gmail.com>
>>>>>> 写道:
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> Hi Jiabao and Ruanhang,
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> Adding a configuration of
>>>>>>>> source.filter-push-down.enabled
>>>>>>>>>>>> as a
>>>>>>>>>>>>>>>>>>> common
>>>>>>>>>>>>>>>>>>>>>>>>>> source configuration seems problematic.
>>>>>>>>>>>>>>>>>>>>>>>>>> 1. The config name is misleading. filter pushdown
>>>>>> should
>>>>>>>>>>>> only
>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>>>> determined
>>>>>>>>>>>>>>>>>>>>>>>>>> by whether the SupportsFilterPushdown interface is
>>>>>>>>>>>> implemented
>>>>>>>>>>>>>>> or
>>>>>>>>>>>>>>>>>>> not.
>>>>>>>>>>>>>>>>>>>>>>>>>> 2. The behavior of this configuration is only
>>>>>> applicable
>>>>>>>>>> to
>>>>>>>>>>>>>>> some
>>>>>>>>>>>>>>>>>>>>>> source
>>>>>>>>>>>>>>>>>>>>>>>>>> implementations. Why is it a common configuration?
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> Here's my suggestion for design principles:
>>>>>>>>>>>>>>>>>>>>>>>>>> 1. Only add source impl specific configuration to
>>>>>>>>>>>> corresponding
>>>>>>>>>>>>>>>>>>>>>> sources.
>>>>>>>>>>>>>>>>>>>>>>>>>> 2. The configuration name should not overrule
>>>> existing
>>>>>>>>>>>> common
>>>>>>>>>>>>>>>>>>>>>> contracts.
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> For example, in the case of MySql source. There
>> are
>>>>>>>>>> several
>>>>>>>>>>>>>>>>>>> options:
>>>>>>>>>>>>>>>>>>>>>>>>>> 1. Have a configuration of
>>>>>>>>>>>>>>>>> `*mysql.avoid.remote.full.table.scan`*.
>>>>>>>>>>>>>>>>>>> If
>>>>>>>>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>>>>>>>>> configuration is set, and a filter pushdown does
>> not
>>>>>> hit
>>>>>>>>>> an
>>>>>>>>>>>>>>>>> index,
>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>> MySql source impl would not further pushdown the
>>>>>> filter
>>>>>>>> to
>>>>>>>>>>>>>>> MySql
>>>>>>>>>>>>>>>>>>>>>>>> servers.
>>>>>>>>>>>>>>>>>>>>>>>>>> Note that this assumes the MySql source can
>> retrieve
>>>>>> the
>>>>>>>>>>>> index
>>>>>>>>>>>>>>>>>>>>>>>> information
>>>>>>>>>>>>>>>>>>>>>>>>>> from the MySql servers.
>>>>>>>>>>>>>>>>>>>>>>>>>> 2. If the MySql index information is not available
>>>> to
>>>>>>>> the
>>>>>>>>>>>> MySql
>>>>>>>>>>>>>>>>>>>>>> source,
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>> configuration could be something like
>>>>>>>>>>>>>>>>>>>>>>>> *`mysql.pushback.pushed.down.filters`*.
>>>>>>>>>>>>>>>>>>>>>>>>>> Once set to true, MySql source would just add all
>>>> the
>>>>>>>>>>>> filters
>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>> RemainingFilters in the Result returned by
>>>>>>>>>>>>>>>>>>>>>>>>>> *SupportsFilterPushdown.applyFilters().*
>>>>>>>>>>>>>>>>>>>>>>>>>> 3. An alternative to option 2 is to have a `
>>>>>>>>>>>>>>>>>>>>>>>>>> *mysql.apply.predicates.after.scan*`. When it is
>> set
>>>>>> to
>>>>>>>>>>>> true,
>>>>>>>>>>>>>>>>> MySql
>>>>>>>>>>>>>>>>>>>>>>>> source
>>>>>>>>>>>>>>>>>>>>>>>>>> will not push the filter down to the MySql
>> servers,
>>>>>> but
>>>>>>>>>>>> apply
>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> filters
>>>>>>>>>>>>>>>>>>>>>>>>>> inside the MySql source itself.
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> As you may see, the above configurations do not
>>>>>> disable
>>>>>>>>>>>> filter
>>>>>>>>>>>>>>>>>>>>>> pushdown
>>>>>>>>>>>>>>>>>>>>>>>>>> itself. They just allow various implementations of
>>>>>>>> filter
>>>>>>>>>>>>>>>>> pushdown.
>>>>>>>>>>>>>>>>>>>>>> And
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>> configuration name does not give any illusion that
>>>>>>>> filter
>>>>>>>>>>>>>>>>> pushdown
>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>>>>> disabled.
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> Jiangjie (Becket) Qin
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> On Mon, Oct 30, 2023 at 11:58 PM Jiabao Sun <
>>>>>>>>>>>>>>>>>>> jiabao....@xtransfer.cn
>>>>>>>>>>>>>>>>>>>>>>>> .invalid>
>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks Hang for the suggestion.
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>> I think the configuration of TableSource is not
>>>>>> closely
>>>>>>>>>>>>>>> related
>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>> SourceReader,
>>>>>>>>>>>>>>>>>>>>>>>>>>> so I prefer to introduce a independent
>>>> configuration
>>>>>>>>>> class
>>>>>>>>>>>>>>>>>>>>>>>>>>> TableSourceOptions in the flink-table-common
>>>> module,
>>>>>>>>>>>> similar
>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>> LookupOptions.
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>> For the second point, I suggest adding Java doc
>> to
>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> SupportsXXXPushDown
>>>>>>>>>>>>>>>>>>>>>>>>>>> interfaces, providing detailed information on
>> these
>>>>>>>>>> options
>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>>> needs
>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>> be supported.
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>> I have made updates in the FLIP document.
>>>>>>>>>>>>>>>>>>>>>>>>>>> Please help check it again.
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>>>> Jiabao
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2023年10月30日 17:23,Hang Ruan <
>>>> ruanhang1...@gmail.com
>>>>>>> 
>>>>>>>>>> 写道:
>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for the improvements, Jiabao.
>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>> There are some details that I am not sure about.
>>>>>>>>>>>>>>>>>>>>>>>>>>>> 1. The new option
>>>> `source.filter-push-down.enabled`
>>>>>>>> will
>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>> added to
>>>>>>>>>>>>>>>>>>>>>>>>>>> which
>>>>>>>>>>>>>>>>>>>>>>>>>>>> class? I think it should be
>> `SourceReaderOptions`.
>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2. How are the connector developers able to know
>>>> and
>>>>>>>>>>>> follow
>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>> FLIP?
>>>>>>>>>>>>>>>>>>>>>>>> Do
>>>>>>>>>>>>>>>>>>>>>>>>>>> we
>>>>>>>>>>>>>>>>>>>>>>>>>>>> need an abstract base class or provide a default
>>>>>>>> method?
>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hang
>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jiabao Sun <jiabao....@xtransfer.cn.invalid>
>>>>>>>>>>>> 于2023年10月30日周一
>>>>>>>>>>>>>>>>>>>>>> 14:45写道:
>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi, all,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for the lively discussion.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Based on the discussion, I have made some
>>>>>> adjustments
>>>>>>>>>> to
>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>> FLIP
>>>>>>>>>>>>>>>>>>>>>>>>>>> document:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 1. The name of the newly added option has been
>>>>>>>> changed
>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "source.filter-push-down.enabled".
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2. Considering compatibility with older
>> versions,
>>>>>> the
>>>>>>>>>>>> newly
>>>>>>>>>>>>>>>>>>> added
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "source.filter-push-down.enabled" option needs
>> to
>>>>>>>>>> respect
>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>> optimizer's
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>> "table.optimizer.source.predicate-pushdown-enabled"
>>>>>>>>>>>> option.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> But there is a consideration to remove the old
>>>>>> option
>>>>>>>>>> in
>>>>>>>>>>>>>>> Flink
>>>>>>>>>>>>>>>>>>> 2.0.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 3. We can provide more options to disable other
>>>>>>>> source
>>>>>>>>>>>>>>>>> abilities
>>>>>>>>>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>>>>>>>>>>>>> side
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> effects, such as “source.aggregate.enabled” and
>>>>>>>>>>>>>>>>>>>>>>>>>>> “source.projection.enabled"
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> This is not urgent and can be continuously
>>>>>>>> introduced.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Looking forward to your feedback again.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jiabao
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2023年10月29日 08:45,Becket Qin <
>>>>>> becket....@gmail.com>
>>>>>>>>>> 写道:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for digging into the git history,
>> Jark. I
>>>>>>>> agree
>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>> makes
>>>>>>>>>>>>>>>>>>>>>>>> sense
>>>>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> deprecate this API in 2.0.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Cheers,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jiangjie (Becket) Qin
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Fri, Oct 27, 2023 at 5:47 PM Jark Wu <
>>>>>>>>>>>> imj...@gmail.com>
>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi Becket,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I checked the history of "
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>> *table.optimizer.source.predicate-pushdown-enabled*",
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> it seems it was introduced since the legacy
>>>>>>>>>>>>>>>>>>> FilterableTableSource
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> interface
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> which might be an experiential feature at
>> that
>>>>>>>> time.
>>>>>>>>>> I
>>>>>>>>>>>>>>> don't
>>>>>>>>>>>>>>>>>>> see
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> necessity
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> of this option at the moment. Maybe we can
>>>>>>>> deprecate
>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>> option
>>>>>>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> drop
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> in Flink 2.0[1] if it is not necessary
>> anymore.
>>>>>>>> This
>>>>>>>>>>>> may
>>>>>>>>>>>>>>>>> help
>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> simplify this discussion.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jark
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> [1]:
>>>>>>>>>> https://issues.apache.org/jira/browse/FLINK-32383
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Thu, 26 Oct 2023 at 10:14, Becket Qin <
>>>>>>>>>>>>>>>>>>> becket....@gmail.com>
>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for the proposal, Jiabao. My two
>> cents
>>>>>>>> below:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 1. If I understand correctly, the motivation
>>>> of
>>>>>>>> the
>>>>>>>>>>>> FLIP
>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>>> mainly to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> make predicate pushdown optional on SOME of
>>>> the
>>>>>>>>>>>> Sources.
>>>>>>>>>>>>>>> If
>>>>>>>>>>>>>>>>>>> so,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> intuitively
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the configuration should be Source specific
>>>>>>>> instead
>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>> general.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Otherwise,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> we will end up with general configurations
>>>> that
>>>>>>>> may
>>>>>>>>>>>> not
>>>>>>>>>>>>>>>>> take
>>>>>>>>>>>>>>>>>>>>>>>> effect
>>>>>>>>>>>>>>>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> some of the Source implementations. This
>>>>>> violates
>>>>>>>>>> the
>>>>>>>>>>>>>>> basic
>>>>>>>>>>>>>>>>>>> rule
>>>>>>>>>>>>>>>>>>>>>>>> of a
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> configuration - it does what it says,
>>>> regardless
>>>>>>>> of
>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>> implementation.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> While configuration standardization is
>>>> usually a
>>>>>>>>>> good
>>>>>>>>>>>>>>>>> thing,
>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>>>>>>>> should
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> not
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> break the basic rules.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> If we really want to have this general
>>>>>>>>>> configuration,
>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> sources
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> this configuration does not apply, they
>> should
>>>>>>>> throw
>>>>>>>>>>>> an
>>>>>>>>>>>>>>>>>>>>>> exception
>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> make
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> it clear that this configuration is not
>>>>>> supported.
>>>>>>>>>>>>>>> However,
>>>>>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>>>>>>>> seems
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ugly.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2. I think the actual motivation of this
>> FLIP
>>>> is
>>>>>>>>>> about
>>>>>>>>>>>>>>>>> "how a
>>>>>>>>>>>>>>>>>>>>>>>> source
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> should implement predicate pushdown
>>>>>> efficiently",
>>>>>>>>>> not
>>>>>>>>>>>>>>>>>>> "whether
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> predicate
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> pushdown should be applied to the source."
>> For
>>>>>>>>>>>> example,
>>>>>>>>>>>>>>> if
>>>>>>>>>>>>>>>>> a
>>>>>>>>>>>>>>>>>>>>>>>> source
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wants
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to avoid additional computing load in the
>>>>>> external
>>>>>>>>>>>>>>> system,
>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>>> can
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> always
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> read the entire record and apply the
>>>> predicates
>>>>>> by
>>>>>>>>>>>>>>> itself.
>>>>>>>>>>>>>>>>>>>>>>>> However,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> from
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the Flink perspective, the predicate
>> pushdown
>>>> is
>>>>>>>>>>>> applied,
>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>>> just
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> implemented differently by the source. So
>> the
>>>>>>>> design
>>>>>>>>>>>>>>>>>>> principle
>>>>>>>>>>>>>>>>>>>>>>>> here
>>>>>>>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Flink only cares about whether a source
>>>> supports
>>>>>>>>>>>>>>> predicate
>>>>>>>>>>>>>>>>>>>>>>>> pushdown
>>>>>>>>>>>>>>>>>>>>>>>>>>> or
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> not,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> it does not care about the implementation
>>>>>>>>>> efficiency /
>>>>>>>>>>>>>>> side
>>>>>>>>>>>>>>>>>>>>>>>> effect of
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> predicates pushdown. It is the Source
>>>>>>>>>> implementation's
>>>>>>>>>>>>>>>>>>>>>>>> responsibility
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ensure the predicates pushdown is
>> implemented
>>>>>>>>>>>> efficiently
>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>> does
>>>>>>>>>>>>>>>>>>>>>>>>>>> not
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> impose excessive pressure on the external
>>>>>> system.
>>>>>>>>>> And
>>>>>>>>>>>> it
>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>> OK
>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>> have
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> additional configurations to achieve this
>>>> goal.
>>>>>>>>>>>>>>> Obviously,
>>>>>>>>>>>>>>>>>>> such
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> configurations will be source specific in
>> this
>>>>>>>> case.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 3. Regarding the existing configurations of
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>> *table.optimizer.source.predicate-pushdown-enabled.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *I am not sure why we need it. Supposedly,
>> if
>>>> a
>>>>>>>>>> source
>>>>>>>>>>>>>>>>>>>>>> implements
>>>>>>>>>>>>>>>>>>>>>>>> a
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> SupportsXXXPushDown interface, the optimizer
>>>>>>>> should
>>>>>>>>>>>> push
>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> corresponding
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> predicates to the Source. I am not sure in
>>>> which
>>>>>>>>>> case
>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> configuration
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> would be used. Any ideas @Jark Wu <
>>>>>>>> imj...@gmail.com
>>>>>>>>>>> ?
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jiangjie (Becket) Qin
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Wed, Oct 25, 2023 at 11:55 PM Jiabao Sun
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> <jiabao....@xtransfer.cn.invalid> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks Jane for the detailed explanation.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I think that for users, we should respect
>>>>>>>>>> conventions
>>>>>>>>>>>>>>> over
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> configurations.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Conventions can be default values
>> explicitly
>>>>>>>>>>>> specified
>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> configurations, or they can be behaviors
>> that
>>>>>>>>>> follow
>>>>>>>>>>>>>>>>>>> previous
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> versions.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> If the same code has different behaviors in
>>>>>>>>>> different
>>>>>>>>>>>>>>>>>>> versions,
>>>>>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> would
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> be a very bad thing.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I agree that for regular users, it is not
>>>>>>>> necessary
>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>> understand
>>>>>>>>>>>>>>>>>>>>>>>>>>> all
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the configurations related to Flink.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> By following conventions, they can have a
>>>> good
>>>>>>>>>>>>>>> experience.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Let's get back to the practical situation
>> and
>>>>>>>>>>>> consider
>>>>>>>>>>>>>>> it.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Case 1:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> The user is not familiar with the purpose
>> of
>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>> table.optimizer.source.predicate-pushdown-enabled
>>>>>>>>>>>>>>>>>>> configuration
>>>>>>>>>>>>>>>>>>>>>>>> but
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> follows
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the convention of allowing predicate
>> pushdown
>>>>>> to
>>>>>>>>>> the
>>>>>>>>>>>>>>>>> source
>>>>>>>>>>>>>>>>>>> by
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> default.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Just understanding the
>>>>>>>>>>>> source.predicate-pushdown-enabled
>>>>>>>>>>>>>>>>>>>>>>>>>>> configuration
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> and performing fine-grained toggle control
>>>> will
>>>>>>>>>> work
>>>>>>>>>>>>>>> well.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Case 2:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> The user understands the meaning of the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>> table.optimizer.source.predicate-pushdown-enabled
>>>>>>>>>>>>>>>>>>> configuration
>>>>>>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> has set
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> its value to false.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> We have reason to believe that the user
>>>>>>>> understands
>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>> meaning
>>>>>>>>>>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> predicate pushdown configuration and the
>>>>>>>> intention
>>>>>>>>>>>> is to
>>>>>>>>>>>>>>>>>>>>>> disable
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> predicate
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> pushdown (rather than whether or not to
>> allow
>>>>>>>> it).
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> The previous choice of globally disabling
>> it
>>>> is
>>>>>>>>>>>> likely
>>>>>>>>>>>>>>>>>>> because
>>>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> couldn't be disabled on individual sources.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> From this perspective, if we provide more
>>>>>>>>>>>> fine-grained
>>>>>>>>>>>>>>>>>>>>>>>> configuration
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> support and provide detailed explanations
>> of
>>>>>> the
>>>>>>>>>>>>>>>>>>> configuration
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> behaviors in
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the documentation,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> users can clearly understand the
>> differences
>>>>>>>>>> between
>>>>>>>>>>>>>>> these
>>>>>>>>>>>>>>>>>>> two
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> configurations and use them correctly.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Also, I don't agree that
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>> table.optimizer.source.predicate-pushdown-enabled =
>>>>>>>>>>>> true
>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> source.predicate-pushdown-enabled = false
>>>> means
>>>>>>>>>> that
>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>> local
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> configuration overrides the global
>>>>>> configuration.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On the contrary, both configurations are
>>>>>>>>>> functioning
>>>>>>>>>>>>>>>>>>> correctly.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> The optimizer allows predicate pushdown to
>>>> all
>>>>>>>>>>>> sources,
>>>>>>>>>>>>>>>>> but
>>>>>>>>>>>>>>>>>>>>>> some
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> sources
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> can reject the filters pushed down by the
>>>>>>>>>> optimizer.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> This is natural, just like different
>>>> components
>>>>>>>> at
>>>>>>>>>>>>>>>>> different
>>>>>>>>>>>>>>>>>>>>>>>> levels
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> are
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> responsible for different tasks.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> The more serious issue is that if
>>>>>>>>>>>>>>>>>>>>>>>>>>> "source.predicate-pushdown-enabled"
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> does not respect
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>> "table.optimizer.source.predicate-pushdown-enabled”,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>> "table.optimizer.source.predicate-pushdown-enabled"
>>>>>>>>>>>>>>>>>>>>>>>>>>> configuration
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> will be invalidated.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> This means that regardless of whether
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>> "table.optimizer.source.predicate-pushdown-enabled"
>>>>>>>>>>>> is
>>>>>>>>>>>>>>> set
>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> true
>>>>>>>>>>>>>>>>>>>>>>>>>>> or
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> false, it will have no effect.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jiabao
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2023年10月25日 22:24,Jane Chan <
>>>>>>>>>> qingyue....@gmail.com>
>>>>>>>>>>>>>>> 写道:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi Jiabao,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for the in-depth clarification.
>> Here
>>>>>> are
>>>>>>>> my
>>>>>>>>>>>>>>> cents
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> However,
>>>>>>>>>>>>>>>>>>> "table.optimizer.source.predicate-pushdown-enabled"
>>>>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "scan.filter-push-down.enabled" are
>>>>>>>>>> configurations
>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>>>>>> different
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> components(optimizer and source
>> operator).
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> We cannot assume that every user would be
>>>>>>>>>>>> interested in
>>>>>>>>>>>>>>>>>>>>>>>>>>> understanding
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> internal components of Flink, such as the
>>>>>>>>>> optimizer
>>>>>>>>>>>> or
>>>>>>>>>>>>>>>>>>>>>>>> connectors,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> specific configurations associated with
>> each
>>>>>>>>>>>> component.
>>>>>>>>>>>>>>>>>>>>>> Instead,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> users
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> might be more concerned about knowing
>> which
>>>>>>>>>>>>>>> configuration
>>>>>>>>>>>>>>>>>>>>>>>> enables
>>>>>>>>>>>>>>>>>>>>>>>>>>> or
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> disables the filter push-down feature for
>>>> all
>>>>>>>>>> source
>>>>>>>>>>>>>>>>>>>>>> connectors,
>>>>>>>>>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> which
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> parameter provides the flexibility to
>>>> override
>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>> behavior
>>>>>>>>>>>>>>>>>>>>>>>> for a
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> single
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> source if needed.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> So, from this perspective, I am inclined
>> to
>>>>>>>> divide
>>>>>>>>>>>>>>> these
>>>>>>>>>>>>>>>>>>> two
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> parameters
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> based on the scope of their impact from
>> the
>>>>>>>> user's
>>>>>>>>>>>>>>>>>>> perspective
>>>>>>>>>>>>>>>>>>>>>>>>>>> (i.e.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> global-level or operator-level), rather
>> than
>>>>>>>>>>>>>>> categorizing
>>>>>>>>>>>>>>>>>>> them
>>>>>>>>>>>>>>>>>>>>>>>>>>> based
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> on the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> component hierarchy from a developer's
>> point
>>>>>> of
>>>>>>>>>>>> view.
>>>>>>>>>>>>>>>>>>>>>> Therefore,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> based
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> on
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> this premise, it is intuitive and natural
>>>> for
>>>>>>>>>> users
>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> understand fine-grained configuration
>>>> options
>>>>>>>> can
>>>>>>>>>>>>>>>>> override
>>>>>>>>>>>>>>>>>>>>>>>> global
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> configurations.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Additionally, if
>>>>>> "scan.filter-push-down.enabled"
>>>>>>>>>>>>>>> doesn't
>>>>>>>>>>>>>>>>>>>>>>>> respect to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>> "table.optimizer.source.predicate-pushdown-enabled"
>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>> default
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> value
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> of "scan.filter-push-down.enabled" is
>>>> defined
>>>>>>>> as
>>>>>>>>>>>> true,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> it means that just modifying
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>> "table.optimizer.source.predicate-pushdown-enabled" as
>>>>>>>>>>>>>>>>>>> false
>>>>>>>>>>>>>>>>>>>>>>>> will
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> have no
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> effect, and filter pushdown will still be
>>>>>>>>>>>> performed.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> If we define the default value of
>>>>>>>>>>>>>>>>>>>>>>>> "scan.filter-push-down.enabled"
>>>>>>>>>>>>>>>>>>>>>>>>>>> as
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> false, it would introduce a difference in
>>>>>>>>>> behavior
>>>>>>>>>>>>>>>>>>> compared
>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> previous
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> version.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> <1>If I understand correctly,
>>>>>>>>>>>>>>>>>>> "scan.filter-push-down.enabled"
>>>>>>>>>>>>>>>>>>>>>>>> is a
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> connector option, which means the only way
>>>> to
>>>>>>>>>>>> configure
>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> explicitly
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> specify it in DDL (no matter whether
>> disable
>>>>>> or
>>>>>>>>>>>>>>> enable),
>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>> SET
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> command is not applicable, so I think it's
>>>>>>>> natural
>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>> still
>>>>>>>>>>>>>>>>>>>>>>>> respect
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> user's
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> specification here. Otherwise, users might
>>>> be
>>>>>>>> more
>>>>>>>>>>>>>>>>> confused
>>>>>>>>>>>>>>>>>>>>>>>> about
>>>>>>>>>>>>>>>>>>>>>>>>>>> why
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> DDL does not work as expected, and the
>>>> reason
>>>>>> is
>>>>>>>>>>>> just
>>>>>>>>>>>>>>>>>>> because
>>>>>>>>>>>>>>>>>>>>>>>> some
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> other
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "optimizer" configuration is set to a
>>>>>> different
>>>>>>>>>>>> value.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> <2> From the implementation side, I am
>>>>>> inclined
>>>>>>>> to
>>>>>>>>>>>> keep
>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> parameter's
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> priority consistent for all conditions.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Let "global" denote
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>> "table.optimizer.source.predicate-pushdown-enabled",
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> and let "per-source" denote
>>>>>>>>>>>>>>>>> "scan.filter-push-down.enabled"
>>>>>>>>>>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> specific
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> source T,  the following Truth table
>> (based
>>>> on
>>>>>>>> the
>>>>>>>>>>>>>>>>> current
>>>>>>>>>>>>>>>>>>>>>>>> design)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> indicates the inconsistent behavior for
>>>>>>>>>> "per-source
>>>>>>>>>>>>>>>>>>> override
>>>>>>>>>>>>>>>>>>>>>>>>>>> global".
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>> .------------.---------------.-------------------
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>> ----.-------------------------------------.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> | global   | per-source | push-down for T
>> |
>>>>>>>>>>>> per-source
>>>>>>>>>>>>>>>>>>>>>> override
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> global
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> |
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> :-----------+--------------+-----------------------+------------------------------------:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> | true       | false         | false
>>>>>>>>>>>>>>>>> | Y
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>       |
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> :-----------+--------------+-----------------------+------------------------------------:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> | false     | true           | false
>>>>>>>>>>>>>>>>> | N
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>       |
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> .------------.---------------.-----------------------.-------------------------------------.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jane
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Wed, Oct 25, 2023 at 6:22 PM Jiabao
>> Sun <
>>>>>>>>>>>>>>>>>>>>>>>>>>> jiabao....@xtransfer.cn
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .invalid>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks Benchao for the feedback.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I understand that the configuration of
>>>> global
>>>>>>>>>>>>>>>>> parallelism
>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>> task
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> parallelism is at different granularities
>>>> but
>>>>>>>>>> with
>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>> same
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> configuration.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> However,
>>>>>>>>>>>>>>>>>>> "table.optimizer.source.predicate-pushdown-enabled"
>>>>>>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "scan.filter-push-down.enabled" are
>>>>>>>>>> configurations
>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>>>>>> different
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> components(optimizer and source
>> operator).
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> From a user's perspective, there are two
>>>>>>>>>> scenarios:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 1. Disabling all filter pushdown
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> In this case, setting
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>> "table.optimizer.source.predicate-pushdown-enabled"
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to false is sufficient to meet the
>>>>>> requirement.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2. Disabling filter pushdown for specific
>>>>>>>> sources
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> In this scenario, there is no need to
>>>> adjust
>>>>>>>> the
>>>>>>>>>>>> value
>>>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>> "table.optimizer.source.predicate-pushdown-enabled".
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Instead, the focus should be on the
>>>>>>>> configuration
>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "scan.filter-push-down.enabled" to meet
>> the
>>>>>>>>>>>>>>> requirement.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> In this case, users do not need to set
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>> "table.optimizer.source.predicate-pushdown-enabled" to
>>>>>>>>>>>>>>>>>>> false
>>>>>>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> manually
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> enable filter pushdown for specific
>>>> sources.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Additionally, if
>>>>>>>> "scan.filter-push-down.enabled"
>>>>>>>>>>>>>>> doesn't
>>>>>>>>>>>>>>>>>>>>>>>> respect
>>>>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>> "table.optimizer.source.predicate-pushdown-enabled"
>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>> default
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> value
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> of "scan.filter-push-down.enabled" is
>>>> defined
>>>>>>>> as
>>>>>>>>>>>> true,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> it means that just modifying
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>> "table.optimizer.source.predicate-pushdown-enabled" as
>>>>>>>>>>>>>>>>>>> false
>>>>>>>>>>>>>>>>>>>>>>>> will
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> have no
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> effect, and filter pushdown will still be
>>>>>>>>>>>> performed.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> If we define the default value of
>>>>>>>>>>>>>>>>>>>>>>>> "scan.filter-push-down.enabled"
>>>>>>>>>>>>>>>>>>>>>>>>>>> as
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> false, it would introduce a difference in
>>>>>>>>>> behavior
>>>>>>>>>>>>>>>>>>> compared
>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> previous
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> version.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> The same SQL query that could
>> successfully
>>>>>> push
>>>>>>>>>>>> down
>>>>>>>>>>>>>>>>>>> filters
>>>>>>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> old
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> version but would no longer do so after
>> the
>>>>>>>>>>>> upgrade.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jiabao
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2023年10月25日 17:10,Benchao Li <
>>>>>>>>>>>> libenc...@apache.org>
>>>>>>>>>>>>>>>>> 写道:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks Jiabao for the detailed
>>>> explanations,
>>>>>>>>>> that
>>>>>>>>>>>>>>>>> helps a
>>>>>>>>>>>>>>>>>>>>>>>> lot, I
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> understand your rationale now.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Correct me if I'm wrong. Your
>> perspective
>>>> is
>>>>>>>>>> from
>>>>>>>>>>>>>>>>>>>>>> "developer",
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> which
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> means there is an optimizer and
>> connector
>>>>>>>>>>>> component,
>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>> if
>>>>>>>>>>>>>>>>>>>>>> we
>>>>>>>>>>>>>>>>>>>>>>>>>>> want
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> enable this feature (pushing filters
>> down
>>>>>> into
>>>>>>>>>>>>>>>>>>> connectors),
>>>>>>>>>>>>>>>>>>>>>>>> you
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> must
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> enable it firstly in optimizer, and only
>>>>>> then
>>>>>>>>>>>>>>> connector
>>>>>>>>>>>>>>>>>>> has
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> chance
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to decide to use it or not.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> My perspective is from "user" that (Why
>> a
>>>>>> user
>>>>>>>>>>>> should
>>>>>>>>>>>>>>>>>>> care
>>>>>>>>>>>>>>>>>>>>>>>> about
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> difference of optimizer/connector) ,
>> this
>>>>>> is a
>>>>>>>>>>>>>>> feature,
>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>> has
>>>>>>>>>>>>>>>>>>>>>>>>>>> two
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> way to control it, one way is to config
>> it
>>>>>>>>>>>> job-level,
>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> other
>>>>>>>>>>>>>>>>>>>>>>>>>>> one
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> in table properties. What a user expects
>>>> is
>>>>>>>> that
>>>>>>>>>>>> they
>>>>>>>>>>>>>>>>> can
>>>>>>>>>>>>>>>>>>>>>>>>>>> control a
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> feature in a tiered way, that setting it
>>>> per
>>>>>>>>>> job,
>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>> then
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> fine-grained tune it per table.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> This is some kind of similar to other
>>>>>>>> concepts,
>>>>>>>>>>>> such
>>>>>>>>>>>>>>> as
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> parallelism,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> users can set a job level default
>>>>>> parallelism,
>>>>>>>>>> and
>>>>>>>>>>>>>>> then
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> fine-grained
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> tune it per operator. There may be more
>>>> such
>>>>>>>>>>>> debate
>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> future
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> e.g., we can have a job level config
>> about
>>>>>>>>>> adding
>>>>>>>>>>>>>>>>> key-by
>>>>>>>>>>>>>>>>>>>>>>>> before
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> lookup
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> join, and also a hint/table property way
>>>> to
>>>>>>>>>>>>>>>>> fine-grained
>>>>>>>>>>>>>>>>>>>>>>>> control
>>>>>>>>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> per lookup operator. Hence we'd better
>>>> find
>>>>>> a
>>>>>>>>>>>> unified
>>>>>>>>>>>>>>>>> way
>>>>>>>>>>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>>>>>> all
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> those similar kind of features.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jiabao Sun <jiabao....@xtransfer.cn
>>>>>> .invalid>
>>>>>>>>>>>>>>>>>>> 于2023年10月25日周三
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 15:27写道:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks Jane for further explanation.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> These two configurations correspond to
>>>>>>>>>> different
>>>>>>>>>>>>>>>>> levels.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "scan.filter-push-down.enabled" does not
>>>> make
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "table.optimizer.source.predicate"
>> invalid.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> The planner will still push down
>>>> predicates
>>>>>>>> to
>>>>>>>>>>>> all
>>>>>>>>>>>>>>>>>>> sources.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Whether filter pushdown is allowed or
>> not
>>>>>> is
>>>>>>>>>>>>>>>>> determined
>>>>>>>>>>>>>>>>>>> by
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> specific
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> source's "scan.filter-push-down.enabled"
>>>>>>>>>>>>>>> configuration.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> However,
>>>> "table.optimizer.source.predicate"
>>>>>>>>>> does
>>>>>>>>>>>>>>>>>>> directly
>>>>>>>>>>>>>>>>>>>>>>>> affect
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "scan.filter-push-down.enabled”.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> When the planner disables predicate
>>>>>> pushdown,
>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> source-level
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> filter
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> pushdown will also not be executed, even
>> if
>>>>>> the
>>>>>>>>>>>> source
>>>>>>>>>>>>>>>>>>> allows
>>>>>>>>>>>>>>>>>>>>>>>>>>> filter
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> pushdown.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Whatever, in point 1 and 2, our
>>>> expectation
>>>>>>>> is
>>>>>>>>>>>>>>>>>>> consistent.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> For the 3rd point, I still think that
>> the
>>>>>>>>>>>>>>>>> planner-level
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> configuration
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> takes precedence over the source-level
>>>>>>>>>>>> configuration.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> It may seem counterintuitive when we
>>>>>> globally
>>>>>>>>>>>>>>> disable
>>>>>>>>>>>>>>>>>>>>>>>> predicate
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> pushdown but allow filter pushdown at the
>>>>>>>> source
>>>>>>>>>>>>>>> level.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jiabao
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2023年10月25日 14:35,Jane Chan <
>>>>>>>>>>>> qingyue....@gmail.com
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 写道:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi Jiabao,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for clarifying this. While by
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "scan.filter-push-down.enabled
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> takes a
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> higher priority" I meant that this
>> value
>>>>>>>>>> should
>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>> respected
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> whenever
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> it is
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> set explicitly.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> The conclusion that
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2. "table.optimizer.source.predicate"
>> =
>>>>>>>> "true"
>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "scan.filter-push-down.enabled" =
>>>> "false"
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Allow the planner to perform
>> predicate
>>>>>>>>>>>> pushdown,
>>>>>>>>>>>>>>> but
>>>>>>>>>>>>>>>>>>>>>>>>>>> individual
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> sources do
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> not enable filter pushdown.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> This indicates that the option
>>>>>>>>>>>>>>>>>>>>>>>> "scan.filter-push-down.enabled =
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> false"
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> an individual source connector does
>>>> indeed
>>>>>>>>>>>> override
>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> global-level
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> planner settings to make a difference.
>>>> And
>>>>>>>>>> thus
>>>>>>>>>>>>>>> "has
>>>>>>>>>>>>>>>>> a
>>>>>>>>>>>>>>>>>>>>>>>> higher
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> priority".
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> While for
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 3. "table.optimizer.source.predicate"
>> =
>>>>>>>>>> "false"
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Predicate pushdown is not allowed for
>>>> the
>>>>>>>>>>>> planner.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Regardless of the value of the
>>>>>>>>>>>>>>>>>>>>>>>> "scan.filter-push-down.enabled"
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> configuration, filter pushdown is
>>>>>> disabled.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> In this scenario, the behavior
>> remains
>>>>>>>>>>>> consistent
>>>>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> old
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> version as
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> well.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I still think
>>>>>>>> "scan.filter-push-down.enabled"
>>>>>>>>>>>>>>> should
>>>>>>>>>>>>>>>>>>> also
>>>>>>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> respected
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> if
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> it is enabled for individual
>> connectors.
>>>>>>>> WDYT?
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jane
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Wed, Oct 25, 2023 at 1:27 PM Jiabao
>>>>>> Sun <
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> jiabao....@xtransfer.cn
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .invalid>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks Benchao for the feedback.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> For the current proposal, we
>> recommend
>>>>>>>>>> keeping
>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>> default
>>>>>>>>>>>>>>>>>>>>>>>>>>> value
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "table.optimizer.source.predicate" as
>>>>>> true,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> and setting the the default value of
>>>>>> newly
>>>>>>>>>>>>>>>>> introduced
>>>>>>>>>>>>>>>>>>>>>>>> option
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "scan.filter-push-down.enabled" to
>> true
>>>>>> as
>>>>>>>>>>>> well.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> The main purpose of doing this is to
>>>>>>>> maintain
>>>>>>>>>>>>>>>>>>> consistency
>>>>>>>>>>>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> previous
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> versions, as whether to perform
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> filter pushdown in the old version
>>>> solely
>>>>>>>>>>>> depends
>>>>>>>>>>>>>>> on
>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "table.optimizer.source.predicate"
>>>>>> option.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> That means by default, as long as a
>>>>>>>>>> TableSource
>>>>>>>>>>>>>>>>>>>>>> implements
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> SupportsFilterPushDown interface,
>>>> filter
>>>>>>>>>>>> pushdown
>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>>> allowed.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> And it seems that we don't have much
>>>>>>>> benefit
>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>> changing
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> default
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> value
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> of "table.optimizer.source.predicate"
>>>> to
>>>>>>>>>> false.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Regarding the priority of these two
>>>>>>>>>>>>>>> configurations,
>>>>>>>>>>>>>>>>> I
>>>>>>>>>>>>>>>>>>>>>>>> believe
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "table.optimizer.source.predicate"
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> takes precedence over
>>>>>>>>>>>>>>>>> "scan.filter-push-down.enabled"
>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> exhibits
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> following behavior.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 1.
>> "table.optimizer.source.predicate" =
>>>>>>>>>> "true"
>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "scan.filter-push-down.enabled" =
>>>> "true"
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> This is the default behavior,
>> allowing
>>>>>>>> filter
>>>>>>>>>>>>>>>>> pushdown
>>>>>>>>>>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> sources.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2.
>> "table.optimizer.source.predicate" =
>>>>>>>>>> "true"
>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "scan.filter-push-down.enabled" =
>>>> "false"
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Allow the planner to perform
>> predicate
>>>>>>>>>>>> pushdown,
>>>>>>>>>>>>>>> but
>>>>>>>>>>>>>>>>>>>>>>>>>>> individual
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> sources do
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> not enable filter pushdown.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 3.
>> "table.optimizer.source.predicate" =
>>>>>>>>>> "false"
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Predicate pushdown is not allowed for
>>>> the
>>>>>>>>>>>> planner.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Regardless of the value of the
>>>>>>>>>>>>>>>>>>>>>>>> "scan.filter-push-down.enabled"
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> configuration, filter pushdown is
>>>>>> disabled.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> In this scenario, the behavior
>> remains
>>>>>>>>>>>> consistent
>>>>>>>>>>>>>>>>> with
>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> old
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> version as
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> well.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> From an implementation perspective,
>>>>>> setting
>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>> priority
>>>>>>>>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "scan.filter-push-down.enabled"
>> higher
>>>>>> than
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "table.optimizer.source.predicate" is
>>>>>>>>>>>> difficult to
>>>>>>>>>>>>>>>>>>>>>> achieve
>>>>>>>>>>>>>>>>>>>>>>>>>>> now.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Because the
>>>>>>>> PushFilterIntoSourceScanRuleBase
>>>>>>>>>> at
>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>> planner
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> level
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> takes
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> precedence over the source-level
>>>>>>>>>>>>>>> FilterPushDownSpec.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Only when the
>>>>>>>>>> PushFilterIntoSourceScanRuleBase
>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>> enabled,
>>>>>>>>>>>>>>>>>>>>>>>>>>> will
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Source-level filter pushdown be
>>>>>> performed.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Additionally, in my opinion, there
>>>>>> doesn't
>>>>>>>>>>>> seem to
>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>> much
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> benefit in
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> setting a higher priority for
>>>>>>>>>>>>>>>>>>>>>>>> "scan.filter-push-down.enabled".
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> It may instead affect compatibility
>> and
>>>>>>>>>>>> increase
>>>>>>>>>>>>>>>>>>>>>>>>>>> implementation
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> complexity.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> WDYT?
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jiabao
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2023年10月25日 11:56,Benchao Li <
>>>>>>>>>>>>>>> libenc...@apache.org
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 写道:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I agree with Jane that fine-grained
>>>>>>>>>>>>>>> configurations
>>>>>>>>>>>>>>>>>>>>>> should
>>>>>>>>>>>>>>>>>>>>>>>>>>> have
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> higher
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> priority than job level
>>>> configurations.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> For current proposal, we can achieve
>>>>>> that:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - Set
>>>>>> "table.optimizer.source.predicate" =
>>>>>>>>>>>> "true"
>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> enable
>>>>>>>>>>>>>>>>>>>>>>>>>>> by
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> default, and set
>>>>>>>>>>>>>>> ""scan.filter-push-down.enabled" =
>>>>>>>>>>>>>>>>>>>>>>>> "false"
>>>>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> disable
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> it per table source
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - Set
>>>>>> "table.optimizer.source.predicate" =
>>>>>>>>>>>>>>> "false"
>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> disable
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> by
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> default, and set
>>>>>>>>>>>>>>> ""scan.filter-push-down.enabled" =
>>>>>>>>>>>>>>>>>>>>>>>> "true" to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> enable
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> it per table source
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jane Chan <qingyue....@gmail.com>
>>>>>>>>>>>> 于2023年10月24日周二
>>>>>>>>>>>>>>>>>>>>>> 23:55写道:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I believe that the configuration
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "table.optimizer.source.predicate"
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> has a
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> higher priority at the planner
>> level
>>>>>>>> than
>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> configuration
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> source
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> level,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> and it seems easy to implement
>> now.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Correct me if I'm wrong, but I
>> think
>>>>>> the
>>>>>>>>>>>>>>>>>>> fine-grained
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> configuration
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "scan.filter-push-down.enabled"
>>>> should
>>>>>>>>>> have a
>>>>>>>>>>>>>>>>> higher
>>>>>>>>>>>>>>>>>>>>>>>>>>> priority
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> because
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> default value of
>>>>>>>>>>>>>>>>> "table.optimizer.source.predicate"
>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>>> true.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> As
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> a
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> result,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> turning off filter push-down for a
>>>>>>>> specific
>>>>>>>>>>>>>>> source
>>>>>>>>>>>>>>>>>>> will
>>>>>>>>>>>>>>>>>>>>>>>> not
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> take
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> effect
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> unless the default value of
>>>>>>>>>>>>>>>>>>>>>>>>>>> "table.optimizer.source.predicate"
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> changed
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to false, or, alternatively, let
>>>> users
>>>>>>>>>>>> manually
>>>>>>>>>>>>>>>>> set
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "table.optimizer.source.predicate"
>> to
>>>>>>>> false
>>>>>>>>>>>>>>> first
>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>> then
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> selectively
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> enable filter push-down for the
>>>> desired
>>>>>>>>>>>> sources,
>>>>>>>>>>>>>>>>>>> which
>>>>>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>>>>>> less
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> intuitive.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> WDYT?
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jane
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Tue, Oct 24, 2023 at 6:05 PM
>>>> Jiabao
>>>>>>>> Sun
>>>>>>>>>> <
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> jiabao....@xtransfer.cn
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .invalid>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks Jane,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I believe that the configuration
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "table.optimizer.source.predicate"
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> has a
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> higher priority at the planner
>> level
>>>>>>>> than
>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> configuration
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> at
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> source
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> level,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> and it seems easy to implement
>> now.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jiabao
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2023年10月24日 17:36,Jane Chan <
>>>>>>>>>>>>>>>>>>> qingyue....@gmail.com>
>>>>>>>>>>>>>>>>>>>>>>>> 写道:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi Jiabao,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks for driving this
>>>> discussion. I
>>>>>>>>>> have
>>>>>>>>>>>> a
>>>>>>>>>>>>>>>>> small
>>>>>>>>>>>>>>>>>>>>>>>>>>> question
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> will
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "scan.filter-push-down.enabled"
>>>> take
>>>>>>>>>>>>>>> precedence
>>>>>>>>>>>>>>>>>>> over
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>> "table.optimizer.source.predicate"
>>>>>> when
>>>>>>>>>> the
>>>>>>>>>>>>>>> two
>>>>>>>>>>>>>>>>>>>>>>>> parameters
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> might
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> conflict
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> each other?
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jane
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Tue, Oct 24, 2023 at 5:05 PM
>>>>>> Jiabao
>>>>>>>>>> Sun
>>>>>>>>>>>> <
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> jiabao....@xtransfer.cn
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .invalid>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks Jark,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> If we only add configuration
>>>> without
>>>>>>>>>>>> adding
>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> enableFilterPushDown
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> method in the
>>>> SupportsFilterPushDown
>>>>>>>>>>>>>>> interface,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> each connector would have to
>>>> handle
>>>>>>>> the
>>>>>>>>>>>> same
>>>>>>>>>>>>>>>>>>> logic
>>>>>>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> applyFilters
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> method to determine whether
>> filter
>>>>>>>>>>>> pushdown
>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>> needed.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> This would increase complexity
>> and
>>>>>>>>>> violate
>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> original
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> behavior
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> applyFilters method.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On the contrary, we only need to
>>>>>> pass
>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> configuration
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> parameter in
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> newly added enableFilterPushDown
>>>>>>>> method
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to decide whether to perform
>>>>>> predicate
>>>>>>>>>>>>>>>>> pushdown.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I think this approach would be
>>>>>> clearer
>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>> simpler.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> WDYT?
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jiabao
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2023年10月24日 16:58,Jark Wu <
>>>>>>>>>>>> imj...@gmail.com
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 写道:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi JIabao,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I think the current interface
>> can
>>>>>>>>>> already
>>>>>>>>>>>>>>>>>>> satisfy
>>>>>>>>>>>>>>>>>>>>>>>> your
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> requirements.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> The connector can reject all
>> the
>>>>>>>>>> filters
>>>>>>>>>>>> by
>>>>>>>>>>>>>>>>>>>>>> returning
>>>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> input
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> filters
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> as `Result#remainingFilters`.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> So maybe we don't need to
>>>>>> introduce a
>>>>>>>>>> new
>>>>>>>>>>>>>>>>>>> method to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> disable
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> pushdown, but just introduce an
>>>>>>>> option
>>>>>>>>>>>> for
>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> specific
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> connector.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jark
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On Tue, 24 Oct 2023 at 16:38,
>>>>>> Leonard
>>>>>>>>>> Xu
>>>>>>>>>>>> <
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> xbjt...@gmail.com
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks @Jiabao for kicking off
>>>>>> this
>>>>>>>>>>>>>>>>> discussion.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Could you add a section to
>>>> explain
>>>>>>>> the
>>>>>>>>>>>>>>>>>>> difference
>>>>>>>>>>>>>>>>>>>>>>>>>>> between
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> proposed
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> connector level config
>>>>>>>>>>>>>>>>>>>>>>>> `scan.filter-push-down.enabled`
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> existing
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> query
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> level config
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>> `table.optimizer.source.predicate-pushdown-enabled` ?
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Leonard
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2023年10月24日 下午4:18,Jiabao
>> Sun <
>>>>>>>>>>>>>>>>>>>>>>>>>>> jiabao....@xtransfer.cn
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .INVALID>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 写道:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi Devs,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I would like to start a
>>>>>> discussion
>>>>>>>> on
>>>>>>>>>>>>>>>>>>> FLIP-377:
>>>>>>>>>>>>>>>>>>>>>>>>>>> support
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> configuration
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> disable filter pushdown for
>>>>>>>> Table/SQL
>>>>>>>>>>>>>>>>>>> Sources[1].
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Currently, Flink Table/SQL
>> does
>>>>>> not
>>>>>>>>>>>> expose
>>>>>>>>>>>>>>>>>>>>>>>>>>> fine-grained
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> control
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> users to enable or disable
>>>> filter
>>>>>>>>>>>> pushdown.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> However, filter pushdown has
>>>> some
>>>>>>>>>> side
>>>>>>>>>>>>>>>>>>> effects,
>>>>>>>>>>>>>>>>>>>>>>>> such
>>>>>>>>>>>>>>>>>>>>>>>>>>> as
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> additional
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> computational pressure on
>>>> external
>>>>>>>>>>>> systems.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Moreover, Improper queries
>> can
>>>>>> lead
>>>>>>>>>> to
>>>>>>>>>>>>>>>>> issues
>>>>>>>>>>>>>>>>>>>>>> such
>>>>>>>>>>>>>>>>>>>>>>>> as
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> full
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> table
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> scans,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> which in turn can impact the
>>>>>>>> stability
>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>> external
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> systems.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Suppose we have an SQL query
>>>> with
>>>>>>>> two
>>>>>>>>>>>>>>>>> sources:
>>>>>>>>>>>>>>>>>>>>>>>> Kafka
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> and a
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> database.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> The database is sensitive to
>>>>>>>>>> pressure,
>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>> we
>>>>>>>>>>>>>>>>>>>>>> want
>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> configure
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> it to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> not perform filter pushdown to
>>>> the
>>>>>>>>>>>> database
>>>>>>>>>>>>>>>>>>>>>> source.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> However, we still want to
>>>> perform
>>>>>>>>>>>> filter
>>>>>>>>>>>>>>>>>>> pushdown
>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Kafka
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> source
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> decrease network IO.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I propose to support
>>>>>> configuration
>>>>>>>> to
>>>>>>>>>>>>>>>>> disable
>>>>>>>>>>>>>>>>>>>>>>>> filter
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> push
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> down for
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Table/SQL sources to let user
>>>>>> decide
>>>>>>>>>>>>>>> whether
>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> perform
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> filter
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> pushdown.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Looking forward to your
>>>> feedback.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> [1]
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=276105768
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Jiabao
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Benchao Li
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Benchao Li
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>> 
>>>> 
>> 
>> 


Reply via email to