Skip to content

Commit a8d8b2f

Browse files
committed
feat: remove one UPDATE sql query in case of metadata usage
1 parent fd576e1 commit a8d8b2f

File tree

10 files changed

+63
-72
lines changed

10 files changed

+63
-72
lines changed

internal/controller/ledger/controller_default.go

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"math/big"
88
"reflect"
99

10-
. "github.com/formancehq/go-libs/v2/collectionutils"
1110
"github.com/formancehq/go-libs/v2/pointer"
1211
"github.com/formancehq/go-libs/v2/time"
1312
"github.com/formancehq/ledger/pkg/features"
@@ -199,17 +198,10 @@ func (ctrl *DefaultController) importLog(ctx context.Context, log ledger.Log) er
199198
switch payload := log.Data.(type) {
200199
case ledger.CreatedTransaction:
201200
logging.FromContext(ctx).Debugf("Importing transaction %d", *payload.Transaction.ID)
202-
if err := ctrl.store.CommitTransaction(ctx, &payload.Transaction); err != nil {
201+
if err := ctrl.store.CommitTransaction(ctx, &payload.Transaction, payload.AccountMetadata); err != nil {
203202
return fmt.Errorf("failed to commit transaction: %w", err)
204203
}
205204
logging.FromContext(ctx).Debugf("Imported transaction %d", *payload.Transaction.ID)
206-
207-
if len(payload.AccountMetadata) > 0 {
208-
logging.FromContext(ctx).Debugf("Importing metadata of accounts '%s'", Keys(payload.AccountMetadata))
209-
if err := ctrl.store.UpdateAccountsMetadata(ctx, payload.AccountMetadata); err != nil {
210-
return fmt.Errorf("updating metadata of accounts '%s': %w", Keys(payload.AccountMetadata), err)
211-
}
212-
}
213205
case ledger.RevertedTransaction:
214206
logging.FromContext(ctx).Debugf("Reverting transaction %d", *payload.RevertedTransaction.ID)
215207
_, _, err := ctrl.store.RevertTransaction(
@@ -220,7 +212,7 @@ func (ctrl *DefaultController) importLog(ctx context.Context, log ledger.Log) er
220212
if err != nil {
221213
return fmt.Errorf("failed to revert transaction: %w", err)
222214
}
223-
if err := ctrl.store.CommitTransaction(ctx, &payload.RevertTransaction); err != nil {
215+
if err := ctrl.store.CommitTransaction(ctx, &payload.RevertTransaction, nil); err != nil {
224216
return fmt.Errorf("failed to commit transaction: %w", err)
225217
}
226218
case ledger.SavedMetadata:
@@ -332,17 +324,11 @@ func (ctrl *DefaultController) createTransaction(ctx context.Context, store Stor
332324
WithMetadata(finalMetadata).
333325
WithTimestamp(parameters.Input.Timestamp).
334326
WithReference(parameters.Input.Reference)
335-
err = store.CommitTransaction(ctx, &transaction)
327+
err = store.CommitTransaction(ctx, &transaction, result.AccountMetadata)
336328
if err != nil {
337329
return nil, err
338330
}
339331

340-
if len(result.AccountMetadata) > 0 {
341-
if err := store.UpdateAccountsMetadata(ctx, result.AccountMetadata); err != nil {
342-
return nil, fmt.Errorf("updating metadata of account '%s': %w", Keys(result.AccountMetadata), err)
343-
}
344-
}
345-
346332
return &ledger.CreatedTransaction{
347333
Transaction: transaction,
348334
AccountMetadata: result.AccountMetadata,
@@ -407,7 +393,7 @@ func (ctrl *DefaultController) revertTransaction(ctx context.Context, store Stor
407393
}
408394
}
409395

410-
err = store.CommitTransaction(ctx, &reversedTx)
396+
err = store.CommitTransaction(ctx, &reversedTx, nil)
411397
if err != nil {
412398
return nil, fmt.Errorf("failed to insert transaction: %w", err)
413399
}

internal/controller/ledger/controller_default_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func TestCreateTransaction(t *testing.T) {
5252
}, nil)
5353

5454
store.EXPECT().
55-
CommitTransaction(gomock.Any(), gomock.Any()).
55+
CommitTransaction(gomock.Any(), gomock.Any(), nil).
5656
Return(nil)
5757

5858
store.EXPECT().
@@ -101,7 +101,7 @@ func TestRevertTransaction(t *testing.T) {
101101
Return(map[string]map[string]*big.Int{}, nil)
102102

103103
store.EXPECT().
104-
CommitTransaction(gomock.Any(), gomock.Any()).
104+
CommitTransaction(gomock.Any(), gomock.Any(), nil).
105105
Return(nil)
106106

107107
store.EXPECT().

internal/controller/ledger/store.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ type Store interface {
3434

3535
// GetBalances must returns balance and lock account until the end of the TX
3636
GetBalances(ctx context.Context, query BalanceQuery) (Balances, error)
37-
CommitTransaction(ctx context.Context, transaction *ledger.Transaction) error
37+
CommitTransaction(ctx context.Context, transaction *ledger.Transaction, accountMetadata map[string]metadata.Metadata) error
3838
// RevertTransaction revert the transaction with identifier id
3939
// It returns :
4040
// * the reverted transaction

internal/controller/ledger/store_generated_test.go

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/storage/ledger/accounts_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func TestAccountsList(t *testing.T) {
3131
err := store.CommitTransaction(ctx, pointer.For(ledger.NewTransaction().
3232
WithPostings(ledger.NewPosting("world", "account:1", "USD", big.NewInt(100))).
3333
WithTimestamp(now).
34-
WithInsertedAt(now)))
34+
WithInsertedAt(now)), nil)
3535
require.NoError(t, err)
3636

3737
require.NoError(t, store.UpdateAccountsMetadata(ctx, map[string]metadata.Metadata{
@@ -55,19 +55,19 @@ func TestAccountsList(t *testing.T) {
5555
err = store.CommitTransaction(ctx, pointer.For(ledger.NewTransaction().
5656
WithPostings(ledger.NewPosting("world", "account:1", "USD", big.NewInt(100))).
5757
WithTimestamp(now.Add(4*time.Minute)).
58-
WithInsertedAt(now.Add(100*time.Millisecond))))
58+
WithInsertedAt(now.Add(100*time.Millisecond))), nil)
5959
require.NoError(t, err)
6060

6161
err = store.CommitTransaction(ctx, pointer.For(ledger.NewTransaction().
6262
WithPostings(ledger.NewPosting("account:1", "bank", "USD", big.NewInt(50))).
6363
WithTimestamp(now.Add(3*time.Minute)).
64-
WithInsertedAt(now.Add(200*time.Millisecond))))
64+
WithInsertedAt(now.Add(200*time.Millisecond))), nil)
6565
require.NoError(t, err)
6666

6767
err = store.CommitTransaction(ctx, pointer.For(ledger.NewTransaction().
6868
WithPostings(ledger.NewPosting("world", "account:1", "USD", big.NewInt(0))).
6969
WithTimestamp(now.Add(-time.Minute)).
70-
WithInsertedAt(now.Add(200*time.Millisecond))))
70+
WithInsertedAt(now.Add(200*time.Millisecond))), nil)
7171
require.NoError(t, err)
7272

7373
t.Run("list all", func(t *testing.T) {
@@ -305,7 +305,7 @@ func TestAccountsGet(t *testing.T) {
305305
tx1 := pointer.For(ledger.NewTransaction().WithPostings(
306306
ledger.NewPosting("world", "multi", "USD/2", big.NewInt(100)),
307307
).WithTimestamp(now))
308-
err := store.CommitTransaction(ctx, tx1)
308+
err := store.CommitTransaction(ctx, tx1, nil)
309309
require.NoError(t, err)
310310

311311
// sleep for at least the time precision to ensure the next transaction is inserted with a different timestamp
@@ -320,7 +320,7 @@ func TestAccountsGet(t *testing.T) {
320320
tx2 := pointer.For(ledger.NewTransaction().WithPostings(
321321
ledger.NewPosting("world", "multi", "USD/2", big.NewInt(0)),
322322
).WithTimestamp(now.Add(-time.Minute)))
323-
err = store.CommitTransaction(ctx, tx2)
323+
err = store.CommitTransaction(ctx, tx2, nil)
324324
require.NoError(t, err)
325325

326326
t.Run("find account", func(t *testing.T) {
@@ -446,7 +446,7 @@ func TestAccountsCount(t *testing.T) {
446446

447447
err := store.CommitTransaction(ctx, pointer.For(ledger.NewTransaction().WithPostings(
448448
ledger.NewPosting("world", "central_bank", "USD/2", big.NewInt(100)),
449-
)))
449+
)), nil)
450450
require.NoError(t, err)
451451

452452
countAccounts, err := store.Accounts().Count(ctx, ledgercontroller.ResourceQuery[any]{})

internal/storage/ledger/balances_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ func TestBalancesAggregates(t *testing.T) {
174174
).
175175
WithTimestamp(now).
176176
WithInsertedAt(now)
177-
err := store.CommitTransaction(ctx, &tx1)
177+
err := store.CommitTransaction(ctx, &tx1, nil)
178178
require.NoError(t, err)
179179

180180
tx2 := ledger.NewTransaction().
@@ -185,7 +185,7 @@ func TestBalancesAggregates(t *testing.T) {
185185
).
186186
WithTimestamp(now.Add(-time.Minute)).
187187
WithInsertedAt(now.Add(time.Minute))
188-
err = store.CommitTransaction(ctx, &tx2)
188+
err = store.CommitTransaction(ctx, &tx2, nil)
189189
require.NoError(t, err)
190190

191191
require.NoError(t, store.UpdateAccountsMetadata(ctx, map[string]metadata.Metadata{

internal/storage/ledger/moves_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ func TestMovesInsert(t *testing.T) {
157157
tx := ledger.NewTransaction().WithPostings(
158158
ledger.NewPosting(src, dst, "USD", big.NewInt(1)),
159159
)
160-
err = storeCP.CommitTransaction(ctx, &tx)
160+
err = storeCP.CommitTransaction(ctx, &tx, nil)
161161
if errors.Is(err, postgres.ErrDeadlockDetected) {
162162
require.NoError(t, sqlTx.Rollback())
163163
continue

internal/storage/ledger/transactions.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@ var (
3434
metadataRegex = regexp.MustCompile(`metadata\[(.+)]`)
3535
)
3636

37-
func (store *Store) CommitTransaction(ctx context.Context, tx *ledger.Transaction) error {
37+
func (store *Store) CommitTransaction(ctx context.Context, tx *ledger.Transaction, accountMetadata map[string]metadata.Metadata) error {
38+
if accountMetadata == nil {
39+
accountMetadata = make(map[string]metadata.Metadata)
40+
}
3841

3942
postCommitVolumes, err := store.UpdateVolumes(ctx, tx.VolumeUpdates()...)
4043
if err != nil {
@@ -51,7 +54,7 @@ func (store *Store) CommitTransaction(ctx context.Context, tx *ledger.Transactio
5154
return &ledger.Account{
5255
Address: address,
5356
FirstUsage: tx.Timestamp,
54-
Metadata: make(metadata.Metadata),
57+
Metadata: accountMetadata[address],
5558
InsertionDate: tx.InsertedAt,
5659
UpdatedAt: tx.InsertedAt,
5760
}

0 commit comments

Comments
 (0)