diff --git a/src/main/java/org/qora/api/model/BlockForgeSummary.java b/src/main/java/org/qora/api/model/BlockForgeSummary.java deleted file mode 100644 index 3b2d3d55..00000000 --- a/src/main/java/org/qora/api/model/BlockForgeSummary.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.qora.api.model; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; - -@XmlAccessorType(XmlAccessType.FIELD) -public class BlockForgeSummary { - - public String address; - public int blockCount; - - protected BlockForgeSummary() { - } - - public BlockForgeSummary(String address, int blockCount) { - this.address = address; - this.blockCount = blockCount; - } - -} diff --git a/src/main/java/org/qora/api/model/BlockForgerSummary.java b/src/main/java/org/qora/api/model/BlockForgerSummary.java new file mode 100644 index 00000000..a2280247 --- /dev/null +++ b/src/main/java/org/qora/api/model/BlockForgerSummary.java @@ -0,0 +1,34 @@ +package org.qora.api.model; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; + +import org.qora.crypto.Crypto; + +@XmlAccessorType(XmlAccessType.FIELD) +public class BlockForgerSummary { + + // Properties + + public String generatorAddress; + public int blockCount; + + public String forgedBy; + public String forgedFor; + + // Constructors + + protected BlockForgerSummary() { + } + + public BlockForgerSummary(byte[] generator, int blockCount, byte[] forger, String recipient) { + this.generatorAddress = Crypto.toAddress(generator); + this.blockCount = blockCount; + + if (recipient != null) { + this.forgedBy = Crypto.toAddress(forger); + this.forgedFor = recipient; + } + } + +} diff --git a/src/main/java/org/qora/api/resource/BlocksResource.java b/src/main/java/org/qora/api/resource/BlocksResource.java index f8c73527..7d292fd1 100644 --- a/src/main/java/org/qora/api/resource/BlocksResource.java +++ b/src/main/java/org/qora/api/resource/BlocksResource.java @@ -27,7 +27,7 @@ import org.qora.api.ApiError; import org.qora.api.ApiErrors; import org.qora.api.ApiException; import org.qora.api.ApiExceptionFactory; -import org.qora.api.model.BlockForgeSummary; +import org.qora.api.model.BlockForgerSummary; import org.qora.block.Block; import org.qora.crypto.Crypto; import org.qora.data.account.AccountData; @@ -574,14 +574,14 @@ public class BlocksResource { content = @Content( array = @ArraySchema( schema = @Schema( - implementation = BlockForgeSummary.class + implementation = BlockForgerSummary.class ) ) ) ) } ) - public List getBlockForgers(@Parameter( + public List getBlockForgers(@Parameter( ref = "limit" ) @QueryParam("limit") Integer limit, @Parameter( ref = "offset" diff --git a/src/main/java/org/qora/repository/BlockRepository.java b/src/main/java/org/qora/repository/BlockRepository.java index 4b0ddc6c..99029146 100644 --- a/src/main/java/org/qora/repository/BlockRepository.java +++ b/src/main/java/org/qora/repository/BlockRepository.java @@ -2,7 +2,7 @@ package org.qora.repository; import java.util.List; -import org.qora.api.model.BlockForgeSummary; +import org.qora.api.model.BlockForgerSummary; import org.qora.data.block.BlockData; import org.qora.data.block.BlockTransactionData; import org.qora.data.transaction.TransactionData; @@ -105,7 +105,7 @@ public interface BlockRepository { /** * Returns summaries of block forgers. */ - public List getBlockForgers(Integer limit, Integer offset, Boolean reverse) throws DataException; + public List getBlockForgers(Integer limit, Integer offset, Boolean reverse) throws DataException; /** * Returns blocks with passed generator public key. diff --git a/src/main/java/org/qora/repository/hsqldb/HSQLDBBlockRepository.java b/src/main/java/org/qora/repository/hsqldb/HSQLDBBlockRepository.java index ae5c2af2..02295e5a 100644 --- a/src/main/java/org/qora/repository/hsqldb/HSQLDBBlockRepository.java +++ b/src/main/java/org/qora/repository/hsqldb/HSQLDBBlockRepository.java @@ -6,8 +6,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import org.qora.api.model.BlockForgeSummary; -import org.qora.crypto.Crypto; +import org.qora.api.model.BlockForgerSummary; import org.qora.data.block.BlockData; import org.qora.data.block.BlockTransactionData; import org.qora.data.transaction.TransactionData; @@ -165,14 +164,17 @@ public class HSQLDBBlockRepository implements BlockRepository { } @Override - public List getBlockForgers(Integer limit, Integer offset, Boolean reverse) throws DataException { - String sql = "SELECT generator, COUNT(signature) FROM Blocks GROUP BY generator ORDER BY COUNT(signature) "; + public List getBlockForgers(Integer limit, Integer offset, Boolean reverse) throws DataException { + String subquerySql = "SELECT generator, COUNT(signature) FROM Blocks GROUP BY generator ORDER BY COUNT(signature) "; if (reverse != null && reverse) - sql += " DESC"; + subquerySql += " DESC"; + + String sql = "SELECT generator, n_blocks, forger, recipient FROM (" + subquerySql + ") AS Forgers (generator, n_blocks) " + + " LEFT OUTER JOIN ProxyForgers ON proxy_public_key = generator "; sql += HSQLDBRepository.limitOffsetSql(limit, offset); - List summaries = new ArrayList<>(); + List summaries = new ArrayList<>(); try (ResultSet resultSet = this.repository.checkedExecute(sql)) { if (resultSet == null) @@ -180,9 +182,11 @@ public class HSQLDBBlockRepository implements BlockRepository { do { byte[] generator = resultSet.getBytes(1); - int count = resultSet.getInt(2); + int nBlocks = resultSet.getInt(2); + byte[] forger = resultSet.getBytes(3); + String recipient = resultSet.getString(4); - summaries.add(new BlockForgeSummary(Crypto.toAddress(generator), count)); + summaries.add(new BlockForgerSummary(generator, nBlocks, forger, recipient)); } while (resultSet.next()); return summaries;