This is an automated email from the ASF dual-hosted git repository.

westonpace pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/master by this push:
     new b46ef0f2c4 ARROW-18367: [C++] Enable the creation of named table 
relations (#14681)
b46ef0f2c4 is described below

commit b46ef0f2c4109553789003e12783bd08ae1ec39d
Author: Jianshen Liu <[email protected]>
AuthorDate: Thu Dec 8 12:21:29 2022 -0800

    ARROW-18367: [C++] Enable the creation of named table relations (#14681)
    
    - changes also include fixes from running IWYU over the directory 
cpp/src/arrow/engine/substrait
    
    Lead-authored-by: Jianshen Liu <[email protected]>
    Co-authored-by: Weston Pace <[email protected]>
    Signed-off-by: Weston Pace <[email protected]>
---
 cpp/src/arrow/compute/exec/options.h               |  15 +++
 cpp/src/arrow/compute/exec/source_node.cc          |   9 ++
 .../arrow/engine/substrait/expression_internal.cc  |  27 +++++
 .../arrow/engine/substrait/expression_internal.h   |  10 +-
 cpp/src/arrow/engine/substrait/ext_test.cc         |  22 ++--
 cpp/src/arrow/engine/substrait/extension_set.cc    |   7 +-
 cpp/src/arrow/engine/substrait/extension_set.h     |   3 +-
 cpp/src/arrow/engine/substrait/extension_types.cc  |   6 +-
 cpp/src/arrow/engine/substrait/extension_types.h   |   3 +-
 cpp/src/arrow/engine/substrait/function_test.cc    |  19 +++-
 cpp/src/arrow/engine/substrait/plan_internal.cc    |  16 ++-
 cpp/src/arrow/engine/substrait/plan_internal.h     |   7 +-
 .../arrow/engine/substrait/protobuf_test_util.cc   |   1 +
 cpp/src/arrow/engine/substrait/relation.h          |   1 +
 .../arrow/engine/substrait/relation_internal.cc    |  66 ++++++++++--
 cpp/src/arrow/engine/substrait/relation_internal.h |  10 +-
 cpp/src/arrow/engine/substrait/serde.cc            |  19 ++--
 cpp/src/arrow/engine/substrait/serde_test.cc       | 118 ++++++++++++++++++---
 .../arrow/engine/substrait/test_plan_builder.cc    |  13 ++-
 cpp/src/arrow/engine/substrait/test_plan_builder.h |   9 +-
 cpp/src/arrow/engine/substrait/type_internal.cc    |  16 ++-
 cpp/src/arrow/engine/substrait/type_internal.h     |   6 +-
 cpp/src/arrow/engine/substrait/util.cc             |  16 ++-
 cpp/src/arrow/engine/substrait/util.h              |  13 ++-
 cpp/src/arrow/flight/sql/acero_test.cc             |   1 +
 25 files changed, 354 insertions(+), 79 deletions(-)

diff --git a/cpp/src/arrow/compute/exec/options.h 
b/cpp/src/arrow/compute/exec/options.h
index 8600b11348..2f0f009c01 100644
--- a/cpp/src/arrow/compute/exec/options.h
+++ b/cpp/src/arrow/compute/exec/options.h
@@ -85,6 +85,21 @@ class ARROW_EXPORT TableSourceNodeOptions : public 
ExecNodeOptions {
   int64_t max_batch_size;
 };
 
+/// \brief Define a lazy resolved Arrow table.
+///
+/// The table uniquely identified by the names can typically be resolved at 
the time when
+/// the plan is to be consumed.
+///
+/// This node is for serialization purposes only and can never be executed.
+class ARROW_EXPORT NamedTableNodeOptions : public ExecNodeOptions {
+ public:
+  NamedTableNodeOptions(std::vector<std::string> names, 
std::shared_ptr<Schema> schema)
+      : names(std::move(names)), schema(schema) {}
+
+  std::vector<std::string> names;
+  std::shared_ptr<Schema> schema;
+};
+
 /// \brief An extended Source node which accepts a schema
 ///
 /// ItMaker is a maker of an iterator of tabular data.
diff --git a/cpp/src/arrow/compute/exec/source_node.cc 
b/cpp/src/arrow/compute/exec/source_node.cc
index 3fd4c6fd5b..3f8f4c9834 100644
--- a/cpp/src/arrow/compute/exec/source_node.cc
+++ b/cpp/src/arrow/compute/exec/source_node.cc
@@ -426,6 +426,14 @@ struct ArrayVectorSourceNode
 
 const char ArrayVectorSourceNode::kKindName[] = "ArrayVectorSourceNode";
 
+Result<compute::ExecNode*> MakeNamedTableNode(compute::ExecPlan* plan,
+                                              std::vector<compute::ExecNode*> 
inputs,
+                                              const compute::ExecNodeOptions& 
options) {
+  return Status::Invalid(
+      "The named table node is for serialization purposes only and can never 
be "
+      "converted into an exec plan or executed");
+}
+
 }  // namespace
 
 namespace internal {
@@ -436,6 +444,7 @@ void RegisterSourceNode(ExecFactoryRegistry* registry) {
   DCHECK_OK(registry->AddFactory("record_batch_source", 
RecordBatchSourceNode::Make));
   DCHECK_OK(registry->AddFactory("exec_batch_source", 
ExecBatchSourceNode::Make));
   DCHECK_OK(registry->AddFactory("array_vector_source", 
ArrayVectorSourceNode::Make));
+  DCHECK_OK(registry->AddFactory("named_table", MakeNamedTableNode));
 }
 
 }  // namespace internal
diff --git a/cpp/src/arrow/engine/substrait/expression_internal.cc 
b/cpp/src/arrow/engine/substrait/expression_internal.cc
index b8b545febc..dab8786885 100644
--- a/cpp/src/arrow/engine/substrait/expression_internal.cc
+++ b/cpp/src/arrow/engine/substrait/expression_internal.cc
@@ -19,16 +19,43 @@
 
 #include "arrow/engine/substrait/expression_internal.h"
 
+#include <algorithm>
+#include <array>
+#include <cstdint>
+#include <cstring>
+#include <functional>
 #include <memory>
+#include <optional>
+#include <string>
+#include <string_view>
+#include <type_traits>
 #include <utility>
+#include <vector>
 
+#include <google/protobuf/descriptor.h>
+
+#include "arrow/array/array_base.h"
+#include "arrow/array/array_nested.h"
+#include "arrow/array/array_primitive.h"
+#include "arrow/array/util.h"
+#include "arrow/buffer.h"
 #include "arrow/builder.h"
+#include "arrow/compute/api_scalar.h"
 #include "arrow/compute/exec/expression.h"
 #include "arrow/compute/exec/expression_internal.h"
+#include "arrow/engine/substrait/extension_set.h"
 #include "arrow/engine/substrait/extension_types.h"
+#include "arrow/engine/substrait/options.h"
 #include "arrow/engine/substrait/type_internal.h"
 #include "arrow/result.h"
+#include "arrow/scalar.h"
 #include "arrow/status.h"
+#include "arrow/type.h"
+#include "arrow/util/checked_cast.h"
+#include "arrow/util/decimal.h"
+#include "arrow/util/endian.h"
+#include "arrow/util/logging.h"
+#include "arrow/util/small_vector.h"
 #include "arrow/util/string.h"
 #include "arrow/visit_scalar_inline.h"
 
diff --git a/cpp/src/arrow/engine/substrait/expression_internal.h 
b/cpp/src/arrow/engine/substrait/expression_internal.h
index f132afc0c1..e947537dd1 100644
--- a/cpp/src/arrow/engine/substrait/expression_internal.h
+++ b/cpp/src/arrow/engine/substrait/expression_internal.h
@@ -19,19 +19,21 @@
 
 #pragma once
 
-#include <utility>
+#include <memory>
 
 #include "arrow/compute/type_fwd.h"
-#include "arrow/engine/substrait/extension_set.h"
-#include "arrow/engine/substrait/options.h"
+#include "arrow/datum.h"
+#include "arrow/engine/substrait/type_fwd.h"
 #include "arrow/engine/substrait/visibility.h"
-#include "arrow/type_fwd.h"
+#include "arrow/result.h"
 
 #include "substrait/algebra.pb.h"  // IWYU pragma: export
 
 namespace arrow {
 namespace engine {
 
+class SubstraitCall;
+
 ARROW_ENGINE_EXPORT
 Result<compute::Expression> FromProto(const substrait::Expression&, const 
ExtensionSet&,
                                       const ConversionOptions&);
diff --git a/cpp/src/arrow/engine/substrait/ext_test.cc 
b/cpp/src/arrow/engine/substrait/ext_test.cc
index 525af7c946..e7aa7a8e8d 100644
--- a/cpp/src/arrow/engine/substrait/ext_test.cc
+++ b/cpp/src/arrow/engine/substrait/ext_test.cc
@@ -15,16 +15,24 @@
 // specific language governing permissions and limitations
 // under the License.
 
-#include "arrow/engine/substrait/extension_set.h"
-#include "arrow/engine/substrait/util.h"
-
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/util/json_util.h>
-#include <google/protobuf/util/type_resolver_util.h>
+#include <cstddef>
+#include <memory>
+#include <optional>
+#include <string>
+#include <string_view>
+#include <tuple>
+#include <vector>
+
+#include <gmock/gmock.h>
 #include <gtest/gtest.h>
 
+#include "arrow/engine/substrait/extension_set.h"
+#include "arrow/engine/substrait/util.h"
+#include "arrow/result.h"
+#include "arrow/status.h"
 #include "arrow/testing/gtest_util.h"
-#include "arrow/testing/matchers.h"
+#include "arrow/type_fwd.h"
+#include "arrow/util/checked_cast.h"
 
 using testing::ElementsAre;
 using testing::Eq;
diff --git a/cpp/src/arrow/engine/substrait/extension_set.cc 
b/cpp/src/arrow/engine/substrait/extension_set.cc
index 1c0a927156..6cd022dc4a 100644
--- a/cpp/src/arrow/engine/substrait/extension_set.cc
+++ b/cpp/src/arrow/engine/substrait/extension_set.cc
@@ -17,14 +17,19 @@
 
 #include "arrow/engine/substrait/extension_set.h"
 
+#include <algorithm>
+#include <iterator>
 #include <list>
 #include <memory>
 #include <sstream>
 #include <unordered_set>
 
-#include "arrow/engine/substrait/expression_internal.h"
+#include "arrow/engine/substrait/options.h"
+#include "arrow/type.h"
+#include "arrow/type_fwd.h"
 #include "arrow/util/hash_util.h"
 #include "arrow/util/hashing.h"
+#include "arrow/util/logging.h"
 #include "arrow/util/string.h"
 
 namespace arrow {
diff --git a/cpp/src/arrow/engine/substrait/extension_set.h 
b/cpp/src/arrow/engine/substrait/extension_set.h
index 12aa40115b..8b6b5d5159 100644
--- a/cpp/src/arrow/engine/substrait/extension_set.h
+++ b/cpp/src/arrow/engine/substrait/extension_set.h
@@ -32,9 +32,10 @@
 
 #include "arrow/compute/api_aggregate.h"
 #include "arrow/compute/exec/expression.h"
-#include "arrow/engine/substrait/options.h"
+#include "arrow/engine/substrait/type_fwd.h"
 #include "arrow/engine/substrait/visibility.h"
 #include "arrow/result.h"
+#include "arrow/status.h"
 #include "arrow/type_fwd.h"
 #include "arrow/util/macros.h"
 
diff --git a/cpp/src/arrow/engine/substrait/extension_types.cc 
b/cpp/src/arrow/engine/substrait/extension_types.cc
index 6a89e3cf98..fcc722e9d9 100644
--- a/cpp/src/arrow/engine/substrait/extension_types.cc
+++ b/cpp/src/arrow/engine/substrait/extension_types.cc
@@ -17,10 +17,14 @@
 
 #include "arrow/engine/substrait/extension_types.h"
 
+#include <cstdint>
+#include <string>
 #include <string_view>
 
 #include "arrow/engine/simple_extension_type_internal.h"
-#include "arrow/util/hashing.h"
+#include "arrow/result.h"
+#include "arrow/type_fwd.h"
+#include "arrow/util/reflection_internal.h"
 
 namespace arrow {
 
diff --git a/cpp/src/arrow/engine/substrait/extension_types.h 
b/cpp/src/arrow/engine/substrait/extension_types.h
index 3b08084c75..28a4898a87 100644
--- a/cpp/src/arrow/engine/substrait/extension_types.h
+++ b/cpp/src/arrow/engine/substrait/extension_types.h
@@ -19,9 +19,10 @@
 
 #pragma once
 
+#include <cstdint>
+#include <memory>
 #include <optional>
 
-#include "arrow/compute/function.h"
 #include "arrow/engine/substrait/visibility.h"
 #include "arrow/type_fwd.h"
 
diff --git a/cpp/src/arrow/engine/substrait/function_test.cc 
b/cpp/src/arrow/engine/substrait/function_test.cc
index 2c00e70ff7..4dc7ce8327 100644
--- a/cpp/src/arrow/engine/substrait/function_test.cc
+++ b/cpp/src/arrow/engine/substrait/function_test.cc
@@ -15,28 +15,37 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include <algorithm>
+#include <cstddef>
 #include <memory>
 #include <string>
+#include <string_view>
+#include <unordered_map>
+#include <utility>
 #include <vector>
 
-#include <gmock/gmock-matchers.h>
+#include <gmock/gmock.h>
+#include <gtest/gtest-matchers.h>
 #include <gtest/gtest.h>
 
-#include "arrow/array.h"
 #include "arrow/array/builder_binary.h"
+#include "arrow/compute/api_vector.h"
 #include "arrow/compute/cast.h"
+#include "arrow/compute/exec/exec_plan.h"
 #include "arrow/compute/exec/options.h"
 #include "arrow/compute/exec/util.h"
+#include "arrow/datum.h"
 #include "arrow/engine/substrait/extension_set.h"
-#include "arrow/engine/substrait/plan_internal.h"
+#include "arrow/engine/substrait/options.h"
 #include "arrow/engine/substrait/serde.h"
 #include "arrow/engine/substrait/test_plan_builder.h"
-#include "arrow/engine/substrait/type_internal.h"
 #include "arrow/record_batch.h"
+#include "arrow/result.h"
+#include "arrow/status.h"
 #include "arrow/table.h"
 #include "arrow/testing/future_util.h"
 #include "arrow/testing/gtest_util.h"
-#include "arrow/type.h"
+#include "arrow/type_fwd.h"
 
 namespace arrow {
 
diff --git a/cpp/src/arrow/engine/substrait/plan_internal.cc 
b/cpp/src/arrow/engine/substrait/plan_internal.cc
index e675a2c2ab..fff0f7563c 100644
--- a/cpp/src/arrow/engine/substrait/plan_internal.cc
+++ b/cpp/src/arrow/engine/substrait/plan_internal.cc
@@ -17,16 +17,24 @@
 
 #include "arrow/engine/substrait/plan_internal.h"
 
+#include <cstdint>
+#include <memory>
+#include <string>
+#include <string_view>
+#include <unordered_map>
+#include <utility>
+
+#include "arrow/compute/type_fwd.h"
 #include "arrow/config.h"
-#include "arrow/dataset/plan.h"
 #include "arrow/engine/substrait/relation_internal.h"
+#include "arrow/engine/substrait/type_fwd.h"
 #include "arrow/result.h"
+#include "arrow/util/checked_cast.h"
 #include "arrow/util/hashing.h"
-#include "arrow/util/logging.h"
+#include "arrow/util/macros.h"
 #include "arrow/util/unreachable.h"
 
-#include <memory>
-#include <unordered_map>
+#include "substrait/extensions/extensions.pb.h"
 
 namespace arrow {
 
diff --git a/cpp/src/arrow/engine/substrait/plan_internal.h 
b/cpp/src/arrow/engine/substrait/plan_internal.h
index 7d6dd37528..235bf1a6ce 100644
--- a/cpp/src/arrow/engine/substrait/plan_internal.h
+++ b/cpp/src/arrow/engine/substrait/plan_internal.h
@@ -19,11 +19,14 @@
 
 #pragma once
 
-#include "arrow/compute/exec/exec_plan.h"
+#include <memory>
+
+#include "arrow/compute/type_fwd.h"
 #include "arrow/engine/substrait/extension_set.h"
 #include "arrow/engine/substrait/options.h"
 #include "arrow/engine/substrait/visibility.h"
-#include "arrow/type_fwd.h"
+#include "arrow/result.h"
+#include "arrow/status.h"
 
 #include "substrait/plan.pb.h"  // IWYU pragma: export
 
diff --git a/cpp/src/arrow/engine/substrait/protobuf_test_util.cc 
b/cpp/src/arrow/engine/substrait/protobuf_test_util.cc
index d99622912c..20b1bb3270 100644
--- a/cpp/src/arrow/engine/substrait/protobuf_test_util.cc
+++ b/cpp/src/arrow/engine/substrait/protobuf_test_util.cc
@@ -18,6 +18,7 @@
 #include <gtest/gtest.h>
 
 #include <google/protobuf/message_lite.h>
+#include <google/protobuf/stubs/common.h>
 
 namespace arrow {
 namespace engine {
diff --git a/cpp/src/arrow/engine/substrait/relation.h 
b/cpp/src/arrow/engine/substrait/relation.h
index c2103a0b9e..06bb3d5854 100644
--- a/cpp/src/arrow/engine/substrait/relation.h
+++ b/cpp/src/arrow/engine/substrait/relation.h
@@ -20,6 +20,7 @@
 #include <memory>
 
 #include "arrow/compute/exec/exec_plan.h"
+#include "arrow/engine/substrait/visibility.h"
 #include "arrow/type_fwd.h"
 
 namespace arrow {
diff --git a/cpp/src/arrow/engine/substrait/relation_internal.cc 
b/cpp/src/arrow/engine/substrait/relation_internal.cc
index 019e402a44..83c36ee9bb 100644
--- a/cpp/src/arrow/engine/substrait/relation_internal.cc
+++ b/cpp/src/arrow/engine/substrait/relation_internal.cc
@@ -17,24 +17,46 @@
 
 #include "arrow/engine/substrait/relation_internal.h"
 
-#include "arrow/compute/api_scalar.h"
+#include <cstdint>
+#include <functional>
+#include <iterator>
+#include <memory>
+#include <string>
+#include <string_view>
+#include <type_traits>
+#include <utility>
+#include <variant>
+#include <vector>
+
+#include "arrow/compute/api_aggregate.h"
+#include "arrow/compute/exec/exec_plan.h"
+#include "arrow/compute/exec/expression.h"
 #include "arrow/compute/exec/options.h"
+#include "arrow/compute/kernel.h"
+#include "arrow/dataset/dataset.h"
+#include "arrow/dataset/discovery.h"
 #include "arrow/dataset/file_base.h"
 #include "arrow/dataset/file_ipc.h"
 #include "arrow/dataset/file_parquet.h"
 #include "arrow/dataset/plan.h"
 #include "arrow/dataset/scanner.h"
+#include "arrow/datum.h"
 #include "arrow/engine/substrait/expression_internal.h"
+#include "arrow/engine/substrait/extension_set.h"
+#include "arrow/engine/substrait/options.h"
+#include "arrow/engine/substrait/relation.h"
 #include "arrow/engine/substrait/type_internal.h"
+#include "arrow/filesystem/filesystem.h"
 #include "arrow/filesystem/localfs.h"
-#include "arrow/filesystem/path_util.h"
+#include "arrow/filesystem/type_fwd.h"
 #include "arrow/filesystem/util_internal.h"
+#include "arrow/io/type_fwd.h"
+#include "arrow/status.h"
+#include "arrow/type.h"
 #include "arrow/util/checked_cast.h"
 #include "arrow/util/string.h"
 #include "arrow/util/uri.h"
 
-#include <memory>
-
 namespace arrow {
 
 using internal::checked_cast;
@@ -638,6 +660,10 @@ Result<std::shared_ptr<Schema>> ExtractSchemaToBind(const 
compute::Declaration&
   } else if (declr.factory_name == "filter") {
     auto input_declr = std::get<compute::Declaration>(declr.inputs[0]);
     ARROW_ASSIGN_OR_RAISE(bind_schema, ExtractSchemaToBind(input_declr));
+  } else if (declr.factory_name == "named_table") {
+    const auto& opts =
+        checked_cast<const compute::NamedTableNodeOptions&>(*declr.options);
+    bind_schema = opts.schema;
   } else if (declr.factory_name == "sink") {
     // Note that the sink has no output_schema
     return bind_schema;
@@ -648,6 +674,30 @@ Result<std::shared_ptr<Schema>> ExtractSchemaToBind(const 
compute::Declaration&
   return bind_schema;
 }
 
+Result<std::unique_ptr<substrait::ReadRel>> NamedTableRelationConverter(
+    const std::shared_ptr<Schema>& schema, const compute::Declaration& 
declaration,
+    ExtensionSet* ext_set, const ConversionOptions& conversion_options) {
+  auto read_rel = std::make_unique<substrait::ReadRel>();
+  const auto& named_table_options =
+      checked_cast<const 
compute::NamedTableNodeOptions&>(*declaration.options);
+
+  // set schema
+  ARROW_ASSIGN_OR_RAISE(auto named_struct, ToProto(*schema, ext_set, 
conversion_options));
+  read_rel->set_allocated_base_schema(named_struct.release());
+
+  if (named_table_options.names.empty()) {
+    return Status::Invalid("Table names cannot be empty");
+  }
+
+  auto read_rel_tn = std::make_unique<substrait::ReadRel::NamedTable>();
+  for (auto& name : named_table_options.names) {
+    read_rel_tn->add_names(name);
+  }
+  read_rel->set_allocated_named_table(read_rel_tn.release());
+
+  return std::move(read_rel);
+}
+
 Result<std::unique_ptr<substrait::ReadRel>> ScanRelationConverter(
     const std::shared_ptr<Schema>& schema, const compute::Declaration& 
declaration,
     ExtensionSet* ext_set, const ConversionOptions& conversion_options) {
@@ -662,8 +712,7 @@ Result<std::unique_ptr<substrait::ReadRel>> 
ScanRelationConverter(
   }
 
   // set schema
-  ARROW_ASSIGN_OR_RAISE(auto named_struct,
-                        ToProto(*dataset->schema(), ext_set, 
conversion_options));
+  ARROW_ASSIGN_OR_RAISE(auto named_struct, ToProto(*schema, ext_set, 
conversion_options));
   read_rel->set_allocated_base_schema(named_struct.release());
 
   // set local files
@@ -743,6 +792,11 @@ Status SerializeAndCombineRelations(const 
compute::Declaration& declaration,
         auto filter_rel,
         FilterRelationConverter(schema, declaration, ext_set, 
conversion_options));
     (*rel)->set_allocated_filter(filter_rel.release());
+  } else if (factory_name == "named_table") {
+    ARROW_ASSIGN_OR_RAISE(
+        auto read_rel,
+        NamedTableRelationConverter(schema, declaration, ext_set, 
conversion_options));
+    (*rel)->set_allocated_read(read_rel.release());
   } else if (factory_name == "sink") {
     // Generally when a plan is deserialized the declaration will be a sink 
declaration.
     // Since there is no Sink relation in substrait, this function would be 
recursively
diff --git a/cpp/src/arrow/engine/substrait/relation_internal.h 
b/cpp/src/arrow/engine/substrait/relation_internal.h
index df7804b679..17153f5365 100644
--- a/cpp/src/arrow/engine/substrait/relation_internal.h
+++ b/cpp/src/arrow/engine/substrait/relation_internal.h
@@ -19,13 +19,13 @@
 
 #pragma once
 
-#include "arrow/compute/exec/exec_plan.h"
-#include "arrow/engine/substrait/extension_types.h"
-#include "arrow/engine/substrait/options.h"
+#include <memory>
+
+#include "arrow/compute/type_fwd.h"
 #include "arrow/engine/substrait/relation.h"
-#include "arrow/engine/substrait/serde.h"
+#include "arrow/engine/substrait/type_fwd.h"
 #include "arrow/engine/substrait/visibility.h"
-#include "arrow/type_fwd.h"
+#include "arrow/result.h"
 
 #include "substrait/algebra.pb.h"  // IWYU pragma: export
 
diff --git a/cpp/src/arrow/engine/substrait/serde.cc 
b/cpp/src/arrow/engine/substrait/serde.cc
index b90bc98aab..1a82e23dc9 100644
--- a/cpp/src/arrow/engine/substrait/serde.cc
+++ b/cpp/src/arrow/engine/substrait/serde.cc
@@ -17,8 +17,19 @@
 
 #include "arrow/engine/substrait/serde.h"
 
+#include <cstdint>
+#include <type_traits>
 #include <utility>
 
+#include <google/protobuf/descriptor.h>
+#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
+#include <google/protobuf/message.h>
+#include <google/protobuf/stubs/status.h>
+#include <google/protobuf/util/json_util.h>
+#include <google/protobuf/util/message_differencer.h>
+#include <google/protobuf/util/type_resolver.h>
+#include <google/protobuf/util/type_resolver_util.h>
+
 #include "arrow/buffer.h"
 #include "arrow/compute/exec/exec_plan.h"
 #include "arrow/compute/exec/expression.h"
@@ -27,18 +38,12 @@
 #include "arrow/engine/substrait/expression_internal.h"
 #include "arrow/engine/substrait/extension_set.h"
 #include "arrow/engine/substrait/plan_internal.h"
+#include "arrow/engine/substrait/relation.h"
 #include "arrow/engine/substrait/relation_internal.h"
 #include "arrow/engine/substrait/type_fwd.h"
 #include "arrow/engine/substrait/type_internal.h"
 #include "arrow/type.h"
 
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/util/json_util.h>
-#include <google/protobuf/util/message_differencer.h>
-#include <google/protobuf/util/type_resolver_util.h>
-
 namespace arrow {
 namespace engine {
 
diff --git a/cpp/src/arrow/engine/substrait/serde_test.cc 
b/cpp/src/arrow/engine/substrait/serde_test.cc
index 210edcf75e..fb91702871 100644
--- a/cpp/src/arrow/engine/substrait/serde_test.cc
+++ b/cpp/src/arrow/engine/substrait/serde_test.cc
@@ -15,36 +15,64 @@
 // specific language governing permissions and limitations
 // under the License.
 
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/util/json_util.h>
-#include <google/protobuf/util/type_resolver_util.h>
+#include <algorithm>
+#include <chrono>
+#include <cstddef>
+#include <cstdint>
+#include <optional>
+#include <type_traits>
+#include <utility>
+#include <variant>
+
+#include <gmock/gmock.h>
+#include <gtest/gtest-matchers.h>
 #include <gtest/gtest.h>
 
+#include "arrow/buffer.h"
+#include "arrow/compute/api_scalar.h"
+#include "arrow/compute/api_vector.h"
+#include "arrow/compute/exec.h"
 #include "arrow/compute/exec/exec_plan.h"
+#include "arrow/compute/exec/expression.h"
 #include "arrow/compute/exec/expression_internal.h"
+#include "arrow/compute/exec/options.h"
+#include "arrow/compute/registry.h"
+#include "arrow/compute/type_fwd.h"
+#include "arrow/dataset/dataset.h"
+#include "arrow/dataset/discovery.h"
 #include "arrow/dataset/file_base.h"
 #include "arrow/dataset/file_ipc.h"
-#include "arrow/dataset/file_parquet.h"
+#include "arrow/dataset/partition.h"
 #include "arrow/dataset/plan.h"
 #include "arrow/dataset/scanner.h"
+#include "arrow/datum.h"
+#include "arrow/engine/substrait/extension_set.h"
 #include "arrow/engine/substrait/extension_types.h"
+#include "arrow/engine/substrait/options.h"
 #include "arrow/engine/substrait/serde.h"
 #include "arrow/engine/substrait/util.h"
-
+#include "arrow/filesystem/filesystem.h"
 #include "arrow/filesystem/localfs.h"
 #include "arrow/filesystem/mockfs.h"
 #include "arrow/filesystem/test_util.h"
-#include "arrow/io/compressed.h"
-#include "arrow/io/memory.h"
+#include "arrow/io/type_fwd.h"
+#include "arrow/ipc/options.h"
 #include "arrow/ipc/writer.h"
+#include "arrow/scalar.h"
+#include "arrow/table.h"
+#include "arrow/testing/future_util.h"
 #include "arrow/testing/gtest_util.h"
 #include "arrow/testing/matchers.h"
-#include "arrow/util/key_value_metadata.h"
-
-#include "parquet/arrow/writer.h"
-
+#include "arrow/type.h"
+#include "arrow/type_fwd.h"
+#include "arrow/util/async_generator_fwd.h"
+#include "arrow/util/checked_cast.h"
+#include "arrow/util/decimal.h"
+#include "arrow/util/future.h"
 #include "arrow/util/hash_util.h"
-#include "arrow/util/hashing.h"
+#include "arrow/util/io_util.h"
+#include "arrow/util/iterator.h"
+#include "arrow/util/key_value_metadata.h"
 
 using testing::ElementsAre;
 using testing::Eq;
@@ -366,14 +394,20 @@ TEST(Substrait, NamedStruct) {
                                                         
/*ignore_unknown_fields=*/false));
   EXPECT_THAT(DeserializeSchema(*buf, ext_set), Raises(StatusCode::Invalid));
 
-  // no schema metadata allowed
-  EXPECT_THAT(SerializeSchema(Schema({}, key_value_metadata({{"ext", 
"yes"}})), &ext_set),
+  ConversionOptions conversion_options;
+  conversion_options.strictness = ConversionStrictness::EXACT_ROUNDTRIP;
+
+  // no schema metadata allowed with EXACT_ROUNDTRIP
+  EXPECT_THAT(SerializeSchema(Schema({}, key_value_metadata({{"ext", 
"yes"}})), &ext_set,
+                              conversion_options),
               Raises(StatusCode::Invalid));
 
-  // no schema metadata allowed
+  ASSERT_OK(SerializeSchema(Schema({}, key_value_metadata({{"ext", "yes"}})), 
&ext_set));
+
+  // no field metadata allowed with EXACT_ROUNDTRIP
   EXPECT_THAT(
       SerializeSchema(Schema({field("a", int32(), key_value_metadata({{"ext", 
"yes"}}))}),
-                      &ext_set),
+                      &ext_set, conversion_options),
       Raises(StatusCode::Invalid));
 }
 
@@ -2037,7 +2071,6 @@ TEST(Substrait, AggregateBadPhase) {
 }
 
 TEST(SubstraitRoundTrip, BasicPlan) {
-  compute::ExecContext exec_context;
   arrow::dataset::internal::Initialize();
 
   auto dummy_schema = schema(
@@ -2260,6 +2293,57 @@ TEST(SubstraitRoundTrip, BasicPlanEndToEnd) {
   EXPECT_TRUE(expected_table->Equals(*rnd_trp_table));
 }
 
+TEST(SubstraitRoundTrip, FilterNamedTable) {
+  compute::ExecContext exec_context;
+  arrow::dataset::internal::Initialize();
+
+  const std::vector<std::string> table_names{"table", "1"};
+  const auto dummy_schema =
+      schema({field("A", int32()), field("B", int32()), field("C", int32())});
+  auto filter = compute::equal(compute::field_ref("A"), 
compute::field_ref("B"));
+
+  auto declarations = compute::Declaration::Sequence(
+      {compute::Declaration({"named_table",
+                             compute::NamedTableNodeOptions{table_names, 
dummy_schema},
+                             "n"}),
+       compute::Declaration({"filter", compute::FilterNodeOptions{filter}, 
"f"})});
+
+  ExtensionSet ext_set{};
+  ASSERT_OK_AND_ASSIGN(auto serialized_plan, SerializePlan(declarations, 
&ext_set));
+
+  // creating a dummy dataset using a dummy table
+  auto input_table = TableFromJSON(dummy_schema, {R"([
+      [1, 1, 10],
+      [3, 5, 20],
+      [4, 1, 30],
+      [2, 1, 40],
+      [5, 5, 50],
+      [2, 2, 60]
+  ])"});
+
+  NamedTableProvider table_provider =
+      [&input_table, &table_names](
+          const std::vector<std::string>& names) -> 
Result<compute::Declaration> {
+    if (table_names != names) {
+      return Status::Invalid("Table name mismatch");
+    }
+    std::shared_ptr<compute::ExecNodeOptions> options =
+        std::make_shared<compute::TableSourceNodeOptions>(input_table);
+    return compute::Declaration("table_source", {}, std::move(options), 
"mock_source");
+  };
+  ConversionOptions conversion_options;
+  conversion_options.named_table_provider = std::move(table_provider);
+
+  auto expected_table = TableFromJSON(dummy_schema, {R"([
+    [1, 1, 10],
+    [5, 5, 50],
+    [2, 2, 60]
+  ])"});
+
+  CheckRoundTripResult(std::move(dummy_schema), std::move(expected_table), 
exec_context,
+                       serialized_plan, {}, conversion_options);
+}
+
 TEST(SubstraitRoundTrip, ProjectRel) {
   compute::ExecContext exec_context;
   auto dummy_schema =
diff --git a/cpp/src/arrow/engine/substrait/test_plan_builder.cc 
b/cpp/src/arrow/engine/substrait/test_plan_builder.cc
index 2643b5c469..62f4361a61 100644
--- a/cpp/src/arrow/engine/substrait/test_plan_builder.cc
+++ b/cpp/src/arrow/engine/substrait/test_plan_builder.cc
@@ -17,17 +17,22 @@
 
 #include "arrow/engine/substrait/test_plan_builder.h"
 
+#include <cstddef>
 #include <cstdint>
+#include <limits>
 #include <memory>
+#include <utility>
 
-#include "arrow/compute/exec/exec_plan.h"
+#include "arrow/buffer.h"
+#include "arrow/engine/substrait/extension_set.h"
+#include "arrow/engine/substrait/options.h"
 #include "arrow/engine/substrait/plan_internal.h"
 #include "arrow/engine/substrait/type_internal.h"
-#include "arrow/util/macros.h"
+#include "arrow/status.h"
+#include "arrow/table.h"
+#include "arrow/type_fwd.h"
 
 #include "substrait/algebra.pb.h"
-#include "substrait/plan.pb.h"
-#include "substrait/type.pb.h"
 
 namespace arrow {
 namespace engine {
diff --git a/cpp/src/arrow/engine/substrait/test_plan_builder.h 
b/cpp/src/arrow/engine/substrait/test_plan_builder.h
index 5f6629e905..8af156ea61 100644
--- a/cpp/src/arrow/engine/substrait/test_plan_builder.h
+++ b/cpp/src/arrow/engine/substrait/test_plan_builder.h
@@ -30,14 +30,15 @@
 #include <unordered_map>
 #include <vector>
 
-#include "arrow/buffer.h"
-#include "arrow/engine/substrait/extension_set.h"
+#include "arrow/engine/substrait/visibility.h"
 #include "arrow/result.h"
-#include "arrow/table.h"
-#include "arrow/type.h"
+#include "arrow/type_fwd.h"
 
 namespace arrow {
 namespace engine {
+
+struct Id;
+
 namespace internal {
 
 /// \brief Create a scan->project->sink plan for tests
diff --git a/cpp/src/arrow/engine/substrait/type_internal.cc 
b/cpp/src/arrow/engine/substrait/type_internal.cc
index 16032df67d..f56aa19a04 100644
--- a/cpp/src/arrow/engine/substrait/type_internal.cc
+++ b/cpp/src/arrow/engine/substrait/type_internal.cc
@@ -17,15 +17,23 @@
 
 #include "arrow/engine/substrait/type_internal.h"
 
+#include <array>
+#include <cstdint>
 #include <memory>
+#include <optional>
 #include <string>
+#include <tuple>
+#include <type_traits>
 #include <vector>
 
+#include "arrow/engine/substrait/extension_set.h"
 #include "arrow/engine/substrait/extension_types.h"
+#include "arrow/engine/substrait/options.h"
+#include "arrow/extension_type.h"
 #include "arrow/result.h"
 #include "arrow/status.h"
 #include "arrow/type.h"
-#include "arrow/util/logging.h"
+#include "arrow/type_fwd.h"
 #include "arrow/visit_type_inline.h"
 
 namespace arrow {
@@ -471,7 +479,8 @@ void ToProtoGetDepthFirstNames(const FieldVector& fields,
 Result<std::unique_ptr<::substrait::NamedStruct>> ToProto(
     const Schema& schema, ExtensionSet* ext_set,
     const ConversionOptions& conversion_options) {
-  if (schema.metadata()) {
+  if (conversion_options.strictness == ConversionStrictness::EXACT_ROUNDTRIP &&
+      schema.metadata() != nullptr) {
     return Status::Invalid("::substrait::NamedStruct does not support schema 
metadata");
   }
 
@@ -486,7 +495,8 @@ Result<std::unique_ptr<::substrait::NamedStruct>> ToProto(
   types->Reserve(schema.num_fields());
 
   for (const auto& field : schema.fields()) {
-    if (field->metadata() != nullptr) {
+    if (conversion_options.strictness == ConversionStrictness::EXACT_ROUNDTRIP 
&&
+        field->metadata() != nullptr) {
       return Status::Invalid("::substrait::NamedStruct does not support field 
metadata");
     }
 
diff --git a/cpp/src/arrow/engine/substrait/type_internal.h 
b/cpp/src/arrow/engine/substrait/type_internal.h
index 6db9aea01a..0d53028f49 100644
--- a/cpp/src/arrow/engine/substrait/type_internal.h
+++ b/cpp/src/arrow/engine/substrait/type_internal.h
@@ -19,11 +19,13 @@
 
 #pragma once
 
+#include <memory>
+#include <string>
 #include <utility>
 
-#include "arrow/engine/substrait/extension_set.h"
-#include "arrow/engine/substrait/options.h"
+#include "arrow/engine/substrait/type_fwd.h"
 #include "arrow/engine/substrait/visibility.h"
+#include "arrow/result.h"
 #include "arrow/type_fwd.h"
 
 #include "substrait/type.pb.h"  // IWYU pragma: export
diff --git a/cpp/src/arrow/engine/substrait/util.cc 
b/cpp/src/arrow/engine/substrait/util.cc
index 8db7ff7cb1..87a7a8e364 100644
--- a/cpp/src/arrow/engine/substrait/util.cc
+++ b/cpp/src/arrow/engine/substrait/util.cc
@@ -17,10 +17,24 @@
 
 #include "arrow/engine/substrait/util.h"
 
+#include <algorithm>
+#include <optional>
+#include <string_view>
+#include <utility>
+
+#include "arrow/buffer.h"
+#include "arrow/compute/exec.h"
 #include "arrow/compute/exec/exec_plan.h"
 #include "arrow/compute/exec/options.h"
+#include "arrow/compute/type_fwd.h"
+#include "arrow/engine/substrait/extension_set.h"
+#include "arrow/engine/substrait/serde.h"
+#include "arrow/engine/substrait/type_fwd.h"
+#include "arrow/status.h"
+#include "arrow/type_fwd.h"
 #include "arrow/util/async_generator.h"
-#include "arrow/util/async_util.h"
+#include "arrow/util/future.h"
+#include "arrow/util/thread_pool.h"
 
 namespace arrow {
 
diff --git a/cpp/src/arrow/engine/substrait/util.h 
b/cpp/src/arrow/engine/substrait/util.h
index a616968d96..5c98c6ff3f 100644
--- a/cpp/src/arrow/engine/substrait/util.h
+++ b/cpp/src/arrow/engine/substrait/util.h
@@ -17,13 +17,18 @@
 
 #pragma once
 
+#include <functional>
 #include <memory>
-#include <optional>
+#include <string>
+#include <vector>
 
-#include "arrow/compute/registry.h"
-#include "arrow/engine/substrait/api.h"
+#include "arrow/compute/type_fwd.h"
 #include "arrow/engine/substrait/options.h"
-#include "arrow/util/iterator.h"
+#include "arrow/engine/substrait/type_fwd.h"
+#include "arrow/engine/substrait/visibility.h"
+#include "arrow/result.h"
+#include "arrow/type_fwd.h"
+#include "arrow/util/macros.h"
 
 namespace arrow {
 
diff --git a/cpp/src/arrow/flight/sql/acero_test.cc 
b/cpp/src/arrow/flight/sql/acero_test.cc
index 9c3f99426f..a8298f57b9 100644
--- a/cpp/src/arrow/flight/sql/acero_test.cc
+++ b/cpp/src/arrow/flight/sql/acero_test.cc
@@ -30,6 +30,7 @@
 #include "arrow/flight/sql/example/acero_server.h"
 #include "arrow/flight/sql/types.h"
 #include "arrow/flight/types.h"
+#include "arrow/scalar.h"
 #include "arrow/stl_iterator.h"
 #include "arrow/table.h"
 #include "arrow/testing/gtest_util.h"

Reply via email to