@Override
 public <D extends Document<?>> D remove(
     D document, PersistTo persistTo, ReplicateTo replicateTo, long timeout, TimeUnit timeUnit) {
   return Blocking.blockForSingle(
       asyncBucket.remove(document, persistTo, replicateTo).singleOrDefault(null),
       timeout,
       timeUnit);
 }
 @Override
 public <D extends Document<?>> D remove(
     String id,
     PersistTo persistTo,
     ReplicateTo replicateTo,
     Class<D> target,
     long timeout,
     TimeUnit timeUnit) {
   return Blocking.blockForSingle(
       asyncBucket.remove(id, persistTo, replicateTo, target).singleOrDefault(null),
       timeout,
       timeUnit);
 }
  @Override
  public QueryResult query(Query query, final long timeout, final TimeUnit timeUnit) {
    return Blocking.blockForSingle(
        asyncBucket
            .query(query)
            .flatMap(
                new Func1<AsyncQueryResult, Observable<QueryResult>>() {
                  @Override
                  public Observable<QueryResult> call(AsyncQueryResult aqr) {
                    final boolean parseSuccess = aqr.parseSuccess();
                    final String requestId = aqr.requestId();
                    final String clientContextId = aqr.clientContextId();

                    return Observable.zip(
                        aqr.rows().toList(),
                        aqr.signature().singleOrDefault(JsonObject.empty()),
                        aqr.info().singleOrDefault(QueryMetrics.EMPTY_METRICS),
                        aqr.errors().toList(),
                        aqr.finalSuccess().singleOrDefault(Boolean.FALSE),
                        new Func5<
                            List<AsyncQueryRow>,
                            Object,
                            QueryMetrics,
                            List<JsonObject>,
                            Boolean,
                            QueryResult>() {
                          @Override
                          public QueryResult call(
                              List<AsyncQueryRow> rows,
                              Object signature,
                              QueryMetrics info,
                              List<JsonObject> errors,
                              Boolean finalSuccess) {
                            return new DefaultQueryResult(
                                rows,
                                signature,
                                info,
                                errors,
                                finalSuccess,
                                parseSuccess,
                                requestId,
                                clientContextId);
                          }
                        });
                  }
                })
            .single(),
        timeout,
        timeUnit);
  }
 @Override
 public BucketManager bucketManager() {
   return asyncBucket
       .bucketManager()
       .map(
           new Func1<AsyncBucketManager, BucketManager>() {
             @Override
             public BucketManager call(AsyncBucketManager asyncBucketManager) {
               return DefaultBucketManager.create(environment, name, password, core);
             }
           })
       .toBlocking()
       .single();
 }
 @Override
 public SpatialViewResult query(SpatialViewQuery query, long timeout, TimeUnit timeUnit) {
   return Blocking.blockForSingle(
       asyncBucket
           .query(query)
           .map(
               new Func1<AsyncSpatialViewResult, SpatialViewResult>() {
                 @Override
                 public SpatialViewResult call(AsyncSpatialViewResult asyncSpatialViewResult) {
                   return new DefaultSpatialViewResult(
                       environment,
                       CouchbaseBucket.this,
                       asyncSpatialViewResult.rows(),
                       asyncSpatialViewResult.success(),
                       asyncSpatialViewResult.error(),
                       asyncSpatialViewResult.debug());
                 }
               })
           .single(),
       timeout,
       timeUnit);
 }
 @Override
 public Boolean unlock(String id, long cas, long timeout, TimeUnit timeUnit) {
   return Blocking.blockForSingle(asyncBucket.unlock(id, cas).single(), timeout, timeUnit);
 }
 @Override
 public QueryPlan prepare(Statement statement, long timeout, TimeUnit timeUnit) {
   return Blocking.blockForSingle(asyncBucket.prepare(statement).single(), timeout, timeUnit);
 }
 @Override
 public List<JsonDocument> getFromReplica(
     String id, ReplicaMode type, long timeout, TimeUnit timeUnit) {
   return Blocking.blockForSingle(
       asyncBucket.getFromReplica(id, type).toList(), timeout, timeUnit);
 }
 @Override
 public <D extends Document<?>> List<D> getFromReplica(
     String id, ReplicaMode type, Class<D> target, long timeout, TimeUnit timeUnit) {
   return Blocking.blockForSingle(
       asyncBucket.getFromReplica(id, type, target).toList(), timeout, timeUnit);
 }
 @Override
 public JsonLongDocument counter(
     String id, long delta, long initial, int expiry, long timeout, TimeUnit timeUnit) {
   return Blocking.blockForSingle(
       asyncBucket.counter(id, delta, initial, expiry).single(), timeout, timeUnit);
 }
 @Override
 public <D extends Document<?>> D remove(D document, long timeout, TimeUnit timeUnit) {
   return Blocking.blockForSingle(
       asyncBucket.remove(document).singleOrDefault(null), timeout, timeUnit);
 }
 @Override
 public <D extends Document<?>> D replace(
     D document, ReplicateTo replicateTo, long timeout, TimeUnit timeUnit) {
   return Blocking.blockForSingle(
       asyncBucket.replace(document, replicateTo).single(), timeout, timeUnit);
 }
 @Override
 public <D extends Document<?>> D upsert(
     D document, PersistTo persistTo, long timeout, TimeUnit timeUnit) {
   return Blocking.blockForSingle(
       asyncBucket.upsert(document, persistTo).single(), timeout, timeUnit);
 }
 @Override
 public <D extends Document<?>> D getAndTouch(
     String id, int expiry, Class<D> target, long timeout, TimeUnit timeUnit) {
   return Blocking.blockForSingle(
       asyncBucket.getAndTouch(id, expiry, target).singleOrDefault(null), timeout, timeUnit);
 }
 @Override
 public JsonDocument getAndTouch(String id, int expiry, long timeout, TimeUnit timeUnit) {
   return Blocking.blockForSingle(
       asyncBucket.getAndTouch(id, expiry).singleOrDefault(null), timeout, timeUnit);
 }
 @Override
 public <D extends Document<?>> D getAndLock(
     D document, int lockTime, long timeout, TimeUnit timeUnit) {
   return Blocking.blockForSingle(
       asyncBucket.getAndLock(document, lockTime).singleOrDefault(null), timeout, timeUnit);
 }
 @Override
 public JsonDocument getAndLock(String id, int lockTime, long timeout, TimeUnit timeUnit) {
   return Blocking.blockForSingle(
       asyncBucket.getAndLock(id, lockTime).singleOrDefault(null), timeout, timeUnit);
 }
 @Override
 public Boolean touch(String id, int expiry, long timeout, TimeUnit timeUnit) {
   return Blocking.blockForSingle(asyncBucket.touch(id, expiry).single(), timeout, timeUnit);
 }
 @Override
 public <D extends Document<?>> Boolean touch(D document, long timeout, TimeUnit timeUnit) {
   return Blocking.blockForSingle(asyncBucket.touch(document).single(), timeout, timeUnit);
 }
 @Override
 public <D extends Document<?>> D prepend(D document, long timeout, TimeUnit timeUnit) {
   return Blocking.blockForSingle(asyncBucket.prepend(document).single(), timeout, timeUnit);
 }
 @Override
 public String name() {
   return asyncBucket.name();
 }
 @Override
 public <D extends Document<?>> List<D> getFromReplica(
     D document, ReplicaMode type, long timeout, TimeUnit timeUnit) {
   return Blocking.blockForSingle(
       asyncBucket.getFromReplica(document, type).toList(), timeout, timeUnit);
 }
 @Override
 public Boolean close(long timeout, TimeUnit timeUnit) {
   return Blocking.blockForSingle(asyncBucket.close().single(), timeout, timeUnit);
 }
 @Override
 public JsonDocument remove(String id, ReplicateTo replicateTo, long timeout, TimeUnit timeUnit) {
   return Blocking.blockForSingle(
       asyncBucket.remove(id, replicateTo).singleOrDefault(null), timeout, timeUnit);
 }
 @Override
 public ClusterFacade core() {
   return asyncBucket.core().toBlocking().single();
 }
 @Override
 public boolean exists(String id, long timeout, TimeUnit timeUnit) {
   return Blocking.blockForSingle(asyncBucket.exists(id), timeout, timeUnit);
 }