CriteriaRetriever.flatten/1 almost works

pull/1164/head
Rick Carlino 2020-02-21 19:18:26 -06:00
parent 5fef363475
commit 3be4d58308
3 changed files with 49 additions and 53 deletions

View File

@ -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

View File

@ -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" => %{}
}

View File

@ -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}
}