ColumnVector* applyToValueAccessorForJoin( ValueAccessor *accessor, const bool use_left_relation, const attribute_id argument_attr_id, const std::vector<std::pair<tuple_id, tuple_id>> &joined_tuple_ids) const override { DCHECK(NativeColumnVector::UsableForType(target_type_)); NativeColumnVector *result = new NativeColumnVector(target_type_, joined_tuple_ids.size()); InvokeOnValueAccessorNotAdapter( accessor, [&](auto *accessor) -> void { // NOLINT(build/c++11) for (const std::pair<tuple_id, tuple_id> &joined_pair : joined_tuple_ids) { const typename SourceType::cpptype *scalar_arg = static_cast<const typename SourceType::cpptype*>( accessor->template getUntypedValueAtAbsolutePosition<source_nullability>( argument_attr_id, use_left_relation ? joined_pair.first : joined_pair.second)); if (source_nullability && (scalar_arg == nullptr)) { result->appendNullValue(); } else { *static_cast<typename TargetType::cpptype*>(result->getPtrForDirectWrite()) = static_cast<typename TargetType::cpptype>(*scalar_arg); } } }); return result; }
ColumnVector* applyToColumnVector(const ColumnVector &argument) const override { DCHECK(NativeColumnVector::UsableForType(target_type_)); DCHECK(argument.isNative()); const NativeColumnVector &native_argument = static_cast<const NativeColumnVector&>(argument); NativeColumnVector *result = new NativeColumnVector( target_type_, native_argument.size()); for (std::size_t pos = 0; pos < native_argument.size(); ++pos) { const typename SourceType::cpptype *scalar_arg = static_cast<const typename SourceType::cpptype*>( native_argument.getUntypedValue<source_nullability>(pos)); if (source_nullability && (scalar_arg == nullptr)) { result->appendNullValue(); } else { *static_cast<typename TargetType::cpptype*>(result->getPtrForDirectWrite()) = static_cast<typename TargetType::cpptype>(*scalar_arg); } } return result; }
ColumnVector* applyToValueAccessor(ValueAccessor *accessor, const attribute_id argument_attr_id) const override { DCHECK(NativeColumnVector::UsableForType(target_type_)); return InvokeOnValueAccessorMaybeTupleIdSequenceAdapter( accessor, [&](auto *accessor) -> ColumnVector* { // NOLINT(build/c++11) NativeColumnVector *result = new NativeColumnVector( target_type_, accessor->getNumTuples()); accessor->beginIteration(); while (accessor->next()) { const typename SourceType::cpptype *scalar_arg = static_cast<const typename SourceType::cpptype*>( accessor->template getUntypedValue<source_nullability>(argument_attr_id)); if (source_nullability && (scalar_arg == nullptr)) { result->appendNullValue(); } else { *static_cast<typename TargetType::cpptype*>(result->getPtrForDirectWrite()) = static_cast<typename TargetType::cpptype>(*scalar_arg); } } return result; }); }
ColumnVector* applyToColumnVector(const ColumnVector &argument) const override { DCHECK(NativeColumnVector::UsableForType(ResultType::Instance(argument_nullable))); // All arithmetic types (numbers, datetime, and intervals) are usable with // NativeColumnVector, so 'argument' should always be native. DCHECK(argument.isNative()); const NativeColumnVector &native_argument = static_cast<const NativeColumnVector&>(argument); NativeColumnVector *result = new NativeColumnVector( ResultType::Instance(argument_nullable), native_argument.size()); for (std::size_t pos = 0; pos < native_argument.size(); ++pos) { const typename ResultType::cpptype *scalar_arg = static_cast<const typename ResultType::cpptype*>( native_argument.getUntypedValue<argument_nullable>(pos)); if (argument_nullable && (scalar_arg == nullptr)) { result->appendNullValue(); } else { *static_cast<typename ResultType::cpptype*>(result->getPtrForDirectWrite()) = -(*scalar_arg); } } return result; }