diff --git a/lib/ddrt/dynamic_rtree_impl/utils.ex b/lib/ddrt/dynamic_rtree_impl/utils.ex index df60022..1601f6b 100644 --- a/lib/ddrt/dynamic_rtree_impl/utils.ex +++ b/lib/ddrt/dynamic_rtree_impl/utils.ex @@ -89,15 +89,19 @@ defmodule DDRT.DynamicRtreeImpl.Utils do end # Return the area of a bounding box - def area([{a, b}, {c, d}]) when (b - a) * (d - c) != 0 do - (b - a) * (d - c) - end - - def area([{_a, _b}, {_c, _d}]) do - -1 + def area([{a, b}, {c, d}]) do + ab = b - a + cd = d - c + + cond do + ab == 0 and cd != 0 -> cd + ab != 0 and cd == 0 -> ab + ab != 0 and cd != 0 -> ab * cd + ab == 0 and cd == 0 -> -1 + end end - # Return de the middle bounding box value + # Return the middle bounding box value def middle_value([{a, b}, {c, d}]) do (a + b + c + d) / 2 end diff --git a/test/drtree_test.exs b/test/drtree_test.exs index 53140a4..4eb9676 100644 --- a/test/drtree_test.exs +++ b/test/drtree_test.exs @@ -90,21 +90,9 @@ defmodule DynamicRtreeTest do assert root_box == [{-50, 36}, {-10, 41}] end - test "MerkleMap inserts a same single point without crash" do - DynamicRtree.new(type: MerkleMap) - new_tuple = {new_node, _new_box} = {UUID.uuid1(), [{1, 2}, {3, 4}]} - {:ok, t} = DynamicRtree.insert(new_tuple) - assert t == DynamicRtree.tree() - {cont, parent, box} = t |> MerkleMap.get(new_node) - assert cont == :leaf - assert parent == t[:root] - assert box == [{1, 2}, {3, 4}] - + test "MerkleMap inserts a triangular bounding box without crash" do DynamicRtree.new(type: MerkleMap) - # ok: - # {:ok, t} = DynamicRtree.insert({1, [{9, 9.1}, {9, 9.1}]}) - # crash: {:ok, t} = DynamicRtree.insert({1, [{9, 9}, {9, 9.1}]}) assert t == DynamicRtree.tree() @@ -112,8 +100,8 @@ defmodule DynamicRtreeTest do root = t |> MerkleMap.get(:root) {ch, _root_ptr, root_box} = t |> MerkleMap.get(root) assert t |> Enum.to_list() |> length == t |> Enum.uniq() |> length - assert length(ch) == 2 - assert root_box == [{-50, 36}, {-10, 41}] + assert length(ch) == 1 + assert root_box == [{9, 9}, {9, 9.1}] end test "Map delete leaf keeps tree consistency" do @@ -141,7 +129,7 @@ defmodule DynamicRtreeTest do refute delete_id in (t[old_parent] |> elem(0)) {:ok, same_t} = DynamicRtree.delete(delete_id) - assert t = same_t + assert ^t = same_t {:ok, t} = DynamicRtree.delete(1..100 |> Enum.map(fn x -> x end)) root = t[:root] @@ -180,7 +168,7 @@ defmodule DynamicRtreeTest do refute delete_id in (t |> MerkleMap.get(old_parent) |> elem(0)) {:ok, same_t} = DynamicRtree.delete(delete_id) - assert t = same_t + assert ^t = same_t {:ok, t} = DynamicRtree.delete(1..100 |> Enum.map(fn x -> x end)) root = t |> MerkleMap.get(:root)