From 11b8527910a86558adb061b19bcd41edc486e09b Mon Sep 17 00:00:00 2001 From: Eric Solender Date: Sun, 15 Dec 2019 11:35:33 -0500 Subject: [PATCH] efficiency improvement for saving nodes --- save.go | 92 ++++--- save_test.go | 9 +- testing_/integration_test.go | 47 ---- testing_/linking.go | 496 ----------------------------------- testing_/objs.go | 28 -- util.go | 2 +- util_test.go | 2 +- 7 files changed, 57 insertions(+), 619 deletions(-) delete mode 100644 testing_/integration_test.go delete mode 100644 testing_/objs.go diff --git a/save.go b/save.go index 0aa8676..2832a70 100644 --- a/save.go +++ b/save.go @@ -100,10 +100,11 @@ func saveDepth(sess *driver.BoltConn, obj interface{}, depth int) error { nodeRef := map[string]*reflect.Value{} newNodes := []*string{} + visited := []string{} rootVal := reflect.ValueOf(obj) - err := parseStruct("", "", false, 0, nil, &rootVal, 0, depth, &nodes, &relations, &oldRels, &newNodes, &nodeRef) + err := parseStruct("", "", false, dsl.DirectionBoth, nil, &rootVal, 0, depth, &nodes, &relations, &oldRels, &newNodes, &nodeRef, &visited) if err != nil { return err } @@ -604,7 +605,7 @@ func generateCurRels(parentId string, current *reflect.Value, currentDepth, maxD // parses tree of structs func parseStruct(parentId, edgeLabel string, parentIsStart bool, direction dsl.Direction, edgeParams map[string]interface{}, current *reflect.Value, currentDepth, maxDepth int, nodesPtr *map[string]map[string]nodeCreateConf, relationsPtr *map[string][]relCreateConf, oldRels *map[string]map[string]*RelationConfig, - newNodes *[]*string, nodeRef *map[string]*reflect.Value) error { + newNodes *[]*string, nodeRef *map[string]*reflect.Value, visited *[]string) error { //check if its done if currentDepth > maxDepth { return nil @@ -642,6 +643,42 @@ func parseStruct(parentId, edgeLabel string, parentIsStart bool, direction dsl.D return err } + //set edge + if parentId != "" && parentIsStart { + if _, ok := (*relationsPtr)[edgeLabel]; !ok { + (*relationsPtr)[edgeLabel] = []relCreateConf{} + } + + start := "" + end := "" + + //if parentIsStart { + start = parentId + end = id + //} else { + // start = id + // end = parentId + //} + + if edgeParams == nil { + edgeParams = map[string]interface{}{} + } + + (*relationsPtr)[edgeLabel] = append((*relationsPtr)[edgeLabel], relCreateConf{ + Direction: direction, + Params: edgeParams, + StartNodeUUID: start, + EndNodeUUID: end, + }) + } + + //check if this has been visited yet, do this after edge is intentional + if stringSliceContains(*visited, id) { + return nil + } else { + *visited = append(*visited, id) + } + if !isNewNode { if _, ok := (*oldRels)[id]; !ok { (*oldRels)[id] = relConf @@ -677,35 +714,6 @@ func parseStruct(parentId, edgeLabel string, parentIsStart bool, direction dsl.D Params: params, } - //set edge - if parentId != "" { - if _, ok := (*relationsPtr)[edgeLabel]; !ok { - (*relationsPtr)[edgeLabel] = []relCreateConf{} - } - - start := "" - end := "" - - if parentIsStart { - start = parentId - end = id - } else { - start = id - end = parentId - } - - if edgeParams == nil { - edgeParams = map[string]interface{}{} - } - - (*relationsPtr)[edgeLabel] = append((*relationsPtr)[edgeLabel], relCreateConf{ - Direction: direction, - Params: edgeParams, - StartNodeUUID: start, - EndNodeUUID: end, - }) - } - for _, conf := range currentConf.Fields { if conf.Relationship == "" { continue @@ -727,32 +735,32 @@ func parseStruct(parentId, edgeLabel string, parentIsStart bool, direction dsl.D for i := 0; i < slLen; i++ { relVal := relField.Index(i) - newParentId, newEdgeLabel, newParentIdStart, newDirection, newEdgeParams, followVal, _, skip, err := processStruct(conf, &relVal, id, parentId) + newParentId, newEdgeLabel, newParentIdStart, newDirection, newEdgeParams, followVal, _, _, err := processStruct(conf, &relVal, id, parentId) if err != nil { return err } - //makes us go backwards - if skip { - continue - } + ////makes us go backwards + //if skip { + // continue + //} - err = parseStruct(newParentId, newEdgeLabel, newParentIdStart, newDirection, newEdgeParams, followVal, currentDepth+1, maxDepth, nodesPtr, relationsPtr, oldRels, newNodes, nodeRef) + err = parseStruct(newParentId, newEdgeLabel, newParentIdStart, newDirection, newEdgeParams, followVal, currentDepth+1, maxDepth, nodesPtr, relationsPtr, oldRels, newNodes, nodeRef, visited) if err != nil { return err } } } else { - newParentId, newEdgeLabel, newParentIdStart, newDirection, newEdgeParams, followVal, _, skip, err := processStruct(conf, &relField, id, parentId) + newParentId, newEdgeLabel, newParentIdStart, newDirection, newEdgeParams, followVal, _, _, err := processStruct(conf, &relField, id, parentId) if err != nil { return err } - if skip { - continue - } + //if skip { + // continue + //} - err = parseStruct(newParentId, newEdgeLabel, newParentIdStart, newDirection, newEdgeParams, followVal, currentDepth+1, maxDepth, nodesPtr, relationsPtr, oldRels, newNodes, nodeRef) + err = parseStruct(newParentId, newEdgeLabel, newParentIdStart, newDirection, newEdgeParams, followVal, currentDepth+1, maxDepth, nodesPtr, relationsPtr, oldRels, newNodes, nodeRef, visited) if err != nil { return err } diff --git a/save_test.go b/save_test.go index 75526b7..55aa548 100644 --- a/save_test.go +++ b/save_test.go @@ -20,6 +20,7 @@ package gogm import ( + dsl "github.com/mindstand/go-cypherdsl" "github.com/stretchr/testify/require" "reflect" "testing" @@ -87,7 +88,7 @@ func parseO2O(req *require.Assertions) { val := reflect.ValueOf(comp1) nodeRef := map[string]*reflect.Value{} - req.Nil(parseStruct("", "", false, 0, nil, &val, 0, 5, &nodes, &relations, &oldRels, &ids, &nodeRef)) + req.Nil(parseStruct("", "", false, dsl.DirectionBoth, nil, &val, 0, 5, &nodes, &relations, &oldRels, &ids, &nodeRef, &[]string{})) req.Nil(generateCurRels("", &val, 0, 5, &curRels)) req.Equal(2, len(nodes)) req.Equal(1, len(nodes["a"])) @@ -144,7 +145,7 @@ func parseM2O(req *require.Assertions) { val := reflect.ValueOf(a1) nodeRef := map[string]*reflect.Value{} - req.Nil(parseStruct("", "", false, 0, nil, &val, 0, 5, &nodes, &relations, &oldRels, &ids, &nodeRef)) + req.Nil(parseStruct("", "", false, dsl.DirectionBoth, nil, &val, 0, 5, &nodes, &relations, &oldRels, &ids, &nodeRef, &[]string{})) req.Nil(generateCurRels("", &val, 0, 5, &curRels)) req.Equal(2, len(nodes)) req.Equal(1, len(nodes["a"])) @@ -201,7 +202,7 @@ func parseM2M(req *require.Assertions) { val := reflect.ValueOf(a1) - req.Nil(parseStruct("", "", false, 0, nil, &val, 0, 5, &nodes, &relations, &oldRels, &ids, &nodeRef)) + req.Nil(parseStruct("", "", false, dsl.DirectionBoth, nil, &val, 0, 5, &nodes, &relations, &oldRels, &ids, &nodeRef, &[]string{})) req.Nil(generateCurRels("", &val, 0, 5, &curRels)) req.Equal(2, len(nodes)) req.Equal(1, len(nodes["a"])) @@ -262,7 +263,7 @@ func TestCalculateCurRels(t *testing.T) { val := reflect.ValueOf(a1) - req.Nil(parseStruct("", "", false, 0, nil, &val, 0, 5, &nodes, &relations, &oldRels, &ids, &nodeRef)) + req.Nil(parseStruct("", "", false, dsl.DirectionBoth, nil, &val, 0, 5, &nodes, &relations, &oldRels, &ids, &nodeRef, &[]string{})) req.Nil(generateCurRels("", &val, 0, 5, &curRels)) req.Equal(1, len(curRels)) } diff --git a/testing_/integration_test.go b/testing_/integration_test.go deleted file mode 100644 index 0beb637..0000000 --- a/testing_/integration_test.go +++ /dev/null @@ -1,47 +0,0 @@ -package testing_ - -import ( - "github.com/mindstand/gogm" - "github.com/stretchr/testify/require" - "testing" -) - -func TestIntegration(t *testing.T) { - req := require.New(t) - - conf := gogm.Config{ - Username: "neo4j", - Password: "password", - Host: "0.0.0.0", - Port: 7687, - PoolSize: 15, - IndexStrategy: gogm.IGNORE_INDEX, - } - - req.Nil(gogm.Init(&conf, &TreeNode{}, &RootTreeNode{}, &SideTreeNode{})) - - sess, err := gogm.NewSession(false) - req.Nil(err) - defer sess.Close() - - sides := make([]*SideTreeNode, 2, 2) - sides[0] = &SideTreeNode{} - sides[1] = &SideTreeNode{} - - treeNodes := make([]*TreeNode, 4, 4) - - for i := 0; i < 4; i++ { - treeNodes[i] = &TreeNode{} - req.Nil(treeNodes[i].LinkToSideTreeNodeOnFieldSides(sides[0])) - } - - for i := 0; i < 3; i++ { - req.Nil(treeNodes[i].LinkToTreeNodeOnFieldParents(treeNodes[3])) - } - - root := &RootTreeNode{} - req.Nil(root.LinkToSideTreeNodeOnFieldSides(sides[1])) - req.Nil(root.LinkToTreeNodeOnFieldTrees(treeNodes[3])) - - req.Nil(sess.SaveDepth(root, 5)) -} \ No newline at end of file diff --git a/testing_/linking.go b/testing_/linking.go index ed61c20..25b0f09 100644 --- a/testing_/linking.go +++ b/testing_/linking.go @@ -308,499 +308,3 @@ func (l *ExampleObject2) UnlinkFromExampleObjectOnFieldSpecial(target *ExampleOb return nil } - -// LinkToTreeNodeOnFieldTrees links RootTreeNode to TreeNode on the fields RootTreeNode.Trees and TreeNode.Roots -func (l *RootTreeNode) LinkToTreeNodeOnFieldTrees(targets ...*TreeNode) error { - if targets == nil { - return errors.New("start and end can not be nil") - } - - for _, target := range targets { - - if l.Trees == nil { - l.Trees = make([]*TreeNode, 1, 1) - l.Trees[0] = target - } else { - l.Trees = append(l.Trees, target) - } - - if target.Roots == nil { - target.Roots = make([]*RootTreeNode, 1, 1) - target.Roots[0] = l - } else { - target.Roots = append(target.Roots, l) - } - } - - return nil -} - -//UnlinkFromTreeNodeOnFieldTrees unlinks RootTreeNode from TreeNode on the fields RootTreeNode.Trees and TreeNode.Roots -func (l *RootTreeNode) UnlinkFromTreeNodeOnFieldTrees(targets ...*TreeNode) error { - if targets == nil { - return errors.New("start and end can not be nil") - } - - for _, target := range targets { - - if l.Trees != nil { - for i, unlinkTarget := range l.Trees { - if unlinkTarget.UUID == target.UUID { - a := &l.Trees - (*a)[i] = (*a)[len(*a)-1] - (*a)[len(*a)-1] = nil - *a = (*a)[:len(*a)-1] - break - } - } - } - - if target.Roots != nil { - for i, unlinkTarget := range target.Roots { - if unlinkTarget.UUID == l.UUID { - a := &target.Roots - (*a)[i] = (*a)[len(*a)-1] - (*a)[len(*a)-1] = nil - *a = (*a)[:len(*a)-1] - break - } - } - } - } - - return nil -} - -// LinkToSideTreeNodeOnFieldSides links RootTreeNode to SideTreeNode on the fields RootTreeNode.Sides and SideTreeNode.Roots -func (l *RootTreeNode) LinkToSideTreeNodeOnFieldSides(targets ...*SideTreeNode) error { - if targets == nil { - return errors.New("start and end can not be nil") - } - - for _, target := range targets { - - if l.Sides == nil { - l.Sides = make([]*SideTreeNode, 1, 1) - l.Sides[0] = target - } else { - l.Sides = append(l.Sides, target) - } - - if target.Roots == nil { - target.Roots = make([]*RootTreeNode, 1, 1) - target.Roots[0] = l - } else { - target.Roots = append(target.Roots, l) - } - } - - return nil -} - -//UnlinkFromSideTreeNodeOnFieldSides unlinks RootTreeNode from SideTreeNode on the fields RootTreeNode.Sides and SideTreeNode.Roots -func (l *RootTreeNode) UnlinkFromSideTreeNodeOnFieldSides(targets ...*SideTreeNode) error { - if targets == nil { - return errors.New("start and end can not be nil") - } - - for _, target := range targets { - - if l.Sides != nil { - for i, unlinkTarget := range l.Sides { - if unlinkTarget.UUID == target.UUID { - a := &l.Sides - (*a)[i] = (*a)[len(*a)-1] - (*a)[len(*a)-1] = nil - *a = (*a)[:len(*a)-1] - break - } - } - } - - if target.Roots != nil { - for i, unlinkTarget := range target.Roots { - if unlinkTarget.UUID == l.UUID { - a := &target.Roots - (*a)[i] = (*a)[len(*a)-1] - (*a)[len(*a)-1] = nil - *a = (*a)[:len(*a)-1] - break - } - } - } - } - - return nil -} - -// LinkToTreeNodeOnFieldTrees links SideTreeNode to TreeNode on the fields SideTreeNode.Trees and TreeNode.Sides -func (l *SideTreeNode) LinkToTreeNodeOnFieldTrees(targets ...*TreeNode) error { - if targets == nil { - return errors.New("start and end can not be nil") - } - - for _, target := range targets { - - if l.Trees == nil { - l.Trees = make([]*TreeNode, 1, 1) - l.Trees[0] = target - } else { - l.Trees = append(l.Trees, target) - } - - if target.Sides == nil { - target.Sides = make([]*SideTreeNode, 1, 1) - target.Sides[0] = l - } else { - target.Sides = append(target.Sides, l) - } - } - - return nil -} - -//UnlinkFromTreeNodeOnFieldTrees unlinks SideTreeNode from TreeNode on the fields SideTreeNode.Trees and TreeNode.Sides -func (l *SideTreeNode) UnlinkFromTreeNodeOnFieldTrees(targets ...*TreeNode) error { - if targets == nil { - return errors.New("start and end can not be nil") - } - - for _, target := range targets { - - if l.Trees != nil { - for i, unlinkTarget := range l.Trees { - if unlinkTarget.UUID == target.UUID { - a := &l.Trees - (*a)[i] = (*a)[len(*a)-1] - (*a)[len(*a)-1] = nil - *a = (*a)[:len(*a)-1] - break - } - } - } - - if target.Sides != nil { - for i, unlinkTarget := range target.Sides { - if unlinkTarget.UUID == l.UUID { - a := &target.Sides - (*a)[i] = (*a)[len(*a)-1] - (*a)[len(*a)-1] = nil - *a = (*a)[:len(*a)-1] - break - } - } - } - } - - return nil -} - -// LinkToRootTreeNodeOnFieldRoots links SideTreeNode to RootTreeNode on the fields SideTreeNode.Roots and RootTreeNode.Sides -func (l *SideTreeNode) LinkToRootTreeNodeOnFieldRoots(targets ...*RootTreeNode) error { - if targets == nil { - return errors.New("start and end can not be nil") - } - - for _, target := range targets { - - if l.Roots == nil { - l.Roots = make([]*RootTreeNode, 1, 1) - l.Roots[0] = target - } else { - l.Roots = append(l.Roots, target) - } - - if target.Sides == nil { - target.Sides = make([]*SideTreeNode, 1, 1) - target.Sides[0] = l - } else { - target.Sides = append(target.Sides, l) - } - } - - return nil -} - -//UnlinkFromRootTreeNodeOnFieldRoots unlinks SideTreeNode from RootTreeNode on the fields SideTreeNode.Roots and RootTreeNode.Sides -func (l *SideTreeNode) UnlinkFromRootTreeNodeOnFieldRoots(targets ...*RootTreeNode) error { - if targets == nil { - return errors.New("start and end can not be nil") - } - - for _, target := range targets { - - if l.Roots != nil { - for i, unlinkTarget := range l.Roots { - if unlinkTarget.UUID == target.UUID { - a := &l.Roots - (*a)[i] = (*a)[len(*a)-1] - (*a)[len(*a)-1] = nil - *a = (*a)[:len(*a)-1] - break - } - } - } - - if target.Sides != nil { - for i, unlinkTarget := range target.Sides { - if unlinkTarget.UUID == l.UUID { - a := &target.Sides - (*a)[i] = (*a)[len(*a)-1] - (*a)[len(*a)-1] = nil - *a = (*a)[:len(*a)-1] - break - } - } - } - } - - return nil -} - -// LinkToTreeNodeOnFieldParents links TreeNode to TreeNode on the fields TreeNode.Parents and TreeNode.Children -func (l *TreeNode) LinkToTreeNodeOnFieldParents(targets ...*TreeNode) error { - if targets == nil { - return errors.New("start and end can not be nil") - } - - for _, target := range targets { - - if l.Parents == nil { - l.Parents = make([]*TreeNode, 1, 1) - l.Parents[0] = target - } else { - l.Parents = append(l.Parents, target) - } - - if target.Children == nil { - target.Children = make([]*TreeNode, 1, 1) - target.Children[0] = l - } else { - target.Children = append(target.Children, l) - } - } - - return nil -} - -//UnlinkFromTreeNodeOnFieldParents unlinks TreeNode from TreeNode on the fields TreeNode.Parents and TreeNode.Children -func (l *TreeNode) UnlinkFromTreeNodeOnFieldParents(targets ...*TreeNode) error { - if targets == nil { - return errors.New("start and end can not be nil") - } - - for _, target := range targets { - - if l.Parents != nil { - for i, unlinkTarget := range l.Parents { - if unlinkTarget.UUID == target.UUID { - a := &l.Parents - (*a)[i] = (*a)[len(*a)-1] - (*a)[len(*a)-1] = nil - *a = (*a)[:len(*a)-1] - break - } - } - } - - if target.Children != nil { - for i, unlinkTarget := range target.Children { - if unlinkTarget.UUID == l.UUID { - a := &target.Children - (*a)[i] = (*a)[len(*a)-1] - (*a)[len(*a)-1] = nil - *a = (*a)[:len(*a)-1] - break - } - } - } - } - - return nil -} - -// LinkToTreeNodeOnFieldChildren links TreeNode to TreeNode on the fields TreeNode.Children and TreeNode.Parents -func (l *TreeNode) LinkToTreeNodeOnFieldChildren(targets ...*TreeNode) error { - if targets == nil { - return errors.New("start and end can not be nil") - } - - for _, target := range targets { - - if l.Children == nil { - l.Children = make([]*TreeNode, 1, 1) - l.Children[0] = target - } else { - l.Children = append(l.Children, target) - } - - if target.Parents == nil { - target.Parents = make([]*TreeNode, 1, 1) - target.Parents[0] = l - } else { - target.Parents = append(target.Parents, l) - } - } - - return nil -} - -//UnlinkFromTreeNodeOnFieldChildren unlinks TreeNode from TreeNode on the fields TreeNode.Children and TreeNode.Parents -func (l *TreeNode) UnlinkFromTreeNodeOnFieldChildren(targets ...*TreeNode) error { - if targets == nil { - return errors.New("start and end can not be nil") - } - - for _, target := range targets { - - if l.Children != nil { - for i, unlinkTarget := range l.Children { - if unlinkTarget.UUID == target.UUID { - a := &l.Children - (*a)[i] = (*a)[len(*a)-1] - (*a)[len(*a)-1] = nil - *a = (*a)[:len(*a)-1] - break - } - } - } - - if target.Parents != nil { - for i, unlinkTarget := range target.Parents { - if unlinkTarget.UUID == l.UUID { - a := &target.Parents - (*a)[i] = (*a)[len(*a)-1] - (*a)[len(*a)-1] = nil - *a = (*a)[:len(*a)-1] - break - } - } - } - } - - return nil -} - -// LinkToRootTreeNodeOnFieldRoots links TreeNode to RootTreeNode on the fields TreeNode.Roots and RootTreeNode.Trees -func (l *TreeNode) LinkToRootTreeNodeOnFieldRoots(targets ...*RootTreeNode) error { - if targets == nil { - return errors.New("start and end can not be nil") - } - - for _, target := range targets { - - if l.Roots == nil { - l.Roots = make([]*RootTreeNode, 1, 1) - l.Roots[0] = target - } else { - l.Roots = append(l.Roots, target) - } - - if target.Trees == nil { - target.Trees = make([]*TreeNode, 1, 1) - target.Trees[0] = l - } else { - target.Trees = append(target.Trees, l) - } - } - - return nil -} - -//UnlinkFromRootTreeNodeOnFieldRoots unlinks TreeNode from RootTreeNode on the fields TreeNode.Roots and RootTreeNode.Trees -func (l *TreeNode) UnlinkFromRootTreeNodeOnFieldRoots(targets ...*RootTreeNode) error { - if targets == nil { - return errors.New("start and end can not be nil") - } - - for _, target := range targets { - - if l.Roots != nil { - for i, unlinkTarget := range l.Roots { - if unlinkTarget.UUID == target.UUID { - a := &l.Roots - (*a)[i] = (*a)[len(*a)-1] - (*a)[len(*a)-1] = nil - *a = (*a)[:len(*a)-1] - break - } - } - } - - if target.Trees != nil { - for i, unlinkTarget := range target.Trees { - if unlinkTarget.UUID == l.UUID { - a := &target.Trees - (*a)[i] = (*a)[len(*a)-1] - (*a)[len(*a)-1] = nil - *a = (*a)[:len(*a)-1] - break - } - } - } - } - - return nil -} - -// LinkToSideTreeNodeOnFieldSides links TreeNode to SideTreeNode on the fields TreeNode.Sides and SideTreeNode.Trees -func (l *TreeNode) LinkToSideTreeNodeOnFieldSides(targets ...*SideTreeNode) error { - if targets == nil { - return errors.New("start and end can not be nil") - } - - for _, target := range targets { - - if l.Sides == nil { - l.Sides = make([]*SideTreeNode, 1, 1) - l.Sides[0] = target - } else { - l.Sides = append(l.Sides, target) - } - - if target.Trees == nil { - target.Trees = make([]*TreeNode, 1, 1) - target.Trees[0] = l - } else { - target.Trees = append(target.Trees, l) - } - } - - return nil -} - -//UnlinkFromSideTreeNodeOnFieldSides unlinks TreeNode from SideTreeNode on the fields TreeNode.Sides and SideTreeNode.Trees -func (l *TreeNode) UnlinkFromSideTreeNodeOnFieldSides(targets ...*SideTreeNode) error { - if targets == nil { - return errors.New("start and end can not be nil") - } - - for _, target := range targets { - - if l.Sides != nil { - for i, unlinkTarget := range l.Sides { - if unlinkTarget.UUID == target.UUID { - a := &l.Sides - (*a)[i] = (*a)[len(*a)-1] - (*a)[len(*a)-1] = nil - *a = (*a)[:len(*a)-1] - break - } - } - } - - if target.Trees != nil { - for i, unlinkTarget := range target.Trees { - if unlinkTarget.UUID == l.UUID { - a := &target.Trees - (*a)[i] = (*a)[len(*a)-1] - (*a)[len(*a)-1] = nil - *a = (*a)[:len(*a)-1] - break - } - } - } - } - - return nil -} diff --git a/testing_/objs.go b/testing_/objs.go deleted file mode 100644 index 87deec5..0000000 --- a/testing_/objs.go +++ /dev/null @@ -1,28 +0,0 @@ -package testing_ - -import "github.com/mindstand/gogm" - -type TreeNode struct { - gogm.BaseNode - - Parents []*TreeNode `gogm:"direction=incoming;relationship=tree"` - Children []*TreeNode `gogm:"direction=outgoing;relationship=tree"` - - Roots []*RootTreeNode `gogm:"direction=outgoing;relationship=root"` - - Sides []*SideTreeNode `gogm:"direction=outgoing;relationship=sides"` -} - -type RootTreeNode struct { - gogm.BaseNode - - Trees []*TreeNode `gogm:"direction=incoming;relationship=root"` - Sides []*SideTreeNode `gogm:"direction=outgoing;relationship=sides"` -} - -type SideTreeNode struct { - gogm.BaseNode - - Trees []*TreeNode `gogm:"direction=incoming;relationship=sides"` - Roots []*RootTreeNode `gogm:"direction=incoming;relationship=sides"` -} diff --git a/util.go b/util.go index 68b5e98..465f213 100644 --- a/util.go +++ b/util.go @@ -66,7 +66,7 @@ func handleNodeState(val *reflect.Value, fieldName string) (bool, string, map[st iConf := loadVal.Interface() - if iConf != nil && loadVal.Len() != 0 && checkUuid != ""{ + if iConf != nil && loadVal.Len() != 0 && checkUuid != "" { // node is not new relConf, ok := iConf.(map[string]*RelationConfig) if !ok { diff --git a/util_test.go b/util_test.go index 533f630..36ce035 100644 --- a/util_test.go +++ b/util_test.go @@ -62,7 +62,7 @@ func TestSetUuidIfNeeded(t *testing.T) { val.UUID = "dasdfasd" val.LoadMap = map[string]*RelationConfig{ "dasdfasd": { - Ids: []int64{69}, + Ids: []int64{69}, RelationType: Single, }, }