public RiakResponse<RiakDocument[]> Find(RiakFindRequest request)
        {
            var connection = _connectionManager.GetNextConnection();
            var threads = request.GetInternalRequests()
                                 .Select(r => _threadPool.QueueWorkItem(() => {
                                     connection.WriteWith(r, RequestMethod.Find);
                                     return connection.Read<FindResponse>();
                                 }))
                                 .ToArray();
            SmartThreadPool.WaitAll(threads);

            var responses = threads.Select(t => t.Result).ToArray();
            var badResponses = responses.Where(r => r.ResponseCode == RiakResponseCode.Failed);
            return badResponses.Count() == 0
                ? RiakResponse<RiakDocument[]>.WithoutErrors(responses.Select(x => x.Result.Content.First().ToDocument()).ToArray())
                : RiakResponse<RiakDocument[]>.WithWarning(badResponses.Select(x => x.Messages.LastOrDefault()).ToArray(),
                                                           responses.Select(x => {
                                                               var content = x.Result.Content.FirstOrDefault();
                                                               return content == null 
                                                                   ? null 
                                                                   : x.Result.Content.FirstOrDefault().ToDocument();
                                                           }).ToArray());
        }
 public RiakResponse<RiakDocument[]> Find(Action<RiakFindRequest> predicate)
 {
     var request = new RiakFindRequest();
     predicate(request);
     return Find(request);
 }