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; }
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; }