100 auto evtsWriter = builderE.
cursor<aod::Events>();
101 for (
auto i = 0;
i < 20; ++
i) {
102 evtsWriter(0,
i, 0.5f *
i, 2.f *
i, 3.f *
i);
104 auto evtTable = builderE.
finalize();
107 auto trksWriter = builderT.
cursor<aod::TrksX>();
108 for (
auto i = 0;
i < 20; ++
i) {
109 for (
auto j = 0.f;
j < 5;
j += 0.5f) {
110 trksWriter(0,
i, 0.5f *
j);
113 auto trkTable = builderT.
finalize();
114 aod::Events e{evtTable};
115 aod::TrksX t{trkTable};
116 REQUIRE(e.size() == 20);
117 REQUIRE(t.size() == 10 * 20);
119 auto tt = std::make_tuple(t);
122 auto s = slices.updateCacheEntry(0, trkTable);
126 for (
auto& slice :
g) {
127 auto as = slice.associatedTables();
128 auto gg = slice.groupingElement();
129 REQUIRE(gg.globalIndex() ==
count);
130 auto trks = std::get<aod::TrksX>(as);
131 REQUIRE(trks.size() == 10);
132 for (
auto& trk : trks) {
133 REQUIRE(trk.eventId() ==
count);
142 auto evtsWriter = builderE.
cursor<aod::Events>();
143 for (
auto i = 0;
i < 20; ++
i) {
144 evtsWriter(0,
i, 0.5f *
i, 2.f *
i, 3.f *
i);
146 auto evtTable = builderE.
finalize();
149 auto trksWriterX = builderTX.
cursor<aod::TrksX>();
151 auto trksWriterY = builderTY.
cursor<aod::TrksY>();
153 auto trksWriterZ = builderTZ.
cursor<aod::TrksZ>();
156 auto trksWriterXYZ = builderTXYZ.
cursor<aod::TrksU>();
158 for (
auto i = 0;
i < 20; ++
i) {
159 for (
auto j = 0.f;
j < 5;
j += 0.5f) {
160 trksWriterX(0,
i, 0.5f *
j);
162 for (
auto j = 0.f;
j < 10;
j += 0.5f) {
163 trksWriterY(0,
i, 0.5f *
j);
165 for (
auto j = 0.f;
j < 15;
j += 0.5f) {
166 trksWriterZ(0,
i, 0.5f *
j);
169 for (
auto j = 0.f;
j < 5;
j += 0.5f) {
170 trksWriterXYZ(0, 0.5f *
j, 2.f *
j, 2.5f *
j);
173 auto trkTableX = builderTX.
finalize();
174 auto trkTableY = builderTY.finalize();
175 auto trkTableZ = builderTZ.finalize();
177 auto trkTableXYZ = builderTXYZ.finalize();
179 aod::Events e{evtTable};
180 aod::TrksX tx{trkTableX};
181 aod::TrksY ty{trkTableY};
182 aod::TrksZ tz{trkTableZ};
184 aod::TrksU tu{trkTableXYZ};
186 REQUIRE(e.size() == 20);
187 REQUIRE(tx.size() == 10 * 20);
188 REQUIRE(ty.size() == 20 * 20);
189 REQUIRE(tz.size() == 30 * 20);
191 REQUIRE(tu.size() == 10 * 20);
193 auto tt = std::make_tuple(tx, ty, tz, tu);
196 {soa::getLabelFromType<aod::TrksY>(), soa::getMatcherFromTypeForKey<aod::TrksY>(
key),
key},
197 {soa::getLabelFromType<aod::TrksZ>(), soa::getMatcherFromTypeForKey<aod::TrksZ>(
key),
key}});
198 auto s = slices.updateCacheEntry(0, {trkTableX});
199 s = slices.updateCacheEntry(1, {trkTableY});
200 s = slices.updateCacheEntry(2, {trkTableZ});
204 for (
auto& slice :
g) {
205 auto as = slice.associatedTables();
206 auto gg = slice.groupingElement();
207 REQUIRE(gg.globalIndex() ==
count);
208 auto trksx = std::get<aod::TrksX>(as);
209 auto trksy = std::get<aod::TrksY>(as);
210 auto trksz = std::get<aod::TrksZ>(as);
212 auto trksu = std::get<aod::TrksU>(as);
214 REQUIRE(trksx.size() == 10);
215 REQUIRE(trksy.size() == 20);
216 REQUIRE(trksz.size() == 30);
218 REQUIRE(trksu.size() == 10 * 20);
220 for (
auto& trk : trksx) {
221 REQUIRE(trk.eventId() ==
count);
223 for (
auto& trk : trksy) {
224 REQUIRE(trk.eventId() ==
count);
226 for (
auto& trk : trksz) {
227 REQUIRE(trk.eventId() ==
count);
237 auto evtsWriter = builderE.
cursor<aod::Events>();
238 for (
auto i = 0;
i < 20; ++
i) {
239 evtsWriter(0,
i, 0.5f *
i, 2.f *
i, 3.f *
i);
241 auto evtTable = builderE.
finalize();
244 auto trksWriter = builderT.
cursor<aod::TrksX>();
245 for (
auto i = 0;
i < 20; ++
i) {
246 if (
i == 3 ||
i == 10 ||
i == 12 ||
i == 16 ||
i == 19) {
249 for (
auto j = 0;
j < 10; ++
j) {
250 trksWriter(0,
i, 0.5f * (
j / 2.));
253 auto trkTable = builderT.
finalize();
254 aod::Events e{evtTable};
255 aod::TrksX t{trkTable};
256 REQUIRE(e.size() == 20);
257 REQUIRE(t.size() == 10 * (20 - 5));
259 auto tt = std::make_tuple(t);
262 auto s = slices.updateCacheEntry(0, trkTable);
265 for (
auto& slice :
g) {
266 auto as = slice.associatedTables();
267 auto gg = slice.groupingElement();
268 REQUIRE(gg.globalIndex() == (int64_t)slice.position);
269 auto trks = std::get<aod::TrksX>(as);
270 if (slice.position == 3 || slice.position == 10 || slice.position == 12 || slice.position == 16 || slice.position == 19) {
271 REQUIRE(trks.size() == 0);
273 REQUIRE(trks.size() == 10);
275 for (
auto& trk : trks) {
276 REQUIRE(trk.eventId() == (int64_t)slice.position);
284 auto evtsWriter = builderE.
cursor<aod::Events>();
285 for (
auto i = 0;
i < 20; ++
i) {
286 evtsWriter(0,
i, 0.5f *
i, 2.f *
i, 3.f *
i);
288 auto evtTable = builderE.
finalize();
293 auto trksWriter = builderT.
cursor<aod::TrksX>();
294 for (
auto i = 0;
i < 20; ++
i) {
295 if (
i == 3 ||
i == 10 ||
i == 12 ||
i == 16 ||
i == 19) {
296 for (
auto iz = 0; iz < 5; ++iz) {
297 trksWriter(0, -1 - skip, 0.123f * iz + 1.654f);
302 for (
auto j = 0;
j < 10; ++
j) {
303 trksWriter(0,
i, 0.5f * (
j / 2.));
306 for (
auto i = 0;
i < 5; ++
i) {
307 trksWriter(0, -6, 0.123f *
i + 1.654f);
309 auto trkTable = builderT.
finalize();
311 aod::Events e{evtTable};
312 aod::TrksX t{trkTable};
313 REQUIRE(e.size() == 20);
314 REQUIRE(t.size() == (30 + 10 * (20 - 5)));
316 auto tt = std::make_tuple(t);
319 auto s = slices.updateCacheEntry(0, trkTable);
323 for (
auto& slice :
g) {
324 auto as = slice.associatedTables();
325 auto gg = slice.groupingElement();
326 REQUIRE(gg.globalIndex() ==
count);
327 auto trks = std::get<aod::TrksX>(as);
329 REQUIRE(trks.size() == 0);
331 REQUIRE(trks.size() == 10);
333 for (
auto& trk : trks) {
334 REQUIRE(trk.eventId() ==
count);
343 auto evtsWriter = builderE.
cursor<aod::Events>();
344 for (
auto i = 0;
i < 20; ++
i) {
345 evtsWriter(0,
i, 0.5f *
i, 2.f *
i, 3.f *
i);
347 auto evtTable = builderE.
finalize();
350 auto trksWriter = builderT.
cursor<aod::TrksX>();
351 for (
auto i = 0;
i < 20; ++
i) {
352 if (
i == 3 ||
i == 10 ||
i == 12 ||
i == 16) {
355 for (
auto j = 0.f;
j < 5;
j += 0.5f) {
356 trksWriter(0,
i, 0.5f *
j);
359 auto trkTable = builderT.
finalize();
362 FilteredEvents e{{evtTable}, {2, 4, 10, 9, 15}};
363 aod::TrksX t{trkTable};
364 REQUIRE(e.size() == 5);
365 REQUIRE(t.size() == 10 * (20 - 4));
367 auto tt = std::make_tuple(t);
370 auto s = slices.updateCacheEntry(0, trkTable);
375 for (
auto& slice :
g) {
376 auto as = slice.associatedTables();
377 auto gg = slice.groupingElement();
378 REQUIRE(gg.globalIndex() ==
rows[
count]);
379 auto trks = std::get<aod::TrksX>(as);
381 REQUIRE(trks.size() == 0);
383 REQUIRE(trks.size() == 10);
385 for (
auto& trk : trks) {
395 auto evtsWriter = builderE.
cursor<aod::Events>();
396 for (
auto i = 0;
i < 20; ++
i) {
397 evtsWriter(0,
i, 0.5f *
i, 2.f *
i, 3.f *
i);
399 auto evtTable = builderE.
finalize();
402 auto trksWriter = builderT.
cursor<aod::TrksXU>();
403 std::vector<int> randomized{10, 2, 1, 0, 15, 3, 6, 4, 14, 5, 7, 9, 8, 19, 11, 13, 17, 12, 18, 19};
404 std::vector<int64_t> sel;
405 sel.resize(10 * (20 - 4));
406 std::iota(sel.begin(), sel.end(), 0);
407 for (
auto i : randomized) {
408 if (
i == 3 ||
i == 10 ||
i == 12 ||
i == 16) {
411 for (
auto j = 0.f;
j < 5;
j += 0.5f) {
412 trksWriter(0,
i, 0.5f *
j);
415 auto trkTable = builderT.
finalize();
418 auto trksWriterE = builderTE.
cursor<aod::TrksXU>();
419 auto trkTableE = builderTE.
finalize();
423 FilteredEvents e{{evtTable}, {2, 4, 10, 9, 15}};
426 REQUIRE(e.size() == 5);
427 REQUIRE(t.size() == 10 * (20 - 4));
429 auto tt = std::make_tuple(t);
432 auto s = slices.updateCacheEntryUnsorted(0, trkTable);
435 unsigned int count = 0;
437 for (
auto& slice :
g) {
438 auto as = slice.associatedTables();
439 auto gg = slice.groupingElement();
440 REQUIRE(gg.globalIndex() ==
rows[
count]);
441 auto trks = std::get<soa::SmallGroups<aod::TrksXU>>(as);
443 REQUIRE(trks.size() == 0);
445 REQUIRE(trks.size() == 10);
447 for (
auto& trk : trks) {
453 std::vector<int64_t> sele;
455 auto tte = std::make_tuple(te);
459 for (
auto& slice : ge) {
460 auto as = slice.associatedTables();
461 auto gg = slice.groupingElement();
462 REQUIRE(gg.globalIndex() ==
rows[
count]);
463 auto trks = std::get<soa::SmallGroups<aod::TrksXU>>(as);
464 REQUIRE(trks.size() == 0);
469 auto ttu = std::make_tuple(tu);
473 for (
auto& slice : gu) {
474 auto as = slice.associatedTables();
475 auto gg = slice.groupingElement();
476 REQUIRE(gg.globalIndex() ==
rows[
count]);
477 auto trks = std::get<soa::SmallGroupsUnfiltered<aod::TrksXU>>(as);
479 REQUIRE(trks.size() == 0);
481 REQUIRE(trks.size() == 10);
512TEST_CASE(
"GroupSlicerMismatchedUnsortedFilteredGroupsWithSelfIndex")
515 auto evtsWriter = builderE.
cursor<aod::Events>();
516 for (
auto i = 0;
i < 10; ++
i) {
517 evtsWriter(0,
i, 0.5f *
i, 2.f *
i, 3.f *
i);
519 auto evtTable = builderE.
finalize();
522 auto partsWriter = builderP.
cursor<aod::Parts>();
524 std::random_device
rd;
525 std::mt19937
gen(
rd());
526 std::uniform_int_distribution<> distrib(0, 99);
528 for (
auto i = 0;
i < 100; ++
i) {
529 filler[0] = distrib(
gen);
530 filler[1] = distrib(
gen);
531 if (filler[0] > filler[1]) {
532 std::swap(filler[0], filler[1]);
534 partsWriter(0, std::floor(
i / 10.),
i, filler);
536 auto partsTable = builderP.
finalize();
539 auto thingsWriter = builderT.
cursor<aod::Things>();
540 for (
auto i = 0;
i < 10; ++
i) {
541 thingsWriter(0,
i, distrib(
gen));
543 auto thingsTable = builderT.
finalize();
545 aod::Events e{evtTable};
546 aod::Things t{thingsTable};
550 for (
auto i = 0;
i <
size; ++
i) {
553 FilteredParts fp{{partsTable},
rows};
554 auto associatedTuple = std::make_tuple(fp, t);
557 {soa::getLabelFromType<aod::Things>(), soa::getMatcherFromTypeForKey<aod::Things>(
key),
key}});
559 auto s1 = slices.updateCacheEntry(1, thingsTable);
562 overwriteInternalIndices(associatedTuple, associatedTuple);
565 for (
auto& slice :
g) {
566 auto as = slice.associatedTables();
567 auto gg = slice.groupingElement();
568 overwriteInternalIndices(as, associatedTuple);
569 auto& ts = std::get<1>(as);
570 ts.bindExternalIndices(&e, &std::get<0>(associatedTuple));
571 for (
auto& thing : ts) {
572 if (thing.has_part()) {
573 auto part = thing.part_as<FilteredParts>();
574 REQUIRE(std::same_as<std::decay_t<
decltype(part)>::parent_t, FilteredParts>);
575 auto rs = part.relatives_as<std::decay_t<
decltype(part)::parent_t>>();
576 REQUIRE(std::same_as<std::decay_t<
decltype(rs)>, FilteredParts>);
578 REQUIRE(std::same_as<std::decay_t<
decltype(
r)>::parent_t, FilteredParts>);
579 auto rss =
r.relatives_as<std::decay_t<
decltype(
r)>::parent_t>();
580 REQUIRE(std::same_as<std::decay_t<
decltype(rss)>, FilteredParts>);
581 for (
auto&
rr : rss) {
582 REQUIRE(std::same_as<std::decay_t<
decltype(
rr)>::parent_t, FilteredParts>);
583 auto rsss =
rr.relatives_as<std::decay_t<
decltype(
rr)>::parent_t>();
584 REQUIRE(std::same_as<std::decay_t<
decltype(rsss)>, FilteredParts>);
585 for (
auto& rrr : rsss) {
586 REQUIRE(std::same_as<std::decay_t<
decltype(rrr)>::parent_t, FilteredParts>);
587 auto rssss = rrr.relatives_as<std::decay_t<
decltype(rrr)>::parent_t>();
588 REQUIRE(std::same_as<std::decay_t<
decltype(rssss)>, FilteredParts>);
600 auto evtsWriter = builderE.
cursor<aod::Events>();
601 for (
auto i = 0;
i < 20; ++
i) {
602 evtsWriter(0,
i, 0.5f *
i, 2.f *
i, 3.f *
i);
604 auto evtTable = builderE.
finalize();
607 auto trksWriter = builderT.
cursor<aod::TrksX>();
608 auto trkTable = builderT.
finalize();
610 aod::Events e{evtTable};
611 aod::TrksX t{trkTable};
612 REQUIRE(e.size() == 20);
613 REQUIRE(t.size() == 0);
615 auto tt = std::make_tuple(t);
618 auto s = slices.updateCacheEntry(0, trkTable);
621 unsigned int count = 0;
622 for (
auto& slice :
g) {
623 auto as = slice.associatedTables();
624 auto gg = slice.groupingElement();
625 auto trks = std::get<aod::TrksX>(as);
626 REQUIRE(gg.globalIndex() ==
count);
627 REQUIRE(trks.size() == 0);
634 int counts[] = {5, 5, 5, 4, 1};
635 int offsets[] = {0, 5, 10, 15, 19, 20};
636 int ids[] = {0, 1, 2, 3, 4};
637 int sizes[] = {4, 1, 12, 5, 2};
642 auto evtsWriter = builderE.
cursor<aod::Events>();
644 for (
auto i = 0;
i < 20; ++
i) {
648 evtsWriter(0,
ids[step], 0.5f *
i, 2.f *
i, 3.f *
i);
650 auto evtTable = builderE.
finalize();
653 auto evtsEWriter = builderEE.
cursor<aod::EventExtra>();
656 for (
auto i = 0;
i < 20; ++
i) {
660 float arr[3] = {0.1f *
i, 0.2f *
i, 0.3f *
i};
661 std::vector<double> d;
662 for (
auto z = 0;
z <
sizes[step]; ++
z) {
663 d.push_back((
double)
z * 0.5);
665 evtsEWriter(0, arr,
i % 2 == 0, d);
667 auto evtETable = builderEE.
finalize();
669 aod::Events e{evtTable};
670 aod::EventExtra ee{evtETable};
671 BigE b_e{{evtTable, evtETable}};
673 std::vector<std::shared_ptr<arrow::ChunkedArray>> slices_array;
674 std::vector<std::shared_ptr<arrow::ChunkedArray>> slices_bool;
675 std::vector<std::shared_ptr<arrow::ChunkedArray>> slices_vec;
677 for (
auto i = 0u;
i < 5; ++
i) {
678 slices_array.emplace_back(evtETable->column(0)->Slice(
offset, counts[
i]));
679 slices_bool.emplace_back(evtETable->column(1)->Slice(
offset, counts[
i]));
680 slices_vec.emplace_back(evtETable->column(2)->Slice(
offset, counts[
i]));
682 REQUIRE(slices_array[
i]->
length() == counts[
i]);
683 REQUIRE(slices_bool[
i]->
length() == counts[
i]);
684 REQUIRE(slices_vec[
i]->
length() == counts[
i]);
687 std::vector<arrow::Datum> slices;
688 std::vector<uint64_t> offsts;
689 auto bk =
Entry(soa::getLabelFromType<aod::Events>(), soa::getMatcherFromTypeForKey<aod::Events>(
"fID"),
"fID");
691 auto s = cache.updateCacheEntry(0, {evtTable});
692 auto lcache = cache.getCacheFor(bk);
693 for (
auto i = 0u;
i < 5; ++
i) {
695 auto tbl = b_e.asArrowTable()->Slice(
offset,
count);
696 auto ca = tbl->GetColumnByName(
"fArr");
697 auto cb = tbl->GetColumnByName(
"fBoo");
698 auto cv = tbl->GetColumnByName(
"fLst");
699 REQUIRE(ca->length() == counts[
i]);
700 REQUIRE(cb->length() == counts[
i]);
701 REQUIRE(cv->length() == counts[
i]);
702 REQUIRE(ca->Equals(slices_array[
i]));
703 REQUIRE(cb->Equals(slices_bool[
i]));
704 REQUIRE(cv->Equals(slices_vec[
i]));
708 for (
auto i = 0u;
i < 5; ++
i) {
710 auto tbl = BigE{{b_e.asArrowTable()->Slice(
offset,
count)},
static_cast<uint64_t
>(
offset)};
711 REQUIRE(tbl.size() == counts[
i]);
712 for (
auto&
row : tbl) {
714 REQUIRE(
row.boo() == (
j % 2 == 0));
715 auto rid =
row.globalIndex();
716 auto arr =
row.arr();
717 REQUIRE(arr[0] == 0.1f * (
float)rid);
718 REQUIRE(arr[1] == 0.2f * (
float)rid);
719 REQUIRE(arr[2] == 0.3f * (
float)rid);
722 REQUIRE(d.size() == (
size_t)
sizes[
i]);
723 for (
auto z = 0u;
z < d.size(); ++
z) {
724 REQUIRE(d[
z] == 0.5 * (
double)
z);
733 int offsets[] = {0, 5, 10, 15, 19, 20};
734 int ids[] = {0, 1, 2, 4, 3};
737 auto evtsWriter = builderE.
cursor<aod::Events>();
739 for (
auto i = 0;
i < 20; ++
i) {
743 evtsWriter(0,
ids[step], 0.5f *
i, 2.f *
i, 3.f *
i);
745 auto evtTable = builderE.
finalize();
747 auto bk =
Entry(soa::getLabelFromType<aod::Events>(), soa::getMatcherFromTypeForKey<aod::Events>(
"fID"),
"fID");
751 auto s = cache.updateCacheEntry(0, {evtTable});
753 REQUIRE(std::string{
error_from_ref(re).
what} ==
"Table Events index fID is not sorted: next value 3 < previous value 4!");
756 FAIL(
"Slicing should have failed due to unsorted index");