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