Skip to content

Commit

Permalink
Refactor SetNewArray method to accept initial values and add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
highcloud100 committed Jan 16, 2024
1 parent 44c1809 commit 4ffdbf3
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 4 deletions.
11 changes: 7 additions & 4 deletions pkg/document/json/object.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,13 +58,16 @@ func (p *Object) SetNewObject(k string, v ...map[string]interface{}) *Object {
}

// SetNewArray sets a new Array for the given key.
func (p *Object) SetNewArray(k string) *Array {
v := p.setInternal(k, func(ticket *time.Ticket) crdt.Element {
func (p *Object) SetNewArray(k string, v ...[]interface{}) *Array {
value := p.setInternal(k, func(ticket *time.Ticket) crdt.Element {
elements := crdt.NewRGATreeList()
return NewArray(p.context, crdt.NewArray(elements, ticket))
if len(v) == 0 {
return NewArray(p.context, crdt.NewArray(elements, ticket))
}
return toElement(p.context, buildCRDTElement(p.context, v[0], ticket))
})

return v.(*Array)
return value.(*Array)
}

// SetNewText sets a new Text for the given key.
Expand Down
51 changes: 51 additions & 0 deletions test/integration/array_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import (
"github.com/yorkie-team/yorkie/pkg/document"
"github.com/yorkie-team/yorkie/pkg/document/json"
"github.com/yorkie-team/yorkie/pkg/document/presence"
"github.com/yorkie-team/yorkie/pkg/document/time"
"github.com/yorkie-team/yorkie/test/helper"
)

Expand Down Expand Up @@ -234,4 +235,54 @@ func TestArray(t *testing.T) {

syncClientsThenAssertEqual(t, []clientAndDocPair{{c1, d1}, {c2, d2}})
})

t.Run("Set array with value set, add, delete test", func(t *testing.T) {
ctx := context.Background()
d1 := document.New(helper.TestDocKey(t))
assert.NoError(t, c1.Attach(ctx, d1))
assert.NoError(t, d1.Update(func(root *json.Object, p *presence.Presence) error {
root.SetNewArray("k1", []interface{}{0, 1, 2, []interface{}{3, 4, 5}})
assert.Equal(t, `{"k1":[0,1,2,[3,4,5]]}`, root.Marshal())

root.GetArray("k1").AddInteger(6)
assert.Equal(t, `{"k1":[0,1,2,[3,4,5],6]}`, root.Marshal())

root.GetArray("k1").AddString("7")
assert.Equal(t, `{"k1":[0,1,2,[3,4,5],6,"7"]}`, root.Marshal())

root.GetArray("k1").Delete(5) // delete "7"
assert.Equal(t, `{"k1":[0,1,2,[3,4,5],6]}`, root.Marshal())
root.Delete("k1")
return nil
}))
assert.NoError(t, c1.Sync(ctx))
assert.Equal(t, 10, d1.GarbageLen())
assert.Equal(t, 10, d1.GarbageCollect(time.MaxTicket))
})

t.Run("Set array with value sync test", func(t *testing.T) {
ctx := context.Background()
d1 := document.New(helper.TestDocKey(t))
assert.NoError(t, c1.Attach(ctx, d1))
d2 := document.New(helper.TestDocKey(t))
assert.NoError(t, c2.Attach(ctx, d2))

assert.NoError(t, d1.Update(func(root *json.Object, p *presence.Presence) error {
root.SetNewArray("k1", []interface{}{0, 1, 2})
assert.Equal(t, `{"k1":[0,1,2]}`, root.Marshal())

root.GetArray("k1").Delete(0) // delete "0"
assert.Equal(t, `{"k1":[1,2]}`, root.Marshal())
root.Delete("k1")
return nil
}))
assert.NoError(t, c1.Sync(ctx))
assert.NoError(t, c2.Sync(ctx))

assert.Equal(t, d1.Marshal(), d2.Marshal())
assert.Equal(t, 4, d1.GarbageLen())
assert.Equal(t, 4, d1.GarbageCollect(time.MaxTicket))
assert.Equal(t, 4, d2.GarbageLen())
assert.Equal(t, 4, d2.GarbageCollect(time.MaxTicket))
})
}

1 comment on commit 4ffdbf3

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Go Benchmark

Benchmark suite Current: 4ffdbf3 Previous: a8c58f9 Ratio
BenchmarkDocument/constructor_test - ns/op 1429 ns/op 1457 ns/op 0.98
BenchmarkDocument/constructor_test - B/op 1224 B/op 1224 B/op 1
BenchmarkDocument/constructor_test - allocs/op 21 allocs/op 21 allocs/op 1
BenchmarkDocument/status_test - ns/op 840.9 ns/op 849.5 ns/op 0.99
BenchmarkDocument/status_test - B/op 1192 B/op 1192 B/op 1
BenchmarkDocument/status_test - allocs/op 19 allocs/op 19 allocs/op 1
BenchmarkDocument/equals_test - ns/op 7385 ns/op 7524 ns/op 0.98
BenchmarkDocument/equals_test - B/op 6977 B/op 6977 B/op 1
BenchmarkDocument/equals_test - allocs/op 124 allocs/op 124 allocs/op 1
BenchmarkDocument/nested_update_test - ns/op 16599 ns/op 18601 ns/op 0.89
BenchmarkDocument/nested_update_test - B/op 12059 B/op 12059 B/op 1
BenchmarkDocument/nested_update_test - allocs/op 260 allocs/op 260 allocs/op 1
BenchmarkDocument/delete_test - ns/op 22444 ns/op 22335 ns/op 1.00
BenchmarkDocument/delete_test - B/op 15284 B/op 15284 B/op 1
BenchmarkDocument/delete_test - allocs/op 339 allocs/op 339 allocs/op 1
BenchmarkDocument/object_test - ns/op 8487 ns/op 8516 ns/op 1.00
BenchmarkDocument/object_test - B/op 6753 B/op 6753 B/op 1
BenchmarkDocument/object_test - allocs/op 118 allocs/op 118 allocs/op 1
BenchmarkDocument/array_test - ns/op 32876 ns/op 28781 ns/op 1.14
BenchmarkDocument/array_test - B/op 11883 B/op 11883 B/op 1
BenchmarkDocument/array_test - allocs/op 274 allocs/op 274 allocs/op 1
BenchmarkDocument/text_test - ns/op 30704 ns/op 30487 ns/op 1.01
BenchmarkDocument/text_test - B/op 14916 B/op 14828 B/op 1.01
BenchmarkDocument/text_test - allocs/op 470 allocs/op 470 allocs/op 1
BenchmarkDocument/text_composition_test - ns/op 28967 ns/op 28865 ns/op 1.00
BenchmarkDocument/text_composition_test - B/op 18430 B/op 18310 B/op 1.01
BenchmarkDocument/text_composition_test - allocs/op 479 allocs/op 479 allocs/op 1
BenchmarkDocument/rich_text_test - ns/op 80220 ns/op 80677 ns/op 0.99
BenchmarkDocument/rich_text_test - B/op 38676 B/op 38572 B/op 1.00
BenchmarkDocument/rich_text_test - allocs/op 1149 allocs/op 1149 allocs/op 1
BenchmarkDocument/counter_test - ns/op 16957 ns/op 16759 ns/op 1.01
BenchmarkDocument/counter_test - B/op 10466 B/op 10242 B/op 1.02
BenchmarkDocument/counter_test - allocs/op 238 allocs/op 238 allocs/op 1
BenchmarkDocument/text_edit_gc_100 - ns/op 2877279 ns/op 2887897 ns/op 1.00
BenchmarkDocument/text_edit_gc_100 - B/op 1658547 B/op 1655169 B/op 1.00
BenchmarkDocument/text_edit_gc_100 - allocs/op 17095 allocs/op 17094 allocs/op 1.00
BenchmarkDocument/text_edit_gc_1000 - ns/op 228861441 ns/op 229415441 ns/op 1.00
BenchmarkDocument/text_edit_gc_1000 - B/op 144408361 B/op 144344868 B/op 1.00
BenchmarkDocument/text_edit_gc_1000 - allocs/op 201063 allocs/op 200908 allocs/op 1.00
BenchmarkDocument/text_split_gc_100 - ns/op 3382192 ns/op 3374708 ns/op 1.00
BenchmarkDocument/text_split_gc_100 - B/op 2316741 B/op 2313351 B/op 1.00
BenchmarkDocument/text_split_gc_100 - allocs/op 16195 allocs/op 16195 allocs/op 1
BenchmarkDocument/text_split_gc_1000 - ns/op 287405692 ns/op 287430465 ns/op 1.00
BenchmarkDocument/text_split_gc_1000 - B/op 228939888 B/op 228891160 B/op 1.00
BenchmarkDocument/text_split_gc_1000 - allocs/op 204039 allocs/op 203934 allocs/op 1.00
BenchmarkDocument/text_delete_all_10000 - ns/op 11196194 ns/op 10779697 ns/op 1.04
BenchmarkDocument/text_delete_all_10000 - B/op 5811013 B/op 5809238 B/op 1.00
BenchmarkDocument/text_delete_all_10000 - allocs/op 40676 allocs/op 40669 allocs/op 1.00
BenchmarkDocument/text_delete_all_100000 - ns/op 187641478 ns/op 188925896 ns/op 0.99
BenchmarkDocument/text_delete_all_100000 - B/op 81910581 B/op 81910706 B/op 1.00
BenchmarkDocument/text_delete_all_100000 - allocs/op 411667 allocs/op 411662 allocs/op 1.00
BenchmarkDocument/text_100 - ns/op 219090 ns/op 229354 ns/op 0.96
BenchmarkDocument/text_100 - B/op 120136 B/op 118514 B/op 1.01
BenchmarkDocument/text_100 - allocs/op 5082 allocs/op 5082 allocs/op 1
BenchmarkDocument/text_1000 - ns/op 2393205 ns/op 2502759 ns/op 0.96
BenchmarkDocument/text_1000 - B/op 1169125 B/op 1153102 B/op 1.01
BenchmarkDocument/text_1000 - allocs/op 50086 allocs/op 50086 allocs/op 1
BenchmarkDocument/array_1000 - ns/op 1222555 ns/op 1262770 ns/op 0.97
BenchmarkDocument/array_1000 - B/op 1091296 B/op 1091147 B/op 1.00
BenchmarkDocument/array_1000 - allocs/op 11829 allocs/op 11829 allocs/op 1
BenchmarkDocument/array_10000 - ns/op 13452833 ns/op 13221008 ns/op 1.02
BenchmarkDocument/array_10000 - B/op 9799698 B/op 9799195 B/op 1.00
BenchmarkDocument/array_10000 - allocs/op 120292 allocs/op 120291 allocs/op 1.00
BenchmarkDocument/array_gc_100 - ns/op 147314 ns/op 172372 ns/op 0.85
BenchmarkDocument/array_gc_100 - B/op 132658 B/op 139899 B/op 0.95
BenchmarkDocument/array_gc_100 - allocs/op 1258 allocs/op 1472 allocs/op 0.85
BenchmarkDocument/array_gc_1000 - ns/op 1402443 ns/op 1651513 ns/op 0.85
BenchmarkDocument/array_gc_1000 - B/op 1159003 B/op 1241466 B/op 0.93
BenchmarkDocument/array_gc_1000 - allocs/op 12874 allocs/op 14897 allocs/op 0.86
BenchmarkDocument/counter_1000 - ns/op 204320 ns/op 210894 ns/op 0.97
BenchmarkDocument/counter_1000 - B/op 192915 B/op 192884 B/op 1.00
BenchmarkDocument/counter_1000 - allocs/op 5767 allocs/op 5767 allocs/op 1
BenchmarkDocument/counter_10000 - ns/op 2215228 ns/op 2217464 ns/op 1.00
BenchmarkDocument/counter_10000 - B/op 2087830 B/op 2087814 B/op 1.00
BenchmarkDocument/counter_10000 - allocs/op 59774 allocs/op 59774 allocs/op 1
BenchmarkDocument/object_1000 - ns/op 1359816 ns/op 1442631 ns/op 0.94
BenchmarkDocument/object_1000 - B/op 1428127 B/op 1428083 B/op 1.00
BenchmarkDocument/object_1000 - allocs/op 9847 allocs/op 9847 allocs/op 1
BenchmarkDocument/object_10000 - ns/op 15399366 ns/op 15149865 ns/op 1.02
BenchmarkDocument/object_10000 - B/op 12167594 B/op 12166338 B/op 1.00
BenchmarkDocument/object_10000 - allocs/op 100566 allocs/op 100562 allocs/op 1.00
BenchmarkDocument/tree_100 - ns/op 1013940 ns/op 1068412 ns/op 0.95
BenchmarkDocument/tree_100 - B/op 943780 B/op 943709 B/op 1.00
BenchmarkDocument/tree_100 - allocs/op 6102 allocs/op 6101 allocs/op 1.00
BenchmarkDocument/tree_1000 - ns/op 72731039 ns/op 79029252 ns/op 0.92
BenchmarkDocument/tree_1000 - B/op 86460385 B/op 86460602 B/op 1.00
BenchmarkDocument/tree_1000 - allocs/op 60116 allocs/op 60116 allocs/op 1
BenchmarkDocument/tree_10000 - ns/op 9405338294 ns/op 9661149264 ns/op 0.97
BenchmarkDocument/tree_10000 - B/op 8580655120 B/op 8580973784 B/op 1.00
BenchmarkDocument/tree_10000 - allocs/op 600230 allocs/op 600230 allocs/op 1
BenchmarkDocument/tree_delete_all_1000 - ns/op 73827374 ns/op 79816852 ns/op 0.92
BenchmarkDocument/tree_delete_all_1000 - B/op 87011418 B/op 86990889 B/op 1.00
BenchmarkDocument/tree_delete_all_1000 - allocs/op 67751 allocs/op 67750 allocs/op 1.00
BenchmarkDocument/tree_edit_gc_100 - ns/op 3629242 ns/op 3866691 ns/op 0.94
BenchmarkDocument/tree_edit_gc_100 - B/op 4121123 B/op 4121023 B/op 1.00
BenchmarkDocument/tree_edit_gc_100 - allocs/op 14359 allocs/op 14358 allocs/op 1.00
BenchmarkDocument/tree_edit_gc_1000 - ns/op 291858440 ns/op 326051394 ns/op 0.90
BenchmarkDocument/tree_edit_gc_1000 - B/op 383467634 B/op 383466086 B/op 1.00
BenchmarkDocument/tree_edit_gc_1000 - allocs/op 145419 allocs/op 145407 allocs/op 1.00
BenchmarkDocument/tree_split_gc_100 - ns/op 2414998 ns/op 2611696 ns/op 0.92
BenchmarkDocument/tree_split_gc_100 - B/op 2386941 B/op 2386898 B/op 1.00
BenchmarkDocument/tree_split_gc_100 - allocs/op 10344 allocs/op 10343 allocs/op 1.00
BenchmarkDocument/tree_split_gc_1000 - ns/op 179394260 ns/op 196739556 ns/op 0.91
BenchmarkDocument/tree_split_gc_1000 - B/op 221991380 B/op 221991590 B/op 1.00
BenchmarkDocument/tree_split_gc_1000 - allocs/op 112258 allocs/op 112260 allocs/op 1.00
BenchmarkRPC/client_to_server - ns/op 359701821 ns/op 356144469 ns/op 1.01
BenchmarkRPC/client_to_server - B/op 17535514 B/op 17801216 B/op 0.99
BenchmarkRPC/client_to_server - allocs/op 166905 allocs/op 166911 allocs/op 1.00
BenchmarkRPC/client_to_client_via_server - ns/op 615482030 ns/op 613079232 ns/op 1.00
BenchmarkRPC/client_to_client_via_server - B/op 36257312 B/op 31722656 B/op 1.14
BenchmarkRPC/client_to_client_via_server - allocs/op 312607 allocs/op 313048 allocs/op 1.00
BenchmarkRPC/attach_large_document - ns/op 1343674668 ns/op 1479934941 ns/op 0.91
BenchmarkRPC/attach_large_document - B/op 1879540456 B/op 1890029520 B/op 0.99
BenchmarkRPC/attach_large_document - allocs/op 7567 allocs/op 7567 allocs/op 1
BenchmarkRPC/adminCli_to_server - ns/op 539018874 ns/op 537051132 ns/op 1.00
BenchmarkRPC/adminCli_to_server - B/op 35980580 B/op 36806452 B/op 0.98
BenchmarkRPC/adminCli_to_server - allocs/op 289644 allocs/op 289659 allocs/op 1.00
BenchmarkLocker - ns/op 64.29 ns/op 65.34 ns/op 0.98
BenchmarkLocker - B/op 16 B/op 16 B/op 1
BenchmarkLocker - allocs/op 1 allocs/op 1 allocs/op 1
BenchmarkLockerParallel - ns/op 39.1 ns/op 38.48 ns/op 1.02
BenchmarkLockerParallel - B/op 0 B/op 0 B/op NaN
BenchmarkLockerParallel - allocs/op 0 allocs/op 0 allocs/op NaN
BenchmarkLockerMoreKeys - ns/op 153 ns/op 145.1 ns/op 1.05
BenchmarkLockerMoreKeys - B/op 15 B/op 15 B/op 1
BenchmarkLockerMoreKeys - allocs/op 0 allocs/op 0 allocs/op NaN
BenchmarkChange/Push_10_Changes - ns/op 3797662 ns/op 3768343 ns/op 1.01
BenchmarkChange/Push_10_Changes - B/op 125974 B/op 126223 B/op 1.00
BenchmarkChange/Push_10_Changes - allocs/op 1254 allocs/op 1254 allocs/op 1
BenchmarkChange/Push_100_Changes - ns/op 14189744 ns/op 14005221 ns/op 1.01
BenchmarkChange/Push_100_Changes - B/op 645445 B/op 648654 B/op 1.00
BenchmarkChange/Push_100_Changes - allocs/op 6539 allocs/op 6539 allocs/op 1
BenchmarkChange/Push_1000_Changes - ns/op 113360231 ns/op 114047673 ns/op 0.99
BenchmarkChange/Push_1000_Changes - B/op 6182945 B/op 6036337 B/op 1.02
BenchmarkChange/Push_1000_Changes - allocs/op 62160 allocs/op 62157 allocs/op 1.00
BenchmarkChange/Pull_10_Changes - ns/op 2842158 ns/op 2839363 ns/op 1.00
BenchmarkChange/Pull_10_Changes - B/op 100540 B/op 100881 B/op 1.00
BenchmarkChange/Pull_10_Changes - allocs/op 952 allocs/op 952 allocs/op 1
BenchmarkChange/Pull_100_Changes - ns/op 4323908 ns/op 4308547 ns/op 1.00
BenchmarkChange/Pull_100_Changes - B/op 257431 B/op 258255 B/op 1.00
BenchmarkChange/Pull_100_Changes - allocs/op 3154 allocs/op 3154 allocs/op 1
BenchmarkChange/Pull_1000_Changes - ns/op 8445087 ns/op 8372656 ns/op 1.01
BenchmarkChange/Pull_1000_Changes - B/op 1397447 B/op 1396187 B/op 1.00
BenchmarkChange/Pull_1000_Changes - allocs/op 26874 allocs/op 26871 allocs/op 1.00
BenchmarkSnapshot/Push_3KB_snapshot - ns/op 16703375 ns/op 16777319 ns/op 1.00
BenchmarkSnapshot/Push_3KB_snapshot - B/op 809600 B/op 809995 B/op 1.00
BenchmarkSnapshot/Push_3KB_snapshot - allocs/op 6540 allocs/op 6542 allocs/op 1.00
BenchmarkSnapshot/Push_30KB_snapshot - ns/op 117930573 ns/op 117069671 ns/op 1.01
BenchmarkSnapshot/Push_30KB_snapshot - B/op 6246922 B/op 6250016 B/op 1.00
BenchmarkSnapshot/Push_30KB_snapshot - allocs/op 62162 allocs/op 62161 allocs/op 1.00
BenchmarkSnapshot/Pull_3KB_snapshot - ns/op 6648512 ns/op 6563310 ns/op 1.01
BenchmarkSnapshot/Pull_3KB_snapshot - B/op 905327 B/op 905174 B/op 1.00
BenchmarkSnapshot/Pull_3KB_snapshot - allocs/op 14883 allocs/op 14882 allocs/op 1.00
BenchmarkSnapshot/Pull_30KB_snapshot - ns/op 15183531 ns/op 15000336 ns/op 1.01
BenchmarkSnapshot/Pull_30KB_snapshot - B/op 6986811 B/op 6977754 B/op 1.00
BenchmarkSnapshot/Pull_30KB_snapshot - allocs/op 144146 allocs/op 144148 allocs/op 1.00
BenchmarkSync/memory_sync_10_test - ns/op 6830 ns/op 6824 ns/op 1.00
BenchmarkSync/memory_sync_10_test - B/op 1286 B/op 1286 B/op 1
BenchmarkSync/memory_sync_10_test - allocs/op 38 allocs/op 38 allocs/op 1
BenchmarkSync/memory_sync_100_test - ns/op 52307 ns/op 51635 ns/op 1.01
BenchmarkSync/memory_sync_100_test - B/op 8674 B/op 8659 B/op 1.00
BenchmarkSync/memory_sync_100_test - allocs/op 275 allocs/op 274 allocs/op 1.00
BenchmarkSync/memory_sync_1000_test - ns/op 591412 ns/op 582724 ns/op 1.01
BenchmarkSync/memory_sync_1000_test - B/op 74459 B/op 74925 B/op 0.99
BenchmarkSync/memory_sync_1000_test - allocs/op 2119 allocs/op 2141 allocs/op 0.99
BenchmarkSync/memory_sync_10000_test - ns/op 6988331 ns/op 7320373 ns/op 0.95
BenchmarkSync/memory_sync_10000_test - B/op 767663 B/op 761425 B/op 1.01
BenchmarkSync/memory_sync_10000_test - allocs/op 20681 allocs/op 20593 allocs/op 1.00
BenchmarkTextEditing - ns/op 18366768157 ns/op 18585017456 ns/op 0.99
BenchmarkTextEditing - B/op 9041679616 B/op 9037385240 B/op 1.00
BenchmarkTextEditing - allocs/op 19921525 allocs/op 19920435 allocs/op 1.00

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.