MCPcopy Create free account
hub / github.com/bytedance/bolt / gatherFromTimestampBufferIPC

Function gatherFromTimestampBufferIPC

bolt/vector/arrow/Bridge.cpp:510–580  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

508}
509
510void gatherFromTimestampBufferIPC(
511 const BaseVector& vec,
512 const Selection& rows,
513 TimestampUnit unit,
514 Buffer& out) {
515 auto src = (*vec.values()).as<Timestamp>();
516 auto dst = out.asMutable<int64_t>();
517 vector_size_t j = 0;
518
519 auto safeConv = [&](const Timestamp& ts, int64_t* outVal) -> bool {
520 const int64_t sec = ts.getSeconds();
521 const int64_t nanos = ts.getNanos();
522
523 if (UNLIKELY(nanos < 0 || nanos >= 1000000000LL)) {
524 return false;
525 }
526
527 __int128 v = 0;
528 switch (unit) {
529 case TimestampUnit::kSecond:
530 v = static_cast<__int128>(sec);
531 break;
532 case TimestampUnit::kMilli:
533 // sec * 1'000 + nanos / 1'000'000
534 v = static_cast<__int128>(sec) * 1000 + nanos / 1000000;
535 break;
536 case TimestampUnit::kMicro:
537 // sec * 1'000'000 + nanos / 1'000
538 v = static_cast<__int128>(sec) * 1000000 + nanos / 1000;
539 break;
540 case TimestampUnit::kNano:
541 // sec * 1'000'000'000 + nanos
542 v = static_cast<__int128>(sec) * 1000000000 + nanos;
543 break;
544 default:
545 BOLT_UNREACHABLE();
546 }
547
548 if (UNLIKELY(
549 v > std::numeric_limits<int64_t>::max() ||
550 v < std::numeric_limits<int64_t>::min())) {
551 return false;
552 }
553
554 *outVal = static_cast<int64_t>(v);
555 return true;
556 };
557
558 auto writeOrZero = [&](vector_size_t i) {
559 int64_t v;
560 if (LIKELY(safeConv(src[i], &v))) {
561 dst[j] = v;
562 } else {
563 dst[j] = 0;
564 }
565 ++j;
566 };
567

Callers 1

exportValuesFunction · 0.85

Calls 7

LIKELYFunction · 0.85
maxFunction · 0.50
minFunction · 0.50
valuesMethod · 0.45
mayHaveNullsMethod · 0.45
applyMethod · 0.45
isNullAtMethod · 0.45

Tested by

no test coverage detected