Skip to content

Commit

Permalink
various updates
Browse files Browse the repository at this point in the history
  • Loading branch information
matthewpeterkort committed Dec 24, 2024
1 parent f6d37a3 commit bf7649d
Show file tree
Hide file tree
Showing 9 changed files with 2,020 additions and 1,150 deletions.
5 changes: 0 additions & 5 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ github.com/99designs/gqlgen v0.17.60/go.mod h1:vQJzWXyGya2TYL7cig1G4OaCQzyck031M
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/PuerkitoBio/goquery v1.9.3 h1:mpJr/ikUA9/GNJB/DBZcGeFDXUtosHRyRrwh7KGdTG0=
github.com/PuerkitoBio/goquery v1.9.3/go.mod h1:1ndLHPdTz+DyQPICCWYlYQMPl0oXZj0G6D4LCYA6u4U=
github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
github.com/agnivade/levenshtein v1.2.0 h1:U9L4IOT0Y3i0TIlUIDJ7rVUziKi/zPbrJGaFrtYH3SY=
github.com/agnivade/levenshtein v1.2.0/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU=
github.com/akuity/grpc-gateway-client v0.0.0-20231116134900-80c401329778 h1:qj3+B4PU5AR2mBffDVXvP2d3hLCNDot28KKPWvQnOxs=
Expand Down Expand Up @@ -201,7 +200,6 @@ github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/segmentio/ksuid v1.0.4 h1:sBo2BdShXjmcugAMwjugoGUdUV0pcxY5mW4xKRn3v4c=
github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8=
github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
Expand Down Expand Up @@ -238,8 +236,6 @@ github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0
github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
github.com/urfave/cli/v2 v2.27.5 h1:WoHEJLdsXr6dDWoJgMq/CboDmyY/8HMMH1fTECbih+w=
github.com/urfave/cli/v2 v2.27.5/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ=
github.com/vektah/gqlparser v1.3.1 h1:8b0IcD3qZKWJQHSzynbDlrtP3IxVydZ2DZepCGofqfU=
github.com/vektah/gqlparser v1.3.1/go.mod h1:bkVf0FX+Stjg/MHnm8mEyubuaArhNEqfQhF+OTiAL74=
github.com/vektah/gqlparser/v2 v2.5.20 h1:kPaWbhBntxoZPaNdBaIPT1Kh0i1b/onb5kXgEdP5JCo=
github.com/vektah/gqlparser/v2 v2.5.20/go.mod h1:xMl+ta8a5M1Yo1A1Iwt/k7gSpscwSnHZdw7tfhEGfTM=
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
Expand Down Expand Up @@ -360,7 +356,6 @@ golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
Expand Down
2,763 changes: 1,739 additions & 1,024 deletions gql-gen/generated/exec.go

Large diffs are not rendered by default.

10 changes: 10 additions & 0 deletions gql-gen/gqlgen.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,13 @@ resolver:
package: graph
filename: graph/resolver.go
layout: single-file

omit_slice_element_pointers: true


#models:
# ObservationType:
# fields:
# focus:
# resolver: true

161 changes: 103 additions & 58 deletions gql-gen/graph/collectFields.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,37 +3,34 @@ package graph
import (
"context"
"fmt"
"reflect"
"strings"

"github.com/99designs/gqlgen/graphql"
"github.com/vektah/gqlparser/v2/ast"

"github.com/bmeg/grip/gripql"
"github.com/vektah/gqlparser/v2/ast"
)

type Resolver struct {
GripDb gripql.Client
Schema *ast.Schema
}

type objectMap struct {
edgeLabel map[string]map[string]struct{} // Maps vertex labels to edge names
edgeDstType map[string]map[string]string // Maps vertex labels and edge names to destination labels
type renderTree struct {
prevName string
moved bool
rFieldPaths map[string][]string
rTree map[string]interface{}
}

func (rt *renderTree) NewElement() string {
rName := fmt.Sprintf("f%d", len(rt.rNameTree))
rt.rNameTree[rName] = []string{}
rName := fmt.Sprintf("f%d", len(rt.rFieldPaths))
rt.rFieldPaths[rName] = []string{}
return rName
}

type renderTree struct {
prevName string
moved bool
rNameTree map[string][]string
}

func queryBuild(query **gripql.Query, selSet ast.SelectionSet, curElement string, rt *renderTree, parentPath string) {
// Recursively traverses AST and builds grip query and render field tree
func queryBuild(query **gripql.Query, selSet ast.SelectionSet, curElement string, rt *renderTree, parentPath string, currentTree map[string]any) {
// Recursively traverses AST and builds grip query, renders field tree
for _, s := range selSet {
switch sel := s.(type) {
case *ast.Field:
Expand All @@ -47,77 +44,125 @@ func queryBuild(query **gripql.Query, selSet ast.SelectionSet, curElement string
rt.moved = false
}
if sel.SelectionSet == nil {
rt.rNameTree[curElement] = append(rt.rNameTree[curElement], newParentPath)
// Full render paths can be stored, but all that is needed is the top level key names.
firstTerm := newParentPath
if dotIndex := strings.Index(newParentPath, "."); dotIndex != -1 {
firstTerm = newParentPath[:dotIndex]
}
exists := false
for _, term := range rt.rFieldPaths[curElement] {
if term == firstTerm {
exists = true
break
}
}
if !exists {
rt.rFieldPaths[curElement] = append(rt.rFieldPaths[curElement], firstTerm)
}
//rt.rFieldPaths[curElement] = append(rt.rFieldPaths[curElement], newParentPath)
currentTree[curElement] = rt.rFieldPaths[curElement]
} else {
queryBuild(query, sel.SelectionSet, curElement, rt, newParentPath)
queryBuild(query, sel.SelectionSet, curElement, rt, newParentPath, currentTree)
}
case *ast.InlineFragment:
elem := rt.NewElement()
if _, exists := currentTree[rt.prevName]; !exists {
currentTree[rt.prevName] = map[string]any{"__typename": sel.TypeCondition}
}
fragmentTree := currentTree[rt.prevName].(map[string]interface{})
//[sel.TypeCondition].(map[string]interface{})
*query = (*query).OutNull(rt.prevName + "_" + sel.TypeCondition[:len(sel.TypeCondition)-4]).As(elem)
queryBuild(query, sel.SelectionSet, elem, rt, "")
queryBuild(query, sel.SelectionSet, elem, rt, "", fragmentTree)
rt.moved = true
default:
panic(fmt.Errorf("unsupported type: %T", sel))
}
}
}

func (r *queryResolver) GetSelectedFieldsAst(ctx context.Context, sourceType string) {
func (r *queryResolver) GetSelectedFieldsAst(ctx context.Context, sourceType string) ([]any, error) {
resctx := graphql.GetFieldContext(ctx)
rt := &renderTree{
rNameTree: map[string][]string{"f0": []string{}},
rFieldPaths: map[string][]string{"f0": []string{}},
rTree: map[string]any{},
}
q := gripql.V().HasLabel(sourceType[:len(sourceType)-4]).As("f0")
queryBuild(&q, resctx.Field.Selections, "f0", rt, "", rt.rTree)

queryBuild(&q, resctx.Field.Selections, "f0", rt, "")
fmt.Println("QUERY AFTER: ", q)
fmt.Printf("RNAME TREE: %#v\n", rt.rNameTree)

/*render := map[string]any{}
for _, i := range rt.fields {
fmt.Println("I: ", i, "FIELDNAME: ", rt.fieldName)
render[i+"_gid"] = "$" + i + "._gid"
render[i+"_data"] = "$" + i //+ "._data"
fmt.Printf("RNAME TREE: %#v\n", rt.rFieldPaths)
fmt.Printf("R TREE: %#v\n", rt.rTree)

render := map[string]any{}
for checkpoint, paths := range rt.rFieldPaths {
render[checkpoint+"_gid"] = "$" + checkpoint + ".id"
for _, path := range paths {
render[path+"_data"] = "$" + checkpoint + "." + path
}
}

fmt.Printf("RENDER: %#v\n", render)
q = q.Render(render)*/
//fmt.Printf("RENDER: %#v\n", render)
q = q.Limit(10).Render(render)

_, err := r.GripDb.Traversal(context.Background(), &gripql.GraphQuery{Graph: "CALIPER", Query: q.Statements})
result, err := r.GripDb.Traversal(context.Background(), &gripql.GraphQuery{Graph: "CALIPER", Query: q.Statements})
if err != nil {
fmt.Printf("ERR: %s\n", err)
return nil, fmt.Errorf("Traversal Error: %s", err)
}

//out := []any{}
//for r := range result {
// values := r.GetRender().GetStructValue().AsMap()
// fmt.Println("VALUES: ", values)
//}
out := []any{}
for r := range result {
values := r.GetRender().GetStructValue().AsMap()
//fmt.Printf("VALUES: %#v\n", values)
data := buildOutputTree(rt.rTree, values)
fmt.Printf("DATA: %#v\n", data)
/*if entry, ok := data["focus"]; ok {
entry.(map[string]any)["__typename"] = "SpecimenType"
}*/
out = append(out, data)
}
return out, nil
}

/*data := map[string]map[string]any{}
for _, r := range rt.fields {
v := values[r+"_data"]
if d, ok := v.(map[string]any); ok {
d["id"] = values[r+"_gid"]
if d["id"] != "" {
data[r] = d
func buildOutputTree(renderTree map[string]interface{}, values map[string]interface{}) map[string]interface{} {
output := map[string]interface{}{}
for key, val := range renderTree {
switch v := val.(type) {
case []string:
for _, fieldPath := range v {
segments := strings.Split(fieldPath, ".")
current := output
for i := 0; i < len(segments)-1; i++ {
//fmt.Println("CURRENT: ", current, "SEGMENTS[i]", segments[i])
//fmt.Println("VALUES: ", values)
if _, exists := current[segments[i]]; !exists {
current[segments[i]] = map[string]interface{}{}
}
current = current[segments[i]].(map[string]interface{})
}
lastSegment := segments[len(segments)-1]
fieldKey := fieldPath + "_data"
if renderedValue, exists := values[fieldKey]; exists {
current[lastSegment] = renderedValue
// if rendered value is string and render was not found return nil instead of string.
if reflect.TypeOf("$f") == reflect.TypeOf(renderedValue) && strings.HasPrefix(renderedValue.(string), "$f") {
current[lastSegment] = nil
}
} else {
current[lastSegment] = nil
}
}
}
}
for _, r := range rt.fields {
fmt.Println("RT PARENT: ", rt.parent, "R: ", r)
if parent, ok := rt.parent[r]; ok {
fieldName := rt.fieldName[r]
if data[r] != nil {
fmt.Println("HELLO 2 DATA?", data)
fmt.Println("HELLO 2 PARENT?", parent)
fmt.Println("HELLO 2 FIELD NAME?", fieldName)
fmt.Println("HELLO 2 data[r]?", data[r])
data[parent][fieldName] = []any{data[r]}
case map[string]interface{}:
output[key] = buildOutputTree(v, values)
case string:
if key == "__typename" {
output[key] = val
} else {
fmt.Printf("Unexpected type: %T\n", val)
}
default:
fmt.Printf("Unexpected type: %T\n", val)
}
}
fmt.Println("DATA: ", data)*/
//out = append(out, data["f0"])

return output
}
Loading

0 comments on commit bf7649d

Please sign in to comment.