@@ -147,7 +147,9 @@ class Sequence : public vgi::TableFunction {
147147};
148148
149149class ProjectionRows : public vgi ::TableProducer {
150- vgi::ProcessParams params_; bool done_ = false ;
150+ vgi::ProcessParams params_;
151+ bool done_ = false ;
152+
151153public:
152154 explicit ProjectionRows (vgi::ProcessParams params) : params_(std::move(params)) {}
153155 std::shared_ptr<arrow::RecordBatch> next_batch () override {
@@ -156,8 +158,17 @@ class ProjectionRows : public vgi::TableProducer {
156158 arrow::ArrayVector arrays;
157159 for (const auto & field : params_.output_schema ->fields ()) {
158160 std::shared_ptr<arrow::Array> array;
159- if (field->name () == " n" ) { arrow::Int32Builder b; for (int n = 0 ; n < 10 ; ++n) (void )b.Append (n); (void )b.Finish (&array); }
160- else { if (params_.bind_opaque_data .empty ()) throw std::invalid_argument (" projection state missing" ); arrow::Int64Builder b; for (int64_t n = 0 ; n < 10 ; ++n) (void )b.Append (n); (void )b.Finish (&array); }
161+ if (field->name () == " n" ) {
162+ arrow::Int32Builder b;
163+ for (int n = 0 ; n < 10 ; ++n) (void )b.Append (n);
164+ (void )b.Finish (&array);
165+ } else {
166+ if (params_.bind_opaque_data .empty ())
167+ throw std::invalid_argument (" projection state missing" );
168+ arrow::Int64Builder b;
169+ for (int64_t n = 0 ; n < 10 ; ++n) (void )b.Append (n);
170+ (void )b.Finish (&array);
171+ }
161172 arrays.push_back (array);
162173 }
163174 return arrow::RecordBatch::Make (params_.output_schema , 10 , arrays);
@@ -166,24 +177,49 @@ class ProjectionRows : public vgi::TableProducer {
166177class ProjectionSequence : public vgi ::TableFunction {
167178public:
168179 std::string name () const override { return " projection_sequence" ; }
169- vgi::FunctionMetadata metadata () const override { vgi::FunctionMetadata md; md.projection_pushdown = true ; return md; }
180+ vgi::FunctionMetadata metadata () const override {
181+ vgi::FunctionMetadata md;
182+ md.projection_pushdown = true ;
183+ return md;
184+ }
170185 std::vector<vgi::ArgSpec> argument_specs () const override { return {}; }
171- std::shared_ptr<arrow::Schema> bind (const vgi::BindParams&) const override { return arrow::schema ({arrow::field (" n" , arrow::int32 (), true )}); }
172- std::vector<std::string> projection_expression_profiles (const vgi::BindParams&) const override { return {vgi::SCALAR_PROJECTION_PROFILE }; }
173- vgi::BindRepeatability repeatability (const vgi::BindParams&) const override { return vgi::BindRepeatability::StableWithinQuery; }
174- vgi::ProjectionAcceptance projection (const vgi::BindParams&, const vgi::ProjectionProposal& p) const override {
175- vgi::ProjectionAcceptance result; auto fields = p.source_schema ->fields ();
186+ std::shared_ptr<arrow::Schema> bind (const vgi::BindParams&) const override {
187+ return arrow::schema ({arrow::field (" n" , arrow::int32 (), true )});
188+ }
189+ std::vector<std::string> projection_expression_profiles (const vgi::BindParams&) const override {
190+ return {vgi::SCALAR_PROJECTION_PROFILE };
191+ }
192+ vgi::BindRepeatability repeatability (const vgi::BindParams&) const override {
193+ return vgi::BindRepeatability::StableWithinQuery;
194+ }
195+ vgi::ProjectionAcceptance projection (const vgi::BindParams&,
196+ const vgi::ProjectionProposal& p) const override {
197+ vgi::ProjectionAcceptance result;
198+ auto fields = p.source_schema ->fields ();
176199 for (size_t i = 0 ; i < p.expressions .size (); ++i) {
177200 const auto & row = p.expressions [i];
178201 auto sql = std::static_pointer_cast<arrow::StringArray>(row->column (0 ))->GetString (0 );
179202 auto c = std::static_pointer_cast<arrow::StructArray>(row->column (3 ));
180- const auto str = [&](int n) { return std::static_pointer_cast<arrow::StringArray>(c->field (n))->GetString (0 ); };
181- if (sql == " CAST(\" n\" AS BIGINT)" && str (0 ) == " UTC" && str (1 ) == " binary" && str (2 ) == " asc" && str (3 ) == " nulls_last" && std::static_pointer_cast<arrow::BooleanArray>(c->field (4 ))->Value (0 ) && p.result_schema ->field (static_cast <int >(i))->type ()->id () == arrow::Type::INT64 ) { result.accepted_indices .push_back (static_cast <int64_t >(i)); fields.push_back (p.result_schema ->field (static_cast <int >(i))); }
203+ const auto str = [&](int n) {
204+ return std::static_pointer_cast<arrow::StringArray>(c->field (n))->GetString (0 );
205+ };
206+ if (sql == " CAST(\" n\" AS BIGINT)" && str (0 ) == " UTC" && str (1 ) == " binary" &&
207+ str (2 ) == " asc" && str (3 ) == " nulls_last" &&
208+ std::static_pointer_cast<arrow::BooleanArray>(c->field (4 ))->Value (0 ) &&
209+ p.result_schema ->field (static_cast <int >(i))->type ()->id () == arrow::Type::INT64 ) {
210+ result.accepted_indices .push_back (static_cast <int64_t >(i));
211+ fields.push_back (p.result_schema ->field (static_cast <int >(i)));
212+ }
213+ }
214+ if (!result.accepted_indices .empty ()) {
215+ result.output_schema = arrow::schema (fields, p.source_schema ->metadata ());
216+ result.opaque_data = std::to_string (result.accepted_indices .size ());
182217 }
183- if (!result.accepted_indices .empty ()) { result.output_schema = arrow::schema (fields, p.source_schema ->metadata ()); result.opaque_data = std::to_string (result.accepted_indices .size ()); }
184218 return result;
185219 }
186- std::unique_ptr<vgi::TableProducer> init (const vgi::ProcessParams& p) const override { return std::make_unique<ProjectionRows>(p); }
220+ std::unique_ptr<vgi::TableProducer> init (const vgi::ProcessParams& p) const override {
221+ return std::make_unique<ProjectionRows>(p);
222+ }
187223};
188224} // namespace
189225
0 commit comments