Using $bucket index in java client

Vassil Kolarov vasco at vas.io
Tue Dec 2 03:22:51 EST 2014


I just changed the Init() constructor in BinIndexQuery to:

super(namespace, indexName, start, end);

and in the second constructor:
super(namespace, indexName, match);

Then in the SecondaryIndexQuery:

        public Init(Namespace namespace, String indexName, S match)
        {
            this.namespace = namespace;

            if(indexName.compareTo("$bucket")!=0){
                this.indexName = indexName + Type._BIN;
            }else{
                this.indexName = indexName;
            }
            this.match = match;
        }

in both constructors - Init(Namespace namespace, String indexName, S match)
and
 Init(Namespace namespace, String indexName, S start, S end)

Works like a charm.

Best regards,
Vasco

On Tue, Dec 2, 2014 at 5:50 AM, niedomnie <niedomnie at gmail.com> wrote:

> there is a bug in BinIndexQuery - I've overriden some classes and now it is
> working (with orginal sources of client). Use MyBinIndexQuery instead of
> BinIndexQuery. Problem is that _BIN in always apppended to name of index.
>
> import com.basho.riak.client.api.commands.CoreFutureAdapter
> import com.basho.riak.client.api.commands.indexes.BinIndexQuery
> import com.basho.riak.client.api.commands.indexes.SecondaryIndexQuery
> import com.basho.riak.client.core.RiakCluster
> import com.basho.riak.client.core.RiakFuture
> import com.basho.riak.client.core.operations.SecondaryIndexQueryOperation
> import com.basho.riak.client.core.query.Location
> import com.basho.riak.client.core.query.Namespace
> import com.basho.riak.client.core.util.BinaryValue
>
> import java.nio.charset.Charset
>
> abstract class MyInit<S, T extends MyInit<S,T>> extends
> SecondaryIndexQuery.Init<S,T>
> {
>     Charset charset = Charset.defaultCharset();
>
>     public MyInit(Namespace namespace, String indexName, S start, S end)
>     {
> //        super(namespace, indexName + SecondaryIndexQuery.Type._BIN,
> start,
> end);
>         super(namespace, indexName, start, end);
>     }
>
>     public MyInit(Namespace namespace, String indexName, S match)
>     {
> //        super(namespace, indexName + SecondaryIndexQuery.Type._BIN,
> match);
>         super(namespace, indexName, match);
>     }
>
>     T withCharacterSet(Charset charset)
>     {
>         this.charset = charset;
>         return self();
>     }
> }
>
> public class MyBuilder extends MyInit<String, MyBuilder>
> {
>     public MyBuilder(Namespace namespace, String indexName, String start,
> String end)
>     {
>         super(namespace, indexName, start, end);
>     }
>
>     public MyBuilder(Namespace namespace, String indexName, String match)
>     {
>         super(namespace, indexName, match);
>     }
>
>     @Override
>     protected MyBuilder self()
>     {
>         return this;
>     }
>
>     public MyBinIndexQuery build()
>     {
>         return new MyBinIndexQuery(this);
>     }
> }
>
> public class MyBinIndexQuery extends SecondaryIndexQuery<String,
> BinIndexQuery.Response, BinIndexQuery>
> {
>     private final Charset charset;
>     private final SecondaryIndexQuery.IndexConverter<String> converter;
>
>     public MyBinIndexQuery(MyInit<String,?> builder)
>     {
>         super(builder);
>         this.charset = builder.charset;
>         this.converter = new  SecondaryIndexQuery.IndexConverter<String>()
> {
>             @Override
>             public String convert(BinaryValue input)
>             {
>                 return input.toString(charset);
>             }
>
>             @Override
>             public BinaryValue convert(String input)
>             {
>                 return BinaryValue.create(input, charset);
>             }
>         };
>     }
>
>     @Override
>     protected SecondaryIndexQuery.IndexConverter<String> getConverter()
>     {
>         return converter;
>     }
>
>     @Override
>     protected RiakFuture<MyResponse, MyBinIndexQuery>
> executeAsync(RiakCluster cluster)
>     {
>         RiakFuture<SecondaryIndexQueryOperation.Response,
> SecondaryIndexQueryOperation.Query> coreFuture =
>                 executeCoreAsync(cluster);
>
>         BinQueryFuture future = new BinQueryFuture(coreFuture);
>         coreFuture.addListener(future);
>         return future;
>     }
>
>     protected final class BinQueryFuture extends
> CoreFutureAdapter<MyResponse, MyBinIndexQuery,
> SecondaryIndexQueryOperation.Response, SecondaryIndexQueryOperation.Query>
> {
>         public
> BinQueryFuture(RiakFuture<SecondaryIndexQueryOperation.Response,
> SecondaryIndexQueryOperation.Query> coreFuture)
>         {
>             super(coreFuture);
>         }
>
>         @Override
>         protected MyResponse
> convertResponse(SecondaryIndexQueryOperation.Response coreResponse)
>         {
>             return new MyResponse(namespace, coreResponse, converter);
>         }
>
>         @Override
>         protected MyBinIndexQuery
> convertQueryInfo(SecondaryIndexQueryOperation.Query coreQueryInfo)
>         {
>             return MyBinIndexQuery.this;
>         }
>     }
>
>     protected static abstract class Init<S, T extends Init<S,T>> extends
> SecondaryIndexQuery.Init<S,T>
>     {
>         private Charset charset = Charset.defaultCharset();
>
>         public Init(Namespace namespace, String indexName, S start, S end)
>         {
>             super(namespace, indexName + Type._BIN, start, end);
>         }
>
>         public Init(Namespace namespace, String indexName, S match)
>         {
>             super(namespace, indexName + Type._BIN, match);
>         }
>
>         T withCharacterSet(Charset charset)
>         {
>             this.charset = charset;
>             return self();
>         }
>
>     }
>
>     /**
>      * Builder used to construct a BinIndexQuery.
>      */
>     public static class Builder extends Init<String, Builder>
>     {
>
>         /**
>          * Construct a Builder for a BinIndexQuery with a range.
>          * <p>
>          * Note that your index name should not include the Riak {@literal
> _int} or
>          * {@literal _bin} extension.
>          * <p>
>          * @param namespace The namespace in Riak to query.
>          * @param indexName The index name in Riak to query.
>          * @param start The start of the 2i range.
>          * @param end The end of the 2i range.
>          */
>         public Builder(Namespace namespace, String indexName, String start,
> String end)
>         {
>             super(namespace, indexName, start, end);
>         }
>
>         /**
>          * Construct a Builder for a BinIndexQuery with a single 2i key.
>          * <p>
>          * Note that your index name should not include the Riak {@literal
> _int} or
>          * {@literal _bin} extension.
>          * <p>
>          * @param namespace The namespace in Riak to query.
>          * @param indexName The name of the index in Riak.
>          * @param match the 2i key.
>          */
>         public Builder(Namespace namespace, String indexName, String match)
>         {
>             super(namespace, indexName, match);
>         }
>
>         @Override
>         protected Builder self()
>         {
>             return this;
>         }
>
>         /**
>          * Construct the query.
>          * @return a new BinIndexQuery
>          */
>         public MyBinIndexQuery build()
>         {
>             return new MyBinIndexQuery(this);
>         }
>
>     }
>
>     public static class MyResponse extends
> SecondaryIndexQuery.Response<String>
>     {
>         final SecondaryIndexQueryOperation.Response coreResponseCopy;
>         final SecondaryIndexQuery.IndexConverter<String> converterCopy;
>
>         protected MyResponse(Namespace queryLocation,
> SecondaryIndexQueryOperation.Response coreResponse,
> SecondaryIndexQuery.IndexConverter<String> converter)
>         {
>             super(queryLocation, coreResponse, converter);
>             this.coreResponseCopy = coreResponse
>             this.converterCopy = converter
>         }
>
>         @Override
>         public List<MyEntry> getEntries()
>         {
>             List<MyEntry> convertedList = new ArrayList<MyEntry>();
>             for (SecondaryIndexQueryOperation.Response.Entry e :
> coreResponseCopy.getEntryList())
>             {
>                 Location loc = getLocationFromCoreEntry(e);
>                 MyEntry ce = new MyEntry(loc, e.getIndexKey(),
> converterCopy);
>                 convertedList.add(ce);
>             }
>             return convertedList;
>         }
>
>         public class MyEntry extends
> SecondaryIndexQuery.Response.Entry<String>
>         {
>             protected MyEntry(Location riakObjectLocation, BinaryValue
> indexKey, SecondaryIndexQuery.IndexConverter<String> converter)
>             {
>                 super(riakObjectLocation, indexKey, converter);
>             }
>
>         }
>     }
> }
>
>
>
> --
> View this message in context:
> http://riak-users.197444.n3.nabble.com/Using-bucket-index-in-java-client-tp4032125p4032199.html
> Sent from the Riak Users mailing list archive at Nabble.com.
>
> _______________________________________________
> riak-users mailing list
> riak-users at lists.basho.com
> http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.basho.com/pipermail/riak-users_lists.basho.com/attachments/20141202/aafc946e/attachment.html>


More information about the riak-users mailing list