From c3d06df00ab264d25032188092d4134e4546dc9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9=20=D0=98=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2?= Date: Thu, 3 Oct 2024 17:12:42 +0300 Subject: [PATCH] Fixes --- .../README.md | 2 +- .../dll/dll.go | 0 .../dll/dll_test.go | 0 weghting_n_cutting_the_tree/func_models.go | 30 +++++++++++++++++++ .../funcs.go | 30 ++----------------- .../funcs_test.go | 26 ++++++++++++++++ .../test_models.go | 27 +++++++++++++++++ 7 files changed, 87 insertions(+), 28 deletions(-) rename {weghting_the_tree => weghting_n_cutting_the_tree}/README.md (71%) rename {weghting_the_tree => weghting_n_cutting_the_tree}/dll/dll.go (100%) rename {weghting_the_tree => weghting_n_cutting_the_tree}/dll/dll_test.go (100%) create mode 100644 weghting_n_cutting_the_tree/func_models.go rename {weghting_the_tree => weghting_n_cutting_the_tree}/funcs.go (82%) rename {weghting_the_tree => weghting_n_cutting_the_tree}/funcs_test.go (81%) rename {weghting_the_tree => weghting_n_cutting_the_tree}/test_models.go (72%) diff --git a/weghting_the_tree/README.md b/weghting_n_cutting_the_tree/README.md similarity index 71% rename from weghting_the_tree/README.md rename to weghting_n_cutting_the_tree/README.md index 454df9f..43ba7eb 100644 --- a/weghting_the_tree/README.md +++ b/weghting_n_cutting_the_tree/README.md @@ -1,3 +1,3 @@ -## Алгоритм кумулятивного взвешивания асинхронного дерева +## [![Build Status](https://drone.tiburon.su/api/badges/TEMPLATES/tests/status.svg)](https://drone.tiburon.su/TEMPLATES/tests) Алгоритм кумулятивного взвешивания и нарезки. Стояла задача передавать огромное JSON дерево, которое целиком не пролезало в nginx. Исходя из предусловия, что дерево может быть сколь угодно большого размера, не стали полагаться на увеличение лимита и/или применение сжатия, было принято решение искать способ нарезать его на поддеревья, передать частями и на месте собрать. \ No newline at end of file diff --git a/weghting_the_tree/dll/dll.go b/weghting_n_cutting_the_tree/dll/dll.go similarity index 100% rename from weghting_the_tree/dll/dll.go rename to weghting_n_cutting_the_tree/dll/dll.go diff --git a/weghting_the_tree/dll/dll_test.go b/weghting_n_cutting_the_tree/dll/dll_test.go similarity index 100% rename from weghting_the_tree/dll/dll_test.go rename to weghting_n_cutting_the_tree/dll/dll_test.go diff --git a/weghting_n_cutting_the_tree/func_models.go b/weghting_n_cutting_the_tree/func_models.go new file mode 100644 index 0000000..ce7e410 --- /dev/null +++ b/weghting_n_cutting_the_tree/func_models.go @@ -0,0 +1,30 @@ +package main + +import "encoding/json" + +type Node struct { + ID string `json:"id"` + Name string `json:"name"` + Children []*Node `json:"children"` +} + +type WeightedNode struct { + node *Node + parent *Node + children []*Node + weight uint16 +} + +type SubTree struct { + path string + tree *Node +} + +func (root *Node) getNodeWeight() uint16 { + nodeBytes, _ := json.Marshal(&Node{ + ID: root.ID, + Name: root.Name, + Children: []*Node{}, + }) + return uint16(len(nodeBytes)) +} diff --git a/weghting_the_tree/funcs.go b/weghting_n_cutting_the_tree/funcs.go similarity index 82% rename from weghting_the_tree/funcs.go rename to weghting_n_cutting_the_tree/funcs.go index db618b5..97000e4 100644 --- a/weghting_the_tree/funcs.go +++ b/weghting_n_cutting_the_tree/funcs.go @@ -1,24 +1,10 @@ package main import ( - "encoding/json" "maps" - "tests/weghting_the_tree/dll" + "tests/weghting_n_cutting_the_tree/dll" ) -type Node struct { - ID string `json:"id"` - Name string `json:"name"` - Children []*Node `json:"children"` -} - -type WeightedNode struct { - node *Node - parent *Node - children []*Node - weight uint16 -} - func (root *Node) WeightingTreeWithRecursion(parent *Node) map[string]*WeightedNode { weightedNode := &Node{ ID: root.ID, @@ -118,16 +104,6 @@ func (root *Node) WeightingTreeWithDLL() map[string]*WeightedNode { return counter } -//func DecomposeTree(tree map[string]*WeightedNode, limit int) ([]SubTree, error) { -// -// return nil, nil -//} - -func (root *Node) getNodeWeight() uint16 { - nodeBytes, _ := json.Marshal(&Node{ - ID: root.ID, - Name: root.Name, - Children: []*Node{}, - }) - return uint16(len(nodeBytes)) +func DecomposeTree(tree map[string]*WeightedNode, threshold int) ([]SubTree, error) { + return []SubTree{{path: "/", tree: tree["root"].node}}, nil } diff --git a/weghting_the_tree/funcs_test.go b/weghting_n_cutting_the_tree/funcs_test.go similarity index 81% rename from weghting_the_tree/funcs_test.go rename to weghting_n_cutting_the_tree/funcs_test.go index 823ba06..7dc8c73 100644 --- a/weghting_the_tree/funcs_test.go +++ b/weghting_n_cutting_the_tree/funcs_test.go @@ -2,6 +2,7 @@ package main import ( "fmt" +"github.com/stretchr/testify/require" "sort" "testing" @@ -33,6 +34,31 @@ func TestNode_WeighingTreeAllAlgo(t *testing.T) { } } +func TestDecomposeTree(t *testing.T){ + for name, tt := range map[string]struct{ + inputTree map[string]*WeightedNode + inputThreshold int + outputParts []SubTree + err string + }{ + "Normal":{ + inputTree: smallTree.Tree, + inputThreshold: smallTree.Threshold, + outputParts: smallTree.Parts, + }, + }{ + t.Run(name, func(t *testing.T) { + result, err := DecomposeTree(tt.inputTree, tt.inputThreshold) + if tt.err == "" { + require.NoError(t, err) + require.ElementsMatch(t, result, tt.outputParts) + } else { + require.EqualError(t, err, tt.err) + } + }) + } +} + func Benchmark(b *testing.B) { b.StopTimer() b.ResetTimer() diff --git a/weghting_the_tree/test_models.go b/weghting_n_cutting_the_tree/test_models.go similarity index 72% rename from weghting_the_tree/test_models.go rename to weghting_n_cutting_the_tree/test_models.go index d7e1fb5..8fa6a6f 100644 --- a/weghting_the_tree/test_models.go +++ b/weghting_n_cutting_the_tree/test_models.go @@ -42,3 +42,30 @@ func getTestTree(branches, depth int, parent *Node) TestTree { } return tree } + +type testDecomposingData struct { + Tree map[string]*WeightedNode + Threshold int + Parts []SubTree +} + +var smallTree = testDecomposingData{ + Tree: map[string]*WeightedNode{ + "root": { + node: &Node{ + ID: "root", + Name: "root", + }, + }, + }, + Threshold: 2, + Parts: []SubTree{ + { + path: "/", + tree: &Node{ + ID: "root", + Name: "root", + }, + }, + }, +}