mirror of
https://github.com/bitcoin-s/bitcoin-s.git
synced 2025-03-03 18:47:38 +01:00
Optimize findClosestToTime (#1959)
* Optimize findClosestToTime * Fix Test * Rename function, change execption type
This commit is contained in:
parent
ee85f463f5
commit
4c0437e352
2 changed files with 18 additions and 7 deletions
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue