Skip to content

Commit

Permalink
Accomodate eviction of asset contract ledger entries in asset stats e…
Browse files Browse the repository at this point in the history
…ndpoint
  • Loading branch information
tamirms committed Aug 31, 2023
1 parent 8371bee commit f2c662a
Show file tree
Hide file tree
Showing 17 changed files with 730 additions and 636 deletions.
2 changes: 1 addition & 1 deletion services/horizon/internal/actions/asset.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ func (handler AssetStatsHandler) validateAssetParams(code, issuer string, pq db2
func (handler AssetStatsHandler) findIssuersForAssets(
ctx context.Context,
historyQ *history.Q,
assetStats []history.ExpAssetStat,
assetStats []history.AssetAndContractStat,
) (map[string]history.AccountEntry, error) {
issuerSet := map[string]bool{}
issuers := []string{}
Expand Down
60 changes: 0 additions & 60 deletions services/horizon/internal/db2/assets/asset_stat.go

This file was deleted.

107 changes: 0 additions & 107 deletions services/horizon/internal/db2/assets/asset_stat_test.go

This file was deleted.

76 changes: 73 additions & 3 deletions services/horizon/internal/db2/history/asset_stats.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"strings"

sq "github.com/Masterminds/squirrel"

"github.com/stellar/go/services/horizon/internal/db2"
"github.com/stellar/go/support/db"
"github.com/stellar/go/support/errors"
Expand Down Expand Up @@ -33,6 +34,11 @@ func assetStatToPrimaryKeyMap(assetStat ExpAssetStat) map[string]interface{} {
}
}

type ContractStatRow struct {
ContractID []byte `db:"contract_id"`
Stat ContractStat `db:"stat"`
}

// InsertAssetStats a set of asset stats into the exp_asset_stats
func (q *Q) InsertAssetStats(ctx context.Context, assetStats []ExpAssetStat, batchSize int) error {
builder := &db.BatchInsertBuilder{
Expand All @@ -53,6 +59,25 @@ func (q *Q) InsertAssetStats(ctx context.Context, assetStats []ExpAssetStat, bat
return nil
}

func (q *Q) InsertAssetContractStats(ctx context.Context, rows []ContractStatRow, batchSize int) error {
builder := &db.BatchInsertBuilder{
Table: q.GetTable("contract_asset_stats"),
MaxBatchSize: batchSize,
}

for _, row := range rows {
if err := builder.RowStruct(ctx, row); err != nil {
return errors.Wrap(err, "could not insert asset assetStat row")
}
}

if err := builder.Exec(ctx); err != nil {
return errors.Wrap(err, "could not exec asset assetStats insert builder")
}

return nil
}

// InsertAssetStat a single asset assetStat row into the exp_asset_stats
// Returns number of rows affected and error.
func (q *Q) InsertAssetStat(ctx context.Context, assetStat ExpAssetStat) (int64, error) {
Expand All @@ -65,6 +90,19 @@ func (q *Q) InsertAssetStat(ctx context.Context, assetStat ExpAssetStat) (int64,
return result.RowsAffected()
}

func (q *Q) InsertAssetContractStat(ctx context.Context, row ContractStatRow) (int64, error) {
sql := sq.Insert("contract_asset_stats").SetMap(map[string]interface{}{
"contract_id": row.ContractID,
"stat": row.Stat,
})
result, err := q.Exec(ctx, sql)
if err != nil {
return 0, err
}

return result.RowsAffected()
}

// UpdateAssetStat updates a row in the exp_asset_stats table.
// Returns number of rows affected and error.
func (q *Q) UpdateAssetStat(ctx context.Context, assetStat ExpAssetStat) (int64, error) {
Expand All @@ -79,6 +117,17 @@ func (q *Q) UpdateAssetStat(ctx context.Context, assetStat ExpAssetStat) (int64,
return result.RowsAffected()
}

func (q *Q) UpdateAssetContractStat(ctx context.Context, row ContractStatRow) (int64, error) {
sql := sq.Update("contract_asset_stats").Set("stat", row.Stat).
Where("contract_id = ?", row.ContractID)
result, err := q.Exec(ctx, sql)
if err != nil {
return 0, err
}

return result.RowsAffected()
}

// RemoveAssetStat removes a row in the exp_asset_stats table.
func (q *Q) RemoveAssetStat(ctx context.Context, assetType xdr.AssetType, assetCode, assetIssuer string) (int64, error) {
sql := sq.Delete("exp_asset_stats").
Expand All @@ -95,6 +144,17 @@ func (q *Q) RemoveAssetStat(ctx context.Context, assetType xdr.AssetType, assetC
return result.RowsAffected()
}

func (q *Q) RemoveAssetContractStat(ctx context.Context, contractID []byte) (int64, error) {
sql := sq.Delete("contract_asset_stats").
Where("contract_id = ?", contractID)
result, err := q.Exec(ctx, sql)
if err != nil {
return 0, err
}

return result.RowsAffected()
}

// GetAssetStat returns a row in the exp_asset_stats table.
func (q *Q) GetAssetStat(ctx context.Context, assetType xdr.AssetType, assetCode, assetIssuer string) (ExpAssetStat, error) {
sql := selectAssetStats.Where(map[string]interface{}{
Expand All @@ -107,6 +167,14 @@ func (q *Q) GetAssetStat(ctx context.Context, assetType xdr.AssetType, assetCode
return assetStat, err
}

// GetAssetContractStat returns a row in the contract_asset_stats table.
func (q *Q) GetAssetContractStat(ctx context.Context, contractID []byte) (ContractStatRow, error) {
sql := sq.Select("*").From("contract_asset_stats").Where("contract_id = ?", contractID)
var assetStat ContractStatRow
err := q.Get(ctx, &assetStat, sql)
return assetStat, err
}

func (q *Q) GetAssetStatByContract(ctx context.Context, contractID [32]byte) (ExpAssetStat, error) {
sql := selectAssetStats.Where("contract_id = ?", contractID[:])
var assetStat ExpAssetStat
Expand Down Expand Up @@ -158,8 +226,10 @@ func parseAssetStatsCursor(cursor string) (string, string, error) {
}

// GetAssetStats returns a page of exp_asset_stats rows.
func (q *Q) GetAssetStats(ctx context.Context, assetCode, assetIssuer string, page db2.PageQuery) ([]ExpAssetStat, error) {
sql := selectAssetStats
func (q *Q) GetAssetStats(ctx context.Context, assetCode, assetIssuer string, page db2.PageQuery) ([]AssetAndContractStat, error) {
sql := sq.Select("exp_asset_stats.*, contract_asset_stats.stat as contracts").
From("exp_asset_stats").
LeftJoin("contract_asset_stats ON exp_asset_stats.contract_id = contract_asset_stats.contract_id")
filters := map[string]interface{}{}
if assetCode != "" {
filters["asset_code"] = assetCode
Expand Down Expand Up @@ -193,7 +263,7 @@ func (q *Q) GetAssetStats(ctx context.Context, assetCode, assetIssuer string, pa

sql = sql.OrderBy("(asset_code, asset_issuer) " + orderBy).Limit(page.Limit)

var results []ExpAssetStat
var results []AssetAndContractStat
if err := q.Select(ctx, &results, sql); err != nil {
return nil, errors.Wrap(err, "could not run select query")
}
Expand Down
Loading

0 comments on commit f2c662a

Please sign in to comment.