query/functor_unittest.cu (1,038 lines of code) (raw):

// Copyright (c) 2017-2018 Uber Technologies, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include <thrust/host_vector.h> #include <thrust/iterator/zip_iterator.h> #include <thrust/transform.h> #include <thrust/tuple.h> #include <thrust/sort.h> #include <thrust/execution_policy.h> #include <algorithm> #include <iterator> #include <tuple> #include "gtest/gtest.h" #include "query/functor.hpp" #include "query/iterator.hpp" #include "query/unittest_utils.hpp" extern uint16_t DAYS_BEFORE_MONTH_HOST[13]; namespace ares { typedef typename thrust::host_vector<UUIDT>::iterator UUIDIter; typedef typename thrust::host_vector<bool>::iterator BoolIter; typedef typename thrust::host_vector<int>::iterator IntIter; typedef typename thrust::host_vector<int16_t>::iterator Int16Iter; typedef typename thrust::host_vector<uint32_t>::iterator Uint32Iter; // cppcheck-suppress * TEST(LogicalFunctorTest, TestBool) { bool values1[5] = {false, false, false, true, true}; bool nulls1[5] = {false, true, true, true, true}; bool values2[5] = {false, false, true, false, true}; bool nulls2[5] = {false, true, true, true, true}; // output bool outputValues[5]; thrust::fill(std::begin(outputValues), std::end(outputValues), false); bool outputNulls[5]; thrust::fill(std::begin(outputNulls), std::end(outputNulls), false); typedef thrust::zip_iterator< thrust::tuple<BoolIter, BoolIter> > InputZipIterator; typedef thrust::zip_iterator<thrust::tuple<BoolIter, BoolIter> > OutputZipIterator; InputZipIterator begin1(thrust::make_tuple(std::begin(values1), std::begin(nulls1))); InputZipIterator end1(thrust::make_tuple(std::end(values1), std::end(nulls1))); InputZipIterator begin2(thrust::make_tuple(std::begin(values2), std::begin(nulls2))); OutputZipIterator outputBegin( thrust::make_tuple(std::begin(outputValues), std::begin(outputNulls))); // Test AndFunctor thrust::transform(begin1, end1, begin2, outputBegin, AndFunctor()); bool expectedValues[5] = {false, false, false, false, true}; bool expectedNulls[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls))); // Test OrFunctor thrust::transform(begin1, end1, begin2, outputBegin, OrFunctor()); bool expectedValues2[5] = {false, false, true, true, true}; bool expectedNulls2[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues2))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls2))); // Test NotFunctor thrust::transform(begin1, end1, outputBegin, NotFunctor()); bool expectedValues3[5] = {false, true, true, false, false}; bool expectedNulls3[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues3))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls3))); } // cppcheck-suppress * TEST(LogicalFunctorTest, TestInt) { int values1[5] = {0, 10, 0, 0, 10}; bool nulls1[5] = {false, true, true, true, true}; int values2[5] = {0, 0, 10, 0, 10}; bool nulls2[5] = {false, true, true, true, true}; // output bool outputValues[5]; thrust::fill(std::begin(outputValues), std::end(outputValues), false); bool outputNulls[5]; thrust::fill(std::begin(outputNulls), std::end(outputNulls), false); int *valuesBegin1 = &values1[0]; bool *nullsBegin1 = &nulls1[0]; int *valuesBegin2 = &values2[0]; bool *nullsBegin2 = &nulls2[0]; typedef thrust::zip_iterator< thrust::tuple<IntIter, BoolIter> > InputZipIterator; typedef thrust::zip_iterator<thrust::tuple<BoolIter, BoolIter> > OutputZipIterator; InputZipIterator begin1(thrust::make_tuple(valuesBegin1, nullsBegin1)); InputZipIterator end1( thrust::make_tuple(valuesBegin1 + 5, nullsBegin1 + 5)); InputZipIterator begin2(thrust::make_tuple(valuesBegin2, nullsBegin2)); OutputZipIterator outputBegin( thrust::make_tuple(std::begin(outputValues), std::begin(outputNulls))); thrust::transform(begin1, end1, begin2, outputBegin, AndFunctor()); bool expectedValues[5] = {false, false, false, false, true}; bool expectedNulls[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls))); // Test OrFunctor thrust::transform(begin1, end1, begin2, outputBegin, OrFunctor()); bool expectedValues2[5] = {false, true, true, false, true}; bool expectedNulls2[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues2))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls2))); // Test NotFunctor thrust::transform(begin1, end1, outputBegin, NotFunctor()); bool expectedValues3[5] = {false, false, true, true, false}; bool expectedNulls3[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues3))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls3))); } // cppcheck-suppress * TEST(LogicalFunctorTest, TestOrFunctor) { OrFunctor f; thrust::tuple<bool, bool> res = f(thrust::make_tuple(true, true), thrust::make_tuple(true, false)); EXPECT_EQ(thrust::get<0>(res), true); EXPECT_EQ(thrust::get<1>(res), true); res = f(thrust::make_tuple(false, true), thrust::make_tuple(true, false)); EXPECT_EQ(thrust::get<0>(res), false); EXPECT_EQ(thrust::get<1>(res), false); res = f(thrust::make_tuple(false, true), thrust::make_tuple(false, true)); EXPECT_EQ(thrust::get<0>(res), false); EXPECT_EQ(thrust::get<1>(res), true); } // cppcheck-suppress * TEST(ComparisonFunctorTest, TestInt) { int values1[5] = {0, 10, 0, 0, 10}; bool nulls1[5] = {false, true, true, true, true}; int values2[5] = {0, 0, 10, 0, 10}; bool nulls2[5] = {false, true, true, true, true}; // output bool outputValues[5]; thrust::fill(std::begin(outputValues), std::end(outputValues), false); bool outputNulls[5]; thrust::fill(std::begin(outputNulls), std::end(outputNulls), false); int *valuesBegin1 = &values1[0]; bool *nullsBegin1 = &nulls1[0]; int *valuesBegin2 = &values2[0]; bool *nullsBegin2 = &nulls2[0]; typedef thrust::zip_iterator< thrust::tuple<IntIter, BoolIter> > InputZipIterator; typedef thrust::zip_iterator<thrust::tuple<BoolIter, BoolIter> > OutputZipIterator; InputZipIterator begin1(thrust::make_tuple(valuesBegin1, nullsBegin1)); InputZipIterator end1( thrust::make_tuple(valuesBegin1 + 5, nullsBegin1 + 5)); InputZipIterator begin2(thrust::make_tuple(valuesBegin2, nullsBegin2)); OutputZipIterator outputBegin( thrust::make_tuple(std::begin(outputValues), std::begin(outputNulls))); // Test EqualFunctor thrust::transform(begin1, end1, begin2, outputBegin, EqualFunctor<int>()); bool expectedValues[5] = {false, false, false, true, true}; bool expectedNulls[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls))); // Test NotEqualFunctor thrust::transform(begin1, end1, begin2, outputBegin, NotEqualFunctor<int>()); bool expectedValues2[5] = {false, true, true, false, false}; bool expectedNulls2[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues2))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls2))); // Test LessThanFunctor thrust::transform(begin1, end1, begin2, outputBegin, LessThanFunctor<int>()); bool expectedValues3[5] = {false, false, true, false, false}; bool expectedNulls3[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues3))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls3))); // Test LessThanOrEqualFunctor thrust::transform(begin1, end1, begin2, outputBegin, LessThanOrEqualFunctor<int>()); bool expectedValues4[5] = {false, false, true, true, true}; bool expectedNulls4[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues4))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls4))); // Test GreaterThanFunctor thrust::transform(begin1, end1, begin2, outputBegin, GreaterThanFunctor<int>()); bool expectedValues5[5] = {false, true, false, false, false}; bool expectedNulls5[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues5))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls5))); // Test GreaterThanOrEqualFunctor thrust::transform(begin1, end1, begin2, outputBegin, GreaterThanOrEqualFunctor<int>()); bool expectedValues6[5] = {false, true, false, true, true}; bool expectedNulls6[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues6))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls6))); } // cppcheck-suppress * TEST(ComparisonFunctorTest, TestUpperCast) { int values1[5] = {0, 10, 0, 0x10, 10}; bool nulls1[5] = {false, true, true, true, true}; int16_t values2[5] = {0, 0, 10, 0, 10}; bool nulls2[5] = {false, true, true, true, true}; // output bool outputValues[5]; thrust::fill(std::begin(outputValues), std::end(outputValues), false); bool outputNulls[5]; thrust::fill(std::begin(outputNulls), std::end(outputNulls), false); int *valuesBegin1 = &values1[0]; bool *nullsBegin1 = &nulls1[0]; int16_t *valuesBegin2 = &values2[0]; bool *nullsBegin2 = &nulls2[0]; typedef thrust::zip_iterator< thrust::tuple<IntIter, BoolIter> > InputZipIterator; typedef thrust::zip_iterator< thrust::tuple<Int16Iter, BoolIter> > InputZipIterator2; typedef thrust::zip_iterator<thrust::tuple<BoolIter, BoolIter> > OutputZipIterator; InputZipIterator begin1(thrust::make_tuple(valuesBegin1, nullsBegin1)); InputZipIterator end1( thrust::make_tuple(valuesBegin1 + 5, nullsBegin1 + 5)); InputZipIterator2 begin2(thrust::make_tuple(valuesBegin2, nullsBegin2)); OutputZipIterator outputBegin( thrust::make_tuple(std::begin(outputValues), std::begin(outputNulls))); thrust::transform(begin1, end1, begin2, outputBegin, GreaterThanFunctor<int>()); bool expectedValues[5] = {false, true, false, true, false}; bool expectedNulls[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls))); } // cppcheck-suppress * TEST(ArithmeticFunctorTest, TestInt) { int values1[5] = {0, 10, 0, 0, 10}; bool nulls1[5] = {false, true, true, true, true}; int values2[5] = {0, 1, 10, 1, 10}; bool nulls2[5] = {false, true, true, true, true}; // output int outputValues[5]; thrust::fill(std::begin(outputValues), std::end(outputValues), 0); bool outputNulls[5]; thrust::fill(std::begin(outputNulls), std::end(outputNulls), false); int *valuesBegin1 = &values1[0]; bool *nullsBegin1 = &nulls1[0]; int *valuesBegin2 = &values2[0]; bool *nullsBegin2 = &nulls2[0]; typedef thrust::zip_iterator< thrust::tuple<IntIter, BoolIter> > InputZipIterator; typedef thrust::zip_iterator<thrust::tuple<IntIter, BoolIter> > OutputZipIterator; InputZipIterator begin1(thrust::make_tuple(valuesBegin1, nullsBegin1)); InputZipIterator end1( thrust::make_tuple(valuesBegin1 + 5, nullsBegin1 + 5)); InputZipIterator begin2(thrust::make_tuple(valuesBegin2, nullsBegin2)); OutputZipIterator outputBegin( thrust::make_tuple(std::begin(outputValues), std::begin(outputNulls))); // Test PlusFunctor thrust::transform(begin1, end1, begin2, outputBegin, PlusFunctor<int>()); int expectedValues[5] = {0, 11, 10, 1, 20}; bool expectedNulls[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls))); // Test MinusFunctor thrust::transform(begin1, end1, begin2, outputBegin, MinusFunctor<int>()); int expectedValues2[5] = {0, 9, -10, -1, 0}; bool expectedNulls2[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues2))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls2))); // Test MutiplyFunctor thrust::transform(begin1, end1, begin2, outputBegin, MultiplyFunctor<int>()); int expectedValues3[5] = {0, 10, 0, 0, 100}; bool expectedNulls3[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues3))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls3))); // Test DivideFunctor thrust::transform(begin1, end1, begin2, outputBegin, DivideFunctor<int>()); int expectedValues4[5] = {0, 10, 0, 0, 1}; bool expectedNulls4[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues4))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls4))); // Test ModFunctor thrust::transform(begin1, end1, begin2, outputBegin, ModFunctor<int>()); int expectedValues5[5] = {0, 0, 0, 0, 0}; bool expectedNulls5[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues5))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls5))); // Test NegateFunctor thrust::transform(begin1, end1, outputBegin, NegateFunctor<int>()); int expectedValues6[5] = {0, -10, 0, 0, -10}; bool expectedNulls6[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues6))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls6))); // Test FloorFunctor thrust::transform(begin1, end1, begin2, outputBegin, FloorFunctor<int>()); int expectedValues7[5] = {0, 10, 0, 0, 10}; bool expectedNulls7[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues7))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls7))); } // cppcheck-suppress * TEST(BitwiseFunctorTest, TestInt) { int values1[5] = {0, 0xF0, 0x0F, 0x00, 0x00}; bool nulls1[5] = {false, true, true, true, true}; int values2[5] = {0, 0x00, 0x0F, 0xF0, 0x00}; bool nulls2[5] = {false, true, true, true, true}; // output int outputValues[5]; thrust::fill(std::begin(outputValues), std::end(outputValues), 0); bool outputNulls[5]; thrust::fill(std::begin(outputNulls), std::end(outputNulls), false); int *valuesBegin1 = &values1[0]; bool *nullsBegin1 = &nulls1[0]; int *valuesBegin2 = &values2[0]; bool *nullsBegin2 = &nulls2[0]; typedef thrust::zip_iterator< thrust::tuple<IntIter, BoolIter> > InputZipIterator; typedef thrust::zip_iterator<thrust::tuple<IntIter, BoolIter> > OutputZipIterator; InputZipIterator begin1(thrust::make_tuple(valuesBegin1, nullsBegin1)); InputZipIterator end1( thrust::make_tuple(valuesBegin1 + 5, nullsBegin1 + 5)); InputZipIterator begin2(thrust::make_tuple(valuesBegin2, nullsBegin2)); OutputZipIterator outputBegin( thrust::make_tuple(std::begin(outputValues), std::begin(outputNulls))); // Test BitwiseAndFunctor thrust::transform(begin1, end1, begin2, outputBegin, BitwiseAndFunctor<int>()); int expectedValues[5] = {0, 0x00, 0x0F, 0x00, 0x00}; bool expectedNulls[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls))); // Test BitwiseOrFunctor thrust::transform(begin1, end1, begin2, outputBegin, BitwiseOrFunctor<int>()); int expectedValues2[5] = {0, 0xF0, 0x0F, 0xF0, 0x00}; bool expectedNulls2[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues2))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls2))); // Test BitwiseXorFunctor thrust::transform(begin1, end1, begin2, outputBegin, BitwiseXorFunctor<int>()); int expectedValues3[5] = {0, 0xF0, 0x00, 0xF0, 0x00}; bool expectedNulls3[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues3))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls3))); // Test BitwiseNotFunctor thrust::transform(begin1, end1, outputBegin, BitwiseNotFunctor<int>()); int expectedValues4[5] = {0, static_cast<int>(0xFFFFFF0F), static_cast<int>(0xFFFFFFF0), static_cast<int>(0xFFFFFFFF), static_cast<int>(0xFFFFFFFF)}; bool expectedNulls4[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues4))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls4))); } // cppcheck-suppress * TEST(MiscFunctorTest, TestInt) { int values1[5] = {0, 0, 0, 0, 0}; bool nulls1[5] = {true, true, true, true, false}; // output int outputValues[5]; thrust::fill(std::begin(outputValues), std::end(outputValues), 0); bool outputNulls[5]; thrust::fill(std::begin(outputNulls), std::end(outputNulls), false); int *valuesBegin1 = &values1[0]; bool *nullsBegin1 = &nulls1[0]; typedef thrust::zip_iterator< thrust::tuple<IntIter, BoolIter> > InputZipIterator; typedef thrust::zip_iterator<thrust::tuple<IntIter, BoolIter> > OutputZipIterator; InputZipIterator begin1(thrust::make_tuple(valuesBegin1, nullsBegin1)); InputZipIterator end1( thrust::make_tuple(valuesBegin1 + 5, nullsBegin1 + 5)); OutputZipIterator outputBegin( thrust::make_tuple(std::begin(outputValues), std::begin(outputNulls))); // Test IsNullFunctor thrust::transform(begin1, end1, outputBegin, IsNullFunctor()); int expectedValues[5] = {0, 0, 0, 0, 1}; bool expectedNulls[5] = {true, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls))); // Test IsNotNullFunctor thrust::transform(begin1, end1, outputBegin, IsNotNullFunctor()); int expectedValues2[5] = {1, 1, 1, 1, 0}; bool expectedNulls2[5] = {true, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues2))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls2))); // Test NoopFunctor thrust::transform(begin1, end1, outputBegin, NoopFunctor<int>()); int expectedValues3[5] = {0, 0, 0, 0, 0}; bool expectedNulls3[5] = {true, true, true, true, false}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues3))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls3))); } // cppcheck-suppress * TEST(RemoveFilterTest, CheckRemoveFilter) { uint8_t predicates[5] = {1, 1, 1, 1, 0}; RemoveFilter<thrust::tuple<uint32_t, uint32_t>, uint8_t> f(&predicates[0]); EXPECT_FALSE(f(thrust::make_tuple(0, 0))); EXPECT_FALSE(f(thrust::make_tuple(1, 0))); EXPECT_FALSE(f(thrust::make_tuple(2, 0))); EXPECT_FALSE(f(thrust::make_tuple(3, 0))); EXPECT_TRUE(f(thrust::make_tuple(4, 0))); } // cppcheck-suppress * TEST(UnaryFunctorTest, CheckUnaryFunctor) { int values1[5] = {0, 0, 0, 0, 0}; bool nulls1[5] = {true, true, true, true, false}; // output int outputValues[5]; thrust::fill(std::begin(outputValues), std::end(outputValues), 0); bool outputNulls[5]; thrust::fill(std::begin(outputNulls), std::end(outputNulls), false); int *valuesBegin1 = &values1[0]; bool *nullsBegin1 = &nulls1[0]; typedef thrust::zip_iterator< thrust::tuple<IntIter, BoolIter> > InputZipIterator; typedef thrust::zip_iterator< thrust::tuple<IntIter, BoolIter> > OutputZipIterator; InputZipIterator begin1(thrust::make_tuple(valuesBegin1, nullsBegin1)); OutputZipIterator outputBegin( thrust::make_tuple(std::begin(outputValues), std::begin(outputNulls))); thrust::transform(begin1, begin1 + 5, outputBegin, UnaryFunctor<int, int>(IsNull)); int expectedValues[5] = {0, 0, 0, 0, 1}; bool expectedNulls[5] = {true, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls))); } // cppcheck-suppress * TEST(BinaryFunctorTest, CheckBinaryFunctor) { int values1[5] = {0, 0xF0, 0x0F, 0x00, 0x00}; bool nulls1[5] = {false, true, true, true, true}; int values2[5] = {0, 0x00, 0x0F, 0xF0, 0x00}; bool nulls2[5] = {false, true, true, true, true}; // output int outputValues[5]; thrust::fill(std::begin(outputValues), std::end(outputValues), 0); bool outputNulls[5]; thrust::fill(std::begin(outputNulls), std::end(outputNulls), false); int *valuesBegin1 = &values1[0]; bool *nullsBegin1 = &nulls1[0]; int *valuesBegin2 = &values2[0]; bool *nullsBegin2 = &nulls2[0]; typedef thrust::zip_iterator< thrust::tuple<IntIter, BoolIter> > InputZipIterator; typedef thrust::zip_iterator< thrust::tuple<IntIter, BoolIter> > OutputZipIterator; InputZipIterator begin1(thrust::make_tuple(valuesBegin1, nullsBegin1)); InputZipIterator begin2(thrust::make_tuple(valuesBegin2, nullsBegin2)); OutputZipIterator outputBegin( thrust::make_tuple(std::begin(outputValues), std::begin(outputNulls))); // Test BitwiseAndFunctor thrust::transform(begin1, begin1 + 5, begin2, outputBegin, BinaryFunctor<int, int, int>(BitwiseAnd)); int expectedValues[5] = {0, 0x00, 0x0F, 0x00, 0x00}; bool expectedNulls[5] = {false, true, true, true, true}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues))); EXPECT_TRUE( thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls))); } // cppcheck-suppress * TEST(BinaryPredicateFunctorTest, CheckBinaryTranformFunctor) { int values1[5] = {100, 1, 200, 0, 1}; bool nulls1[5] = {false, true, true, true, true}; int values2[5] = {0, 1, 1, 0, 100}; bool nulls2[5] = {false, true, true, true, true}; // output bool outputValues[5]; thrust::fill(std::begin(outputValues), std::end(outputValues), 0); int *valuesBegin1 = &values1[0]; bool *nullsBegin1 = &nulls1[0]; int *valuesBegin2 = &values2[0]; bool *nullsBegin2 = &nulls2[0]; typedef thrust::zip_iterator< thrust::tuple<IntIter, BoolIter> > InputZipIterator; typedef thrust::zip_iterator< thrust::tuple<InputZipIterator, InputZipIterator> > ZipOfInputZipIterator; typedef thrust::zip_iterator<thrust::tuple<IntIter, BoolIter> > OutputZipIterator; InputZipIterator begin1(thrust::make_tuple(valuesBegin1, nullsBegin1)); InputZipIterator begin2(thrust::make_tuple(valuesBegin2, nullsBegin2)); // Test BitwiseAndFunctor thrust::transform(begin1, begin1 + 5, begin2, &outputValues[0], BinaryPredicateFunctor<bool, int, int>(And)); bool expectedValues[5] = {0, 1, 1, 0, 1}; EXPECT_TRUE( thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues))); } TEST(HashLookupFunctorTest, CheckHashLookupFunctor) { // hash index created in golang cuckoo_hash_index uint32_t seeds[4] = {2596996162, 4039455774, 2854263694, 1879968118}; uint8_t buckets[312] = { 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 140, 236, 116, 56, 157, 195, 184, 133, 16, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 17, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 121, 236, 209, 218, 160, 185, 109, 187, 0, 0, 0, 0, 8, 0, 0, 0, 15, 0, 0, 0, 9, 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; int keyBytes = 4; int numHashes = 4; int numBuckets = 2; uint32_t keys[18] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17}; bool nulls[18]; thrust::fill(std::begin(nulls), std::end(nulls), true); bool *nullsBegin = &nulls[0]; HashLookupFunctor<uint32_t> lookupFunctor(buckets, seeds, keyBytes, numHashes, numBuckets); RecordID outputValues[18]; typedef typename thrust::host_vector<RecordID>::iterator RecordIDIter; typedef thrust::zip_iterator<thrust::tuple<Uint32Iter, BoolIter> > InputZipIterator; InputZipIterator inputBegin(thrust::make_tuple(std::begin(keys), nullsBegin)); thrust::transform(inputBegin, inputBegin + 18, std::begin(outputValues), lookupFunctor); for (int i = 0; i < 18; i++) { EXPECT_EQ(outputValues[i].batchID, 0); EXPECT_EQ(outputValues[i].index, i); } } // cppcheck-suppress * TEST(ResolveTimeBucketizerTest, CheckTimeSeriesBucketizer) { // works for epoch time. uint32_t ts = get_ts(1970, 1, 1); uint32_t yearStart = resolveTimeBucketizer(ts, YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(yearStart, get_ts(1970, 1, 1)); uint32_t quarterStart = resolveTimeBucketizer(ts, QUATER, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(quarterStart, get_ts(1970, 1, 1)); uint32_t monthStart = resolveTimeBucketizer(ts, MONTH, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(monthStart, get_ts(1970, 1, 1)); /* 1970-01-31 */ ts = get_ts(1970, 1, 31); yearStart = resolveTimeBucketizer(ts, YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(yearStart, get_ts(1970, 1, 1)); quarterStart = resolveTimeBucketizer(ts, QUATER, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(quarterStart, get_ts(1970, 1, 1)); monthStart = resolveTimeBucketizer(ts, MONTH, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(monthStart, get_ts(1970, 1, 1)); /* 1970-01-30 */ ts = get_ts(1970, 1, 30); yearStart = resolveTimeBucketizer(ts, YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(yearStart, get_ts(1970, 1, 1)); quarterStart = resolveTimeBucketizer(ts, QUATER, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(quarterStart, get_ts(1970, 1, 1)); monthStart = resolveTimeBucketizer(ts, MONTH, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(monthStart, get_ts(1970, 1, 1)); /* 1970-02-01 */ ts = get_ts(1970, 2, 1); yearStart = resolveTimeBucketizer(ts, YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(yearStart, get_ts(1970, 1, 1)); quarterStart = resolveTimeBucketizer(ts, QUATER, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(quarterStart, get_ts(1970, 1, 1)); monthStart = resolveTimeBucketizer(ts, MONTH, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(monthStart, get_ts(1970, 2, 1)); /* 1970-02-28 */ ts = get_ts(1970, 2, 28); yearStart = resolveTimeBucketizer(ts, YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(yearStart, get_ts(1970, 1, 1)); quarterStart = resolveTimeBucketizer(ts, QUATER, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(quarterStart, get_ts(1970, 1, 1)); monthStart = resolveTimeBucketizer(ts, MONTH, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(monthStart, get_ts(1970, 2, 1)); /* 1970-03-01 */ ts = get_ts(1970, 3, 1); yearStart = resolveTimeBucketizer(ts, YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(yearStart, get_ts(1970, 1, 1)); quarterStart = resolveTimeBucketizer(ts, QUATER, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(quarterStart, get_ts(1970, 1, 1)); monthStart = resolveTimeBucketizer(ts, MONTH, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(monthStart, get_ts(1970, 3, 1)); /* 1970-04-01 */ ts = get_ts(1970, 4, 1); yearStart = resolveTimeBucketizer(ts, YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(yearStart, get_ts(1970, 1, 1)); quarterStart = resolveTimeBucketizer(ts, QUATER, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(quarterStart, get_ts(1970, 4, 1)); monthStart = resolveTimeBucketizer(ts, MONTH, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(monthStart, get_ts(1970, 4, 1)); /* 1970-05-01 */ ts = get_ts(1970, 5, 1); yearStart = resolveTimeBucketizer(ts, YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(yearStart, get_ts(1970, 1, 1)); quarterStart = resolveTimeBucketizer(ts, QUATER, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(quarterStart, get_ts(1970, 4, 1)); monthStart = resolveTimeBucketizer(ts, MONTH, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(monthStart, get_ts(1970, 5, 1)); /* 1970-09-01 */ ts = get_ts(1970, 9, 1); yearStart = resolveTimeBucketizer(ts, YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(yearStart, get_ts(1970, 1, 1)); quarterStart = resolveTimeBucketizer(ts, QUATER, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(quarterStart, get_ts(1970, 7, 1)); monthStart = resolveTimeBucketizer(ts, MONTH, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(monthStart, get_ts(1970, 9, 1)); /* 1970-12-31 */ ts = get_ts(1970, 12, 31); yearStart = resolveTimeBucketizer(ts, YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(yearStart, get_ts(1970, 1, 1)); quarterStart = resolveTimeBucketizer(ts, QUATER, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(quarterStart, get_ts(1970, 10, 1)); monthStart = resolveTimeBucketizer(ts, MONTH, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(monthStart, get_ts(1970, 12, 1)); /* 1971-01-01 */ ts = get_ts(1971, 1, 1); yearStart = resolveTimeBucketizer(ts, YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(yearStart, get_ts(1971, 1, 1)); quarterStart = resolveTimeBucketizer(ts, QUATER, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(quarterStart, get_ts(1971, 1, 1)); monthStart = resolveTimeBucketizer(ts, MONTH, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(monthStart, get_ts(1971, 1, 1)); /* 1971-06-01 */ ts = get_ts(1971, 6, 1); yearStart = resolveTimeBucketizer(ts, YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(yearStart, get_ts(1971, 1, 1)); quarterStart = resolveTimeBucketizer(ts, QUATER, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(quarterStart, get_ts(1971, 4, 1)); monthStart = resolveTimeBucketizer(ts, MONTH, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(monthStart, get_ts(1971, 6, 1)); // leap year. /* 1972-01-01 */ ts = get_ts(1972, 1, 1); yearStart = resolveTimeBucketizer(ts, YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(yearStart, get_ts(1972, 1, 1)); quarterStart = resolveTimeBucketizer(ts, QUATER, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(quarterStart, get_ts(1972, 1, 1)); monthStart = resolveTimeBucketizer(ts, MONTH, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(monthStart, get_ts(1972, 1, 1)); /* 1972-02-29 */ ts = get_ts(1972, 2, 29); yearStart = resolveTimeBucketizer(ts, YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(yearStart, get_ts(1972, 1, 1)); quarterStart = resolveTimeBucketizer(ts, QUATER, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(quarterStart, get_ts(1972, 1, 1)); monthStart = resolveTimeBucketizer(ts, MONTH, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(monthStart, get_ts(1972, 2, 1)); /* 1972-03-01 */ ts = get_ts(1972, 3, 1); yearStart = resolveTimeBucketizer(ts, YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(yearStart, get_ts(1972, 1, 1)); quarterStart = resolveTimeBucketizer(ts, QUATER, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(quarterStart, get_ts(1972, 1, 1)); monthStart = resolveTimeBucketizer(ts, MONTH, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(monthStart, get_ts(1972, 3, 1)); /* 1972-03-31 */ ts = get_ts(1972, 3, 31); yearStart = resolveTimeBucketizer(ts, YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(yearStart, get_ts(1972, 1, 1)); quarterStart = resolveTimeBucketizer(ts, QUATER, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(quarterStart, get_ts(1972, 1, 1)); monthStart = resolveTimeBucketizer(ts, MONTH, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(monthStart, get_ts(1972, 3, 1)); /* 1972-04-01 */ ts = get_ts(1972, 4, 1); yearStart = resolveTimeBucketizer(ts, YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(yearStart, get_ts(1972, 1, 1)); quarterStart = resolveTimeBucketizer(ts, QUATER, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(quarterStart, get_ts(1972, 4, 1)); monthStart = resolveTimeBucketizer(ts, MONTH, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(monthStart, get_ts(1972, 4, 1)); // leap year if year % 400 == 0 /* 2000-03-01 */ ts = get_ts(2000, 3, 1); yearStart = resolveTimeBucketizer(ts, YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(yearStart, get_ts(2000, 1, 1)); quarterStart = resolveTimeBucketizer(ts, QUATER, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(quarterStart, get_ts(2000, 1, 1)); monthStart = resolveTimeBucketizer(ts, MONTH, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(monthStart, get_ts(2000, 3, 1)); /* 2018-06-11 */ ts = get_ts(2018, 6, 11); yearStart = resolveTimeBucketizer(ts, YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(yearStart, get_ts(2018, 1, 1)); quarterStart = resolveTimeBucketizer(ts, QUATER, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(quarterStart, get_ts(2018, 4, 1)); monthStart = resolveTimeBucketizer(ts, MONTH, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(monthStart, get_ts(2018, 6, 1)); } TEST(ResolveTimeBucketizerTest, CheckRecurringTimeBucketizer) { // works for epoch time. uint32_t ts = get_ts(1970, 1, 1); uint32_t dayOfYear = resolveTimeBucketizer(ts, DAY_OF_YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(dayOfYear, 0); uint32_t dayOfMonth = resolveTimeBucketizer(ts, DAY_OF_MONTH, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(dayOfMonth, 0); uint32_t monthOfYear = resolveTimeBucketizer(ts, MONTH_OF_YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(monthOfYear, 0); uint32_t quarterOfMonth = resolveTimeBucketizer(ts, QUARTER_OF_YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(quarterOfMonth, 0); ts = get_ts(1972, 2, 29); dayOfYear = resolveTimeBucketizer(ts, DAY_OF_YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(dayOfYear, 59); dayOfMonth = resolveTimeBucketizer(ts, DAY_OF_MONTH, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(dayOfMonth, 28); monthOfYear = resolveTimeBucketizer(ts, MONTH_OF_YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(monthOfYear, 1); quarterOfMonth = resolveTimeBucketizer(ts, QUARTER_OF_YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(quarterOfMonth, 0); ts = get_ts(1972, 3, 1); dayOfYear = resolveTimeBucketizer(ts, DAY_OF_YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(dayOfYear, 60); dayOfMonth = resolveTimeBucketizer(ts, DAY_OF_MONTH, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(dayOfMonth, 0); monthOfYear = resolveTimeBucketizer(ts, MONTH_OF_YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(monthOfYear, 2); quarterOfMonth = resolveTimeBucketizer(ts, QUARTER_OF_YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(quarterOfMonth, 0); ts = get_ts(2018, 6, 11); dayOfYear = resolveTimeBucketizer(ts, DAY_OF_YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(dayOfYear, 161); dayOfMonth = resolveTimeBucketizer(ts, DAY_OF_MONTH, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(dayOfMonth, 10); monthOfYear = resolveTimeBucketizer(ts, MONTH_OF_YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(monthOfYear, 5); quarterOfMonth = resolveTimeBucketizer(ts, QUARTER_OF_YEAR, DAYS_BEFORE_MONTH_HOST); EXPECT_EQ(quarterOfMonth, 1); } TEST(getWeekStartTimestamp, CheckWeeklyBucketizer) { uint32_t ts = get_ts(1970, 1, 3); uint32_t weekts = getWeekStartTimestamp(ts); EXPECT_EQ(weekts, 0); ts = get_ts(1970, 1, 6); weekts = getWeekStartTimestamp(ts); EXPECT_EQ(weekts, 345600); ts = 1533081655; weekts = getWeekStartTimestamp(ts); EXPECT_EQ(weekts, 1532908800); ts = 1534520171; weekts = getWeekStartTimestamp(ts); EXPECT_EQ(weekts, 1534118400); ts = 1528675200; weekts = getWeekStartTimestamp(ts); EXPECT_EQ(weekts, 1528675200); } TEST(CalculateHLLHashTest, CheckUUIDT) { UUIDT uuidT = {0x0000483EC1324C38, 0xBE372EB5A01BBB30}; UUIDT uuidTs[2] = {uuidT, uuidT}; bool nulls[2] = {true, false}; uint32_t expectedValues[2] = {14088, 0}; bool expectedNulls[2] = {true, false}; uint32_t outputValues[2] = {0}; bool outputNulls[2] = {0}; typedef thrust::zip_iterator<thrust::tuple<UUIDIter, BoolIter> > InputZipIterator; typedef thrust::zip_iterator<thrust::tuple<Uint32Iter, BoolIter> > OutputZipIterator; InputZipIterator inputBegin( thrust::make_tuple(std::begin(uuidTs), std::begin(nulls))); OutputZipIterator outputBegin( thrust::make_tuple(std::begin(outputValues), std::begin(outputNulls))); thrust::transform(inputBegin, inputBegin + 2, outputBegin, GetHLLValueFunctor<UUIDT>()); EXPECT_TRUE(thrust::equal(std::begin(outputValues), std::end(outputValues), std::begin(expectedValues))); EXPECT_TRUE(thrust::equal(std::begin(outputNulls), std::end(outputNulls), std::begin(expectedNulls))); } TEST(ArrayLengthTest, CheckArrayLengthFunctor) { uint32_t offsetLength[12] = {0, 2, 16, 1, 32, 3, 0, 0, 0xFFFFFFFF, 0, 56, 1}; uint32_t values[72] = {2, 1, 2, 0x03, 1, 1, 0x01, 0, 3, 1, 2, 3, 0x07, 0, 1, 1, 0x01, 0}; uint32_t expectedVals[6] = {2, 1, 3, 0, 0, 1}; bool expectedNulls[6] = {true, true, true, false, true, true}; #ifdef RUN_ON_DEVICE cudaStream_t s = NULL; int device = 0; cudaStreamCreate(&s); cudaSetDevice(device); #endif uint8_t *basePtr = allocate_array_column( reinterpret_cast<uint8_t *>(&offsetLength[0]), reinterpret_cast<uint8_t *>(&values[0]), 6, 72*4); ArrayVectorPartyIterator<uint32_t> begin = make_array_column_iterator<uint32_t>(basePtr, 0, 6); auto outputValues = allocate_raw(8+6*4); auto outputBegin = make_zip_iterator( thrust::make_tuple(reinterpret_cast<uint32_t *>(outputValues+8), reinterpret_cast<bool *>(outputValues))); thrust::transform(GET_EXECUTION_POLICY(s), begin, begin + 6, outputBegin, UnaryFunctor<uint32_t, uint32_t*>(ArrayLength)); EXPECT_TRUE( equal(reinterpret_cast<uint32_t*>(outputValues+8), reinterpret_cast<uint32_t*>(outputValues+8)+6, expectedVals)); EXPECT_TRUE( equal(reinterpret_cast<bool*>(outputValues), reinterpret_cast<bool*>(outputValues)+6, expectedNulls)); release(basePtr); release(outputValues); } TEST(ArrayContainsTest, CheckArrayContainsFunctor) { uint32_t offsetLength[12] = {0, 2, 16, 1, 32, 3, 0, 0, 0xFFFFFFFF, 0, 56, 1}; uint32_t values[72] = {2, 1, 2, 0x03, 1, 1, 0x01, 0, 3, 1, 2, 3, 0x07, 0, 1, 1, 0x01, 0}; bool expectedValues[6] = {true, false, true, false, false, false}; #ifdef RUN_ON_DEVICE cudaStream_t s = NULL; int device = 0; cudaStreamCreate(&s); cudaSetDevice(device); #endif uint8_t *basePtr = allocate_array_column( reinterpret_cast<uint8_t *>(&offsetLength[0]), reinterpret_cast<uint8_t *>(&values[0]), 6, 72*4); ArrayVectorPartyIterator<uint32_t> begin = make_array_column_iterator<uint32_t>(basePtr, 0, 6); auto begin2 = thrust::make_constant_iterator( thrust::make_tuple<uint32_t, bool>(2, true)); auto outputValues = allocate_raw(16); auto outputBegin = make_zip_iterator( thrust::make_tuple(reinterpret_cast<bool *>(outputValues+8), reinterpret_cast<bool *>(outputValues))); // Test BitwiseAndFunctor thrust::transform(GET_EXECUTION_POLICY(s), begin, begin + 6, begin2, outputBegin, BinaryFunctor<bool, uint32_t*, uint32_t>(ArrayContains)); EXPECT_TRUE( equal_print(reinterpret_cast<bool *>(outputValues+8), reinterpret_cast<bool *>(outputValues+8)+6, expectedValues)); release(basePtr); release(outputValues); } TEST(ArrayElementAtTest, CheckArrayElementAtFunctor) { uint32_t offsetLength[12] = {0, 2, 16, 1, 32, 3, 0, 0, 0xFFFFFFFF, 0, 56, 1}; uint32_t values[72] = {2, 1, 2, 0x03, 1, 1, 0x01, 0, 3, 1, 2, 3, 0x07, 0, 1, 1, 0x01, 0}; uint32_t expectedValues[6] = {2, 0, 2, 0, 0, 0}; bool expectedNulls[6] = {true, false, true, false, false, false}; #ifdef RUN_ON_DEVICE cudaStream_t s = NULL; int device = 0; cudaStreamCreate(&s); cudaSetDevice(device); #endif uint8_t *basePtr = allocate_array_column( reinterpret_cast<uint8_t *>(&offsetLength[0]), reinterpret_cast<uint8_t *>(&values[0]), 6, 72*4); ArrayVectorPartyIterator<uint32_t> begin = make_array_column_iterator<uint32_t>(basePtr, 0, 6); auto begin2 = thrust::make_constant_iterator( thrust::make_tuple<int, bool>(1, true)); auto outputValues = allocate_raw(8+6*4); auto outputBegin = make_zip_iterator( thrust::make_tuple(reinterpret_cast<uint32_t *>(outputValues+8), reinterpret_cast<bool *>(outputValues))); // Test BitwiseAndFunctor thrust::transform(GET_EXECUTION_POLICY(s), begin, begin + 6, begin2, outputBegin, BinaryFunctor<uint32_t, uint32_t*, int>(ArrayElementAt)); EXPECT_TRUE( equal(reinterpret_cast<uint32_t *>(outputValues+8), reinterpret_cast<uint32_t *>(outputValues+8) + 6, expectedValues)); EXPECT_TRUE( equal(reinterpret_cast<bool *>(outputValues), reinterpret_cast<bool *>(outputValues+6), expectedNulls)); release(basePtr); release(outputValues); } } // namespace ares