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 createdF = blockHeaderDAO.create(blockHeader)
|
||||||
|
|
||||||
val headerDbsF = createdF.flatMap(_ =>
|
val headerDbsF = createdF.flatMap(_ =>
|
||||||
blockHeaderDAO.findAllBeforeTime(UInt32(TimeUtil.currentEpochSecond)))
|
blockHeaderDAO.findClosestBeforeTime(
|
||||||
|
UInt32(TimeUtil.currentEpochSecond)))
|
||||||
|
|
||||||
headerDbsF.map { headerDbs =>
|
headerDbsF.map { headerDbOpt =>
|
||||||
assert(headerDbs.size == 2)
|
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
|
table.filter(header => header.height >= from && header.height <= to).result
|
||||||
}
|
}
|
||||||
|
|
||||||
def findAllBeforeTime(time: UInt32): Future[Vector[BlockHeaderDb]] = {
|
def findClosestBeforeTime(time: UInt32): Future[Option[BlockHeaderDb]] = {
|
||||||
val query = table.filter(_.time < time)
|
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] = {
|
def findClosestToTime(time: UInt32): Future[BlockHeaderDb] = {
|
||||||
|
@ -223,7 +227,12 @@ case class BlockHeaderDAO()(implicit
|
||||||
|
|
||||||
opt.flatMap {
|
opt.flatMap {
|
||||||
case None =>
|
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) =>
|
case Some(header) =>
|
||||||
Future.successful(header)
|
Future.successful(header)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue