Optimize findClosestToTime (#1959)

* Optimize findClosestToTime

* Fix Test

* Rename function, change execption type
This commit is contained in:
Ben Carman 2020-09-08 09:23:41 -05:00 committed by GitHub
parent ee85f463f5
commit 4c0437e352
2 changed files with 18 additions and 7 deletions

View file

@ -115,10 +115,12 @@ class BlockHeaderDAOTest extends ChainDbUnitTest {
val createdF = blockHeaderDAO.create(blockHeader)
val headerDbsF = createdF.flatMap(_ =>
blockHeaderDAO.findAllBeforeTime(UInt32(TimeUtil.currentEpochSecond)))
blockHeaderDAO.findClosestBeforeTime(
UInt32(TimeUtil.currentEpochSecond)))
headerDbsF.map { headerDbs =>
assert(headerDbs.size == 2)
headerDbsF.map { headerDbOpt =>
assert(headerDbOpt.isDefined)
assert(headerDbOpt.get.hashBE == blockHeader.hashBE)
}
}

View file

@ -207,10 +207,14 @@ case class BlockHeaderDAO()(implicit
table.filter(header => header.height >= from && header.height <= to).result
}
def findAllBeforeTime(time: UInt32): Future[Vector[BlockHeaderDb]] = {
val query = table.filter(_.time < time)
def findClosestBeforeTime(time: UInt32): Future[Option[BlockHeaderDb]] = {
val beforeTime = table.filter(_.time < time)
database.run(query.result).map(_.toVector)
val maxTime = beforeTime.map(_.time).max
val query = table.filter(_.time === maxTime)
safeDatabase.run(query.result).map(_.headOption)
}
def findClosestToTime(time: UInt32): Future[BlockHeaderDb] = {
@ -223,7 +227,12 @@ case class BlockHeaderDAO()(implicit
opt.flatMap {
case None =>
findAllBeforeTime(time).map(_.maxBy(_.time))
findClosestBeforeTime(time).flatMap {
case None =>
Future.failed(new RuntimeException("No block headers in database."))
case Some(header) =>
Future.successful(header)
}
case Some(header) =>
Future.successful(header)
}