diff --git a/server/app/com/xsn/explorer/data/anorm/dao/BalancePostgresDAO.scala b/server/app/com/xsn/explorer/data/anorm/dao/BalancePostgresDAO.scala index ea99bb6..d75609b 100644 --- a/server/app/com/xsn/explorer/data/anorm/dao/BalancePostgresDAO.scala +++ b/server/app/com/xsn/explorer/data/anorm/dao/BalancePostgresDAO.scala @@ -16,20 +16,18 @@ class BalancePostgresDAO @Inject() (fieldOrderingSQLInterpreter: FieldOrderingSQ SQL( """ |INSERT INTO balances - | (address, received, spent, available) + | (address, received, spent) |VALUES - | ({address}, {received}, {spent}, {available}) + | ({address}, {received}, {spent}) |ON CONFLICT (address) DO UPDATE | SET received = balances.received + EXCLUDED.received, - | spent = balances.spent + EXCLUDED.spent, - | available = balances.available + EXCLUDED.available + | spent = balances.spent + EXCLUDED.spent |RETURNING address, received, spent """.stripMargin ).on( 'address -> balance.address.string, 'received -> balance.received, 'spent -> balance.spent, - 'available -> balance.available ).as(parseBalance.singleOpt).flatten } @@ -41,7 +39,7 @@ class BalancePostgresDAO @Inject() (fieldOrderingSQLInterpreter: FieldOrderingSQ val orderBy = fieldOrderingSQLInterpreter.toOrderByClause(ordering) SQL( s""" - |SELECT address, received, spent, available + |SELECT address, received, spent |FROM balances |WHERE address NOT IN ( | SELECT address 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 7dfe2d1..5db85fa 100644 --- a/server/app/com/xsn/explorer/data/anorm/dao/StatisticsPostgresDAO.scala +++ b/server/app/com/xsn/explorer/data/anorm/dao/StatisticsPostgresDAO.scala @@ -12,9 +12,9 @@ class StatisticsPostgresDAO { SQL( """ |SELECT - | (SELECT SUM(available) FROM balances) AS total_supply, + | (SELECT SUM(received - spent) FROM balances) AS total_supply, | ( - | SELECT SUM(available) FROM balances + | SELECT SUM(received - spent) FROM balances | WHERE address NOT IN (SELECT address FROM hidden_addresses) | ) AS circulating_supply, | (SELECT COUNT(*) FROM transactions) AS transactions, diff --git a/server/app/com/xsn/explorer/models/fields/BalanceField.scala b/server/app/com/xsn/explorer/models/fields/BalanceField.scala index 3d9975e..97345c7 100644 --- a/server/app/com/xsn/explorer/models/fields/BalanceField.scala +++ b/server/app/com/xsn/explorer/models/fields/BalanceField.scala @@ -19,5 +19,8 @@ object BalanceField { case _ => None } - implicit val columnNameResolver: ColumnNameResolver[BalanceField] = (field) => field.string + implicit val columnNameResolver: ColumnNameResolver[BalanceField] = (field) => field match { + case Available => s"(${Received.string} - ${Spent.string})" + case f => f.string + } } diff --git a/server/conf/evolutions/default/5.sql b/server/conf/evolutions/default/5.sql new file mode 100644 index 0000000..6511572 --- /dev/null +++ b/server/conf/evolutions/default/5.sql @@ -0,0 +1,20 @@ + +# --- !Ups + +DROP INDEX balances_available_index; + +ALTER TABLE balances +DROP COLUMN available; + +CREATE INDEX balances_available_index ON balances ((received - spent)); + + +# --- !Downs + +DROP INDEX balances_available_index; + +-- in case this down is applied, the table needs to be rebuilt. +ALTER TABLE balances +ADD COLUMN available DECIMAL(30, 15) NOT NULL DEFAULT 0; + +CREATE INDEX balances_available_index ON balances (available); diff --git a/server/test/com/xsn/explorer/data/BalancePostgresDataHandlerSpec.scala b/server/test/com/xsn/explorer/data/BalancePostgresDataHandlerSpec.scala index a45c0be..ef97930 100644 --- a/server/test/com/xsn/explorer/data/BalancePostgresDataHandlerSpec.scala +++ b/server/test/com/xsn/explorer/data/BalancePostgresDataHandlerSpec.scala @@ -25,21 +25,6 @@ class BalancePostgresDataHandlerSpec extends PostgresDataHandlerSpec { result mustEqual Good(balance) } - "set the available amount" in { - val address = DataHelper.createAddress("Xbh5pJdBNm8J9PxnEmwVcuQKRmZZ7DkpcF") - val balance = Balance(address, received = BigDecimal(10), spent = BigDecimal(5)) - - val result = dataHandler.upsert(balance) - result mustEqual Good(balance) - database.withConnection { implicit conn => - val available = _root_.anorm - .SQL(s"SELECT available FROM balances WHERE address = '${address.string}'") - .as(_root_.anorm.SqlParser.get[BigDecimal]("available").single) - - available mustEqual balance.available - } - } - "update an existing balance" in { val address = DataHelper.createAddress("XfAATXtkRgCdMTrj2fxHvLsKLLmqAjhEAt") val initialBalance = Balance(address, received = BigDecimal(10), spent = BigDecimal(5))