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;
   });
 }
Beispiel #4
0
 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;
 }