in src/main/scala/datastore/ElasticsearchRepo.scala [97:125]
private def handleResponseMultiple[D:io.circe.Decoder](response:Response[SearchResponse], pageSize:Int)(mapper:(Json)=>Option[D])(implicit ct:ClassTag[D]):Future[Edge[D]] = {
if(response.isSuccess) {
val allResults = response
.result
.hits
.hits
.map(RawResult.apply)
val failures = allResults.collect({case Left(err)=>err})
if(failures.nonEmpty) {
logger.error(s"${failures.length} entries failed to parse:")
failures.foreach(err=>logger.error(s"\t${err.getMessage()}"))
Future.failed(new RuntimeException(s"${failures.length} entries failed to parse:"))
} else {
val success = allResults.collect({case Right(content)=>content})
Future(
Edge(
response.result.hits.total.value,
success.lastOption.flatMap(rec=>Edge.cursorValue(rec.sort)),
success.length==pageSize, //FIXME - is there a better a way of determining if there is likely to be more content?
success.map(_.fulljson).map(mapper).collect({case Some(d)=>d})
)
)
}
} else {
Future.failed(response.error.asException)
}
}