removed unneeded 'recursive get'

This commit is contained in:
Ivan Yuriev 2025-02-01 21:25:01 +03:00
parent b6bba8fcd1
commit 62a76e9d92
8 changed files with 16 additions and 57 deletions

View File

@ -9,9 +9,7 @@ import json_serde
import query import query
import simplifile import simplifile
import tree import tree
import tree_events.{ import tree_events.{type TreeEvents, GetEvent, SetEvent, Shutdown, Snapshot}
type TreeEvents, GetEvent, RecursiveGetEvent, SetEvent, Shutdown, Snapshot,
}
pub type Message { pub type Message {
Message Message
@ -78,15 +76,7 @@ pub fn load(snapshots_path, names) {
fn handle_message(event: TreeEvents, tree) { fn handle_message(event: TreeEvents, tree) {
case event { case event {
GetEvent(path, client) -> { GetEvent(path, client) -> {
let res = query.get(tree, path, False) let res = query.get(tree, path)
actor.send(
client,
res |> result.map(fn(tree) { tree |> json_serde.serialize }),
)
actor.continue(tree)
}
RecursiveGetEvent(path, client) -> {
let res = query.get(tree, path, False)
actor.send( actor.send(
client, client,
res |> result.map(fn(tree) { tree |> json_serde.serialize }), res |> result.map(fn(tree) { tree |> json_serde.serialize }),

View File

@ -10,7 +10,7 @@ import tree_events
/// ///
/// Query formats: /// Query formats:
/// ///
/// - get | rget (path) /// - get (path)
/// - set (path) (data) /// - set (path) (data)
pub fn parse(query: String) { pub fn parse(query: String) {
let args = query |> string.split(" ") let args = query |> string.split(" ")
@ -23,14 +23,6 @@ pub fn parse(query: String) {
|> Ok |> Ok
} }
} }
["rget", path] -> {
case path |> parse_path {
Error(_) -> Error(QueryError("Wrong query format."))
Ok(#(head, tail)) ->
#(head, fn(actor) { tree_events.RecursiveGetEvent(tail, actor) })
|> Ok
}
}
["set", path, data] -> { ["set", path, data] -> {
case path |> parse_path { case path |> parse_path {
Error(_) -> Error(QueryError("Wrong query format.")) Error(_) -> Error(QueryError("Wrong query format."))
@ -50,11 +42,8 @@ pub fn parse(query: String) {
} }
} }
pub fn get(tree, path, recursive) -> Result(tree.Tree, QueryError) { pub fn get(tree, path) -> Result(tree.Tree, QueryError) {
let res = case recursive { let res = tree.get(tree, path)
False -> tree.get(tree, path)
_ -> tree.rget(tree, path)
}
case res { case res {
Error(_) -> Error(QueryError("There is no such node.")) Error(_) -> Error(QueryError("There is no such node."))
Ok(tree) -> Ok(tree) Ok(tree) -> Ok(tree)

View File

@ -18,10 +18,6 @@ pub fn new() {
Root(dict.new()) Root(dict.new())
} }
/// Traverses the tree along the given path.
///
/// If the last found node is a Leaf, returns it.
/// Else returns Nil
pub fn get(tree, path) { pub fn get(tree, path) {
let res = get_step(tree, path) let res = get_step(tree, path)
case res { case res {
@ -30,15 +26,6 @@ pub fn get(tree, path) {
} }
} }
/// Recursive Get: returns whole requsted subtree
pub fn rget(tree, path) {
let res = get_step(tree, path)
case res {
Error(_) -> Error(Nil)
Ok(_) as res -> res
}
}
fn get_step(tree: Tree, path: List(String)) -> Result(Tree, Nil) { fn get_step(tree: Tree, path: List(String)) -> Result(Tree, Nil) {
case tree, path { case tree, path {
Root(_) as rt, [] -> Ok(rt) Root(_) as rt, [] -> Ok(rt)

View File

@ -5,11 +5,6 @@ import tree
pub type TreeEvents { pub type TreeEvents {
GetEvent(path: List(String), reply_with: Subject(Result(String, QueryError))) GetEvent(path: List(String), reply_with: Subject(Result(String, QueryError)))
RecursiveGetEvent(
path: List(String),
reply_with: Subject(Result(String, QueryError)),
)
SetEvent( SetEvent(
path: List(String), path: List(String),
data: tree.LeafData, data: tree.LeafData,

View File

@ -105,7 +105,6 @@ fn read_next(forest) {
"help" |> io.println "help" |> io.println
"exit" |> io.println "exit" |> io.println
"get <path>" |> io.println "get <path>" |> io.println
"rget <path>" |> io.println
"set <path> <data>" |> io.println "set <path> <data>" |> io.println
"trees" |> io.println "trees" |> io.println

View File

@ -50,8 +50,7 @@ fn get_100k(tree, i) {
100_000 -> Nil 100_000 -> Nil
_ -> { _ -> {
let rint = int.random(1_000_000) let rint = int.random(1_000_000)
let assert Ok(_) = let assert Ok(_) = tree |> query.get([".", rint |> int.to_string()])
tree |> query.get([".", rint |> int.to_string()], False)
get_100k(tree, i + 1) get_100k(tree, i + 1)
} }
} }
@ -98,7 +97,7 @@ fn setup_nodes_tasks(tree, paths) {
fn get_nodes(tree, paths) { fn get_nodes(tree, paths) {
paths paths
|> list.fold(tree, fn(tree, path) { |> list.fold(tree, fn(tree, path) {
let _ = tree |> query.get(path, True) let _ = tree |> query.get(path)
tree tree
}) })
} }

View File

@ -31,7 +31,7 @@ pub fn server_test() {
let assert Ok(Nil) = mug.send(socket, <<"set root.b \"foo\"":utf8>>) let assert Ok(Nil) = mug.send(socket, <<"set root.b \"foo\"":utf8>>)
let assert Ok(_) = mug.receive(socket, timeout_milliseconds: 100) let assert Ok(_) = mug.receive(socket, timeout_milliseconds: 100)
let assert Ok(Nil) = mug.send(socket, <<"rget root":utf8>>) let assert Ok(Nil) = mug.send(socket, <<"get root":utf8>>)
let assert Ok(packet) = mug.receive(socket, timeout_milliseconds: 100) let assert Ok(packet) = mug.receive(socket, timeout_milliseconds: 100)
packet |> should.equal(<<"{\"a\":2,\"b\":\"foo\"}":utf8>>) packet |> should.equal(<<"{\"a\":2,\"b\":\"foo\"}":utf8>>)

View File

@ -24,15 +24,15 @@ pub fn kv_test() {
let assert Ok(tree) = query.set(tree, ["d"], tree.Bool(False)) let assert Ok(tree) = query.set(tree, ["d"], tree.Bool(False))
let assert Ok(tree) = query.set(tree, ["e"], tree.Null) let assert Ok(tree) = query.set(tree, ["e"], tree.Null)
query.get(tree, ["a"], False) query.get(tree, ["a"])
|> should.equal(tree.Leaf(tree.String("foo")) |> Ok()) |> should.equal(tree.Leaf(tree.String("foo")) |> Ok())
query.get(tree, ["b"], False) query.get(tree, ["b"])
|> should.equal(tree.Leaf(tree.Int(42)) |> Ok()) |> should.equal(tree.Leaf(tree.Int(42)) |> Ok())
query.get(tree, ["c"], False) query.get(tree, ["c"])
|> should.equal(tree.Leaf(tree.Float(12.34)) |> Ok()) |> should.equal(tree.Leaf(tree.Float(12.34)) |> Ok())
query.get(tree, ["d"], False) query.get(tree, ["d"])
|> should.equal(tree.Leaf(tree.Bool(False)) |> Ok()) |> should.equal(tree.Leaf(tree.Bool(False)) |> Ok())
query.get(tree, ["e"], False) query.get(tree, ["e"])
|> should.equal(tree.Leaf(tree.Null) |> Ok()) |> should.equal(tree.Leaf(tree.Null) |> Ok())
} }
@ -45,15 +45,15 @@ pub fn tree_test() {
let assert Ok(tree) = query.set(tree, ["a2", "b3"], tree.Int(42)) let assert Ok(tree) = query.set(tree, ["a2", "b3"], tree.Int(42))
let assert Ok(tree) = query.set(tree, ["a2", "b3"], tree.Int(43)) let assert Ok(tree) = query.set(tree, ["a2", "b3"], tree.Int(43))
query.get(tree, ["a", "b"], False) query.get(tree, ["a", "b"])
|> should.equal(tree.Leaf(tree.String("new foo")) |> Ok()) |> should.equal(tree.Leaf(tree.String("new foo")) |> Ok())
query.get(tree, ["a", "b2"], True) query.get(tree, ["a", "b2"])
|> should.equal( |> should.equal(
tree.Node(dict.new() |> dict.insert("c", tree.Leaf(tree.String("bar")))) tree.Node(dict.new() |> dict.insert("c", tree.Leaf(tree.String("bar"))))
|> Ok(), |> Ok(),
) )
query.get(tree, ["a2", "b3"], False) query.get(tree, ["a2", "b3"])
|> should.equal(tree.Leaf(tree.Int(43)) |> Ok()) |> should.equal(tree.Leaf(tree.Int(43)) |> Ok())
} }