50 const SelectivityVector& rows,
51 std::vector<VectorPtr>& args,
53 exec::EvalCtx& context,
54 VectorPtr& output)
const override {
55 BaseVector::ensureWritable(rows, type, context.pool(), output);
59 BaseVector* left = args[0].get();
60 BaseVector* right = args[1].get();
62 exec::LocalDecodedVector leftHolder(context, *left, rows);
63 auto decodedLeftArray = leftHolder.get();
65 decodedLeftArray->base()->as<ArrayVector>()->elements();
67 exec::LocalDecodedVector rightHolder(context, *right, rows);
68 auto decodedRightArray = rightHolder.get();
70 decodedRightArray->base()->as<ArrayVector>()->elements();
72 float* input1Values = baseLeftArray->values()->asMutable<
float>();
73 float* input2Values = baseRightArray->values()->asMutable<
float>();
82 std::vector<std::vector<float>> results;
84 for (
int i = 0; i < rows.size(); i++) {
85 std::vector<float> concatenatedVector(input1Dims_ + input2Dims_);
88 concatenatedVector.data(),
89 input1Values + i * input1Dims_,
90 input1Dims_ *
sizeof(
float));
93 concatenatedVector.data() + input1Dims_,
94 input2Values + i * input2Dims_,
95 input2Dims_ *
sizeof(
float));
96 results.push_back(concatenatedVector);
99 VectorMaker maker{context.pool()};
100 output = maker.arrayVector<
float>(results, REAL());