From e1a96c2c6173736dd81a9248357344527e4e5e85 Mon Sep 17 00:00:00 2001 From: Alexis Hernandez Date: Tue, 25 Dec 2018 17:06:00 -0700 Subject: [PATCH] server: Speed up the statistics computation from the database --- .../data/anorm/dao/StatisticsPostgresDAO.scala | 13 ++++++------- .../data/StatisticsPostgresDataHandlerSpec.scala | 9 +++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/server/app/com/xsn/explorer/data/anorm/dao/StatisticsPostgresDAO.scala b/server/app/com/xsn/explorer/data/anorm/dao/StatisticsPostgresDAO.scala index 740d2fc..1f5b211 100644 --- a/server/app/com/xsn/explorer/data/anorm/dao/StatisticsPostgresDAO.scala +++ b/server/app/com/xsn/explorer/data/anorm/dao/StatisticsPostgresDAO.scala @@ -13,16 +13,15 @@ class StatisticsPostgresDAO { def getStatistics(implicit conn: Connection): Statistics = { val result = SQL( s""" - |SELECT - | ( - | SELECT SUM(received - spent) FROM balances - | WHERE address <> '$BurnAddress' + |SELECT ( + | (SELECT value FROM aggregated_amounts WHERE name = 'available_coins') - + | (SELECT COALESCE(SUM(received - spent), 0) FROM balances WHERE address = '$BurnAddress') | ) AS total_supply, | ( - | SELECT SUM(received - spent) FROM balances - | WHERE address NOT IN (SELECT address FROM hidden_addresses) + | (SELECT value FROM aggregated_amounts WHERE name = 'available_coins') - + | (SELECT COALESCE(SUM(received - spent), 0) FROM balances WHERE address IN (SELECT address FROM hidden_addresses)) | ) AS circulating_supply, - | (SELECT COUNT(*) FROM transactions) AS transactions, + | (SELECT n_live_tup FROM pg_stat_all_tables WHERE relname = 'transactions') AS transactions, | (SELECT COALESCE(MAX(height), 0) FROM blocks) AS blocks """.stripMargin ).as(StatisticsParsers.parseStatistics.single) diff --git a/server/test/com/xsn/explorer/data/StatisticsPostgresDataHandlerSpec.scala b/server/test/com/xsn/explorer/data/StatisticsPostgresDataHandlerSpec.scala index 6d49661..b7690d1 100644 --- a/server/test/com/xsn/explorer/data/StatisticsPostgresDataHandlerSpec.scala +++ b/server/test/com/xsn/explorer/data/StatisticsPostgresDataHandlerSpec.scala @@ -6,6 +6,7 @@ import com.xsn.explorer.data.anorm.{BalancePostgresDataHandler, StatisticsPostgr import com.xsn.explorer.data.common.PostgresDataHandlerSpec import com.xsn.explorer.helpers.DataHelper import com.xsn.explorer.models.{Address, Balance} +import org.scalatest.OptionValues._ class StatisticsPostgresDataHandlerSpec extends PostgresDataHandlerSpec { @@ -20,7 +21,7 @@ class StatisticsPostgresDataHandlerSpec extends PostgresDataHandlerSpec { "exclude hidden_addresses from the circulating supply" in { val hiddenAddress = DataHelper.createAddress("XfAATXtkRgCdMTrj2fxHvLsKLLmqAjhEAt") - val circulatingSupply = dataHandler.getStatistics().get.circulatingSupply + val circulatingSupply = dataHandler.getStatistics().get.circulatingSupply.getOrElse(0) database.withConnection { implicit conn => _root_.anorm.SQL( @@ -35,19 +36,19 @@ class StatisticsPostgresDataHandlerSpec extends PostgresDataHandlerSpec { balanceDataHandler.upsert(balance).isGood mustEqual true val result = dataHandler.getStatistics().get - result.circulatingSupply mustEqual circulatingSupply + result.circulatingSupply.value mustEqual circulatingSupply } "exclude the burn address from the total supply" in { val burnAddress = Address.from(StatisticsPostgresDAO.BurnAddress).get - val totalSupply = dataHandler.getStatistics().get.totalSupply + val totalSupply = dataHandler.getStatistics().get.totalSupply.getOrElse(0) val balance = Balance(burnAddress, received = BigDecimal(1000), spent = BigDecimal(500)) balanceDataHandler.upsert(balance).isGood mustEqual true val result = dataHandler.getStatistics().get - result.totalSupply mustEqual totalSupply + result.totalSupply.value mustEqual totalSupply } } }