|
1 | 1 | import { storage } from '@powersync/service-core'; |
2 | 2 | import { expect, test } from 'vitest'; |
3 | 3 | import * as test_utils from '../test-utils/test-utils-index.js'; |
| 4 | +import { ParameterLookup } from '@powersync/service-sync-rules'; |
4 | 5 |
|
5 | 6 | const TEST_TABLE = test_utils.makeTestTable('test', ['id']); |
6 | 7 |
|
@@ -442,4 +443,80 @@ bucket_definitions: |
442 | 443 | ]) |
443 | 444 | ); |
444 | 445 | }); |
| 446 | + |
| 447 | + test('compacting parameters', async () => { |
| 448 | + await using factory = await generateStorageFactory(); |
| 449 | + const syncRules = await factory.updateSyncRules({ |
| 450 | + content: ` |
| 451 | +bucket_definitions: |
| 452 | + test: |
| 453 | + parameters: select id from test where id = request.user_id() |
| 454 | + data: [] |
| 455 | + ` |
| 456 | + }); |
| 457 | + const bucketStorage = factory.getInstance(syncRules); |
| 458 | + |
| 459 | + await bucketStorage.startBatch(test_utils.BATCH_OPTIONS, async (batch) => { |
| 460 | + await batch.save({ |
| 461 | + sourceTable: TEST_TABLE, |
| 462 | + tag: storage.SaveOperationTag.INSERT, |
| 463 | + after: { |
| 464 | + id: 't1' |
| 465 | + }, |
| 466 | + afterReplicaId: 't1' |
| 467 | + }); |
| 468 | + |
| 469 | + await batch.save({ |
| 470 | + sourceTable: TEST_TABLE, |
| 471 | + tag: storage.SaveOperationTag.INSERT, |
| 472 | + after: { |
| 473 | + id: 't2' |
| 474 | + }, |
| 475 | + afterReplicaId: 't2' |
| 476 | + }); |
| 477 | + |
| 478 | + await batch.commit('1/1'); |
| 479 | + }); |
| 480 | + |
| 481 | + const lookup = ParameterLookup.normalized('test', '1', ['t1']); |
| 482 | + |
| 483 | + const checkpoint1 = await bucketStorage.getCheckpoint(); |
| 484 | + const parameters1 = await checkpoint1.getParameterSets([lookup]); |
| 485 | + expect(parameters1).toEqual([{ id: 't1' }]); |
| 486 | + |
| 487 | + await bucketStorage.startBatch(test_utils.BATCH_OPTIONS, async (batch) => { |
| 488 | + await batch.save({ |
| 489 | + sourceTable: TEST_TABLE, |
| 490 | + tag: storage.SaveOperationTag.UPDATE, |
| 491 | + before: { |
| 492 | + id: 't1' |
| 493 | + }, |
| 494 | + beforeReplicaId: 't1', |
| 495 | + after: { |
| 496 | + id: 't1' |
| 497 | + }, |
| 498 | + afterReplicaId: 't1' |
| 499 | + }); |
| 500 | + |
| 501 | + await batch.save({ |
| 502 | + sourceTable: TEST_TABLE, |
| 503 | + tag: storage.SaveOperationTag.DELETE, |
| 504 | + before: { |
| 505 | + id: 't1' |
| 506 | + }, |
| 507 | + beforeReplicaId: 't1' |
| 508 | + }); |
| 509 | + await batch.commit('1/2'); |
| 510 | + }); |
| 511 | + const checkpoint2 = await bucketStorage.getCheckpoint(); |
| 512 | + const parameters2 = await checkpoint2.getParameterSets([lookup]); |
| 513 | + expect(parameters2).toEqual([]); |
| 514 | + |
| 515 | + await bucketStorage.compact({ compactParameterData: true }); |
| 516 | + |
| 517 | + const parameters1b = await checkpoint1.getParameterSets([lookup]); |
| 518 | + const parameters2b = await checkpoint2.getParameterSets([lookup]); |
| 519 | + expect(parameters1b).toEqual([{ id: 't1' }]); |
| 520 | + expect(parameters2b).toEqual([]); |
| 521 | + }); |
445 | 522 | } |
0 commit comments