mirror of
https://github.com/ash-project/ash.git
synced 2024-09-20 13:33:20 +12:00
fix: don't evaluate unknown types in basic operators
This commit is contained in:
parent
e976956254
commit
6136ca693b
1 changed files with 32 additions and 13 deletions
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue