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* ColumnVector::MakeVectorOfValue(
    const Type &value_type,
    const TypedValue &value,
    const std::size_t num_copies) {
  if (NativeColumnVector::UsableForType(value_type)) {
    NativeColumnVector *result = new NativeColumnVector(value_type, num_copies);
    result->fillWithValue(value);
    return result;
  } else {
    IndirectColumnVector *result = new IndirectColumnVector(value_type, num_copies);
    result->fillWithValue(value);
    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 *createColumnVectorGeneric(const Type &type, typename GenericType::cpptype *sum) {
    NativeColumnVector *column = new NativeColumnVector(type, kNumSamples + 3);

    typename GenericType::cpptype val;
    SetDataType(0, sum);

    column->appendTypedValue(type.makeNullValue());
    for (int i = 0; i < kNumSamples; ++i) {
      if (type.getTypeID() == kInt || type.getTypeID() == kLong) {
        SetDataType(i - 10, &val);
      } else {
        SetDataType(static_cast<float>(i - 10)/10, &val);
      }
      column->appendTypedValue(type.makeValue(&val));
      *sum += val;
      // One NULL in the middle.
      if (i == kNumSamples/2) {
        column->appendTypedValue(type.makeNullValue());
      }
    }
    column->appendTypedValue(type.makeNullValue());

    return column;
  }
Beispiel #6
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;
 }