Sorry for not being clear enough.

Maybe i misunderstand your suggestion, but what I've done in implement my own 
filter, wrapping a FilterList

public class NotFilterList extends Filter {
    private FilterList filter;

    public NotFilterList(final List<Filter> rowFilters) {
        this.filter = new FilterList(rowFilters);
    }

    public void reset() throws IOException {
        this.filter.reset();
    }

    public boolean filterRowKey(byte[] rowKey, int offset, int length) throws 
IOException {
        return this.filter.filterRowKey(rowKey, offset, length);
    }

    public boolean filterAllRemaining() throws IOException {
        return this.filter.filterAllRemaining();
    }

    public ReturnCode filterKeyValue(Cell v) throws IOException {
        ReturnCode code = this.filter.filterKeyValue(v);

        if (code == ReturnCode.INCLUDE)
            code = ReturnCode.SKIP;
        else if (code == ReturnCode.INCLUDE_AND_NEXT_COL)
            code = ReturnCode.NEXT_COL;
        else if (code == ReturnCode.NEXT_ROW)
            code = ReturnCode.INCLUDE_AND_NEXT_COL;
        else if (code == ReturnCode.SKIP) {
            code = ReturnCode.INCLUDE;
        }

        return code;
    }

    public Cell transformCell(Cell v) throws IOException {
        return this.filter.transformCell(v);
    }

    public KeyValue transform(KeyValue currentKV) throws IOException {
        return this.filter.transform(currentKV);
    }

    public void filterRowCells(List<Cell> kvs) throws IOException {
        this.filter.filterRowCells(kvs);
    }

    public boolean hasFilterRow() {
        return this.filter.hasFilterRow();
    }

    public boolean filterRow() throws IOException {
        return this.filter.filterRow();
    }

    public KeyValue getNextKeyHint(KeyValue currentKV) throws IOException {
        return this.filter.getNextKeyHint(currentKV);
    }

    public Cell getNextCellHint(Cell currentKV) throws IOException {
        return this.filter.getNextCellHint(currentKV);
    }

    public boolean isFamilyEssential(byte[] name) throws IOException {
        return this.filter.isFamilyEssential(name);
    }

    public byte[] toByteArray() throws IOException {
        return this.filter.toByteArray();
    }

    public static NotFilterList parseFrom(final byte [] pbBytes) throws 
DeserializationException {
        FilterList filterList = FilterList.parseFrom(pbBytes);
        return new NotFilterList(filterList.getFilters());
    }

    boolean areSerializedFieldsEqual(Filter other) {
        return this.filter.areSerializedFieldsEqual(other);
    }

}


What I mean is that  filterKeyValue in the way i have it now, return the right 
results but only the fields that were not originally skipped.


So for example, if i have two rows each one with two fields

Row 1

Name: Bill

Surname: Gates


Row 2

Name: Steve

Surname: Jobs


And I want to query for  Rows that doesn't have Name 'Bill'

NOT (Name='Bill')


What  I get as result from Hbase with this NotFilter is

Row 2

Surname: Jobs


I suppose it's related to the cell "Name: Steve" skipped in the first place 
(before reversing the ReturnCode).


Best,



________________________________
De: Ted Yu <yuzhih...@gmail.com>
Enviado: lunes, 02 de enero de 2017 06:31 p.m.
Para: user@hbase.apache.org
Asunto: Re: Is it possible to implement a NOT filter in Hbase?

bq. the cell/value that was originally skip is not return

Can you be a bit more specific (with a concrete example) : the skipped cell
would not be returned (as indicated by the ReturnCode).

Thanks

On Mon, Jan 2, 2017 at 1:06 PM, Carl M <soloning...@hotmail.com> wrote:

> Hi Ted,
>
>
> I tried your suggestion, unfortunately it doesn't work as expected. I
> don't fully understand FilterList, but if a cell value was skip and I
> reverse the ReturnCode, i get the right row but the cell/value that was
> originally skip is not return.
>
> I also tried reversing only filterRow() method of FilterList, but I got
> the same behaviour (the original cell/value missing).
>
>
> Best,
>
>
> ________________________________
> De: Ted Yu <yuzhih...@gmail.com>
> Enviado: viernes, 30 de diciembre de 2016 12:56 p.m.
> Para: user@hbase.apache.org
> Asunto: Re: Is it possible to implement a NOT filter in Hbase?
>
> I think the ReturnCode opposite INCLUDE_AND_NEXT_COL is NEXT_COL : you're
> not interested in any version of the current Cell.
>
> Cheers
>
> On Fri, Dec 30, 2016 at 4:53 AM, Carl M <soloning...@hotmail.com> wrote:
>
> > Thanks Ted! Great idea replacing the value in filterKeyValue. Although
> I'm
> > not quite sure looking at FilterList code if only INCLUDE/SKIP should be
> > replaced, and which should be the correct replacement for
> > INCLUDE_AND_NEXT_COL. What do you think? If not maybe i should try to
> > implement DeMorgan's law but I think it would be harder.
> >
> >
> > Best,
> >
> > ________________________________
> > De: Ted Yu <yuzhih...@gmail.com>
> > Enviado: jueves, 29 de diciembre de 2016 06:10 p.m.
> > Para: user@hbase.apache.org
> > Asunto: Re: Is it possible to implement a NOT filter in Hbase?
> >
> > You can try negating the ReturnCode from filterKeyValue() (at the root of
> > FilterList):
> >
> >   abstract public ReturnCode filterKeyValue(final Cell v) throws
> > IOException;
> >
> > INCLUDE -> SKIP
> >
> > SKIP -> INCLUDE
> >
> > Alternatively, you can use De Morgan's law to transfer the condition:
> >
> >  NOT (a = '123' AND b = '456') becomes
> >
> >  (NOT a = '123') OR (b = '456')
> >
> > On Thu, Dec 29, 2016 at 12:56 PM, Carl M <soloning...@hotmail.com>
> wrote:
> >
> > > Hi guys
> > >
> > >
> > > I'm trying to implement some kind of NOT filter in Hbase, but don't
> know
> > > if possible, I'm playing with FilterIfMissing and FilterList.Operator
> but
> > > without luck.
> > >
> > >
> > > I know how to return rows not having a specific column, but I mean
> > > something like returning rows NOT fullfilling a condition, where
> > condition
> > > could be not only a SingleColumnValueFilter but a combined condition
> with
> > > FilterList. In SQL would be something like this for example
> > >
> > >
> > > SELECT * FROM table WHERE NOT (a = '123' AND b = '456');
> > >
> > >
> > > Thanks in advance,
> > >
> >
>

Reply via email to