Skip to content

Commit

Permalink
Adapt MongoDB interface
Browse files Browse the repository at this point in the history
  • Loading branch information
realsuayip committed Nov 24, 2022
1 parent 10b111e commit d68a5ee
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 37 deletions.
38 changes: 20 additions & 18 deletions conlib.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,22 @@ package main

import (
"fmt"
"github.com/google/uuid"
"go.mongodb.org/mongo-driver/bson/primitive"
"time"
)

type Branch struct {
UUID string
Data ArbitraryData
ReplacedBy []string // List of UUID strings
StartAt, EndAt, CreatedAt time.Time
ID primitive.ObjectID `bson:"_id" json:"_id"`
Data ArbitraryData `bson:"data" json:"data"`
ReplacedBy []primitive.ObjectID `bson:"replaced_by" json:"replaced_by"`
StartAt time.Time `bson:"start_at" json:"start_at"`
EndAt time.Time `bson:"end_at" json:"end_at"`
CreatedAt time.Time `bson:"created_at" json:"created_at"`
}

func NewBranch(StartAt, EndAt time.Time, Data ArbitraryData) *Branch {
return &Branch{
UUID: uuid.New().String(),
ID: primitive.NewObjectID(),
Data: Data,
StartAt: StartAt.Truncate(time.Second),
EndAt: EndAt.Truncate(time.Second),
Expand All @@ -28,13 +30,13 @@ func (b *Branch) Span() time.Duration {
}

func (b *Branch) String() string {
var replacedBy []string
var replacedBy []primitive.ObjectID
for _, item := range b.ReplacedBy {
replacedBy = append(replacedBy, item[0:8])
replacedBy = append(replacedBy, item)
}
return fmt.Sprintf(
"<Branch %-10s StartAt=%-22s EndAt=%-22s Span=%-14s Data=%s ReplacedBy=%s>",
b.UUID[0:8],
b.ID,
b.StartAt.Format(time.RFC3339),
b.EndAt.Format(time.RFC3339),
duration(b.Span()),
Expand All @@ -43,15 +45,15 @@ func (b *Branch) String() string {
}

type Contract struct {
UUID string
Meta ArbitraryData
Items []*Branch
CreatedAt time.Time
ID primitive.ObjectID `bson:"_id" json:"_id"`
Meta ArbitraryData `bson:"meta" json:"meta"`
Items []*Branch `bson:"items" json:"items"`
CreatedAt time.Time `bson:"created_at" json:"created_at"`
}

func NewContract(StartAt, EndAt time.Time, Data ArbitraryData, Meta ArbitraryData) *Contract {
return &Contract{
UUID: uuid.New().String(),
ID: primitive.NewObjectID(),
Meta: Meta,
Items: []*Branch{NewBranch(StartAt, EndAt, Data)},
CreatedAt: time.Now().UTC(),
Expand All @@ -60,7 +62,7 @@ func NewContract(StartAt, EndAt time.Time, Data ArbitraryData, Meta ArbitraryDat

func (c *Contract) Contains(branch *Branch) bool {
for _, item := range c.Items {
if item.UUID == branch.UUID {
if item.ID == branch.ID {
return true
}
}
Expand All @@ -73,20 +75,20 @@ func (c *Contract) Shift(old, new *Branch, replace bool) {
}

if replace {
old.ReplacedBy = append(old.ReplacedBy, new.UUID)
old.ReplacedBy = append(old.ReplacedBy, new.ID)
}
}

func (c *Contract) ResolveDataref(b *Branch) ArbitraryData {
if ref, exists := b.Data["_ref"]; exists {
for _, branch := range c.Items {
if ref == branch.UUID {
if ref == branch.ID {
return c.ResolveDataref(branch)
}
}
}
return ArbitraryData{
"_ref": b.UUID,
"_ref": b.ID,
}
}

Expand Down
32 changes: 16 additions & 16 deletions conlib_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ func TestBranchLeft(t *testing.T) {
require.Equal(t, 3, len(items))
require.Equal(t, branch, head)

require.Contains(t, initial.ReplacedBy, left.UUID)
require.Contains(t, initial.ReplacedBy, head.UUID)
require.Contains(t, initial.ReplacedBy, left.ID)
require.Contains(t, initial.ReplacedBy, head.ID)

require.Empty(t, left.ReplacedBy)
require.Empty(t, head.ReplacedBy)
Expand All @@ -64,7 +64,7 @@ func TestBranchLeft(t *testing.T) {
require.Equal(t, time.Hour*24*(365-45), head.Span())

require.Equal(t, ArbitraryData{"key": "world"}, initial.Data)
require.Equal(t, ArbitraryData{"_ref": initial.UUID}, left.Data)
require.Equal(t, ArbitraryData{"_ref": initial.ID}, left.Data)
require.Equal(t, ArbitraryData{"key": "venus"}, head.Data)
}

Expand All @@ -81,8 +81,8 @@ func TestBranchRight(t *testing.T) {
require.Equal(t, 3, len(items))
require.Equal(t, branch, head)

require.Contains(t, initial.ReplacedBy, right.UUID)
require.Contains(t, initial.ReplacedBy, head.UUID)
require.Contains(t, initial.ReplacedBy, right.ID)
require.Contains(t, initial.ReplacedBy, head.ID)

require.Empty(t, right.ReplacedBy)
require.Empty(t, head.ReplacedBy)
Expand All @@ -93,7 +93,7 @@ func TestBranchRight(t *testing.T) {

require.Equal(t, ArbitraryData{"key": "world"}, initial.Data)
require.Equal(t, ArbitraryData{"key": "venus"}, head.Data)
require.Equal(t, ArbitraryData{"_ref": initial.UUID}, right.Data)
require.Equal(t, ArbitraryData{"_ref": initial.ID}, right.Data)
}

func TestBranchLeftRight(t *testing.T) {
Expand All @@ -109,9 +109,9 @@ func TestBranchLeftRight(t *testing.T) {
require.Equal(t, 4, len(items))
require.Equal(t, branch, head)

require.Contains(t, initial.ReplacedBy, left.UUID)
require.Contains(t, initial.ReplacedBy, head.UUID)
require.Contains(t, initial.ReplacedBy, right.UUID)
require.Contains(t, initial.ReplacedBy, left.ID)
require.Contains(t, initial.ReplacedBy, head.ID)
require.Contains(t, initial.ReplacedBy, right.ID)

require.Empty(t, left.ReplacedBy)
require.Empty(t, head.ReplacedBy)
Expand All @@ -123,9 +123,9 @@ func TestBranchLeftRight(t *testing.T) {
require.Equal(t, time.Hour*24*(365-45), right.Span())

require.Equal(t, ArbitraryData{"key": "world"}, initial.Data)
require.Equal(t, ArbitraryData{"_ref": initial.UUID}, left.Data)
require.Equal(t, ArbitraryData{"_ref": initial.ID}, left.Data)
require.Equal(t, ArbitraryData{"key": "venus"}, head.Data)
require.Equal(t, ArbitraryData{"_ref": initial.UUID}, right.Data)
require.Equal(t, ArbitraryData{"_ref": initial.ID}, right.Data)
}

func TestContractBranchSpansNothing(t *testing.T) {
Expand All @@ -152,7 +152,7 @@ func TestContractBranchSpanDateOutOfBoundary(t *testing.T) {

items := contract.Items
head, head1 := items[0], items[1]
require.Contains(t, head.ReplacedBy, head1.UUID)
require.Contains(t, head.ReplacedBy, head1.ID)
require.True(t, head1.StartAt.Before(head.StartAt))
}

Expand Down Expand Up @@ -184,13 +184,13 @@ func TestContract_ResolveDataref(t *testing.T) {

require.Equal(t, ArbitraryData{"key": "world"}, m0.Data)

require.Equal(t, ArbitraryData{"_ref": m0.UUID}, l1.Data)
require.Equal(t, ArbitraryData{"_ref": m0.ID}, l1.Data)
require.Equal(t, ArbitraryData{"key": "venus"}, m1.Data)
require.Equal(t, ArbitraryData{"_ref": m0.UUID}, r1.Data)
require.Equal(t, ArbitraryData{"_ref": m0.ID}, r1.Data)

require.Equal(t, ArbitraryData{"_ref": m1.UUID}, l2.Data)
require.Equal(t, ArbitraryData{"_ref": m1.ID}, l2.Data)
require.Equal(t, ArbitraryData{"key": "jupiter"}, m2.Data)
require.Equal(t, ArbitraryData{"_ref": m1.UUID}, r2.Data)
require.Equal(t, ArbitraryData{"_ref": m1.ID}, r2.Data)

require.Equal(t, ArbitraryData{"key": "mars"}, m3.Data)
}
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ module goProject
go 1.19

require (
github.com/google/uuid v1.3.0
github.com/stretchr/testify v1.8.0
go.mongodb.org/mongo-driver v1.11.0
)

require (
Expand Down
29 changes: 27 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,47 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
go.mongodb.org/mongo-driver v1.11.0 h1:FZKhBSTydeuffHj9CBjXlR8vQLee1cQyTWYPA6/tqiE=
go.mongodb.org/mongo-driver v1.11.0/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
Expand Down

0 comments on commit d68a5ee

Please sign in to comment.