github.com/rohankumardubey/aresdb@v0.0.2-0.20190517170215-e54e3ca06b9c/query/iterator_unittest.cu (about)

     1  //  Copyright (c) 2017-2018 Uber Technologies, Inc.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  #include <thrust/execution_policy.h>
    16  #include <thrust/fill.h>
    17  #include <thrust/iterator/discard_iterator.h>
    18  #include <thrust/sequence.h>
    19  #include <thrust/sort.h>
    20  #include <cstdint>
    21  #include <algorithm>
    22  #include <cfloat>
    23  #include <iostream>
    24  #include <iterator>
    25  #include <tuple>
    26  #include "gtest/gtest.h"
    27  #include "query/unittest_utils.hpp"
    28  #include "query/functor.hpp"
    29  #include "query/iterator.hpp"
    30  
    31  namespace ares {
    32  // cppcheck-suppress *
    33  TEST(BoolValueIteratorTest, CheckDereference) {
    34    uint32_t indexVectorH[8] = {0, 1, 2, 3, 4, 5, 6, 7};
    35    uint32_t *indexVector = allocate(&indexVectorH[0], 8);
    36    uint8_t nullsH[1] = {0xF0};
    37    uint8_t valuesH[1] = {0xF0};
    38  
    39    uint8_t *basePtr = allocate_column(nullptr, &nullsH[0], &valuesH[0], 0, 1, 1);
    40    ColumnIterator<bool> begin = make_column_iterator<bool>(indexVector,
    41                                                            nullptr, 0, basePtr,
    42                                                            0, 8, 8, 1, 0);
    43    bool expected[8] = {false, false, false, false, true, true, true, true};
    44    EXPECT_TRUE(compare_value(begin, begin + 8, &expected[0]));
    45    release(indexVector);
    46    release(basePtr);
    47  }
    48  
    49  // cppcheck-suppress *
    50  TEST(BoolValueIteratorTest, CheckNullOffset) {
    51    uint32_t indexVectorH[4] = {0, 1, 2, 3};
    52    uint32_t *indexVector = allocate(&indexVectorH[0], 4);
    53    uint8_t nullsH[1] = {0xF0};
    54    uint8_t valuesH[1] = {0xF0};
    55  
    56    uint8_t *basePtr = allocate_column(nullptr, &nullsH[0], &valuesH[0], 0, 1, 1);
    57  
    58    ColumnIterator<bool> begin = make_column_iterator<bool>(indexVector,
    59                                                            nullptr,
    60                                                            0,
    61                                                            basePtr,
    62                                                            0,
    63                                                            8,
    64                                                            4,
    65                                                            1,
    66                                                            4);
    67    bool expected[4] = {true, true, true, true};
    68    EXPECT_TRUE(compare_value(begin, begin + 4, &expected[0]));
    69    release(basePtr);
    70    release(indexVector);
    71  }
    72  
    73  // cppcheck-suppress *
    74  TEST(BoolValueIteratorTest, CheckMovingOperator) {
    75    // 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0
    76    // 1 1 1 1 0 0 0 0 | 0 0 0 0 1 1 1 1
    77    uint32_t indexVectorH[16];
    78    thrust::sequence(&indexVectorH[0], &indexVectorH[16]);
    79    uint32_t *indexVector = allocate(&indexVectorH[0], 16);
    80  
    81    uint8_t nullsH[2] = {0xF0, 0x0F};
    82    uint8_t valuesH[2] = {0xF0, 0x0F};
    83  
    84    uint8_t *basePtr = allocate_column(nullptr, &nullsH[0], &valuesH[0], 0, 2, 2);
    85  
    86    ColumnIterator<bool> begin = make_column_iterator<bool>(indexVector,
    87                                                            nullptr, 0,
    88                                                            basePtr, 0,
    89                                                            8, 16, 1, 0);
    90    bool expected = false;
    91    EXPECT_TRUE(compare_value(begin, begin + 1, &expected));
    92  
    93    begin++;  // 1
    94    expected = false;
    95    EXPECT_TRUE(compare_value(begin, begin + 1, &expected));
    96  
    97    begin += 3;  // 4
    98    expected = true;
    99    EXPECT_TRUE(compare_value(begin, begin + 1, &expected));
   100  
   101    // Cross byte boundary
   102    begin += 8;  // 4 in byte 1
   103    expected = false;
   104    EXPECT_TRUE(compare_value(begin, begin + 1, &expected));
   105  
   106    begin--;  // 3 in byte 1
   107    expected = true;
   108    EXPECT_TRUE(compare_value(begin, begin + 1, &expected));
   109  
   110    // Go back to byte 0
   111    begin -= 8;  // 3 in byte 0
   112    expected = false;
   113    EXPECT_TRUE(compare_value(begin, begin + 1, &expected));
   114  
   115    ColumnIterator<bool>
   116        anotherBegin = make_column_iterator<bool>(indexVector,
   117                                                  nullptr,
   118                                                  0, basePtr,
   119                                                  0, 8, 16, 1, 0);
   120    ColumnIterator<bool> anotherEnd = anotherBegin + 16;
   121    EXPECT_EQ(16, anotherEnd - anotherBegin);
   122    release(basePtr);
   123    release(indexVector);
   124  }
   125  
   126  // cppcheck-suppress *
   127  TEST(ScratchSpaceIteratorTest, CheckBool) {
   128    uint8_t nullsH[5] = {1, 1, 1, 1, 1};
   129    bool valuesH[5] = {0, 1, 1, 0, 0};
   130    uint8_t *basePtr =
   131        allocate_column(nullptr, reinterpret_cast<uint8_t *>(&valuesH[0]),
   132                        &nullsH[0], 0, 5, 5);
   133    SimpleIterator<bool> begin = make_scratch_space_input_iterator<bool>(
   134        basePtr, 8);
   135    SimpleIterator<bool> end = begin + 5;
   136    bool expectedValues[5] = {false, true, true, false, false};
   137    EXPECT_TRUE(compare_value(begin, end, std::begin(expectedValues)));
   138    release(basePtr);
   139  }
   140  
   141  // cppcheck-suppress *
   142  TEST(ScratchSpaceIteratorTest, CheckInt) {
   143    uint8_t nullsH[5] = {1, 1, 0, 1, 1};
   144    int32_t valuesH[5] = {1000000, -1, 1, -1000000, 0};
   145    uint8_t *basePtr =
   146        allocate_column(nullptr, reinterpret_cast<uint8_t *>(&valuesH[0]),
   147                        &nullsH[0], 0, 20, 5);
   148    SimpleIterator<int32_t> begin = make_scratch_space_input_iterator<int32_t>(
   149        basePtr, 24);
   150    SimpleIterator<int32_t> end = begin + 5;
   151    int32_t expectedValues[5] = {1000000, -1, 1, -1000000, 0};
   152    uint8_t expectedNulls[5] = {1, 1, 0, 1, 1};
   153    EXPECT_TRUE(compare_value(begin, end, std::begin(expectedValues)));
   154    EXPECT_TRUE(compare_null(begin, end, std::begin(expectedNulls)));
   155    release(basePtr);
   156  }
   157  
   158  // cppcheck-suppress *
   159  TEST(BoolIteratorTest, CheckConstantIterator) {
   160    SimpleIterator<bool> begin = make_constant_iterator(false, true);
   161    SimpleIterator<bool> end = begin + 5;
   162    bool expectedValues[5] = {false, false, false, false, false};
   163    EXPECT_TRUE(compare_value(begin, end, std::begin(expectedValues)));
   164  }
   165  
   166  // cppcheck-suppress *
   167  TEST(VectorPartyIteratorTest, CheckUintIterator) {
   168    uint32_t indexVectorH[5];
   169    thrust::sequence(std::begin(indexVectorH), std::end(indexVectorH));
   170    uint32_t *indexVector = allocate(&indexVectorH[0], 5);
   171  
   172    uint32_t uint32ValuesH[5] = {1000000000, 10000, 0, 10000, 1000000000};
   173    uint8_t nullsH[1] = {0xFF};
   174  
   175    uint8_t *basePtr = allocate_column(nullptr, &nullsH[0],
   176                                       &uint32ValuesH[0], 0, 1, 20);
   177  
   178    ColumnIterator<uint32_t> begin = make_column_iterator<uint32_t>(indexVector,
   179                                                                    nullptr,
   180                                                                    0,
   181                                                                    basePtr,
   182                                                                    0,
   183                                                                    8,
   184                                                                    5,
   185                                                                    4,
   186                                                                    0);
   187  
   188    ColumnIterator<uint32_t> end = begin + 5;
   189    uint32_t expectedUint32Values[5] = {1000000000, 10000, 0, 10000, 1000000000};
   190    EXPECT_TRUE(
   191        compare_value(begin, end,
   192                      std::begin(expectedUint32Values)));
   193    release(basePtr);
   194  
   195    int16_t uint16ValuesH[5] = {1000, 10, 0, 10, 1000};
   196    basePtr = allocate_column(nullptr, &nullsH[0],
   197                              &uint16ValuesH[0], 0, 1, 10);
   198  
   199    begin = make_column_iterator<uint32_t>(indexVector,
   200                                           nullptr, 0, basePtr, 0, 8, 5, 2, 0);
   201    end = begin + 5;
   202    uint32_t expectedValues2[5] = {1000, 10, 0, 10, 1000};
   203    EXPECT_TRUE(
   204        compare_value(begin, end,
   205                      std::begin(expectedValues2)));
   206    release(basePtr);
   207  
   208    int8_t uint8ValuesH[5] = {10, 1, 0, 1, 10};
   209    basePtr = allocate_column(nullptr, &nullsH[0],
   210                              &uint8ValuesH[0], 0, 1, 5);
   211    begin = make_column_iterator<uint32_t>(indexVector,
   212                                           nullptr, 0, basePtr, 0, 8, 5, 1, 0);
   213    end = begin + 5;
   214    uint32_t expectedValues3[5] = {10, 1, 0, 1, 10};
   215    EXPECT_TRUE(
   216        compare_value(begin, end, std::begin(expectedValues3)));
   217    release(basePtr);
   218    release(indexVector);
   219  }
   220  
   221  // cppcheck-suppress *
   222  TEST(VectorPartyIteratorTest, CheckIntIterator) {
   223    uint32_t indexVectorH[5];
   224    thrust::sequence(std::begin(indexVectorH), std::end(indexVectorH));
   225    uint32_t *indexVector = allocate(&indexVectorH[0], 5);
   226  
   227    int32_t int32ValuesH[5] = {-1000000000, -10000, 0, 10000, 1000000000};
   228    uint8_t nullsH[1] = {0xFF};
   229  
   230    uint8_t *basePtr = allocate_column(nullptr, &nullsH[0],
   231                                       &int32ValuesH[0], 0, 1, 20);
   232  
   233    ColumnIterator<int32_t> begin = make_column_iterator<int32_t>(indexVector,
   234                                                                  nullptr,
   235                                                                  0,
   236                                                                  basePtr,
   237                                                                  0,
   238                                                                  8,
   239                                                                  5,
   240                                                                  4,
   241                                                                  0);
   242  
   243    ColumnIterator<int32_t> end = begin + 5;
   244    int32_t expectedInt32Values[5] = {-1000000000, -10000, 0, 10000, 1000000000};
   245    EXPECT_TRUE(
   246        compare_value(begin, end,
   247                      std::begin(expectedInt32Values)));
   248    release(basePtr);
   249  
   250    int16_t int16ValuesH[5] = {-1000, -10, 0, 10, 1000};
   251    basePtr = allocate_column(nullptr, &nullsH[0],
   252                              &int16ValuesH[0], 0, 1, 10);
   253  
   254    begin = make_column_iterator<int32_t>(indexVector,
   255                                          nullptr, 0, basePtr, 0, 8, 5, 2, 0);
   256    end = begin + 5;
   257    int expectedValues2[5] = {-1000, -10, 0, 10, 1000};
   258    EXPECT_TRUE(
   259        compare_value(begin, end,
   260                      std::begin(expectedValues2)));
   261    release(basePtr);
   262  
   263    int8_t int8ValuesH[5] = {-10, -1, 0, 1, 10};
   264    basePtr = allocate_column(nullptr, &nullsH[0],
   265                              &int8ValuesH[0], 0, 1, 5);
   266    begin = make_column_iterator<int32_t>(indexVector,
   267                                          nullptr, 0, basePtr, 0, 8, 5, 1, 0);
   268    end = begin + 5;
   269    int expectedValues3[5] = {-10, -1, 0, 1, 10};
   270    EXPECT_TRUE(
   271        compare_value(begin, end, std::begin(expectedValues3)));
   272    release(basePtr);
   273    release(indexVector);
   274  }
   275  
   276  // cppcheck-suppress *
   277  TEST(VectorPartyIteratorTest, CheckFloatIterator) {
   278    uint32_t indexVectorH[5];
   279    thrust::sequence(std::begin(indexVectorH), std::end(indexVectorH));
   280    uint32_t *indexVector = allocate(&indexVectorH[0], 5);
   281  
   282    float_t valuesH[5] = {-10.1, -1.1, 0.0, 1.1, 10.1};
   283    uint8_t nullsH[1] = {0xFF};
   284  
   285    uint8_t *basePtr = allocate_column(nullptr, &nullsH[0],
   286                                       &valuesH[0], 0, 1, 20);
   287  
   288    ColumnIterator<float_t>
   289        begin = make_column_iterator<float_t>(indexVector,
   290                                              nullptr, 0, basePtr,
   291                                              0, 8, 5, 4, 0);
   292  
   293    ColumnIterator<float_t> end = begin + 5;
   294    float_t expectedValues[5] = {-10.1, -1.1, 0.0, 1.1, 10.1};
   295    EXPECT_TRUE(
   296        compare_value(begin, end,
   297                      std::begin(expectedValues)));
   298    release(basePtr);
   299    release(indexVector);
   300  }
   301  
   302  // cppcheck-suppress *
   303  TEST(CompressedColumnTest, CheckCountPointer) {
   304    uint32_t indexVectorH[5];
   305    thrust::sequence(std::begin(indexVectorH), std::end(indexVectorH));
   306    uint32_t *indexVector = allocate(&indexVectorH[0], 5);
   307  
   308    // counts0 : 0 1 4 6 8
   309    uint32_t baseCountsH[5] = {0, 1, 4, 6, 8};
   310    // uncompressed: 2 2 2 2 3 3 3 3
   311    // value1: 2 3
   312    int valuesH[2] = {2, 3};
   313    // null1: 1 1 1 1 1 1 1 1
   314    uint8_t nullsH[1] = {0xFF};
   315    // count1:
   316    uint32_t countsH[3] = {0, 4, 8};
   317  
   318    uint32_t *baseCounts = allocate(&baseCountsH[0], 5);
   319  
   320    uint8_t *basePtr =
   321        allocate_column(&countsH[0], &nullsH[0], &valuesH[0], 12, 1, 8);
   322  
   323    ColumnIterator<int32_t>
   324        begin = make_column_iterator<int32_t>(indexVector,
   325                                              baseCounts, 0, basePtr,
   326                                              16, 24, 5, 4, 0);
   327  
   328    int32_t expectedValues[4] = {2, 2, 3, 3};
   329    uint8_t expectedNulls[4] = {1, 1, 1, 1};
   330    EXPECT_TRUE(compare_value(begin, begin + 4, std::begin(expectedValues)));
   331    EXPECT_TRUE(compare_null(begin, begin + 4, std::begin(expectedNulls)));
   332  
   333    release(basePtr);
   334    release(indexVector);
   335    release(baseCounts);
   336  }
   337  
   338  // cppcheck-suppress *
   339  TEST(CompressedColumnTest, CheckStartCount) {
   340    uint32_t indexVectorH[4];
   341    thrust::sequence(std::begin(indexVectorH), std::end(indexVectorH));
   342    uint32_t *indexVector = allocate(&indexVectorH[0], 4);
   343  
   344    // uncompressed: 2 2 3 3
   345    // value1: 2 3
   346    int valuesH[2] = {2, 3};
   347    uint8_t nullsH[1] = {0xFF};
   348    // count1:
   349    uint32_t countsH[3] = {4, 6, 8};
   350  
   351    uint8_t *basePtr =
   352        allocate_column(&countsH[0], &nullsH[0], &valuesH[0], 12, 1, 8);
   353  
   354    ColumnIterator<int32_t>
   355        begin = make_column_iterator<int32_t>(indexVector,
   356                                              nullptr, 4, basePtr,
   357                                              16, 24, 5, 4, 0);
   358  
   359    int32_t expectedValues[4] = {2, 2, 3, 3};
   360    uint8_t expectedNulls[4] = {1, 1, 1, 1};
   361    EXPECT_TRUE(compare_value(begin, begin + 4, std::begin(expectedValues)));
   362    EXPECT_TRUE(compare_null(begin, begin + 4, std::begin(expectedNulls)));
   363  
   364    release(basePtr);
   365    release(indexVector);
   366  }
   367  
   368  // cppcheck-suppress *
   369  TEST(DimensionOutputIteratorTest, CheckCopy) {
   370    uint16_t in1[2] = {65531, 1};
   371    bool in2[2] = {true, true};
   372    uint8_t out[8] = {0, 0, 0, 0, 0, 0, 0, 0};
   373    thrust::zip_iterator<thrust::tuple<Uint16Iter, BoolIter>> zipped1(
   374        thrust::make_tuple(std::begin(in1), std::begin(in2)));
   375    DimensionOutputIterator<uint16_t> dim_iter =
   376        make_dimension_output_iterator<uint16_t>(&out[0], &out[4]);
   377  
   378    thrust::copy(zipped1, zipped1 + 2, dim_iter);
   379    EXPECT_EQ(65531, *reinterpret_cast<uint16_t *>(out));
   380    EXPECT_EQ(true, *reinterpret_cast<bool *>(&out[4]));
   381    EXPECT_EQ(1, *reinterpret_cast<uint16_t *>(&out[2]));
   382    EXPECT_EQ(true, *reinterpret_cast<bool *>(&out[5]));
   383  }
   384  
   385  // cppcheck-suppress *
   386  TEST(DimensionOutputIteratorTest, CheckTransform) {
   387    uint16_t in1[2] = {1, 2};
   388    bool in2[2] = {true, true};
   389    thrust::zip_iterator<thrust::tuple<Uint16Iter, BoolIter>> zipped1(
   390        thrust::make_tuple(std::begin(in1), std::begin(in2)));
   391    thrust::zip_iterator<thrust::tuple<Uint16Iter, BoolIter>> zipped2(
   392        thrust::make_tuple(std::begin(in1), std::begin(in2)));
   393    uint8_t out[6] = {0, 0, 0, 0, 0, 0};
   394    DimensionOutputIterator<uint16_t> dim_iter =
   395        make_dimension_output_iterator<uint16_t>(&out[0], &out[4]);
   396    thrust::copy(zipped1, zipped1 + 2, dim_iter);
   397    thrust::transform(zipped1, zipped1 + 2, zipped2, dim_iter,
   398                      PlusFunctor<uint16_t>());
   399    EXPECT_EQ(2, out[0]);
   400    EXPECT_EQ(true, out[4]);
   401    EXPECT_EQ(4, out[2]);
   402    EXPECT_EQ(true, out[5]);
   403  }
   404  
   405  // cppcheck-suppress *
   406  TEST(MeasureIteratorTest, CheckSum) {
   407    uint32_t baseCounts[5] = {0, 3, 6, 9, 10};
   408  
   409    uint32_t indexVector[3] = {0, 2, 3};
   410    int output[3] = {0, 0, 0};
   411    MeasureOutputIterator<int> measureIter(&output[0], &baseCounts[0],
   412                                           &indexVector[0], AGGR_SUM_SIGNED);
   413  
   414    measureIter[0] = thrust::make_tuple(1, true);
   415    // Count = 3 - 0.
   416    EXPECT_EQ(output[0], 3);
   417  
   418    measureIter[1] = thrust::make_tuple(2, false);
   419    // Identity.
   420    EXPECT_EQ(output[1], 0);
   421  
   422    measureIter[2] = thrust::make_tuple(2, true);
   423    // Count = 10 - 9
   424    EXPECT_EQ(output[2], 2);
   425  
   426    MeasureOutputIterator<int> measureIter2(&output[0], nullptr,
   427                                            &indexVector[0], AGGR_SUM_SIGNED);
   428  
   429    // All counts are 1 if base counts is null.
   430    measureIter2[0] = thrust::make_tuple(1, true);
   431    EXPECT_EQ(output[0], 1);
   432    measureIter2[1] = thrust::make_tuple(2, false);
   433    EXPECT_EQ(output[1], 0);
   434    measureIter2[2] = thrust::make_tuple(2, true);
   435    EXPECT_EQ(output[2], 2);
   436  }
   437  
   438  // cppcheck-suppress *
   439  TEST(MeasureIteratorTest, CheckMin) {
   440    uint32_t baseCounts[5] = {0, 3, 6, 9, 10};
   441    uint32_t indexVector[3] = {0, 2, 3};
   442    int output[3] = {0, 0, 0};
   443    MeasureOutputIterator<int> measureIter(&output[0], &baseCounts[0],
   444                                           &indexVector[0], AGGR_MIN_SIGNED);
   445    measureIter[0] = thrust::make_tuple(1, true);
   446    EXPECT_EQ(output[0], 1);
   447    measureIter[1] = thrust::make_tuple(2, false);
   448    EXPECT_EQ(output[1], INT32_MAX);
   449  
   450    uint32_t outputUint[3] = {0, 0, 0};
   451    MeasureOutputIterator<uint32_t>
   452        measureIterUint(&outputUint[0], &baseCounts[0],
   453                        &indexVector[0], AGGR_MIN_UNSIGNED);
   454    measureIterUint[0] = thrust::make_tuple(1, true);
   455    EXPECT_EQ(outputUint[0], 1);
   456    measureIterUint[1] = thrust::make_tuple(2, false);
   457    EXPECT_EQ(outputUint[1], UINT32_MAX);
   458  
   459    float outputFloat[3] = {0, 0, 0};
   460    MeasureOutputIterator<float_t>
   461        measureIterFloat(&outputFloat[0], &baseCounts[0],
   462                         &indexVector[0], AGGR_MIN_FLOAT);
   463    measureIterFloat[0] = thrust::make_tuple(1.0, true);
   464    EXPECT_EQ(outputFloat[0], 1.0);
   465    measureIterFloat[1] = thrust::make_tuple(2.2, false);
   466    EXPECT_EQ(outputFloat[1], FLT_MAX);
   467  }
   468  
   469  // cppcheck-suppress *
   470  TEST(MeasureIteratorTest, CheckMax) {
   471    uint32_t baseCounts[5] = {0, 3, 6, 9, 10};
   472    uint32_t indexVector[3] = {0, 2, 3};
   473  
   474    int output[3] = {0, 0, 0};
   475    MeasureOutputIterator<int> measureIter(&output[0], baseCounts,
   476                                           &indexVector[0], AGGR_MAX_SIGNED);
   477    measureIter[0] = thrust::make_tuple(1, true);
   478    EXPECT_EQ(output[0], 1);
   479    measureIter[1] = thrust::make_tuple(2, false);
   480    EXPECT_EQ(output[1], INT32_MIN);
   481  
   482    uint32_t outputUint[3] = {0, 0, 0};
   483    MeasureOutputIterator<uint32_t> measureIterUint(&outputUint[0],
   484                                                    baseCounts,
   485                                                    &indexVector[0],
   486                                                    AGGR_MAX_UNSIGNED);
   487    measureIterUint[0] = thrust::make_tuple(1, true);
   488    EXPECT_EQ(outputUint[0], 1);
   489    measureIterUint[1] = thrust::make_tuple(2, false);
   490    EXPECT_EQ(outputUint[1], 0);
   491  
   492    float outputFloat[3] = {0, 0, 0};
   493    MeasureOutputIterator<float_t> measureIterFloat(&outputFloat[0],
   494                                                    baseCounts,
   495                                                    &indexVector[0],
   496                                                    AGGR_MAX_FLOAT);
   497    measureIterFloat[0] = thrust::make_tuple(1.0, true);
   498    EXPECT_EQ(outputFloat[0], 1.0);
   499    measureIterFloat[1] = thrust::make_tuple(2.2, false);
   500    EXPECT_EQ(outputFloat[1], FLT_MIN);
   501  }
   502  
   503  // cppcheck-suppress *
   504  TEST(RecordIDJoinIteratorTest, CheckIterator) {
   505    RecordID recordIDsH[5];
   506    ForeignTableIterator<int32_t> vpItersH[5];
   507    int values[5][5] = {{1, 0, 0, 0, 0},
   508                        {0, 2, 0, 0, 0},
   509                        {0, 0, 3, 0, 0},
   510                        {0, 0, 0, 4, 0},
   511                        {0, 0, 0, 0, 5}};
   512  
   513    // prepare record ids
   514    int16_t timezoneLookupH[6] = {0, 1, 2, 3, 10};
   515    int32_t baseBatchID = -2147483648;
   516    for (int i = 0; i < 5; i++) {
   517      recordIDsH[i] = {static_cast<int32_t>(baseBatchID + i),
   518                           static_cast<uint32_t>(i)};
   519    }
   520  
   521    RecordID* recordIDs = allocate(&recordIDsH[0], 5);
   522    int16_t *timezoneLookup = allocate(&timezoneLookupH[0], 5);
   523    // prepare batches
   524    uint8_t *basePtrs[5];
   525    for (int i = 0; i < 5; i++) {
   526      basePtrs[i] =
   527          allocate_column(nullptr, nullptr, &values[i], 0, 0, 20);
   528      vpItersH[i] = ForeignTableIterator<int32_t>(VectorPartyIterator<int32_t>(
   529          nullptr, 0, basePtrs[i], 0, 0, 5, 4, 0));
   530    }
   531  
   532    ForeignTableIterator<int32_t>* vpIters = allocate(&vpItersH[0], 5);
   533  
   534    RecordIDJoinIterator<int32_t> joinIter(
   535        &recordIDs[0], 5, baseBatchID, vpIters, 5, timezoneLookup, 5);
   536    int32_t expectedValues[5] = {1, 2, 3, 10, 0};
   537    uint8_t expectedNulls[5] = {1, 1, 1, 1, 1};
   538  
   539    EXPECT_TRUE(compare_value(joinIter,
   540                              joinIter + 5,
   541                              std::begin(expectedValues)));
   542    EXPECT_TRUE(compare_null(joinIter, joinIter + 5, std::begin(expectedNulls)));
   543    for (int i = 0; i < 5; i++) {
   544      release(basePtrs[i]);
   545    }
   546  }
   547  
   548  // cppcheck-suppress *
   549  TEST(DimensionHashIterator, CheckIterator) {
   550    uint8_t dimValues[20];
   551    uint32_t indexVector[2] = {0, 1};
   552    uint8_t numDimsPerDimWidth[NUM_DIM_WIDTH] = {0, 0, 1, 1, 1};
   553    reinterpret_cast<uint32_t *>(dimValues)[0] = 1;
   554    reinterpret_cast<uint32_t *>(dimValues)[1] = 1;
   555    reinterpret_cast<uint16_t *>(dimValues + 8)[0] = 1;
   556    reinterpret_cast<uint16_t *>(dimValues + 8)[1] = 1;
   557    (dimValues + 12)[0] = 1;
   558    (dimValues + 12)[1] = 1;
   559    (dimValues + 12)[2] = 1;
   560    (dimValues + 12)[3] = 1;
   561    (dimValues + 12)[4] = 1;
   562    (dimValues + 12)[5] = 1;
   563    (dimValues + 12)[6] = 1;
   564    (dimValues + 12)[7] = 1;
   565    DimensionHashIterator iter(dimValues, indexVector, numDimsPerDimWidth, 2);
   566    EXPECT_EQ(iter[0], iter[1]);
   567  }
   568  
   569  // cppcheck-suppress *
   570  TEST(DimensionColumnPermutateIteratorTest, CheckIterator) {
   571    uint8_t valuesInH[28] = {1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   572                             0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 1, 2, 0, 0};
   573    uint32_t indexVectorH[2] = {1, 0};
   574    uint8_t valuesOutH[28] = {0};
   575  
   576    uint8_t *valuesIn = allocate(valuesInH, 28);
   577    uint32_t *indexVector = allocate(indexVectorH, 2);
   578    uint8_t *valuesOut = allocate(valuesOutH, 28);
   579  
   580    uint8_t numDimsPerDimWidth[NUM_DIM_WIDTH] = {0, 0, 1, 1, 1};
   581    DimensionColumnPermutateIterator iterIn(valuesIn, indexVector, 4, 2,
   582                                            numDimsPerDimWidth);
   583    DimensionColumnOutputIterator iterOut(valuesOut, 4, 2, numDimsPerDimWidth, 0);
   584  #ifdef RUN_ON_DEVICE
   585    thrust::copy(thrust::device, iterIn, iterIn + 6, iterOut);
   586  #else
   587    thrust::copy(thrust::host, iterIn, iterIn + 6, iterOut);
   588  #endif
   589    uint8_t expectedOut[28] = {2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   590                               0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 2, 1, 0, 0};
   591    EXPECT_TRUE(equal(valuesOut, valuesOut + 28, &expectedOut[0]));
   592    release(valuesIn);
   593    release(indexVector);
   594    release(valuesOut);
   595  }
   596  
   597  // cppcheck-suppress *
   598  TEST(GeoBatchIntersectIteratorTest, CheckIterator) {
   599    // A square with (1,1), (1,-1), (-1,-1), (-1, 1) as points.
   600    float shapeLatsH[10] = {1, 1, -1, -1, 1, 1, 1, -1, -1, 1};
   601    float shapeLongsH[10] = {1, -1, -1, 1, 1, 1, -1, -1, 1, 1};
   602    uint8_t shapeIndexsH[10] = {0, 0, 0, 0, 0, 1, 1, 1, 1, 1};
   603    GeoShapeBatch geoShapeBatch =
   604        get_geo_shape_batch(shapeLatsH, shapeLongsH, shapeIndexsH, 2, 10);
   605  
   606    uint32_t indexVectorH[3] = {0, 1, 2};
   607    uint32_t *indexVector = allocate(indexVectorH, 3);
   608  
   609    // three points (0,0) (2,2), null
   610    GeoPointT pointsH[3] = {{0, 0}, {2, 2}, {0, 0}};
   611    uint8_t nullsH[1] = {0x3};
   612  
   613    uint32_t outputPredicateH[3] = {0, 0, 0};
   614  
   615    uint32_t *outputPredicate = allocate(outputPredicateH, 3);
   616  
   617    uint8_t
   618        *basePtr = allocate_column(nullptr, &nullsH[0], &pointsH[0], 0, 1, 24);
   619  
   620    auto columnIter = make_column_iterator<GeoPointT>(indexVector, nullptr, 0,
   621                                                      basePtr, 0, 8, 3, 8, 0);
   622  
   623    auto geoIter = make_geo_batch_intersect_iterator(columnIter, geoShapeBatch,
   624                                                     outputPredicate, true);
   625  
   626    // test moving iter.
   627    EXPECT_EQ(geoIter - geoIter, 0);
   628    EXPECT_EQ(geoIter + 1 - geoIter, 1);
   629    EXPECT_EQ(geoIter - 1 - geoIter, -1);
   630    EXPECT_EQ(geoIter + 5 - geoIter, 5);
   631    EXPECT_EQ(geoIter + 6 - geoIter, 6);
   632    EXPECT_EQ(geoIter - 6 - geoIter, -6);
   633    EXPECT_EQ(geoIter + 7 - geoIter, 7);
   634    EXPECT_EQ(geoIter + 14 - geoIter, 14);
   635  
   636  #ifdef RUN_ON_DEVICE
   637    thrust::for_each(thrust::device, geoIter, geoIter + 30,
   638                 VoidFunctor());
   639  #else
   640    thrust::for_each(thrust::host, geoIter, geoIter + 30,
   641                 VoidFunctor());
   642  #endif
   643    uint32_t expectedOutputPredicate[3] = {3, 0, 0};
   644    EXPECT_TRUE(equal(outputPredicate,
   645                      outputPredicate + 3,
   646                      expectedOutputPredicate));
   647  
   648    release(outputPredicate);
   649    release(indexVector);
   650    release(basePtr);
   651    release(geoShapeBatch);
   652  }
   653  
   654  // cppcheck-suppress *
   655  TEST(GeoPredicateIteratorTest, CheckIterator) {
   656    uint32_t predicate[4] = {0x00001000, 0xffffffff, 0, 0};
   657    int stepInWords = 2;
   658    GeoPredicateIterator geoIter(predicate, stepInWords);
   659    EXPECT_EQ(geoIter[0], 12);
   660    EXPECT_EQ(geoIter[1], -1);
   661  
   662    EXPECT_EQ(geoIter + 1 - geoIter, 1);
   663    EXPECT_EQ(geoIter + 2 - geoIter, 2);
   664  }
   665  
   666  TEST(IndexCountIterator, checkCount) {
   667    uint32_t counts[10] = {1, 3, 5, 8, 9, 10, 15, 16, 18, 20};
   668    uint32_t indexes[3] = {2, 5, 3};
   669  
   670    IndexCountIterator it(counts, indexes);
   671    EXPECT_EQ(it[0], 3);
   672    EXPECT_EQ(it[1], 5);
   673    EXPECT_EQ(it[2], 1);
   674  }
   675  
   676  }  // namespace ares