public CompletableFuture<List<DeviceCommand>> find(Collection<String> deviceIds, Collection<String> names,
Date timestampSt, Date timestampEnd, String status, String sortField, String sortOrder, Integer take,
Integer skip) {
CommandSearchRequest searchRequest = new CommandSearchRequest();
searchRequest.setDeviceIds(Sets.newHashSet(deviceIds));
if (names != null) {
searchRequest.setNames(Sets.newHashSet(names));
}
searchRequest.setTimestampStart(timestampSt);
searchRequest.setTimestampEnd(timestampEnd);
searchRequest.setStatus(status);
searchRequest.setSortField(sortField);
searchRequest.setSortOrder(sortOrder);
searchRequest.setTake(take);
searchRequest.setSkip(skip);
CompletableFuture<Response> future = new CompletableFuture<>();
rpcClient.call(Request.newBuilder()
.withBody(searchRequest)
.withPartitionKey(searchRequest.getDeviceId())
.build(), new ResponseConsumer(future));
return future.thenApply(v -> v.getBody().cast(CommandSearchResponse.class).getCommands());
}