From a2492ca65bf098650cbf34fa2194880db37f0e7e Mon Sep 17 00:00:00 2001 From: Aman Mangal Date: Thu, 20 Mar 2025 20:26:52 +0530 Subject: [PATCH] Add implementation for RunDQL for v25 --- dgraph/cmd/alpha/http.go | 2 +- dgraph/cmd/alpha/http_test.go | 2 +- dql/dql.go | 50 ++++++++++++++++++ dql/dql_test.go | 95 +++++++++++++++++++++++++++++++++++ dql/parser_mutation.go | 2 +- dql/parser_test.go | 6 +-- dql/state.go | 69 ++++++++++++------------- dql/upsert_test.go | 52 +++++++++---------- edgraph/alter.go | 5 ++ edgraph/namespace.go | 5 ++ edgraph/namespace_test.go | 81 +++++++++++------------------ edgraph/query.go | 90 +++++++++++++++++++++++++++++++++ go.mod | 2 +- go.sum | 4 +- 14 files changed, 339 insertions(+), 126 deletions(-) create mode 100644 dql/dql.go create mode 100644 dql/dql_test.go create mode 100644 edgraph/query.go diff --git a/dgraph/cmd/alpha/http.go b/dgraph/cmd/alpha/http.go index f69b3af74d8..5b996e1f742 100644 --- a/dgraph/cmd/alpha/http.go +++ b/dgraph/cmd/alpha/http.go @@ -402,7 +402,7 @@ func mutationHandler(w http.ResponseWriter, r *http.Request) { case "application/rdf": // Parse N-Quads. - req, err = dql.ParseMutation(string(body)) + req, err = dql.ParseDQL(string(body)) if err != nil { x.SetStatus(w, x.ErrorInvalidRequest, err.Error()) return diff --git a/dgraph/cmd/alpha/http_test.go b/dgraph/cmd/alpha/http_test.go index 67e67367398..5fade786ec2 100644 --- a/dgraph/cmd/alpha/http_test.go +++ b/dgraph/cmd/alpha/http_test.go @@ -934,7 +934,7 @@ func TestContentTypeCharset(t *testing.T) { require.True(t, err != nil && strings.Contains(err.Error(), "Unsupported charset")) _, err = mutationWithTs( - mutationInp{body: `{}`, typ: "application/rdf; charset=utf-8", commitNow: true}) + mutationInp{body: `{ set {_:a "alice" .}}`, typ: "application/rdf; charset=utf-8", commitNow: true}) require.NoError(t, err) _, err = mutationWithTs( diff --git a/dql/dql.go b/dql/dql.go new file mode 100644 index 00000000000..58ba9c8abc8 --- /dev/null +++ b/dql/dql.go @@ -0,0 +1,50 @@ +/* + * SPDX-FileCopyrightText: Hypermode Inc. + * SPDX-License-Identifier: Apache-2.0 + */ + +package dql + +import ( + "github.com/dgraph-io/dgo/v240/protos/api" + + "github.com/hypermodeinc/dgraph/v24/lex" +) + +func ParseDQL(dqlQuery string) (*api.Request, error) { + var lexer lex.Lexer + lexer.Reset(dqlQuery) + lexer.Run(lexTopLevel) + if err := lexer.ValidateResult(); err != nil { + return nil, err + } + + it := lexer.NewIterator() + if !it.Next() { + return nil, it.Errorf("Invalid mutation") + } + + item := it.Item() + switch item.Typ { + case itemUpsertBlock: + it.Prev() + return parseUpsertBlock(it) + + default: + it.Next() + item = it.Item() + if item.Typ == itemMutationOp { + it.Prev() + it.Prev() + mu, err := parseMutationBlock(it) + if err != nil { + return nil, err + } + return &api.Request{Mutations: []*api.Mutation{mu}}, nil + } + + it.Prev() + it.Prev() + return &api.Request{Query: dqlQuery}, nil + } +} diff --git a/dql/dql_test.go b/dql/dql_test.go new file mode 100644 index 00000000000..4d21f1ed827 --- /dev/null +++ b/dql/dql_test.go @@ -0,0 +1,95 @@ +/* + * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-License-Identifier: Apache-2.0 + */ + +package dql + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestParseDQL(t *testing.T) { + testCases := []string{ + `{ set {_:a "Alice" .}}`, + "schema{}", + `upsert { + query { + ns(func: eq(dgraph.namespace.name, "ns1")) { + q as var + dgraph.namespace.id + } + } + + mutation { + delete { + uid(q) * * . + } + } + }`, + `{ + q(func: eq(dgraph.namespace.name, "ns1")) { + uid + dgraph.type + dgraph.namespace.id + } + }`, + ` query test($a: int) { + q(func: uid(0x1)) { + x as count(uid) + p : math(x + $a) + } + }`, + `{ + me(func: uid(1)) { + Upvote { + u as Author + } + count(val(u)) + } + }`, + `{ + user(func: uid(0x0a)) { + ...fragmenta,...fragmentb + friends { + name + } + ...fragmentc + hobbies + ...fragmentd + } + me(func: uid(0x01)) { + ...fragmenta + ...fragmentb + } + } + fragment fragmenta { + name + } + fragment fragmentb { + id + } + fragment fragmentc { + name + } + fragment fragmentd { + id + }`, + `{ + set { + . + . + } + delete { + . + } + }`, + } + + for _, tc := range testCases { + _, err := ParseDQL(tc) + require.NoError(t, err) + } +} diff --git a/dql/parser_mutation.go b/dql/parser_mutation.go index 13f76c8c20d..ca90c95f867 100644 --- a/dql/parser_mutation.go +++ b/dql/parser_mutation.go @@ -15,7 +15,7 @@ import ( func ParseMutation(mutation string) (req *api.Request, err error) { var lexer lex.Lexer lexer.Reset(mutation) - lexer.Run(lexIdentifyBlock) + lexer.Run(lexTopLevel) if err := lexer.ValidateResult(); err != nil { return nil, err } diff --git a/dql/parser_test.go b/dql/parser_test.go index 166727f7315..7e323c893fc 100644 --- a/dql/parser_test.go +++ b/dql/parser_test.go @@ -1960,7 +1960,7 @@ func TestParseMutationError(t *testing.T) { ` _, err := ParseMutation(query) require.Error(t, err) - require.Contains(t, err.Error(), `Invalid block: [mutation]`) + require.Contains(t, err.Error(), `Unexpected token: [mutation]`) } func TestParseMutationError2(t *testing.T) { @@ -1975,7 +1975,7 @@ func TestParseMutationError2(t *testing.T) { ` _, err := ParseMutation(query) require.Error(t, err) - require.Contains(t, err.Error(), `Invalid block: [set]`) + require.Contains(t, err.Error(), `Invalid operation type: set`) } func TestParseMutationAndQueryWithComments(t *testing.T) { @@ -4809,7 +4809,7 @@ func TestParseMutationTooManyBlocks(t *testing.T) { }{ set { _:b2 "b2 content" . } }`, - errStr: "Unrecognized character in lexText", + errStr: "Unexpected { after the end of the block", }, {m: `{set { _:a1 "a1 content" . }} something`, errStr: "Invalid operation type: something", diff --git a/dql/state.go b/dql/state.go index 301396de1a1..e3a8d19f169 100644 --- a/dql/state.go +++ b/dql/state.go @@ -55,43 +55,6 @@ const ( itemStar ) -// lexIdentifyBlock identifies whether it is an upsert block -// If the block begins with "{" => mutation block -// Else if the block begins with "upsert" => upsert block -func lexIdentifyBlock(l *lex.Lexer) lex.StateFn { - l.Mode = lexIdentifyBlock - for { - switch r := l.Next(); { - case isSpace(r) || lex.IsEndOfLine(r): - l.Ignore() - case isNameBegin(r): - return lexNameBlock - case r == leftCurl: - l.Backup() - return lexInsideMutation - case r == '#': - return lexComment - case r == lex.EOF: - return l.Errorf("Invalid mutation block") - default: - return l.Errorf("Unexpected character while identifying mutation block: %#U", r) - } - } -} - -// lexNameBlock lexes the blocks, for now, only upsert block -func lexNameBlock(l *lex.Lexer) lex.StateFn { - // The caller already checked isNameBegin, and absorbed one rune. - l.AcceptRun(isNameSuffix) - switch word := l.Input[l.Start:l.Pos]; word { - case "upsert": - l.Emit(itemUpsertBlock) - return lexUpsertBlock - default: - return l.Errorf("Invalid block: [%s]", word) - } -} - // lexUpsertBlock lexes the upsert block func lexUpsertBlock(l *lex.Lexer) lex.StateFn { l.Mode = lexUpsertBlock @@ -368,7 +331,7 @@ Loop: case r == leftCurl: l.Depth++ // one level down. l.Emit(itemLeftCurl) - return lexQuery + return lexIdentifyMutationOrQuery case r == rightCurl: return l.Errorf("Too many right curl") case r == lex.EOF: @@ -396,6 +359,33 @@ Loop: return nil } +func lexIdentifyMutationOrQuery(l *lex.Lexer) lex.StateFn { + l.Mode = lexIdentifyMutationOrQuery + for { + switch r := l.Next(); { + case isSpace(r) || lex.IsEndOfLine(r): + l.Ignore() + case isNameBegin(r): + l.AcceptRun(isNameSuffix) + op := l.Input[l.Start:l.Pos] + // If it is a mutation + if op == "set" || op == "delete" || op == "del" { + l.Emit(itemMutationOp) + return lexInsideMutation + } + // else it is a query + l.Emit(itemName) + return lexQuery + case r == '#': + return lexComment + case r == lex.EOF: + return l.Errorf("Invalid DQL") + default: + return l.Errorf("Unexpected character while lexing DQL: %#U", r) + } + } +} + // lexQuery lexes the input string and calls other lex functions. func lexQuery(l *lex.Lexer) lex.StateFn { l.Mode = lexQuery @@ -592,6 +582,9 @@ func lexOperationType(l *lex.Lexer) lex.StateFn { case "schema": l.Emit(itemOpType) return lexInsideSchema + case "upsert": + l.Emit(itemUpsertBlock) + return lexUpsertBlock default: return l.Errorf("Invalid operation type: %s", word) } diff --git a/dql/upsert_test.go b/dql/upsert_test.go index 9cb32b80565..d14b987b94c 100644 --- a/dql/upsert_test.go +++ b/dql/upsert_test.go @@ -22,9 +22,8 @@ query { } } }` - _, err := ParseMutation(query) - require.Error(t, err) - require.Contains(t, err.Error(), "Invalid block: [query]") + _, err := ParseDQL(query) + require.NoError(t, err) } func TestExtraRightCurlErr(t *testing.T) { @@ -42,7 +41,7 @@ upsert { } } ` - _, err := ParseMutation(query) + _, err := ParseDQL(query) require.Error(t, err) require.Contains(t, err.Error(), "Too many right curl") } @@ -60,7 +59,7 @@ upsert { } } ` - _, err := ParseMutation(query) + _, err := ParseDQL(query) require.Error(t, err) require.Contains(t, err.Error(), "Empty mutation block") } @@ -95,21 +94,21 @@ upsert { } } ` - _, err := ParseMutation(query) + _, err := ParseDQL(query) require.Error(t, err) require.Contains(t, err.Error(), "Multiple query ops inside upsert block") } func TestEmptyUpsertErr(t *testing.T) { query := `upsert {}` - _, err := ParseMutation(query) + _, err := ParseDQL(query) require.Error(t, err) require.Contains(t, err.Error(), "Empty mutation block") } func TestNoRightCurlErr(t *testing.T) { query := `upsert {` - _, err := ParseMutation(query) + _, err := ParseDQL(query) require.Contains(t, err.Error(), "Unclosed upsert block") } @@ -125,7 +124,7 @@ upsert { query { me(func: eq(age, "{ ` - _, err := ParseMutation(query) + _, err := ParseDQL(query) require.Error(t, err) require.Contains(t, err.Error(), "Unexpected end of input") } @@ -140,7 +139,7 @@ upsert { } } ` - _, err := ParseMutation(query) + _, err := ParseDQL(query) require.Error(t, err) require.Contains(t, err.Error(), "Query op not found in upsert block") } @@ -169,7 +168,7 @@ upsert { } } ` - _, err := ParseMutation(query) + _, err := ParseDQL(query) require.NoError(t, err) } @@ -193,7 +192,7 @@ upsert { } } ` - _, err := ParseMutation(query) + _, err := ParseDQL(query) require.NoError(t, err) } @@ -226,7 +225,7 @@ upsert }} } ` - _, err := ParseMutation(query) + _, err := ParseDQL(query) require.NoError(t, err) } @@ -250,7 +249,7 @@ upsert { } } ` - _, err := ParseMutation(query) + _, err := ParseDQL(query) require.NoError(t, err) } @@ -274,7 +273,7 @@ upsert { } } ` - _, err := ParseMutation(query) + _, err := ParseDQL(query) require.NoError(t, err) } @@ -297,9 +296,8 @@ upsert { uid(b) "45" . } } -} -` - _, err := ParseMutation(query) +}` + _, err := ParseDQL(query) require.NoError(t, err) } @@ -326,7 +324,7 @@ upsert { } } ` - _, err := ParseMutation(query) + _, err := ParseDQL(query) require.NoError(t, err) } @@ -355,7 +353,7 @@ upsert { } } ` - _, err := ParseMutation(query) + _, err := ParseDQL(query) require.NoError(t, err) } @@ -384,7 +382,7 @@ upsert { } } ` - _, err := ParseMutation(query) + _, err := ParseDQL(query) require.NoError(t, err) } @@ -411,21 +409,21 @@ upsert { } } ` - _, err := ParseMutation(query) + _, err := ParseDQL(query) require.Contains(t, err.Error(), "Matching brackets not found") } func TestConditionalUpsertErrUnclosed(t *testing.T) { query := `upsert { mutation @if(eq(len(m), 1) AND gt(len(f), 0))` - _, err := ParseMutation(query) + _, err := ParseDQL(query) require.Contains(t, err.Error(), "Unclosed mutation action") } func TestConditionalUpsertErrInvalidIf(t *testing.T) { query := `upsert { mutation @if` - _, err := ParseMutation(query) + _, err := ParseDQL(query) require.Contains(t, err.Error(), "Matching brackets not found") } @@ -453,7 +451,7 @@ func TestConditionalUpsertErrWrongIf(t *testing.T) { } } ` - _, err := ParseMutation(query) + _, err := ParseDQL(query) require.Contains(t, err.Error(), "Expected @if, found [@fi]") } @@ -484,7 +482,7 @@ upsert { } } }` - req, err := ParseMutation(query) + req, err := ParseDQL(query) require.NoError(t, err) require.Equal(t, 3, len(req.Mutations)) } @@ -516,7 +514,7 @@ upsert { } } }` - req, err := ParseMutation(query) + req, err := ParseDQL(query) require.NoError(t, err) require.Equal(t, 3, len(req.Mutations)) } diff --git a/edgraph/alter.go b/edgraph/alter.go index bb8cd34e3ae..2dfd89ea556 100644 --- a/edgraph/alter.go +++ b/edgraph/alter.go @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-License-Identifier: Apache-2.0 + */ + package edgraph import ( diff --git a/edgraph/namespace.go b/edgraph/namespace.go index cc34261ca92..243b65744bc 100644 --- a/edgraph/namespace.go +++ b/edgraph/namespace.go @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-License-Identifier: Apache-2.0 + */ + package edgraph import ( diff --git a/edgraph/namespace_test.go b/edgraph/namespace_test.go index e82adc1c477..0efb8907cce 100644 --- a/edgraph/namespace_test.go +++ b/edgraph/namespace_test.go @@ -36,66 +36,47 @@ func TestNamespaces(t *testing.T) { require.NoError(t, client.CreateNamespace(ctx, "ns2")) // namespace 1 - // require.NoError(t, client.LoginToNamespace(context.Background(), - // "ns1", dgraphapi.DefaultUser, dgraphapi.DefaultPassword)) - // require.NoError(t, client.SetupSchema(`name: string @index(exact) .`)) - // _, err = client.Mutate(&api.Mutation{ - // SetNquads: []byte(`_:a "Alice" .`), - // CommitNow: true, - // }) - // require.NoError(t, err) - // resp, err := client.Query(`{ q(func: has(name)) { name } }`) - // require.NoError(t, err) - // require.JSONEq(t, `{"q":[{"name":"Alice"}]}`, string(resp.GetJson())) + require.NoError(t, client.SetSchema(ctx, "ns1", `name: string @index(exact) .`)) + resp, err := client.RunDQL(ctx, "ns1", `{ set {_:a "Alice" .}}`) + require.NoError(t, err) + require.Equal(t, 1, len(resp.BlankUids)) + resp, err = client.RunDQL(ctx, "ns1", `{ q(func: has(name)) { name } }`) + require.NoError(t, err) + require.JSONEq(t, `{"q":[{"name":"Alice"}]}`, string(resp.GetQueryResult())) // namespace 2 - // require.NoError(t, client.LoginToNamespace(context.Background(), - // "ns2", dgraphapi.DefaultUser, dgraphapi.DefaultPassword)) - // require.NoError(t, client.SetupSchema(`name: string @index(exact) .`)) - // _, err = client.Mutate(&api.Mutation{ - // SetNquads: []byte(`_:a "Bob" .`), - // CommitNow: true, - // }) - // require.NoError(t, err) - // resp, err = client.Query(`{ q(func: has(name)) { name } }`) - // require.NoError(t, err) - // require.JSONEq(t, `{"q":[{"name":"Bob"}]}`, string(resp.GetJson())) + require.NoError(t, client.SetSchema(ctx, "ns2", `name: string @index(exact) .`)) + _, err = client.RunDQL(ctx, "ns2", `{ set {_:a "Bob" .}}`) + require.NoError(t, err) + resp, err = client.RunDQL(ctx, "ns2", `{ q(func: has(name)) { name } }`) + require.NoError(t, err) + require.JSONEq(t, `{"q":[{"name":"Bob"}]}`, string(resp.GetQueryResult())) // rename ns2 namespace - require.NoError(t, client.SignInUser(context.Background(), - dgraphapi.DefaultUser, dgraphapi.DefaultPassword)) require.NoError(t, client.RenameNamespace(ctx, "ns2", "ns2-new")) // check if the data is still there - // require.NoError(t, client.LoginToNamespace(context.Background(), - // "ns2-new", dgraphapi.DefaultUser, dgraphapi.DefaultPassword)) - // resp, err = client.Query(`{ q(func: has(name)) { name } }`) - // require.NoError(t, err) - // require.JSONEq(t, `{"q":[{"name":"Bob"}]}`, string(resp.GetJson())) + resp, err = client.RunDQL(ctx, "ns2-new", `{ q(func: has(name)) { name } }`) + require.NoError(t, err) + require.JSONEq(t, `{"q":[{"name":"Bob"}]}`, string(resp.GetQueryResult())) // List Namespaces - require.NoError(t, client.SignInUser(context.Background(), - dgraphapi.DefaultUser, dgraphapi.DefaultPassword)) nsMaps, err := client.ListNamespaces(ctx) require.NoError(t, err) require.Len(t, nsMaps, 3) // drop ns2-new namespace require.NoError(t, client.DropNamespace(ctx, "ns2-new")) - // require.ErrorContains(t, client.LoginToNamespace(context.Background(), - // "ns2-new", dgraphapi.DefaultUser, dgraphapi.DefaultPassword), - // "invalid username or password") + _, err = client.RunDQL(ctx, "ns2-new", `{ q(func: has(name)) { name } }`) + require.ErrorContains(t, err, "namespace \"ns2-new\" not found") nsMaps, err = client.ListNamespaces(ctx) require.NoError(t, err) require.Len(t, nsMaps, 2) // drop ns1 namespace - require.NoError(t, client.SignInUser(context.Background(), - dgraphapi.DefaultUser, dgraphapi.DefaultPassword)) require.NoError(t, client.DropNamespace(ctx, "ns1")) - // require.ErrorContains(t, client.LoginToNamespace(context.Background(), - // "ns1", dgraphapi.DefaultUser, dgraphapi.DefaultPassword), - // "invalid username or password") + _, err = client.RunDQL(ctx, "ns1", `{ q(func: has(name)) { name } }`) + require.ErrorContains(t, err, "namespace \"ns1\" not found") } func TestNamespacesPreV25(t *testing.T) { @@ -159,19 +140,15 @@ func TestNamespacesPreV25(t *testing.T) { require.Contains(t, nsMaps, "ns3") // Add two pre v25 namespaces and ensure login works - // ns4, err := hc.AddNamespace() - // require.NoError(t, err) - // require.NoError(t, client.LoginToNamespace(context.Background(), - // fmt.Sprintf("dgraph-%v", ns4), dgraphapi.DefaultUser, dgraphapi.DefaultPassword)) - // require.NoError(t, client.SetupSchema(`name: string @index(exact) .`)) - // _, err = client.Mutate(&api.Mutation{ - // SetNquads: []byte(`_:a "Alice" .`), - // CommitNow: true, - // }) - // require.NoError(t, err) - // resp, err := client.Query(`{ q(func: has(name)) { name } }`) - // require.NoError(t, err) - // require.JSONEq(t, `{"q":[{"name":"Alice"}]}`, string(resp.GetJson())) + ns4ID, err := hc.AddNamespace() + require.NoError(t, err) + ns4 := fmt.Sprintf("dgraph-%v", ns4ID) + require.NoError(t, client.SetSchema(ctx, ns4, `name: string @index(exact) .`)) + _, err = client.RunDQL(ctx, ns4, `{set{_:a "Alice" .}}`) + require.NoError(t, err) + resp, err := client.RunDQL(ctx, ns4, `{ q(func: has(name)) { name } }`) + require.NoError(t, err) + require.JSONEq(t, `{"q":[{"name":"Alice"}]}`, string(resp.GetQueryResult())) } func TestCreateNamespaceErr(t *testing.T) { diff --git a/edgraph/query.go b/edgraph/query.go new file mode 100644 index 00000000000..c9388492e55 --- /dev/null +++ b/edgraph/query.go @@ -0,0 +1,90 @@ +/* + * SPDX-FileCopyrightText: © Hypermode Inc. + * SPDX-License-Identifier: Apache-2.0 + */ + +package edgraph + +import ( + "context" + "fmt" + + "github.com/dgraph-io/dgo/v240/protos/api" + apiv25 "github.com/dgraph-io/dgo/v240/protos/api.v25" + "github.com/hypermodeinc/dgraph/v24/dql" + "github.com/hypermodeinc/dgraph/v24/x" + + "google.golang.org/grpc/status" +) + +func (s *ServerV25) Ping(ctx context.Context, req *apiv25.PingRequest) (*apiv25.PingResponse, error) { + if err := x.HealthCheck(); err != nil { + return nil, err + } + + return &apiv25.PingResponse{Version: x.Version()}, nil +} + +// Alter handles requests to change the schema or remove parts or all of the data. +func (s *ServerV25) RunDQL(ctx context.Context, req *apiv25.RunDQLRequest) (*apiv25.RunDQLResponse, error) { + // For now, we only allow guardian of galaxies to do this operation in v25 + if err := AuthGuardianOfTheGalaxy(ctx); err != nil { + s := status.Convert(err) + return nil, status.Error(s.Code(), + "v25.RunDQL can only be called by the guardian of the galaxy. "+s.Message()) + } + + apiReq, err := dql.ParseDQL(req.DqlQuery) + if err != nil { + return nil, fmt.Errorf("error parsing DQL query: %w", err) + } + + nsID, err := getNamespaceIDFromName(x.AttachJWTNamespace(ctx), req.NsName) + if err != nil { + return nil, err + } + + if len(apiReq.Mutations) > 0 { + apiReq.CommitNow = true + apiReq.Vars = req.Vars + apiReq.ReadOnly = req.ReadOnly + apiReq.BestEffort = req.BestEffort + apiReq.RespFormat = api.Request_RespFormat(req.RespFormat) + } + + apiResp, err := (&Server{}).doQuery(x.AttachNamespace(ctx, nsID), + &Request{req: apiReq, doAuth: NoAuthorize}) + if err != nil { + return nil, err + } + + resp := &apiv25.RunDQLResponse{ + Txn: &apiv25.TxnContext{ + StartTs: apiResp.Txn.StartTs, + CommitTs: apiResp.Txn.CommitTs, + Aborted: apiResp.Txn.Aborted, + Keys: apiResp.Txn.Keys, + Preds: apiResp.Txn.Preds, + Hash: apiResp.Txn.Hash, + }, + BlankUids: apiResp.Uids, + Latency: &apiv25.Latency{ + ParsingNs: apiResp.Latency.ParsingNs, + ProcessingNs: apiResp.Latency.ProcessingNs, + RespEncodingNs: apiResp.Latency.EncodingNs, + AssignTimestampNs: apiResp.Latency.AssignTimestampNs, + TotalNs: apiResp.Latency.TotalNs, + }, + Metrics: &apiv25.Metrics{ + UidsTouched: apiResp.Metrics.NumUids, + }, + } + + if req.RespFormat == apiv25.RespFormat_JSON { + resp.QueryResult = apiResp.Json + } else if req.RespFormat == apiv25.RespFormat_RDF { + resp.QueryResult = apiResp.Rdf + } + + return resp, nil +} diff --git a/go.mod b/go.mod index d16d3a20ae0..bc5d23e3ea7 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/Masterminds/semver/v3 v3.3.1 github.com/blevesearch/bleve/v2 v2.4.4 github.com/dgraph-io/badger/v4 v4.6.0 - github.com/dgraph-io/dgo/v240 v240.1.1-0.20250313030749-bde409adcb52 + github.com/dgraph-io/dgo/v240 v240.1.1-0.20250320140028-4b86d6c8121d github.com/dgraph-io/gqlgen v0.13.2 github.com/dgraph-io/gqlparser/v2 v2.2.2 github.com/dgraph-io/graphql-transport-ws v0.0.0-20210511143556-2cef522f1f15 diff --git a/go.sum b/go.sum index c0c2693d24e..3e97224c54a 100644 --- a/go.sum +++ b/go.sum @@ -129,8 +129,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgraph-io/badger/v4 v4.6.0 h1:acOwfOOZ4p1dPRnYzvkVm7rUk2Y21TgPVepCy5dJdFQ= github.com/dgraph-io/badger/v4 v4.6.0/go.mod h1:KSJ5VTuZNC3Sd+YhvVjk2nYua9UZnnTr/SkXvdtiPgI= -github.com/dgraph-io/dgo/v240 v240.1.1-0.20250313030749-bde409adcb52 h1:k2Rj5jrnHUnGS9EWO8khhmpGg4S+W/bwt2NE2BeLShw= -github.com/dgraph-io/dgo/v240 v240.1.1-0.20250313030749-bde409adcb52/go.mod h1:CyEuwJgQ8NoNjWbj2ZnvVFPixe5akCbWPR1O0fHpQ+U= +github.com/dgraph-io/dgo/v240 v240.1.1-0.20250320140028-4b86d6c8121d h1:lYEAkYiSOv2mnh7ocInqI62YnfkjbxGdmd/0F2aGjCE= +github.com/dgraph-io/dgo/v240 v240.1.1-0.20250320140028-4b86d6c8121d/go.mod h1:CyEuwJgQ8NoNjWbj2ZnvVFPixe5akCbWPR1O0fHpQ+U= github.com/dgraph-io/gqlgen v0.13.2 h1:TNhndk+eHKj5qE7BenKKSYdSIdOGhLqxR1rCiMso9KM= github.com/dgraph-io/gqlgen v0.13.2/go.mod h1:iCOrOv9lngN7KAo+jMgvUPVDlYHdf7qDwsTkQby2Sis= github.com/dgraph-io/gqlparser/v2 v2.1.1/go.mod h1:MYS4jppjyx8b9tuUtjV7jU1UFZK6P9fvO8TsIsQtRKU=