bkmgit commented on a change in pull request #11882:
URL: https://github.com/apache/arrow/pull/11882#discussion_r785186730



##########
File path: cpp/src/arrow/compute/kernels/scalar_compare_test.cc
##########
@@ -1865,5 +1861,636 @@ TEST(TestMaxElementWiseMinElementWise, CommonTemporal) {
               ResultWith(ScalarFromJSON(date64(), "86400000")));
 }
 
+template <typename ArrowType>
+static void ValidateBetween(BetweenOptions options, const Datum& val, const 
Datum& lhs,
+                            const Datum& rhs, const Datum& expected) {
+  ASSERT_OK_AND_ASSIGN(Datum result, Between(val, lhs, rhs, options, nullptr));
+  AssertArraysEqual(*expected.make_array(), *result.make_array(),
+                    /*verbose=*/true);
+}
+
+template <typename ArrowType>
+void ValidateBetween(BetweenOptions options, const Datum& val, const Datum& 
lhs,
+                     const Datum& rhs) {
+  CompareOperator lhs_val;
+  CompareOperator val_rhs;
+  BetweenOptions::Inclusive include_endpoints = options.inclusive;
+
+  if (include_endpoints == BetweenOptions::Inclusive::NEITHER) {
+    lhs_val = LESS;
+    val_rhs = LESS;
+  } else if (include_endpoints == BetweenOptions::Inclusive::LEFT) {
+    lhs_val = LESS_EQUAL;
+    val_rhs = LESS;
+  } else if (include_endpoints == BetweenOptions::Inclusive::RIGHT) {
+    lhs_val = LESS;
+    val_rhs = LESS_EQUAL;
+  } else {
+    lhs_val = LESS_EQUAL;
+    val_rhs = LESS_EQUAL;
+  }
+
+  ASSERT_OK_AND_ASSIGN(Datum resultl,
+                       CallFunction(CompareOperatorToFunctionName(lhs_val), 
{lhs, val}));
+  ASSERT_OK_AND_ASSIGN(Datum resultr,
+                       CallFunction(CompareOperatorToFunctionName(val_rhs), 
{val, rhs}));
+  ASSERT_OK_AND_ASSIGN(Datum expected, CallFunction("and", {resultl, 
resultr}));
+
+  ValidateBetween<ArrowType>(options, val, lhs, rhs, expected);
+}
+
+template <typename ArrowType>
+class TestNumericBetweenKernel : public ::testing::Test {};
+
+TYPED_TEST_SUITE(TestNumericBetweenKernel, NumericArrowTypes);
+TYPED_TEST(TestNumericBetweenKernel, SimpleBetweenArrayScalarScalar) {
+  using ScalarType = typename TypeTraits<TypeParam>::ScalarType;
+  using CType = typename TypeTraits<TypeParam>::CType;
+
+  Datum zero(std::make_shared<ScalarType>(CType(0)));
+  Datum four(std::make_shared<ScalarType>(CType(4)));
+  Datum null(std::make_shared<ScalarType>());
+  BetweenOptions InclusiveBoth(BetweenOptions::Inclusive::BOTH);
+  ValidateBetween<TypeParam>(
+      InclusiveBoth, ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), 
"[]"), zero,
+      four, ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[]"));
+  ValidateBetween<TypeParam>(
+      InclusiveBoth, ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), 
"[null]"),
+      zero, four, ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), 
"[null]"));
+  ValidateBetween<TypeParam>(
+      InclusiveBoth,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,0,1,1,2,2]"), 
zero, four,
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), 
"[1,1,1,1,1,1]"));
+  ValidateBetween<TypeParam>(
+      InclusiveBoth,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,1,2,3,4,5]"), 
zero, four,
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), 
"[1,1,1,1,1,0]"));
+  ValidateBetween<TypeParam>(
+      InclusiveBoth,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[5,4,3,2,1,0]"), 
zero, four,
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), 
"[0,1,1,1,1,1]"));
+  ValidateBetween<TypeParam>(
+      InclusiveBoth,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[null,0,1,1]"), 
zero, four,
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), 
"[null,1,1,1]"));
+  ValidateBetween<TypeParam>(
+      InclusiveBoth,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[5,4,3,2,1,0]"), 
null, four,
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                    "[null,null,null,null,null,null]"));
+  ValidateBetween<TypeParam>(
+      InclusiveBoth,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[5,4,3,2,1,0]"), 
zero, null,
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                    "[null,null,null,null,null,null]"));
+  BetweenOptions InclusiveLeft(BetweenOptions::Inclusive::LEFT);
+  ValidateBetween<TypeParam>(
+      InclusiveLeft, ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), 
"[]"), zero,
+      four, ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[]"));
+  ValidateBetween<TypeParam>(
+      InclusiveLeft, ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), 
"[null]"),
+      zero, four, ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), 
"[null]"));
+  ValidateBetween<TypeParam>(
+      InclusiveLeft,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,0,1,1,2,2]"), 
zero, four,
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), 
"[1,1,1,1,1,1]"));
+  ValidateBetween<TypeParam>(
+      InclusiveLeft,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,1,2,3,4,5]"), 
zero, four,
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), 
"[1,1,1,1,0,0]"));
+  ValidateBetween<TypeParam>(
+      InclusiveLeft,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[5,4,3,2,1,0]"), 
zero, four,
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), 
"[0,0,1,1,1,1]"));
+  ValidateBetween<TypeParam>(
+      InclusiveLeft,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[null,0,1,1]"), 
zero, four,
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), 
"[null,1,1,1]"));
+  ValidateBetween<TypeParam>(
+      InclusiveLeft,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[5,4,3,2,1,0]"), 
null, four,
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                    "[null,null,null,null,null,null]"));
+  ValidateBetween<TypeParam>(
+      InclusiveLeft,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[5,4,3,2,1,0]"), 
zero, null,
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                    "[null,null,null,null,null,null]"));
+  BetweenOptions InclusiveRight(BetweenOptions::Inclusive::RIGHT);
+  ValidateBetween<TypeParam>(
+      InclusiveRight, ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), 
"[]"), zero,
+      four, ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[]"));
+  ValidateBetween<TypeParam>(
+      InclusiveRight, ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), 
"[null]"),
+      zero, four, ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), 
"[null]"));
+  ValidateBetween<TypeParam>(
+      InclusiveRight,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,0,1,1,2,2]"), 
zero, four,
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), 
"[0,0,1,1,1,1]"));
+  ValidateBetween<TypeParam>(
+      InclusiveRight,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,1,2,3,4,5]"), 
zero, four,
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), 
"[0,1,1,1,1,0]"));
+  ValidateBetween<TypeParam>(
+      InclusiveRight,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[5,4,3,2,1,0]"), 
zero, four,
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), 
"[0,1,1,1,1,0]"));
+  ValidateBetween<TypeParam>(
+      InclusiveRight,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[null,0,1,1]"), 
zero, four,
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), 
"[null,0,1,1]"));
+  ValidateBetween<TypeParam>(
+      InclusiveRight,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[5,4,3,2,1,0]"), 
null, four,
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                    "[null,null,null,null,null,null]"));
+  ValidateBetween<TypeParam>(
+      InclusiveRight,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[5,4,3,2,1,0]"), 
zero, null,
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                    "[null,null,null,null,null,null]"));
+  BetweenOptions InclusiveNeither(BetweenOptions::Inclusive::NEITHER);
+  ValidateBetween<TypeParam>(
+      InclusiveNeither, ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), 
"[]"),
+      zero, four, ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), 
"[]"));
+  ValidateBetween<TypeParam>(
+      InclusiveNeither, ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), 
"[null]"),
+      zero, four, ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), 
"[null]"));
+  ValidateBetween<TypeParam>(
+      InclusiveNeither,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,0,1,1,2,2]"), 
zero, four,
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), 
"[0,0,1,1,1,1]"));
+  ValidateBetween<TypeParam>(
+      InclusiveNeither,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,1,2,3,4,5]"), 
zero, four,
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), 
"[0,1,1,1,0,0]"));
+  ValidateBetween<TypeParam>(
+      InclusiveNeither,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[5,4,3,2,1,0]"), 
zero, four,
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), 
"[0,0,1,1,1,0]"));
+  ValidateBetween<TypeParam>(
+      InclusiveNeither,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[null,0,1,1]"), 
zero, four,
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), 
"[null,0,1,1]"));
+  ValidateBetween<TypeParam>(
+      InclusiveNeither,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[5,4,3,2,1,0]"), 
null, four,
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                    "[null,null,null,null,null,null]"));
+  ValidateBetween<TypeParam>(
+      InclusiveNeither,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[5,4,3,2,1,0]"), 
zero, null,
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                    "[null,null,null,null,null,null]"));
+}
+
+TYPED_TEST(TestNumericBetweenKernel, SimpleBetweenScalarArrayArray) {
+  using ScalarType = typename TypeTraits<TypeParam>::ScalarType;
+  using CType = typename TypeTraits<TypeParam>::CType;
+
+  Datum one(std::make_shared<ScalarType>(CType(1)));
+
+  BetweenOptions InclusiveBoth(BetweenOptions::Inclusive::BOTH);
+  ValidateBetween<TypeParam>(
+      InclusiveBoth, one, 
ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[]"));
+  ValidateBetween<TypeParam>(
+      InclusiveBoth, one,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[null]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[null]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[null]"));
+  ValidateBetween<TypeParam>(
+      InclusiveBoth, one,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,0,1,3,3]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[10,10,2,5,5]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                    "[true,true,true,false,false]"));
+  ValidateBetween<TypeParam>(
+      InclusiveBoth, one,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), 
"[0,0,1,null,3,3]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,10,2,2,5,5]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                    "[false,true,true,null,false,false]"));
+  BetweenOptions InclusiveLeft(BetweenOptions::Inclusive::LEFT);
+  ValidateBetween<TypeParam>(
+      InclusiveLeft, one, 
ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[]"));
+  ValidateBetween<TypeParam>(
+      InclusiveLeft, one,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[null]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[null]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[null]"));
+  ValidateBetween<TypeParam>(
+      InclusiveLeft, one,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,0,1,3,3]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[10,10,2,5,5]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                    "[true,true,true,false,false]"));
+  ValidateBetween<TypeParam>(
+      InclusiveLeft, one,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), 
"[0,0,1,null,3,3]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,10,2,2,5,5]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                    "[false,true,true,null,false,false]"));
+  BetweenOptions InclusiveRight(BetweenOptions::Inclusive::RIGHT);
+  ValidateBetween<TypeParam>(
+      InclusiveRight, one, 
ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[]"));
+  ValidateBetween<TypeParam>(
+      InclusiveRight, one,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[null]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[null]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[null]"));
+  ValidateBetween<TypeParam>(
+      InclusiveRight, one,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,0,1,3,3]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[10,10,2,5,5]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                    "[true,true,false,false,false]"));
+  ValidateBetween<TypeParam>(
+      InclusiveRight, one,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), 
"[0,0,1,null,3,3]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,10,2,2,5,5]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                    "[false,true,false,null,false,false]"));
+  BetweenOptions InclusiveNeither(BetweenOptions::Inclusive::NEITHER);
+  ValidateBetween<TypeParam>(
+      InclusiveNeither, one, 
ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[]"));
+  ValidateBetween<TypeParam>(
+      InclusiveNeither, one,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[null]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[null]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[null]"));
+  ValidateBetween<TypeParam>(
+      InclusiveNeither, one,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,0,1,3,3]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[10,10,2,5,5]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                    "[true,true,false,false,false]"));
+  ValidateBetween<TypeParam>(
+      InclusiveNeither, one,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), 
"[0,0,1,null,3,3]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,10,2,2,5,5]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                    "[false,true,false,null,false,false]"));
+}
+
+TYPED_TEST(TestNumericBetweenKernel, SimpleBetweenArrayArrayArray) {
+  BetweenOptions InclusiveBoth(BetweenOptions::Inclusive::BOTH);
+  ValidateBetween<TypeParam>(
+      InclusiveBoth, ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), 
"[]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[]"));
+  ValidateBetween<TypeParam>(
+      InclusiveBoth, ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), 
"[null]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[null]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[null]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[null]"));
+  ValidateBetween<TypeParam>(
+      InclusiveBoth,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[1,1,2,2,2]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,0,1,3,3]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[10,10,2,5,5]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                    "[true,true,true,false,false]"));
+  ValidateBetween<TypeParam>(
+      InclusiveBoth,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,1,2,2,2,2]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), 
"[0,0,1,null,3,3]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,10,2,2,5,5]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                    "[true,true,true,null,false,false]"));
+  BetweenOptions InclusiveLeft(BetweenOptions::Inclusive::LEFT);
+  ValidateBetween<TypeParam>(
+      InclusiveLeft, ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), 
"[]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[]"));
+  ValidateBetween<TypeParam>(
+      InclusiveLeft, ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), 
"[null]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[null]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[null]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[null]"));
+  ValidateBetween<TypeParam>(
+      InclusiveLeft,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[1,1,2,2,2]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,0,1,3,3]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[10,10,2,5,5]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                    "[true,true,false,false,false]"));
+  ValidateBetween<TypeParam>(
+      InclusiveLeft,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,1,2,2,2,2]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), 
"[0,0,1,null,3,3]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,10,2,2,5,5]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                    "[false,true,false,null,false,false]"));
+  BetweenOptions InclusiveRight(BetweenOptions::Inclusive::RIGHT);
+  ValidateBetween<TypeParam>(
+      InclusiveRight, ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), 
"[]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[]"));
+  ValidateBetween<TypeParam>(
+      InclusiveRight, ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), 
"[null]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[null]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[null]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[null]"));
+  ValidateBetween<TypeParam>(
+      InclusiveRight,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[1,1,2,2,2]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,0,1,3,3]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[10,10,2,5,5]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                    "[true,true,true,false,false]"));
+  ValidateBetween<TypeParam>(
+      InclusiveRight,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,1,2,2,2,2]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), 
"[0,0,1,null,3,3]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,10,2,2,5,5]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                    "[false,true,true,null,false,false]"));
+  BetweenOptions InclusiveNeither(BetweenOptions::Inclusive::NEITHER);
+  ValidateBetween<TypeParam>(
+      InclusiveNeither, ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), 
"[]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[]"));
+  ValidateBetween<TypeParam>(
+      InclusiveNeither, ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), 
"[null]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[null]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[null]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[null]"));
+  ValidateBetween<TypeParam>(
+      InclusiveNeither,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[1,1,2,2,2]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,0,1,3,3]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[10,10,2,5,5]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                    "[true,true,false,false,false]"));
+  ValidateBetween<TypeParam>(
+      InclusiveNeither,
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,1,2,2,2,2]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), 
"[0,0,1,null,3,3]"),
+      ArrayFromJSON(TypeTraits<TypeParam>::type_singleton(), "[0,10,2,2,5,5]"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                    "[false,true,false,null,false,false]"));
+}
+
+template <typename Type>
+struct BetweenRandomNumeric {
+  static void Test(const std::shared_ptr<DataType>& type) {
+    using ScalarType = typename TypeTraits<Type>::ScalarType;
+    using CType = typename TypeTraits<Type>::CType;
+    auto rand = random::RandomArrayGenerator(0x5416447);
+    const int64_t length = 1000;
+    for (auto null_probability : {0.0, 0.01, 0.1, 0.25, 0.5, 1.0}) {
+      for (auto inclusive :
+           {BetweenOptions::Inclusive::BOTH, BetweenOptions::Inclusive::LEFT,
+            BetweenOptions::Inclusive::RIGHT, 
BetweenOptions::Inclusive::NEITHER}) {
+        auto data1 =
+            rand.Numeric<typename Type::PhysicalType>(length, 0, 100, 
null_probability);
+        auto data2 =
+            rand.Numeric<typename Type::PhysicalType>(length, 0, 100, 
null_probability);
+        auto data3 =
+            rand.Numeric<typename Type::PhysicalType>(length, 0, 100, 
null_probability);
+
+        // Create view of data as the type (e.g. timestamp)
+        auto array1 = Datum(*data1->View(type));
+        auto array2 = Datum(*data2->View(type));
+        auto array3 = Datum(*data3->View(type));
+        auto scalar1 = Datum(std::make_shared<ScalarType>(CType(10), type));
+        auto scalar2 = Datum(std::make_shared<ScalarType>(CType(30), type));
+        auto scalar3 = Datum(std::make_shared<ScalarType>(CType(50), type));
+        auto options = BetweenOptions(inclusive);
+        ValidateBetween<Type>(options, array1, scalar2, scalar3);
+        ValidateBetween<Type>(options, array1, array2, scalar3);
+        ValidateBetween<Type>(options, array1, array2, array3);
+        ValidateBetween<Type>(options, array1, scalar2, scalar3);
+        ValidateBetween<Type>(options, scalar1, array2, array3);
+        ValidateBetween<Type>(options, scalar1, array2, scalar3);
+        ValidateBetween<Type>(options, scalar1, scalar2, array3);
+        ValidateBetween<Type>(options, array1, scalar2, array3);
+      }
+    }
+  }
+};
+
+TEST(TestNumericBetweenKernel, BetweenPrimitiveRandomTests) {
+  TestRandomPrimitiveCTypes<BetweenRandomNumeric>();
+}
+
+class TestStringBetweenKernel : public ::testing::Test {};
+
+TEST(TestStringBetweenKernel, RandomBetween) {
+  using ScalarType = typename TypeTraits<StringType>::ScalarType;
+
+  auto rand = random::RandomArrayGenerator(0x5416447);
+  for (size_t i = 3; i < 10; i++) {
+    for (auto null_probability : {0.0, 0.01, 0.1, 0.25, 0.5, 1.0}) {
+      for (auto inclusive :
+           {BetweenOptions::Inclusive::BOTH, BetweenOptions::Inclusive::LEFT,
+            BetweenOptions::Inclusive::RIGHT, 
BetweenOptions::Inclusive::NEITHER}) {
+        const int64_t length = static_cast<int64_t>(1ULL << i);
+        auto array1 = Datum(rand.String(length, 0, 16, null_probability));
+        auto array2 = Datum(rand.String(length, 0, 16, null_probability));
+        auto array3 = Datum(rand.String(length, 0, 16, null_probability));
+        auto scalar1 = Datum(std::make_shared<ScalarType>("fupi"));
+        auto scalar2 = Datum(std::make_shared<ScalarType>("tupu"));
+        auto scalar3 = Datum(std::make_shared<ScalarType>("zito"));
+        auto options = BetweenOptions(inclusive);
+        ValidateBetween<StringType>(options, array1, scalar2, scalar3);
+        ValidateBetween<StringType>(options, scalar1, array2, scalar3);
+        ValidateBetween<StringType>(options, scalar1, scalar2, array3);
+        ValidateBetween<StringType>(options, scalar1, array2, array3);
+        ValidateBetween<StringType>(options, array1, scalar2, array3);
+        ValidateBetween<StringType>(options, array1, array2, scalar3);
+        ValidateBetween<StringType>(options, array1, array2, array3);
+      }
+    }
+  }
+}
+
+TEST(TestStringBetweenKernel, StringArrayScalarScalarTest) {
+  using ScalarType = typename TypeTraits<StringType>::ScalarType;
+  auto l = Datum(std::make_shared<ScalarType>("abc"));
+  auto r = Datum(std::make_shared<ScalarType>("zzz"));
+  BetweenOptions InclusiveOption(BetweenOptions::Inclusive::BOTH);
+  ValidateBetween<StringType>(
+      InclusiveOption, ArrayFromJSON(TypeTraits<StringType>::type_singleton(), 
"[]"), l,
+      r, ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[]"));
+  ValidateBetween<StringType>(
+      InclusiveOption, ArrayFromJSON(TypeTraits<StringType>::type_singleton(), 
"[null]"),
+      l, r, ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), 
"[null]"));
+  ValidateBetween<StringType>(InclusiveOption,
+                              
ArrayFromJSON(TypeTraits<StringType>::type_singleton(),
+                                            R"(["aaa", "aaaa", "ccc", "z"])"),
+                              l, r,
+                              
ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                                            R"([false, false, true, true])"));
+  ValidateBetween<StringType>(InclusiveOption,
+                              
ArrayFromJSON(TypeTraits<StringType>::type_singleton(),
+                                            R"(["a", "aaaa", "c", "z"])"),
+                              l, r,
+                              
ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                                            R"([false, false, true, true])"));
+  ValidateBetween<StringType>(InclusiveOption,
+                              
ArrayFromJSON(TypeTraits<StringType>::type_singleton(),
+                                            R"(["a", "aaaa", "fff", "zzzz"])"),
+                              l, r,
+                              
ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                                            R"([false, false, true, false])"));
+  ValidateBetween<StringType>(InclusiveOption,
+                              
ArrayFromJSON(TypeTraits<StringType>::type_singleton(),
+                                            R"(["abc", "baa", "fff", "zzz"])"),
+                              l, r,
+                              
ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                                            R"([true, true, true, true])"));
+  ValidateBetween<StringType>(InclusiveOption,
+                              
ArrayFromJSON(TypeTraits<StringType>::type_singleton(),
+                                            R"(["abd", null, null, "zzx"])"),
+                              l, r,
+                              
ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(),
+                                            R"([true, null, null, true])"));
+}
+
+TEST(TestStringBetweenKernel, StringArrayArrayArrayTest) {
+  BetweenOptions InclusiveOption(BetweenOptions::Inclusive::BOTH);
+  ValidateBetween<StringType>(
+      InclusiveOption,
+      ArrayFromJSON(TypeTraits<StringType>::type_singleton(),
+                    R"(["david","hello","world"])"),
+      ArrayFromJSON(TypeTraits<StringType>::type_singleton(), 
R"(["adam","hi","whirl"])"),
+      ArrayFromJSON(TypeTraits<StringType>::type_singleton(),
+                    R"(["robert","goeiemoreen","whirlwind"])"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[true, false, 
false]"));
+  ValidateBetween<StringType>(
+      InclusiveOption,
+      ArrayFromJSON(TypeTraits<StringType>::type_singleton(), 
R"(["x","a","f"])"),
+      ArrayFromJSON(TypeTraits<StringType>::type_singleton(), 
R"(["w","a","e"])"),
+      ArrayFromJSON(TypeTraits<StringType>::type_singleton(), 
R"(["z","a","g"])"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[true, true, 
true]"));
+  ValidateBetween<StringType>(
+      InclusiveOption,
+      ArrayFromJSON(TypeTraits<StringType>::type_singleton(),
+                    R"(["block","bit","binary"])"),
+      ArrayFromJSON(TypeTraits<StringType>::type_singleton(),
+                    R"(["bit","nibble","ternary"])"),
+      ArrayFromJSON(TypeTraits<StringType>::type_singleton(), 
R"(["word","d","xyz"])"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[true, false, 
false]"));
+  ValidateBetween<StringType>(
+      InclusiveOption,
+      ArrayFromJSON(TypeTraits<StringType>::type_singleton(),
+                    R"(["よしもと","の","ち"])"),
+      ArrayFromJSON(TypeTraits<StringType>::type_singleton(), 
R"(["は","へ","あ"])"),
+      ArrayFromJSON(TypeTraits<StringType>::type_singleton(), 
R"(["な","を","ち"])"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[false, false, 
true]"));
+  ValidateBetween<StringType>(
+      InclusiveOption,
+      ArrayFromJSON(TypeTraits<StringType>::type_singleton(), 
R"(["A","ア","王"])"),
+      ArrayFromJSON(TypeTraits<StringType>::type_singleton(), 
R"(["た","あ","歩"])"),
+      ArrayFromJSON(TypeTraits<StringType>::type_singleton(), 
R"(["李","田",null])"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[false, true, 
null]"));
+  ValidateBetween<StringType>(
+      InclusiveOption,
+      ArrayFromJSON(TypeTraits<StringType>::type_singleton(), 
R"(["Б",null,"Я"])"),
+      ArrayFromJSON(TypeTraits<StringType>::type_singleton(), 
R"(["А","Ж","Щ"])"),
+      ArrayFromJSON(TypeTraits<StringType>::type_singleton(), 
R"(["Д","Л","Ф"])"),
+      ArrayFromJSON(TypeTraits<BooleanType>::type_singleton(), "[true, null, 
false]"));
+}
+
+TEST(TestTimestampsBetweenKernel, TimestampsArrayArrayArrayTest) {
+  const std::string arr_json = R"(["1970-01-01","2000-02-02","1900-02-28"])";
+  const std::string lhs_json = R"(["1970-01-01","2000-02-01","1900-02-28"])";
+  const std::string rhs_json = R"(["1970-01-02","2000-02-02","1900-02-28"])";
+  // Between Options
+  BetweenOptions both(BetweenOptions::Inclusive::BOTH);
+  BetweenOptions left(BetweenOptions::Inclusive::LEFT);
+  BetweenOptions right(BetweenOptions::Inclusive::RIGHT);
+  BetweenOptions neither(BetweenOptions::Inclusive::NEITHER);
+  // Same units should be fine
+  auto arr = ArrayFromJSON(timestamp(TimeUnit::SECOND), arr_json);
+  auto lhs = ArrayFromJSON(timestamp(TimeUnit::SECOND), lhs_json);
+  auto rhs = ArrayFromJSON(timestamp(TimeUnit::SECOND), rhs_json);
+  // BOTH
+  ValidateBetween<TimestampType>(both, arr, lhs, rhs);
+  // LEFT
+  ValidateBetween<TimestampType>(left, arr, lhs, rhs);
+  // RIGHT
+  ValidateBetween<TimestampType>(right, arr, lhs, rhs);
+  // NEITHER
+  ValidateBetween<TimestampType>(neither, arr, lhs, rhs);
+/*  // So are same time zones
+  arr = ArrayFromJSON(timestamp(TimeUnit::SECOND, "America/Chicago"), 
arr_json);
+  lhs = ArrayFromJSON(timestamp(TimeUnit::SECOND, "America/Chicago"), 
lhs_json);
+  rhs = ArrayFromJSON(timestamp(TimeUnit::SECOND, "America/Chicago"), 
rhs_json);
+  // BOTH
+  ValidateBetween<TimestampType>(both, arr, lhs, rhs);
+  // LEFT
+  ValidateBetween<TimestampType>(left, arr, lhs, rhs);
+  // RIGHT
+  ValidateBetween<TimestampType>(right, arr, lhs, rhs);
+  // NEITHER
+  ValidateBetween<TimestampType>(neither, arr, lhs, rhs);
+  // Different units should be fine
+  auto arr = ArrayFromJSON(timestamp(TimeUnit::SECOND), arr_json);
+  auto lhs = ArrayFromJSON(timestamp(TimeUnit::MILLI), lhs_json);
+  auto rhs = ArrayFromJSON(timestamp(TimeUnit::SECOND), rhs_json);
+  // BOTH

Review comment:
       Some fixes are still needed to pass tests,  (timezones are fine, but 
timestamps with different units are not), otherwise most of the functionality 
is there now.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscr...@arrow.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Reply via email to