Skip to content

Commit

Permalink
coprocessor/dag/expr: add un-pushed builtin UDFs(Log1Arg, Log2Args) (t…
Browse files Browse the repository at this point in the history
…ikv#3603)

Signed-off-by: sllt <hello@sllt.me>
  • Loading branch information
sllt authored and huachaohuang committed Sep 17, 2018
1 parent e1b04eb commit 2972f3e
Show file tree
Hide file tree
Showing 2 changed files with 134 additions and 4 deletions.
128 changes: 128 additions & 0 deletions src/coprocessor/dag/expr/builtin_math.rs
Expand Up @@ -133,6 +133,29 @@ impl ScalarFunc {
}
}

#[inline]
pub fn log_1_arg(&self, ctx: &mut EvalContext, row: &[Datum]) -> Result<Option<f64>> {
let n = try_opt!(self.children[0].eval_real(ctx, row));
let res = n.ln();
if res.is_finite() {
Ok(Some(res))
} else {
Ok(None)
}
}

#[inline]
pub fn log_2_args(&self, ctx: &mut EvalContext, row: &[Datum]) -> Result<Option<f64>> {
let base = try_opt!(self.children[0].eval_real(ctx, row));
let n = try_opt!(self.children[1].eval_real(ctx, row));
let res = n.log(base);
if res.is_finite() {
Ok(Some(res))
} else {
Ok(None)
}
}

#[inline]
pub fn pi(&self, _ctx: &mut EvalContext, _row: &[Datum]) -> Result<Option<f64>> {
Ok(Some(f64::consts::PI))
Expand Down Expand Up @@ -574,6 +597,111 @@ mod test {
}
}

#[test]
fn test_log_1_arg() {
let tests = vec![
(ScalarFuncSig::Log1Arg, Datum::F64(f64::consts::E), 1.0_f64),
(
ScalarFuncSig::Log1Arg,
Datum::F64(100_f64),
4.605170185988092_f64,
),
];

let tests_invalid_f64 = vec![
(ScalarFuncSig::Log1Arg, Datum::F64(-1.0_f64), Datum::Null),
(ScalarFuncSig::Log1Arg, Datum::F64(0_f64), Datum::Null),
(ScalarFuncSig::Log1Arg, Datum::Null, Datum::Null),
];

let mut ctx = EvalContext::default();
for (sig, arg, exp) in tests {
let arg = datum_expr(arg);
let f = scalar_func_expr(sig, &[arg]);
let op = Expression::build(&mut ctx, f).unwrap();
let got = op.eval(&mut ctx, &[]).unwrap();
assert!((got.f64() - exp).abs() < f64::EPSILON);
}

for (sig, arg, exp) in tests_invalid_f64 {
let arg = datum_expr(arg);
let f = scalar_func_expr(sig, &[arg]);
let op = Expression::build(&mut ctx, f).unwrap();
let got = op.eval(&mut ctx, &[]).unwrap();
assert_eq!(got, exp);
}
}

#[test]
fn test_log_2_args() {
let tests = vec![
(
ScalarFuncSig::Log2Args,
Datum::F64(10.0_f64),
Datum::F64(100.0_f64),
2.0_f64,
),
(
ScalarFuncSig::Log2Args,
Datum::F64(2.0_f64),
Datum::F64(1.0_f64),
0.0_f64,
),
(
ScalarFuncSig::Log2Args,
Datum::F64(0.5_f64),
Datum::F64(0.25_f64),
2.0_f64,
),
];

let tests_invalid_f64 = vec![
(
ScalarFuncSig::Log2Args,
Datum::F64(-0.23323_f64),
Datum::F64(2.0_f64),
Datum::Null,
),
(
ScalarFuncSig::Log2Args,
Datum::Null,
Datum::Null,
Datum::Null,
),
(
ScalarFuncSig::Log2Args,
Datum::F64(2.0_f64),
Datum::Null,
Datum::Null,
),
(
ScalarFuncSig::Log2Args,
Datum::Null,
Datum::F64(2.0_f64),
Datum::Null,
),
];

let mut ctx = EvalContext::default();
for (sig, arg0, arg1, exp) in tests {
let arg0 = datum_expr(arg0);
let arg1 = datum_expr(arg1);
let f = scalar_func_expr(sig, &[arg0, arg1]);
let op = Expression::build(&mut ctx, f).unwrap();
let got = op.eval(&mut ctx, &[]).unwrap();
assert!((got.f64() - exp).abs() < f64::EPSILON);
}

for (sig, arg0, arg1, exp) in tests_invalid_f64 {
let arg0 = datum_expr(arg0);
let arg1 = datum_expr(arg1);
let f = scalar_func_expr(sig, &[arg0, arg1]);
let op = Expression::build(&mut ctx, f).unwrap();
let got = op.eval(&mut ctx, &[]).unwrap();
assert_eq!(got, exp);
}
}

#[test]
fn test_pi() {
let mut ctx = EvalContext::default();
Expand Down
10 changes: 6 additions & 4 deletions src/coprocessor/dag/expr/scalar_function.rs
Expand Up @@ -108,6 +108,7 @@ impl ScalarFunc {
| ScalarFuncSig::RightShift
| ScalarFuncSig::Pow
| ScalarFuncSig::Atan2Args
| ScalarFuncSig::Log2Args
| ScalarFuncSig::RegexpSig
| ScalarFuncSig::RegexpBinarySig
| ScalarFuncSig::DateFormatSig => (2, 2),
Expand Down Expand Up @@ -209,6 +210,7 @@ impl ScalarFunc {
| ScalarFuncSig::JsonTypeSig
| ScalarFuncSig::JsonUnquoteSig
| ScalarFuncSig::Log10
| ScalarFuncSig::Log1Arg
| ScalarFuncSig::Log2
| ScalarFuncSig::ASCII
| ScalarFuncSig::CharLength
Expand Down Expand Up @@ -374,8 +376,6 @@ impl ScalarFunc {
| ScalarFuncSig::LocateBinary2Args
| ScalarFuncSig::LocateBinary3Args
| ScalarFuncSig::Lock
| ScalarFuncSig::Log1Arg
| ScalarFuncSig::Log2Args
| ScalarFuncSig::Lpad
| ScalarFuncSig::LpadBinary
| ScalarFuncSig::MakeDate
Expand Down Expand Up @@ -820,6 +820,8 @@ dispatch_call! {
CaseWhenReal => case_when_real,
Log2 => log2,
Log10 => log10,
Log1Arg => log_1_arg,
Log2Args => log_2_args,
GreatestReal => greatest_real,
LeastReal => least_real,
Sqrt => sqrt,
Expand Down Expand Up @@ -1057,6 +1059,7 @@ mod test {
ScalarFuncSig::RightShift,
ScalarFuncSig::Pow,
ScalarFuncSig::Atan2Args,
ScalarFuncSig::Log2Args,
],
2,
2,
Expand Down Expand Up @@ -1162,6 +1165,7 @@ mod test {
ScalarFuncSig::ASCII,
ScalarFuncSig::Bin,
ScalarFuncSig::Log10,
ScalarFuncSig::Log1Arg,
ScalarFuncSig::Log2,
ScalarFuncSig::BitCount,
ScalarFuncSig::BitLength,
Expand Down Expand Up @@ -1363,8 +1367,6 @@ mod test {
ScalarFuncSig::LocateBinary2Args,
ScalarFuncSig::LocateBinary3Args,
ScalarFuncSig::Lock,
ScalarFuncSig::Log1Arg,
ScalarFuncSig::Log2Args,
ScalarFuncSig::Lpad,
ScalarFuncSig::LpadBinary,
ScalarFuncSig::MakeDate,
Expand Down

0 comments on commit 2972f3e

Please sign in to comment.