99 auto evtsWriter = builderE.
cursor<aod::Events>();
100 for (
auto i = 0;
i < 20; ++
i) {
101 evtsWriter(0,
i, 0.5f *
i, 2.f *
i, 3.f *
i);
103 auto evtTable = builderE.
finalize();
106 auto trksWriter = builderT.
cursor<aod::TrksX>();
107 for (
auto i = 0;
i < 20; ++
i) {
108 for (
auto j = 0.f;
j < 5;
j += 0.5f) {
109 trksWriter(0,
i, 0.5f *
j);
112 auto trkTable = builderT.
finalize();
113 aod::Events e{evtTable};
114 aod::TrksX t{trkTable};
115 REQUIRE(e.size() == 20);
116 REQUIRE(t.size() == 10 * 20);
118 auto tt = std::make_tuple(t);
121 auto s = slices.updateCacheEntry(0, trkTable);
125 for (
auto& slice :
g) {
126 auto as = slice.associatedTables();
127 auto gg = slice.groupingElement();
128 REQUIRE(gg.globalIndex() ==
count);
129 auto trks = std::get<aod::TrksX>(as);
130 REQUIRE(trks.size() == 10);
131 for (
auto& trk : trks) {
132 REQUIRE(trk.eventId() ==
count);
141 auto evtsWriter = builderE.
cursor<aod::Events>();
142 for (
auto i = 0;
i < 20; ++
i) {
143 evtsWriter(0,
i, 0.5f *
i, 2.f *
i, 3.f *
i);
145 auto evtTable = builderE.
finalize();
148 auto trksWriterX = builderTX.
cursor<aod::TrksX>();
150 auto trksWriterY = builderTY.
cursor<aod::TrksY>();
152 auto trksWriterZ = builderTZ.
cursor<aod::TrksZ>();
155 auto trksWriterXYZ = builderTXYZ.
cursor<aod::TrksU>();
157 for (
auto i = 0;
i < 20; ++
i) {
158 for (
auto j = 0.f;
j < 5;
j += 0.5f) {
159 trksWriterX(0,
i, 0.5f *
j);
161 for (
auto j = 0.f;
j < 10;
j += 0.5f) {
162 trksWriterY(0,
i, 0.5f *
j);
164 for (
auto j = 0.f;
j < 15;
j += 0.5f) {
165 trksWriterZ(0,
i, 0.5f *
j);
168 for (
auto j = 0.f;
j < 5;
j += 0.5f) {
169 trksWriterXYZ(0, 0.5f *
j, 2.f *
j, 2.5f *
j);
172 auto trkTableX = builderTX.
finalize();
173 auto trkTableY = builderTY.finalize();
174 auto trkTableZ = builderTZ.finalize();
176 auto trkTableXYZ = builderTXYZ.finalize();
178 aod::Events e{evtTable};
179 aod::TrksX tx{trkTableX};
180 aod::TrksY ty{trkTableY};
181 aod::TrksZ tz{trkTableZ};
183 aod::TrksU tu{trkTableXYZ};
185 REQUIRE(e.size() == 20);
186 REQUIRE(tx.size() == 10 * 20);
187 REQUIRE(ty.size() == 20 * 20);
188 REQUIRE(tz.size() == 30 * 20);
190 REQUIRE(tu.size() == 10 * 20);
192 auto tt = std::make_tuple(tx, ty, tz, tu);
195 {soa::getLabelFromType<aod::TrksY>(), soa::getMatcherFromTypeForKey<aod::TrksY>(
key),
key},
196 {soa::getLabelFromType<aod::TrksZ>(), soa::getMatcherFromTypeForKey<aod::TrksZ>(
key),
key}});
197 auto s = slices.updateCacheEntry(0, {trkTableX});
198 s = slices.updateCacheEntry(1, {trkTableY});
199 s = slices.updateCacheEntry(2, {trkTableZ});
203 for (
auto& slice :
g) {
204 auto as = slice.associatedTables();
205 auto gg = slice.groupingElement();
206 REQUIRE(gg.globalIndex() ==
count);
207 auto trksx = std::get<aod::TrksX>(as);
208 auto trksy = std::get<aod::TrksY>(as);
209 auto trksz = std::get<aod::TrksZ>(as);
211 auto trksu = std::get<aod::TrksU>(as);
213 REQUIRE(trksx.size() == 10);
214 REQUIRE(trksy.size() == 20);
215 REQUIRE(trksz.size() == 30);
217 REQUIRE(trksu.size() == 10 * 20);
219 for (
auto& trk : trksx) {
220 REQUIRE(trk.eventId() ==
count);
222 for (
auto& trk : trksy) {
223 REQUIRE(trk.eventId() ==
count);
225 for (
auto& trk : trksz) {
226 REQUIRE(trk.eventId() ==
count);
236 auto evtsWriter = builderE.
cursor<aod::Events>();
237 for (
auto i = 0;
i < 20; ++
i) {
238 evtsWriter(0,
i, 0.5f *
i, 2.f *
i, 3.f *
i);
240 auto evtTable = builderE.
finalize();
243 auto trksWriter = builderT.
cursor<aod::TrksX>();
244 for (
auto i = 0;
i < 20; ++
i) {
245 if (
i == 3 ||
i == 10 ||
i == 12 ||
i == 16 ||
i == 19) {
248 for (
auto j = 0;
j < 10; ++
j) {
249 trksWriter(0,
i, 0.5f * (
j / 2.));
252 auto trkTable = builderT.
finalize();
253 aod::Events e{evtTable};
254 aod::TrksX t{trkTable};
255 REQUIRE(e.size() == 20);
256 REQUIRE(t.size() == 10 * (20 - 5));
258 auto tt = std::make_tuple(t);
261 auto s = slices.updateCacheEntry(0, trkTable);
264 for (
auto& slice :
g) {
265 auto as = slice.associatedTables();
266 auto gg = slice.groupingElement();
267 REQUIRE(gg.globalIndex() == (
int64_t)slice.position);
268 auto trks = std::get<aod::TrksX>(as);
269 if (slice.position == 3 || slice.position == 10 || slice.position == 12 || slice.position == 16 || slice.position == 19) {
270 REQUIRE(trks.size() == 0);
272 REQUIRE(trks.size() == 10);
274 for (
auto& trk : trks) {
275 REQUIRE(trk.eventId() == (
int64_t)slice.position);
283 auto evtsWriter = builderE.
cursor<aod::Events>();
284 for (
auto i = 0;
i < 20; ++
i) {
285 evtsWriter(0,
i, 0.5f *
i, 2.f *
i, 3.f *
i);
287 auto evtTable = builderE.
finalize();
292 auto trksWriter = builderT.
cursor<aod::TrksX>();
293 for (
auto i = 0;
i < 20; ++
i) {
294 if (
i == 3 ||
i == 10 ||
i == 12 ||
i == 16 ||
i == 19) {
295 for (
auto iz = 0; iz < 5; ++iz) {
296 trksWriter(0, -1 - skip, 0.123f * iz + 1.654f);
301 for (
auto j = 0;
j < 10; ++
j) {
302 trksWriter(0,
i, 0.5f * (
j / 2.));
305 for (
auto i = 0;
i < 5; ++
i) {
306 trksWriter(0, -6, 0.123f *
i + 1.654f);
308 auto trkTable = builderT.
finalize();
310 aod::Events e{evtTable};
311 aod::TrksX t{trkTable};
312 REQUIRE(e.size() == 20);
313 REQUIRE(t.size() == (30 + 10 * (20 - 5)));
315 auto tt = std::make_tuple(t);
318 auto s = slices.updateCacheEntry(0, trkTable);
322 for (
auto& slice :
g) {
323 auto as = slice.associatedTables();
324 auto gg = slice.groupingElement();
325 REQUIRE(gg.globalIndex() ==
count);
326 auto trks = std::get<aod::TrksX>(as);
328 REQUIRE(trks.size() == 0);
330 REQUIRE(trks.size() == 10);
332 for (
auto& trk : trks) {
333 REQUIRE(trk.eventId() ==
count);
342 auto evtsWriter = builderE.
cursor<aod::Events>();
343 for (
auto i = 0;
i < 20; ++
i) {
344 evtsWriter(0,
i, 0.5f *
i, 2.f *
i, 3.f *
i);
346 auto evtTable = builderE.
finalize();
349 auto trksWriter = builderT.
cursor<aod::TrksX>();
350 for (
auto i = 0;
i < 20; ++
i) {
351 if (
i == 3 ||
i == 10 ||
i == 12 ||
i == 16) {
354 for (
auto j = 0.f;
j < 5;
j += 0.5f) {
355 trksWriter(0,
i, 0.5f *
j);
358 auto trkTable = builderT.
finalize();
361 FilteredEvents e{{evtTable}, {2, 4, 10, 9, 15}};
362 aod::TrksX t{trkTable};
363 REQUIRE(e.size() == 5);
364 REQUIRE(t.size() == 10 * (20 - 4));
366 auto tt = std::make_tuple(t);
369 auto s = slices.updateCacheEntry(0, trkTable);
374 for (
auto& slice :
g) {
375 auto as = slice.associatedTables();
376 auto gg = slice.groupingElement();
377 REQUIRE(gg.globalIndex() ==
rows[
count]);
378 auto trks = std::get<aod::TrksX>(as);
380 REQUIRE(trks.size() == 0);
382 REQUIRE(trks.size() == 10);
384 for (
auto& trk : trks) {
394 auto evtsWriter = builderE.
cursor<aod::Events>();
395 for (
auto i = 0;
i < 20; ++
i) {
396 evtsWriter(0,
i, 0.5f *
i, 2.f *
i, 3.f *
i);
398 auto evtTable = builderE.
finalize();
401 auto trksWriter = builderT.
cursor<aod::TrksXU>();
402 std::vector<int> randomized{10, 2, 1, 0, 15, 3, 6, 4, 14, 5, 7, 9, 8, 19, 11, 13, 17, 12, 18, 19};
403 std::vector<int64_t> sel;
404 sel.resize(10 * (20 - 4));
405 std::iota(sel.begin(), sel.end(), 0);
406 for (
auto i : randomized) {
407 if (
i == 3 ||
i == 10 ||
i == 12 ||
i == 16) {
410 for (
auto j = 0.f;
j < 5;
j += 0.5f) {
411 trksWriter(0,
i, 0.5f *
j);
414 auto trkTable = builderT.
finalize();
417 auto trksWriterE = builderTE.
cursor<aod::TrksXU>();
418 auto trkTableE = builderTE.
finalize();
422 FilteredEvents e{{evtTable}, {2, 4, 10, 9, 15}};
425 REQUIRE(e.size() == 5);
426 REQUIRE(t.size() == 10 * (20 - 4));
428 auto tt = std::make_tuple(t);
431 auto s = slices.updateCacheEntryUnsorted(0, trkTable);
434 unsigned int count = 0;
436 for (
auto& slice :
g) {
437 auto as = slice.associatedTables();
438 auto gg = slice.groupingElement();
439 REQUIRE(gg.globalIndex() ==
rows[
count]);
440 auto trks = std::get<soa::SmallGroups<aod::TrksXU>>(as);
442 REQUIRE(trks.size() == 0);
444 REQUIRE(trks.size() == 10);
446 for (
auto& trk : trks) {
452 std::vector<int64_t> sele;
454 auto tte = std::make_tuple(te);
458 for (
auto& slice : ge) {
459 auto as = slice.associatedTables();
460 auto gg = slice.groupingElement();
461 REQUIRE(gg.globalIndex() ==
rows[
count]);
462 auto trks = std::get<soa::SmallGroups<aod::TrksXU>>(as);
463 REQUIRE(trks.size() == 0);
468 auto ttu = std::make_tuple(tu);
472 for (
auto& slice : gu) {
473 auto as = slice.associatedTables();
474 auto gg = slice.groupingElement();
475 REQUIRE(gg.globalIndex() ==
rows[
count]);
476 auto trks = std::get<soa::SmallGroupsUnfiltered<aod::TrksXU>>(as);
478 REQUIRE(trks.size() == 0);
480 REQUIRE(trks.size() == 10);
511TEST_CASE(
"GroupSlicerMismatchedUnsortedFilteredGroupsWithSelfIndex")
514 auto evtsWriter = builderE.
cursor<aod::Events>();
515 for (
auto i = 0;
i < 10; ++
i) {
516 evtsWriter(0,
i, 0.5f *
i, 2.f *
i, 3.f *
i);
518 auto evtTable = builderE.
finalize();
521 auto partsWriter = builderP.
cursor<aod::Parts>();
523 std::random_device
rd;
524 std::mt19937
gen(
rd());
525 std::uniform_int_distribution<> distrib(0, 99);
527 for (
auto i = 0;
i < 100; ++
i) {
528 filler[0] = distrib(
gen);
529 filler[1] = distrib(
gen);
530 if (filler[0] > filler[1]) {
531 std::swap(filler[0], filler[1]);
533 partsWriter(0, std::floor(
i / 10.),
i, filler);
535 auto partsTable = builderP.
finalize();
538 auto thingsWriter = builderT.
cursor<aod::Things>();
539 for (
auto i = 0;
i < 10; ++
i) {
540 thingsWriter(0,
i, distrib(
gen));
542 auto thingsTable = builderT.
finalize();
544 aod::Events e{evtTable};
545 aod::Things t{thingsTable};
549 for (
auto i = 0;
i <
size; ++
i) {
552 FilteredParts fp{{partsTable},
rows};
553 auto associatedTuple = std::make_tuple(fp, t);
556 {soa::getLabelFromType<aod::Things>(), soa::getMatcherFromTypeForKey<aod::Things>(
key),
key}});
558 auto s1 = slices.updateCacheEntry(1, thingsTable);
561 overwriteInternalIndices(associatedTuple, associatedTuple);
564 for (
auto& slice :
g) {
565 auto as = slice.associatedTables();
566 auto gg = slice.groupingElement();
567 overwriteInternalIndices(as, associatedTuple);
568 auto& ts = std::get<1>(as);
569 ts.bindExternalIndices(&e, &std::get<0>(associatedTuple));
570 for (
auto& thing : ts) {
571 if (thing.has_part()) {
572 auto part = thing.part_as<FilteredParts>();
573 REQUIRE(std::same_as<std::decay_t<
decltype(part)>::parent_t, FilteredParts>);
574 auto rs = part.relatives_as<std::decay_t<
decltype(part)::parent_t>>();
575 REQUIRE(std::same_as<std::decay_t<
decltype(rs)>, FilteredParts>);
577 REQUIRE(std::same_as<std::decay_t<
decltype(
r)>::parent_t, FilteredParts>);
578 auto rss =
r.relatives_as<std::decay_t<
decltype(
r)>::parent_t>();
579 REQUIRE(std::same_as<std::decay_t<
decltype(rss)>, FilteredParts>);
580 for (
auto& rr : rss) {
581 REQUIRE(std::same_as<std::decay_t<
decltype(rr)>::parent_t, FilteredParts>);
582 auto rsss = rr.relatives_as<std::decay_t<
decltype(rr)>::parent_t>();
583 REQUIRE(std::same_as<std::decay_t<
decltype(rsss)>, FilteredParts>);
584 for (
auto& rrr : rsss) {
585 REQUIRE(std::same_as<std::decay_t<
decltype(rrr)>::parent_t, FilteredParts>);
586 auto rssss = rrr.relatives_as<std::decay_t<
decltype(rrr)>::parent_t>();
587 REQUIRE(std::same_as<std::decay_t<
decltype(rssss)>, FilteredParts>);
599 auto evtsWriter = builderE.
cursor<aod::Events>();
600 for (
auto i = 0;
i < 20; ++
i) {
601 evtsWriter(0,
i, 0.5f *
i, 2.f *
i, 3.f *
i);
603 auto evtTable = builderE.
finalize();
606 auto trksWriter = builderT.
cursor<aod::TrksX>();
607 auto trkTable = builderT.
finalize();
609 aod::Events e{evtTable};
610 aod::TrksX t{trkTable};
611 REQUIRE(e.size() == 20);
612 REQUIRE(t.size() == 0);
614 auto tt = std::make_tuple(t);
617 auto s = slices.updateCacheEntry(0, trkTable);
620 unsigned int count = 0;
621 for (
auto& slice :
g) {
622 auto as = slice.associatedTables();
623 auto gg = slice.groupingElement();
624 auto trks = std::get<aod::TrksX>(as);
625 REQUIRE(gg.globalIndex() ==
count);
626 REQUIRE(trks.size() == 0);
633 int counts[] = {5, 5, 5, 4, 1};
634 int offsets[] = {0, 5, 10, 15, 19, 20};
635 int ids[] = {0, 1, 2, 3, 4};
636 int sizes[] = {4, 1, 12, 5, 2};
641 auto evtsWriter = builderE.
cursor<aod::Events>();
643 for (
auto i = 0;
i < 20; ++
i) {
647 evtsWriter(0,
ids[step], 0.5f *
i, 2.f *
i, 3.f *
i);
649 auto evtTable = builderE.
finalize();
652 auto evtsEWriter = builderEE.
cursor<aod::EventExtra>();
655 for (
auto i = 0;
i < 20; ++
i) {
659 float arr[3] = {0.1f *
i, 0.2f *
i, 0.3f *
i};
660 std::vector<double> d;
661 for (
auto z = 0;
z <
sizes[step]; ++
z) {
662 d.push_back((
double)
z * 0.5);
664 evtsEWriter(0, arr,
i % 2 == 0, d);
666 auto evtETable = builderEE.
finalize();
668 aod::Events e{evtTable};
669 aod::EventExtra ee{evtETable};
670 BigE b_e{{evtTable, evtETable}};
672 std::vector<std::shared_ptr<arrow::ChunkedArray>> slices_array;
673 std::vector<std::shared_ptr<arrow::ChunkedArray>> slices_bool;
674 std::vector<std::shared_ptr<arrow::ChunkedArray>> slices_vec;
676 for (
auto i = 0u;
i < 5; ++
i) {
677 slices_array.emplace_back(evtETable->column(0)->Slice(
offset, counts[
i]));
678 slices_bool.emplace_back(evtETable->column(1)->Slice(
offset, counts[
i]));
679 slices_vec.emplace_back(evtETable->column(2)->Slice(
offset, counts[
i]));
681 REQUIRE(slices_array[
i]->
length() == counts[
i]);
682 REQUIRE(slices_bool[
i]->
length() == counts[
i]);
683 REQUIRE(slices_vec[
i]->
length() == counts[
i]);
686 std::vector<arrow::Datum> slices;
687 std::vector<uint64_t> offsts;
688 auto bk =
Entry(soa::getLabelFromType<aod::Events>(), soa::getMatcherFromTypeForKey<aod::Events>(
"fID"),
"fID");
690 auto s = cache.updateCacheEntry(0, {evtTable});
691 auto lcache = cache.getCacheFor(bk);
692 for (
auto i = 0u;
i < 5; ++
i) {
694 auto tbl = b_e.asArrowTable()->Slice(
offset,
count);
695 auto ca = tbl->GetColumnByName(
"fArr");
696 auto cb = tbl->GetColumnByName(
"fBoo");
697 auto cv = tbl->GetColumnByName(
"fLst");
698 REQUIRE(ca->length() == counts[
i]);
699 REQUIRE(cb->length() == counts[
i]);
700 REQUIRE(cv->length() == counts[
i]);
701 REQUIRE(ca->Equals(slices_array[
i]));
702 REQUIRE(cb->Equals(slices_bool[
i]));
703 REQUIRE(cv->Equals(slices_vec[
i]));
707 for (
auto i = 0u;
i < 5; ++
i) {
709 auto tbl = BigE{{b_e.asArrowTable()->Slice(
offset,
count)},
static_cast<uint64_t
>(
offset)};
710 REQUIRE(tbl.size() == counts[
i]);
711 for (
auto&
row : tbl) {
713 REQUIRE(
row.boo() == (
j % 2 == 0));
714 auto rid =
row.globalIndex();
715 auto arr =
row.arr();
716 REQUIRE(arr[0] == 0.1f * (
float)rid);
717 REQUIRE(arr[1] == 0.2f * (
float)rid);
718 REQUIRE(arr[2] == 0.3f * (
float)rid);
721 REQUIRE(d.size() == (
size_t)
sizes[
i]);
722 for (
auto z = 0u;
z < d.size(); ++
z) {
723 REQUIRE(d[
z] == 0.5 * (
double)
z);
732 int offsets[] = {0, 5, 10, 15, 19, 20};
733 int ids[] = {0, 1, 2, 4, 3};
736 auto evtsWriter = builderE.
cursor<aod::Events>();
738 for (
auto i = 0;
i < 20; ++
i) {
742 evtsWriter(0,
ids[step], 0.5f *
i, 2.f *
i, 3.f *
i);
744 auto evtTable = builderE.
finalize();
746 auto bk =
Entry(soa::getLabelFromType<aod::Events>(), soa::getMatcherFromTypeForKey<aod::Events>(
"fID"),
"fID");
750 auto s = cache.updateCacheEntry(0, {evtTable});
752 REQUIRE(std::string{
error_from_ref(re).
what} ==
"Table Events index fID is not sorted: next value 3 < previous value 4!");
755 FAIL(
"Slicing should have failed due to unsorted index");