Jonathan, I didn't get any response from you, so I tried to do it my self.
I did some changes to SingleColumnValueFilter class and now it's working
like I was expected.
Actualy it was simple: if the filter noesn't find inside a row a
Column-Value match than the FilterRow method should return true.
I posted this here maybe it will help others.

On Fri, Sep 4, 2009 at 9:12 AM, Adrian Olariu <[email protected]>wrote:

> Exactly, in both cases I don't want any row emitted.
> Thanks.
>
>
> On Fri, Sep 4, 2009 at 3:10 AM, Jonathan Gray <[email protected]> wrote:
>
>> And what you want to happen is, if either of the conditions fail, that the
>> entire row is not emitted?  What do you want to happen if either of the
>> columns don't exist at all?
>>
>> Let me play around with some unit tests tomorrow and I will report back.
>>
>> Thanks.
>>
>> JG
>>
>> On Thu, September 3, 2009 11:56 am, Adrian Olariu wrote:
>> > The behavior described in the first pace was whit
>> > FilterList.MUST_PASS_ALL.
>> > I did copy/paste without checking twice, sorry about that.
>> >
>> >
>> > Found row: keyvalues={135/F1:c2/1251994608272/Put/vlen=1}
>> > Found row: keyvalues={141/F1:c1/1251994608289/Put/vlen=1}
>> > Found row: keyvalues={143/F1:c1/1251994608293/Put/vlen=1,
>> > 143/F1:c2/1251994608293/Put/vlen=1}
>> > Found row: keyvalues={144/F1:c1/1251994608295/Put/vlen=1}
>> > Found row: keyvalues={152/F1:c2/1251994608314/Put/vlen=1}
>> > this results I'm getting when I'm using must MUST_PASS_ALL.
>> >
>> >
>> > On Thu, Sep 3, 2009 at 9:07 PM, Jonathan Gray <[email protected]>
>> wrote:
>> >
>> >
>> >> You are using FilterList.MUST_PASS_ONE... That is an OR condition.
>> >>
>> >>
>> >> You want FilterList.MUST_PASS_ALL if you want it to require both
>> >> conditions to be met.
>> >>
>> >> If you want to include _other_ columns from that family if _these_ two
>> >> conditions are met (but the row skipped if the two conditions does not
>> >> match), then wrap the FilterList w/ a SkipFilter and use addFamily
>> >> rather than addColumns.  If you just want the row and the two columns
>> >> you are checking for, use addColumn calls and don't use the SkipFilter.
>> >>
>> >> Hope that helps... and hope it works as you expect :)
>> >>
>> >>
>> >> Is there somewhere we could add better documentation?  FilterList
>> >> should explain AND/OR operations.
>> >>
>> >> JG
>> >>
>> >>
>> >> On Thu, September 3, 2009 10:46 am, Adrian Olariu wrote:
>> >>
>> >>> Thanks for quick replay, I want only the rows that matches BOTH
>> >>> conditions. Detailed: all the rows that have this two columns and the
>> >>> values from this two columns must match values specified in code.
>> >>>
>> >>> On Thu, Sep 3, 2009 at 8:37 PM, Jonathan Gray <[email protected]>
>> >>> wrote:
>> >>>
>> >>>
>> >>>
>> >>>> That filter just underwent a rewrite this week, there is certainly
>> >>>> possibility for a bug... However it does seem you are seeing
>> >>>> expected behavior.
>> >>>>
>> >>>> What exactly are you trying to do?  You want to return the entire
>> >>>> row if it makes the value (get all columns in the family if one
>> >>>> column matches), if it matches BOTH, if it matches EITHER... I don't
>> >>>> follow exactly what you want to have as the end result returned to
>> >>>> the client.
>> >>>>
>> >>>> Could you define more specifically what you want your result to be?
>> >>>>
>> >>>>
>> >>>>
>> >>>> JG
>> >>>>
>> >>>>
>> >>>>
>> >>>> On Thu, September 3, 2009 10:08 am, Adrian Olariu wrote:
>> >>>>
>> >>>>
>> >>>>> Hi,
>> >>>>> I'm trying to use some filters and the results are not like
>> >>>>> expected. Maybe there it's a bug. I'm using HBase 0.20.0 RC3
>> >>>>> I'm trying to filter rows using SingleColumnValueFilter like this:
>> >>>>>  Scan s = new Scan();
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>> Filter filter1 = new SingleColumnValueFilter(Bytes.toBytes("F1"),
>> >>>>>  Bytes.toBytes("c1"), CompareOp.EQUAL, Bytes.toBytes("1"));
>> >>>>> Filter filter2 = new SingleColumnValueFilter(Bytes.toBytes("F1"),
>> >>>>> Bytes.toBytes("c2"), CompareOp.EQUAL, Bytes.toBytes("1"));
>> >>>>> List<Filter> rowFilters = new ArrayList<Filter>();
>> >>>>> rowFilters.add(filter1);rowFilters.add(filter2); Filter filter =
>> >>>>> new FilterList(FilterList.Operator.MUST_PASS_ONE,
>> >>>>> rowFilters);
>> >>>>>
>> >>>>> s.addColumn(Bytes.toBytes("F1"), Bytes.toBytes("c1"));
>> >>>>> s.addColumn(Bytes.toBytes("F1"), Bytes.toBytes("c2"));
>> >>>>> s.setFilter(filter);
>> >>>>>
>> >>>>> long startTime = System.currentTimeMillis(); ResultScanner
>> >>>>> scanner = table.getScanner(s);
>> >>>>>
>> >>>>> This filter returns all rows the contains F1:c1 whit val "1" or
>> >>>>> contains F1:c2 whit val "1" or contains both. If I replace
>> >>>>> "addColumn" methods whit s.addFamily("F1"); the scanner
>> >>>>> returns all rows from the table whit no filtering eaven if the
>> >>>>> F1:c1/c2
>> >>>>> columns doesn't exist
>> >>>>>
>> >>>>> How can I get only the rows that matches all the conditions?
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>> Thank you,
>> >>>>> Olariu Adrian.
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>
>> >>>>
>> >>>
>> >>
>> >>
>> >
>>
>>
>

Reply via email to