[ 
https://issues.apache.org/jira/browse/HBASE-10965?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13993583#comment-13993583
 ] 

Ted Yu commented on HBASE-10965:
--------------------------------

w.r.t. complexity, patch v7 creates FilterUtil class for utility methods and 
adds new unit test. Apart from those, the patch is small.

bq. all implementors of Filter need to do the same.
There're many custom Filters in use today. It is hard to know which filters 
override filterRow() but don't override hasFilterRow() - without autodetection 
proposed in this JIRA.
Hence the following code from HRegion cannot be safely removed without 
autodetection of hasFilterRow() :
{code}
      return filter != null && (!filter.hasFilterRow())
          && filter.filterRow();
{code}
One limitation is that we cannot optimize FilterList#filterRow() through short 
circuit when FilterList#hasFilterRow() turns false. HBASE-11093 is blocked due 
to this reason.

> Automate detection of presence of Filter#filterRow()
> ----------------------------------------------------
>
>                 Key: HBASE-10965
>                 URL: https://issues.apache.org/jira/browse/HBASE-10965
>             Project: HBase
>          Issue Type: Task
>          Components: Filters
>            Reporter: Ted Yu
>            Assignee: Ted Yu
>         Attachments: 10965-v1.txt, 10965-v2.txt, 10965-v3.txt, 10965-v4.txt, 
> 10965-v6.txt, 10965-v7.txt
>
>
> There is potential inconsistency between the return value of 
> Filter#hasFilterRow() and presence of Filter#filterRow().
> Filters may override Filter#filterRow() while leaving return value of 
> Filter#hasFilterRow() being false (inherited from FilterBase).
> Downside to purely depending on hasFilterRow() telling us whether custom 
> filter overrides filterRow(List) or filterRow() is that the check below may 
> be rendered ineffective:
> {code}
>           if (nextKv == KV_LIMIT) {
>             if (this.filter != null && filter.hasFilterRow()) {
>               throw new IncompatibleFilterException(
>                 "Filter whose hasFilterRow() returns true is incompatible 
> with scan with limit!");
>             }
> {code}
> When user forgets to override hasFilterRow(), the above check becomes not 
> useful.
> Another limitation is that we cannot optimize FilterList#filterRow() through 
> short circuit when FilterList#hasFilterRow() turns false.
> See 
> https://issues.apache.org/jira/browse/HBASE-11093?focusedCommentId=13985149&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13985149
> This JIRA aims to remove the inconsistency by automatically detecting the 
> presence of overridden Filter#filterRow(). For FilterBase-derived classes, if 
> filterRow() is implemented and not inherited from FilterBase, it is 
> equivalent to having hasFilterRow() return true.
> With precise detection of presence of Filter#filterRow(), the following code 
> from HRegion is no longer needed while backward compatibility is kept.
> {code}
>       return filter != null && (!filter.hasFilterRow())
>           && filter.filterRow();
> {code}



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to