Skip to content

Commit

Permalink
feat: Add support for cid-only time travel queries (#3256)
Browse files Browse the repository at this point in the history
## Relevant issue(s)

Resolves #3214

## Description

Adds support for cid-only time travel queries.

Also removes some dead code.
  • Loading branch information
AndrewSisley authored Nov 20, 2024
1 parent 27893cf commit c45b07e
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 40 deletions.
21 changes: 3 additions & 18 deletions internal/db/fetcher/versioned.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,33 +153,18 @@ func (vf *VersionedFetcher) Init(

// Start serializes the correct state according to the Key and CID.
func (vf *VersionedFetcher) Start(ctx context.Context, spans ...core.Span) error {
if vf.col == nil {
return client.NewErrUninitializeProperty("VersionedFetcher", "CollectionDescription")
}

if len(spans) != 1 {
return ErrSingleSpanOnly
}

// VersionedFetcher only ever recieves a headstore key
//nolint:forcetypeassert
prefix := spans[0].Start.(keys.HeadstoreDocKey)
dk := prefix.DocID
cid := prefix.Cid
if dk == "" {
return client.NewErrUninitializeProperty("Spans", "DocID")
} else if !cid.Defined() {
return client.NewErrUninitializeProperty("Spans", "CID")
}

vf.ctx = ctx
vf.dsKey = keys.DataStoreKey{
CollectionRootID: vf.col.Description().RootID,
DocID: dk,
DocID: prefix.DocID,
}

if err := vf.seekTo(cid); err != nil {
return NewErrFailedToSeek(cid, err)
if err := vf.seekTo(prefix.Cid); err != nil {
return NewErrFailedToSeek(prefix.Cid, err)
}

return vf.DocumentFetcher.Start(ctx)
Expand Down
13 changes: 9 additions & 4 deletions internal/planner/select.go
Original file line number Diff line number Diff line change
Expand Up @@ -255,19 +255,24 @@ func (n *selectNode) initSource() ([]aggregateNode, error) {
origScan.filter = n.filter
n.filter = nil

// If we have both a DocID and a CID, then we need to run
// a TimeTravel (History-Traversing Versioned) query, which means
// we need to propagate the values to the underlying VersionedFetcher
// If we have a CID, then we need to run a TimeTravel (History-Traversing Versioned)
// query, which means we need to propagate the values to the underlying VersionedFetcher
if n.selectReq.Cid.HasValue() {
c, err := cid.Decode(n.selectReq.Cid.Value())
if err != nil {
return nil, err
}

var docID string
if len(n.selectReq.DocIDs.Value()) > 0 {
docID = n.selectReq.DocIDs.Value()[0]
}

origScan.Spans(
[]core.Span{
core.NewSpan(
keys.HeadstoreDocKey{
DocID: n.selectReq.DocIDs.Value()[0],
DocID: docID,
Cid: c,
},
keys.HeadstoreDocKey{},
Expand Down
2 changes: 1 addition & 1 deletion internal/request/graphql/schema/descriptions.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ An optional set of docIDs for this field. Only documents with a docID
be ignored.
`
cidArgDescription string = `
An optional value that specifies the commit ID of the document to return.
An optional value that specifies the commit ID of a document to return.
This CID does not need to be the most recent for a document, if it
corresponds to an older version of a document the document will be returned
at the state it was in at the time of that commit. If a matching commit is
Expand Down
58 changes: 41 additions & 17 deletions tests/integration/query/simple/with_cid_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,6 @@ package simple
import (
"testing"

"github.com/sourcenetwork/immutable"
"github.com/stretchr/testify/require"

"github.com/sourcenetwork/defradb/tests/change_detector"
testUtils "github.com/sourcenetwork/defradb/tests/integration"
)

Expand Down Expand Up @@ -44,20 +40,45 @@ func TestQuerySimpleWithInvalidCid(t *testing.T) {
executeTestCase(t, test)
}

// This test documents a bug:
// https://github.com/sourcenetwork/defradb/issues/3214
func TestQuerySimpleWithCid(t *testing.T) {
if change_detector.Enabled {
t.Skipf("Change detector does not support requiring panics")
test := testUtils.TestCase{
Actions: []any{
testUtils.SchemaUpdate{
Schema: `
type Users {
name: String
}
`,
},
testUtils.CreateDoc{
Doc: `{
"name": "John"
}`,
},
testUtils.Request{
Request: `query {
Users (
cid: "bafyreib7afkd5hepl45wdtwwpai433bhnbd3ps5m2rv3masctda7b6mmxe"
) {
name
}
}`,
Results: map[string]any{
"Users": []map[string]any{
{
"name": "John",
},
},
},
},
},
}

testUtils.ExecuteTestCase(t, test)
}

func TestQuerySimpleWithCid_MultipleDocs(t *testing.T) {
test := testUtils.TestCase{
SupportedClientTypes: immutable.Some(
[]testUtils.ClientType{
// The CLI/Http clients don't panic in this context
testUtils.GoClientType,
},
),
Actions: []any{
testUtils.SchemaUpdate{
Schema: `
Expand All @@ -71,6 +92,11 @@ func TestQuerySimpleWithCid(t *testing.T) {
"name": "John"
}`,
},
testUtils.CreateDoc{
Doc: `{
"name": "Fred"
}`,
},
testUtils.Request{
Request: `query {
Users (
Expand All @@ -90,7 +116,5 @@ func TestQuerySimpleWithCid(t *testing.T) {
},
}

require.Panics(t, func() {
testUtils.ExecuteTestCase(t, test)
})
testUtils.ExecuteTestCase(t, test)
}

0 comments on commit c45b07e

Please sign in to comment.