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 <[email protected]> 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
> [email protected]
> http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com
>
_______________________________________________
riak-users mailing list
[email protected]
http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com