CriteriaRetriever.flatten/1 almost works
parent
5fef363475
commit
3be4d58308
|
@ -14,60 +14,55 @@ defmodule FarmbotCore.Asset.CriteriaRetriever do
|
|||
10.
|
||||
"""
|
||||
|
||||
# @number_eq_fields [:radius, :x, :y, :z, :z]
|
||||
# @number_gt_fields [:radius, :x, :y, :z, :z]
|
||||
# @number_lt_fields [:radius, :x, :y, :z, :z]
|
||||
# @string_eq_fields [:name, :openfarm_slug, :plant_stage, :pointer_type]
|
||||
@numberic_fields ["radius", "x", "y", "z"]
|
||||
@string_fields ["name", "openfarm_slug", "plant_stage", "pointer_type"]
|
||||
|
||||
def run(%PointGroup{} = _pg) do
|
||||
# Handle AND criteria
|
||||
# Handle point_id criteria
|
||||
# Handle meta.* criteria
|
||||
end
|
||||
|
||||
def flatten(%PointGroup{} = pg) do
|
||||
{_, results} = ({pg, []}
|
||||
# |> handle_meta_fields()
|
||||
# |> handle_point_ids()
|
||||
{pg, []}
|
||||
|> handle_number_eq_fields()
|
||||
|> handle_number_gt_fields()
|
||||
|> handle_number_lt_fields()
|
||||
|> handle_string_eq_fields()
|
||||
|> handle_day_field())
|
||||
results
|
||||
|> handle_day_field()
|
||||
end
|
||||
|
||||
# # == THIS IS SPECIAL!
|
||||
# defp handle_meta_fields({%PointGroup{} = pg, [] = results}) do
|
||||
# raise "Not Implemented"
|
||||
# {pg, results}
|
||||
# end
|
||||
|
||||
# # == THIS IS SPEICAL!
|
||||
# defp handle_point_ids({%PointGroup{} = pg, [] = results}) do
|
||||
# raise "Not Implemented"
|
||||
# {pg, results}
|
||||
# end
|
||||
|
||||
defp handle_number_eq_fields({%PointGroup{} = pg, [] = results}) do
|
||||
raise "Not Implemented"
|
||||
{pg, results}
|
||||
defp handle_number_eq_fields({%PointGroup{} = pg, accum}) do
|
||||
{pg, accum ++ filter_it(pg, "number_eq", @numberic_fields, "IN")}
|
||||
end
|
||||
|
||||
defp handle_number_gt_fields({%PointGroup{} = pg, [] = results}) do
|
||||
raise "Not Implemented"
|
||||
{pg, results}
|
||||
defp handle_number_gt_fields({%PointGroup{} = pg, accum}) do
|
||||
{pg, accum ++ filter_it(pg, "number_gt", @numberic_fields, ">")}
|
||||
end
|
||||
|
||||
defp handle_number_lt_fields({%PointGroup{} = pg, [] = results}) do
|
||||
raise "Not Implemented"
|
||||
{pg, results}
|
||||
defp handle_number_lt_fields({%PointGroup{} = pg, accum}) do
|
||||
{pg, accum ++ filter_it(pg, "number_lt", @numberic_fields, "<")}
|
||||
end
|
||||
|
||||
defp handle_string_eq_fields({%PointGroup{} = pg, [] = results}) do
|
||||
raise "Not Implemented"
|
||||
{pg, results}
|
||||
defp handle_string_eq_fields({%PointGroup{} = pg, accum}) do
|
||||
{pg, accum ++ filter_it(pg, "string_eq", @string_fields, "IN")}
|
||||
end
|
||||
|
||||
defp handle_day_field({%PointGroup{} = pg, [] = results}) do
|
||||
raise "Not Implemented"
|
||||
{pg, results}
|
||||
defp handle_day_field({%PointGroup{} = pg, accum}) do
|
||||
op = pg.criteria["day"]["op"] || "<"
|
||||
days = pg.criteria["day"]["days"] || 0
|
||||
|
||||
query = ["created_at #{op} ?", Timex.shift(Timex.now(), days: days)]
|
||||
|
||||
{ pg, accum ++ [ query ] }
|
||||
end
|
||||
|
||||
defp filter_it(pg, criteria_kind, criteria_fields, op) do
|
||||
criteria_fields
|
||||
|> Enum.map(fn field ->
|
||||
{field, pg.criteria[criteria_kind][field]}
|
||||
end)
|
||||
|> Enum.filter(fn {_k, v} -> v end)
|
||||
|> Enum.map(fn {k, v} -> ["#{k} #{op} ?", v] end)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -4,15 +4,16 @@ defmodule FarmbotCore.Asset.PointGroup do
|
|||
"""
|
||||
|
||||
use FarmbotCore.Asset.Schema, path: "/api/point_groups"
|
||||
|
||||
@default_criteria %{
|
||||
"day" => %{ "op" => ">", "days" => 0 },
|
||||
# Map<string, string[]>
|
||||
"string_eq" => %{},
|
||||
# Map<string, number[]>
|
||||
"number_eq" => %{},
|
||||
# Map<string, number[]>
|
||||
"number_lt" => %{},
|
||||
# Map<string, number[]>
|
||||
"day" => %{ "op" => ">", "days" => 0 },
|
||||
# Map<string, string[] | undefined>,
|
||||
"string_eq" => %{},
|
||||
# Map<string, number[] | undefined>,
|
||||
"number_eq" => %{},
|
||||
# Map<string, number | undefined>,
|
||||
"number_lt" => %{},
|
||||
# Map<string, number | undefined>,
|
||||
"number_gt" => %{}
|
||||
}
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ defmodule FarmbotCore.Asset.CriteriaRetrieverTest do
|
|||
|
||||
alias FarmbotCore.Asset.{
|
||||
CriteriaRetriever,
|
||||
Repo,
|
||||
# Repo,
|
||||
PointGroup
|
||||
}
|
||||
|
||||
|
@ -14,20 +14,20 @@ defmodule FarmbotCore.Asset.CriteriaRetrieverTest do
|
|||
expect(Timex, :now, 1, fn -> ~U[2020-02-21 12:34:56.789012Z] end)
|
||||
|
||||
expected = [
|
||||
{:and, ["created_at < ?", ~U[2020-02-18 12:34:56.789012Z]]},
|
||||
{:and, ["openfarm_slug = ?", "five"]},
|
||||
{:and, ["radius = ?", 6]},
|
||||
{:and, ["x < ?", 7]},
|
||||
{:and, ["z > ?", 8]}
|
||||
["created_at < ?", ~U[2020-02-18 12:34:56.789012Z]],
|
||||
["openfarm_slug = ?", "five"],
|
||||
["radius = ?", [6]],
|
||||
["x < ?", 7],
|
||||
["z > ?", 8]
|
||||
]
|
||||
|
||||
results =
|
||||
{_pg, results} =
|
||||
CriteriaRetriever.flatten(%PointGroup{
|
||||
point_ids: [1, 2, 3],
|
||||
criteria: %{
|
||||
"day" => %{"op" => "<", "days" => 4},
|
||||
"string_eq" => %{"openfarm_slug" => "five"},
|
||||
"number_eq" => %{"radius" => 6},
|
||||
"string_eq" => %{"openfarm_slug" => ["five"]},
|
||||
"number_eq" => %{"radius" => [6]},
|
||||
"number_lt" => %{"x" => 7},
|
||||
"number_gt" => %{"z" => 8}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue