fix: don't evaluate unknown types in basic operators

This commit is contained in:
Zach Daniel 2023-08-18 11:37:20 -04:00
parent e976956254
commit 6136ca693b

View file

@ -1,20 +1,26 @@
defmodule Ash.Query.Operator.Basic do defmodule Ash.Query.Operator.Basic do
require Decimal
@operators [ @operators [
plus: [ plus: [
symbol: :+, symbol: :+,
no_nils: true no_nils: true,
evaluate_types: :numbers
], ],
times: [ times: [
symbol: :*, symbol: :*,
no_nils: true no_nils: true,
evaluate_types: :numbers
], ],
minus: [ minus: [
symbol: :-, symbol: :-,
no_nils: true no_nils: true,
evaluate_types: :numbers
], ],
div: [ div: [
symbol: :/, symbol: :/,
no_nils: true no_nils: true,
evaluate_types: :numbers
], ],
concat: [ concat: [
symbol: :<>, symbol: :<>,
@ -110,15 +116,28 @@ defmodule Ash.Query.Operator.Basic do
{:known, Comp.greater_or_equal?(left, right)} {:known, Comp.greater_or_equal?(left, right)}
end end
defp do_evaluate(op, left, right) do defp do_evaluate(op, left, right)
if Decimal.is_decimal(left) || Decimal.is_decimal(right) do when Decimal.is_decimal(left) or Decimal.is_decimal(right) do
case op do case op do
:+ -> {:known, Decimal.add(to_decimal(left), to_decimal(right))} :+ -> {:known, Decimal.add(to_decimal(left), to_decimal(right))}
:* -> {:known, Decimal.mult(to_decimal(left), to_decimal(right))} :* -> {:known, Decimal.mult(to_decimal(left), to_decimal(right))}
:- -> {:known, Decimal.sub(to_decimal(left), to_decimal(right))} :- -> {:known, Decimal.sub(to_decimal(left), to_decimal(right))}
:/ -> {:known, Decimal.div(to_decimal(left), to_decimal(right))} :/ -> {:known, Decimal.div(to_decimal(left), to_decimal(right))}
end end
else end
if unquote(opts[:evaluate_types]) == :numbers do
defp do_evaluate(op, left, right)
when not ((is_integer(left) or is_float(left)) and
(is_integer(right) or is_float(right))) do
:unknown
end
defp do_evaluate(op, left, right) do
{:known, apply(Kernel, unquote(opts[:symbol]), [left, right])}
end
else
defp do_evaluate(op, left, right) do
{:known, apply(Kernel, unquote(opts[:symbol]), [left, right])} {:known, apply(Kernel, unquote(opts[:symbol]), [left, right])}
end end
end end