]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/arrow/cpp/src/generated/Relation_generated.h
import quincy 17.2.0
[ceph.git] / ceph / src / arrow / cpp / src / generated / Relation_generated.h
diff --git a/ceph/src/arrow/cpp/src/generated/Relation_generated.h b/ceph/src/arrow/cpp/src/generated/Relation_generated.h
new file mode 100644 (file)
index 0000000..6c9d9bc
--- /dev/null
@@ -0,0 +1,1647 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+
+#ifndef FLATBUFFERS_GENERATED_RELATION_ORG_APACHE_ARROW_COMPUTEIR_FLATBUF_H_
+#define FLATBUFFERS_GENERATED_RELATION_ORG_APACHE_ARROW_COMPUTEIR_FLATBUF_H_
+
+#include "flatbuffers/flatbuffers.h"
+
+#include "Schema_generated.h"
+#include "Expression_generated.h"
+#include "Literal_generated.h"
+
+namespace org {
+namespace apache {
+namespace arrow {
+namespace computeir {
+namespace flatbuf {
+
+struct Remap;
+struct RemapBuilder;
+
+struct PassThrough;
+struct PassThroughBuilder;
+
+struct RelId;
+struct RelIdBuilder;
+
+struct RelBase;
+struct RelBaseBuilder;
+
+struct Filter;
+struct FilterBuilder;
+
+struct Project;
+struct ProjectBuilder;
+
+struct Grouping;
+struct GroupingBuilder;
+
+struct Aggregate;
+struct AggregateBuilder;
+
+struct Join;
+struct JoinBuilder;
+
+struct OrderBy;
+struct OrderByBuilder;
+
+struct Limit;
+struct LimitBuilder;
+
+struct SetOperation;
+struct SetOperationBuilder;
+
+struct LiteralColumn;
+struct LiteralColumnBuilder;
+
+struct LiteralRelation;
+struct LiteralRelationBuilder;
+
+struct Source;
+struct SourceBuilder;
+
+struct Relation;
+struct RelationBuilder;
+
+/// A union for the different colum remapping variants
+enum class Emit : uint8_t {
+  NONE = 0,
+  Remap = 1,
+  PassThrough = 2,
+  MIN = NONE,
+  MAX = PassThrough
+};
+
+inline const Emit (&EnumValuesEmit())[3] {
+  static const Emit values[] = {
+    Emit::NONE,
+    Emit::Remap,
+    Emit::PassThrough
+  };
+  return values;
+}
+
+inline const char * const *EnumNamesEmit() {
+  static const char * const names[4] = {
+    "NONE",
+    "Remap",
+    "PassThrough",
+    nullptr
+  };
+  return names;
+}
+
+inline const char *EnumNameEmit(Emit e) {
+  if (flatbuffers::IsOutRange(e, Emit::NONE, Emit::PassThrough)) return "";
+  const size_t index = static_cast<size_t>(e);
+  return EnumNamesEmit()[index];
+}
+
+template<typename T> struct EmitTraits {
+  static const Emit enum_value = Emit::NONE;
+};
+
+template<> struct EmitTraits<org::apache::arrow::computeir::flatbuf::Remap> {
+  static const Emit enum_value = Emit::Remap;
+};
+
+template<> struct EmitTraits<org::apache::arrow::computeir::flatbuf::PassThrough> {
+  static const Emit enum_value = Emit::PassThrough;
+};
+
+bool VerifyEmit(flatbuffers::Verifier &verifier, const void *obj, Emit type);
+bool VerifyEmitVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector<flatbuffers::Offset<void>> *values, const flatbuffers::Vector<uint8_t> *types);
+
+enum class JoinKind : uint8_t {
+  Anti = 0,
+  Cross = 1,
+  FullOuter = 2,
+  Inner = 3,
+  LeftOuter = 4,
+  LeftSemi = 5,
+  RightOuter = 6,
+  MIN = Anti,
+  MAX = RightOuter
+};
+
+inline const JoinKind (&EnumValuesJoinKind())[7] {
+  static const JoinKind values[] = {
+    JoinKind::Anti,
+    JoinKind::Cross,
+    JoinKind::FullOuter,
+    JoinKind::Inner,
+    JoinKind::LeftOuter,
+    JoinKind::LeftSemi,
+    JoinKind::RightOuter
+  };
+  return values;
+}
+
+inline const char * const *EnumNamesJoinKind() {
+  static const char * const names[8] = {
+    "Anti",
+    "Cross",
+    "FullOuter",
+    "Inner",
+    "LeftOuter",
+    "LeftSemi",
+    "RightOuter",
+    nullptr
+  };
+  return names;
+}
+
+inline const char *EnumNameJoinKind(JoinKind e) {
+  if (flatbuffers::IsOutRange(e, JoinKind::Anti, JoinKind::RightOuter)) return "";
+  const size_t index = static_cast<size_t>(e);
+  return EnumNamesJoinKind()[index];
+}
+
+/// The kind of set operation being performed.
+enum class SetOpKind : uint8_t {
+  Union = 0,
+  Intersection = 1,
+  Difference = 2,
+  MIN = Union,
+  MAX = Difference
+};
+
+inline const SetOpKind (&EnumValuesSetOpKind())[3] {
+  static const SetOpKind values[] = {
+    SetOpKind::Union,
+    SetOpKind::Intersection,
+    SetOpKind::Difference
+  };
+  return values;
+}
+
+inline const char * const *EnumNamesSetOpKind() {
+  static const char * const names[4] = {
+    "Union",
+    "Intersection",
+    "Difference",
+    nullptr
+  };
+  return names;
+}
+
+inline const char *EnumNameSetOpKind(SetOpKind e) {
+  if (flatbuffers::IsOutRange(e, SetOpKind::Union, SetOpKind::Difference)) return "";
+  const size_t index = static_cast<size_t>(e);
+  return EnumNamesSetOpKind()[index];
+}
+
+/// The varieties of relations
+enum class RelationImpl : uint8_t {
+  NONE = 0,
+  Aggregate = 1,
+  Filter = 2,
+  Join = 3,
+  Limit = 4,
+  LiteralRelation = 5,
+  OrderBy = 6,
+  Project = 7,
+  SetOperation = 8,
+  Source = 9,
+  MIN = NONE,
+  MAX = Source
+};
+
+inline const RelationImpl (&EnumValuesRelationImpl())[10] {
+  static const RelationImpl values[] = {
+    RelationImpl::NONE,
+    RelationImpl::Aggregate,
+    RelationImpl::Filter,
+    RelationImpl::Join,
+    RelationImpl::Limit,
+    RelationImpl::LiteralRelation,
+    RelationImpl::OrderBy,
+    RelationImpl::Project,
+    RelationImpl::SetOperation,
+    RelationImpl::Source
+  };
+  return values;
+}
+
+inline const char * const *EnumNamesRelationImpl() {
+  static const char * const names[11] = {
+    "NONE",
+    "Aggregate",
+    "Filter",
+    "Join",
+    "Limit",
+    "LiteralRelation",
+    "OrderBy",
+    "Project",
+    "SetOperation",
+    "Source",
+    nullptr
+  };
+  return names;
+}
+
+inline const char *EnumNameRelationImpl(RelationImpl e) {
+  if (flatbuffers::IsOutRange(e, RelationImpl::NONE, RelationImpl::Source)) return "";
+  const size_t index = static_cast<size_t>(e);
+  return EnumNamesRelationImpl()[index];
+}
+
+template<typename T> struct RelationImplTraits {
+  static const RelationImpl enum_value = RelationImpl::NONE;
+};
+
+template<> struct RelationImplTraits<org::apache::arrow::computeir::flatbuf::Aggregate> {
+  static const RelationImpl enum_value = RelationImpl::Aggregate;
+};
+
+template<> struct RelationImplTraits<org::apache::arrow::computeir::flatbuf::Filter> {
+  static const RelationImpl enum_value = RelationImpl::Filter;
+};
+
+template<> struct RelationImplTraits<org::apache::arrow::computeir::flatbuf::Join> {
+  static const RelationImpl enum_value = RelationImpl::Join;
+};
+
+template<> struct RelationImplTraits<org::apache::arrow::computeir::flatbuf::Limit> {
+  static const RelationImpl enum_value = RelationImpl::Limit;
+};
+
+template<> struct RelationImplTraits<org::apache::arrow::computeir::flatbuf::LiteralRelation> {
+  static const RelationImpl enum_value = RelationImpl::LiteralRelation;
+};
+
+template<> struct RelationImplTraits<org::apache::arrow::computeir::flatbuf::OrderBy> {
+  static const RelationImpl enum_value = RelationImpl::OrderBy;
+};
+
+template<> struct RelationImplTraits<org::apache::arrow::computeir::flatbuf::Project> {
+  static const RelationImpl enum_value = RelationImpl::Project;
+};
+
+template<> struct RelationImplTraits<org::apache::arrow::computeir::flatbuf::SetOperation> {
+  static const RelationImpl enum_value = RelationImpl::SetOperation;
+};
+
+template<> struct RelationImplTraits<org::apache::arrow::computeir::flatbuf::Source> {
+  static const RelationImpl enum_value = RelationImpl::Source;
+};
+
+bool VerifyRelationImpl(flatbuffers::Verifier &verifier, const void *obj, RelationImpl type);
+bool VerifyRelationImplVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector<flatbuffers::Offset<void>> *values, const flatbuffers::Vector<uint8_t> *types);
+
+/// A data type indicating that a different mapping of columns
+/// should occur in the output.
+///
+/// For example:
+///
+/// Given a query `SELECT b, a FROM t` where `t` has columns a, b, c
+/// the mapping value for the projection would equal [1, 0].
+struct Remap FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+  typedef RemapBuilder Builder;
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+    VT_MAPPING = 4
+  };
+  const flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::FieldIndex>> *mapping() const {
+    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::FieldIndex>> *>(VT_MAPPING);
+  }
+  bool Verify(flatbuffers::Verifier &verifier) const {
+    return VerifyTableStart(verifier) &&
+           VerifyOffsetRequired(verifier, VT_MAPPING) &&
+           verifier.VerifyVector(mapping()) &&
+           verifier.VerifyVectorOfTables(mapping()) &&
+           verifier.EndTable();
+  }
+};
+
+struct RemapBuilder {
+  typedef Remap Table;
+  flatbuffers::FlatBufferBuilder &fbb_;
+  flatbuffers::uoffset_t start_;
+  void add_mapping(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::FieldIndex>>> mapping) {
+    fbb_.AddOffset(Remap::VT_MAPPING, mapping);
+  }
+  explicit RemapBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+        : fbb_(_fbb) {
+    start_ = fbb_.StartTable();
+  }
+  RemapBuilder &operator=(const RemapBuilder &);
+  flatbuffers::Offset<Remap> Finish() {
+    const auto end = fbb_.EndTable(start_);
+    auto o = flatbuffers::Offset<Remap>(end);
+    fbb_.Required(o, Remap::VT_MAPPING);
+    return o;
+  }
+};
+
+inline flatbuffers::Offset<Remap> CreateRemap(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::FieldIndex>>> mapping = 0) {
+  RemapBuilder builder_(_fbb);
+  builder_.add_mapping(mapping);
+  return builder_.Finish();
+}
+
+inline flatbuffers::Offset<Remap> CreateRemapDirect(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    const std::vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::FieldIndex>> *mapping = nullptr) {
+  auto mapping__ = mapping ? _fbb.CreateVector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::FieldIndex>>(*mapping) : 0;
+  return org::apache::arrow::computeir::flatbuf::CreateRemap(
+      _fbb,
+      mapping__);
+}
+
+struct PassThrough FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+  typedef PassThroughBuilder Builder;
+  bool Verify(flatbuffers::Verifier &verifier) const {
+    return VerifyTableStart(verifier) &&
+           verifier.EndTable();
+  }
+};
+
+struct PassThroughBuilder {
+  typedef PassThrough Table;
+  flatbuffers::FlatBufferBuilder &fbb_;
+  flatbuffers::uoffset_t start_;
+  explicit PassThroughBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+        : fbb_(_fbb) {
+    start_ = fbb_.StartTable();
+  }
+  PassThroughBuilder &operator=(const PassThroughBuilder &);
+  flatbuffers::Offset<PassThrough> Finish() {
+    const auto end = fbb_.EndTable(start_);
+    auto o = flatbuffers::Offset<PassThrough>(end);
+    return o;
+  }
+};
+
+inline flatbuffers::Offset<PassThrough> CreatePassThrough(
+    flatbuffers::FlatBufferBuilder &_fbb) {
+  PassThroughBuilder builder_(_fbb);
+  return builder_.Finish();
+}
+
+/// An identifier for relations in a query.
+///
+/// A table is used here to allow plan implementations optionality.
+struct RelId FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+  typedef RelIdBuilder Builder;
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+    VT_ID = 4
+  };
+  uint64_t id() const {
+    return GetField<uint64_t>(VT_ID, 0);
+  }
+  bool Verify(flatbuffers::Verifier &verifier) const {
+    return VerifyTableStart(verifier) &&
+           VerifyField<uint64_t>(verifier, VT_ID) &&
+           verifier.EndTable();
+  }
+};
+
+struct RelIdBuilder {
+  typedef RelId Table;
+  flatbuffers::FlatBufferBuilder &fbb_;
+  flatbuffers::uoffset_t start_;
+  void add_id(uint64_t id) {
+    fbb_.AddElement<uint64_t>(RelId::VT_ID, id, 0);
+  }
+  explicit RelIdBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+        : fbb_(_fbb) {
+    start_ = fbb_.StartTable();
+  }
+  RelIdBuilder &operator=(const RelIdBuilder &);
+  flatbuffers::Offset<RelId> Finish() {
+    const auto end = fbb_.EndTable(start_);
+    auto o = flatbuffers::Offset<RelId>(end);
+    return o;
+  }
+};
+
+inline flatbuffers::Offset<RelId> CreateRelId(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    uint64_t id = 0) {
+  RelIdBuilder builder_(_fbb);
+  builder_.add_id(id);
+  return builder_.Finish();
+}
+
+/// Fields common to every relational operator
+struct RelBase FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+  typedef RelBaseBuilder Builder;
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+    VT_OUTPUT_MAPPING_TYPE = 4,
+    VT_OUTPUT_MAPPING = 6,
+    VT_ID = 8
+  };
+  org::apache::arrow::computeir::flatbuf::Emit output_mapping_type() const {
+    return static_cast<org::apache::arrow::computeir::flatbuf::Emit>(GetField<uint8_t>(VT_OUTPUT_MAPPING_TYPE, 0));
+  }
+  /// Output remapping of ordinal columns for a given operation
+  const void *output_mapping() const {
+    return GetPointer<const void *>(VT_OUTPUT_MAPPING);
+  }
+  template<typename T> const T *output_mapping_as() const;
+  const org::apache::arrow::computeir::flatbuf::Remap *output_mapping_as_Remap() const {
+    return output_mapping_type() == org::apache::arrow::computeir::flatbuf::Emit::Remap ? static_cast<const org::apache::arrow::computeir::flatbuf::Remap *>(output_mapping()) : nullptr;
+  }
+  const org::apache::arrow::computeir::flatbuf::PassThrough *output_mapping_as_PassThrough() const {
+    return output_mapping_type() == org::apache::arrow::computeir::flatbuf::Emit::PassThrough ? static_cast<const org::apache::arrow::computeir::flatbuf::PassThrough *>(output_mapping()) : nullptr;
+  }
+  /// An identifiier for a relation. The identifier should be unique over the
+  /// entire plan. Optional.
+  const org::apache::arrow::computeir::flatbuf::RelId *id() const {
+    return GetPointer<const org::apache::arrow::computeir::flatbuf::RelId *>(VT_ID);
+  }
+  bool Verify(flatbuffers::Verifier &verifier) const {
+    return VerifyTableStart(verifier) &&
+           VerifyField<uint8_t>(verifier, VT_OUTPUT_MAPPING_TYPE) &&
+           VerifyOffsetRequired(verifier, VT_OUTPUT_MAPPING) &&
+           VerifyEmit(verifier, output_mapping(), output_mapping_type()) &&
+           VerifyOffset(verifier, VT_ID) &&
+           verifier.VerifyTable(id()) &&
+           verifier.EndTable();
+  }
+};
+
+template<> inline const org::apache::arrow::computeir::flatbuf::Remap *RelBase::output_mapping_as<org::apache::arrow::computeir::flatbuf::Remap>() const {
+  return output_mapping_as_Remap();
+}
+
+template<> inline const org::apache::arrow::computeir::flatbuf::PassThrough *RelBase::output_mapping_as<org::apache::arrow::computeir::flatbuf::PassThrough>() const {
+  return output_mapping_as_PassThrough();
+}
+
+struct RelBaseBuilder {
+  typedef RelBase Table;
+  flatbuffers::FlatBufferBuilder &fbb_;
+  flatbuffers::uoffset_t start_;
+  void add_output_mapping_type(org::apache::arrow::computeir::flatbuf::Emit output_mapping_type) {
+    fbb_.AddElement<uint8_t>(RelBase::VT_OUTPUT_MAPPING_TYPE, static_cast<uint8_t>(output_mapping_type), 0);
+  }
+  void add_output_mapping(flatbuffers::Offset<void> output_mapping) {
+    fbb_.AddOffset(RelBase::VT_OUTPUT_MAPPING, output_mapping);
+  }
+  void add_id(flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelId> id) {
+    fbb_.AddOffset(RelBase::VT_ID, id);
+  }
+  explicit RelBaseBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+        : fbb_(_fbb) {
+    start_ = fbb_.StartTable();
+  }
+  RelBaseBuilder &operator=(const RelBaseBuilder &);
+  flatbuffers::Offset<RelBase> Finish() {
+    const auto end = fbb_.EndTable(start_);
+    auto o = flatbuffers::Offset<RelBase>(end);
+    fbb_.Required(o, RelBase::VT_OUTPUT_MAPPING);
+    return o;
+  }
+};
+
+inline flatbuffers::Offset<RelBase> CreateRelBase(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    org::apache::arrow::computeir::flatbuf::Emit output_mapping_type = org::apache::arrow::computeir::flatbuf::Emit::NONE,
+    flatbuffers::Offset<void> output_mapping = 0,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelId> id = 0) {
+  RelBaseBuilder builder_(_fbb);
+  builder_.add_id(id);
+  builder_.add_output_mapping(output_mapping);
+  builder_.add_output_mapping_type(output_mapping_type);
+  return builder_.Finish();
+}
+
+/// Filter operation
+struct Filter FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+  typedef FilterBuilder Builder;
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+    VT_BASE = 4,
+    VT_REL = 6,
+    VT_PREDICATE = 8
+  };
+  /// Common options
+  const org::apache::arrow::computeir::flatbuf::RelBase *base() const {
+    return GetPointer<const org::apache::arrow::computeir::flatbuf::RelBase *>(VT_BASE);
+  }
+  /// Child relation
+  const org::apache::arrow::computeir::flatbuf::Relation *rel() const {
+    return GetPointer<const org::apache::arrow::computeir::flatbuf::Relation *>(VT_REL);
+  }
+  /// The expression which will be evaluated against input rows
+  /// to determine whether they should be excluded from the
+  /// filter relation's output.
+  const org::apache::arrow::computeir::flatbuf::Expression *predicate() const {
+    return GetPointer<const org::apache::arrow::computeir::flatbuf::Expression *>(VT_PREDICATE);
+  }
+  bool Verify(flatbuffers::Verifier &verifier) const {
+    return VerifyTableStart(verifier) &&
+           VerifyOffsetRequired(verifier, VT_BASE) &&
+           verifier.VerifyTable(base()) &&
+           VerifyOffsetRequired(verifier, VT_REL) &&
+           verifier.VerifyTable(rel()) &&
+           VerifyOffsetRequired(verifier, VT_PREDICATE) &&
+           verifier.VerifyTable(predicate()) &&
+           verifier.EndTable();
+  }
+};
+
+struct FilterBuilder {
+  typedef Filter Table;
+  flatbuffers::FlatBufferBuilder &fbb_;
+  flatbuffers::uoffset_t start_;
+  void add_base(flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelBase> base) {
+    fbb_.AddOffset(Filter::VT_BASE, base);
+  }
+  void add_rel(flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation> rel) {
+    fbb_.AddOffset(Filter::VT_REL, rel);
+  }
+  void add_predicate(flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Expression> predicate) {
+    fbb_.AddOffset(Filter::VT_PREDICATE, predicate);
+  }
+  explicit FilterBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+        : fbb_(_fbb) {
+    start_ = fbb_.StartTable();
+  }
+  FilterBuilder &operator=(const FilterBuilder &);
+  flatbuffers::Offset<Filter> Finish() {
+    const auto end = fbb_.EndTable(start_);
+    auto o = flatbuffers::Offset<Filter>(end);
+    fbb_.Required(o, Filter::VT_BASE);
+    fbb_.Required(o, Filter::VT_REL);
+    fbb_.Required(o, Filter::VT_PREDICATE);
+    return o;
+  }
+};
+
+inline flatbuffers::Offset<Filter> CreateFilter(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelBase> base = 0,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation> rel = 0,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Expression> predicate = 0) {
+  FilterBuilder builder_(_fbb);
+  builder_.add_predicate(predicate);
+  builder_.add_rel(rel);
+  builder_.add_base(base);
+  return builder_.Finish();
+}
+
+/// Projection
+struct Project FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+  typedef ProjectBuilder Builder;
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+    VT_BASE = 4,
+    VT_REL = 6,
+    VT_EXPRESSIONS = 8
+  };
+  /// Common options
+  const org::apache::arrow::computeir::flatbuf::RelBase *base() const {
+    return GetPointer<const org::apache::arrow::computeir::flatbuf::RelBase *>(VT_BASE);
+  }
+  /// Child relation
+  const org::apache::arrow::computeir::flatbuf::Relation *rel() const {
+    return GetPointer<const org::apache::arrow::computeir::flatbuf::Relation *>(VT_REL);
+  }
+  /// Expressions which will be evaluated to produce to
+  /// the rows of the project relation's output.
+  const flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Expression>> *expressions() const {
+    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Expression>> *>(VT_EXPRESSIONS);
+  }
+  bool Verify(flatbuffers::Verifier &verifier) const {
+    return VerifyTableStart(verifier) &&
+           VerifyOffsetRequired(verifier, VT_BASE) &&
+           verifier.VerifyTable(base()) &&
+           VerifyOffsetRequired(verifier, VT_REL) &&
+           verifier.VerifyTable(rel()) &&
+           VerifyOffsetRequired(verifier, VT_EXPRESSIONS) &&
+           verifier.VerifyVector(expressions()) &&
+           verifier.VerifyVectorOfTables(expressions()) &&
+           verifier.EndTable();
+  }
+};
+
+struct ProjectBuilder {
+  typedef Project Table;
+  flatbuffers::FlatBufferBuilder &fbb_;
+  flatbuffers::uoffset_t start_;
+  void add_base(flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelBase> base) {
+    fbb_.AddOffset(Project::VT_BASE, base);
+  }
+  void add_rel(flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation> rel) {
+    fbb_.AddOffset(Project::VT_REL, rel);
+  }
+  void add_expressions(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Expression>>> expressions) {
+    fbb_.AddOffset(Project::VT_EXPRESSIONS, expressions);
+  }
+  explicit ProjectBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+        : fbb_(_fbb) {
+    start_ = fbb_.StartTable();
+  }
+  ProjectBuilder &operator=(const ProjectBuilder &);
+  flatbuffers::Offset<Project> Finish() {
+    const auto end = fbb_.EndTable(start_);
+    auto o = flatbuffers::Offset<Project>(end);
+    fbb_.Required(o, Project::VT_BASE);
+    fbb_.Required(o, Project::VT_REL);
+    fbb_.Required(o, Project::VT_EXPRESSIONS);
+    return o;
+  }
+};
+
+inline flatbuffers::Offset<Project> CreateProject(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelBase> base = 0,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation> rel = 0,
+    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Expression>>> expressions = 0) {
+  ProjectBuilder builder_(_fbb);
+  builder_.add_expressions(expressions);
+  builder_.add_rel(rel);
+  builder_.add_base(base);
+  return builder_.Finish();
+}
+
+inline flatbuffers::Offset<Project> CreateProjectDirect(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelBase> base = 0,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation> rel = 0,
+    const std::vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Expression>> *expressions = nullptr) {
+  auto expressions__ = expressions ? _fbb.CreateVector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Expression>>(*expressions) : 0;
+  return org::apache::arrow::computeir::flatbuf::CreateProject(
+      _fbb,
+      base,
+      rel,
+      expressions__);
+}
+
+/// A set of grouping keys
+struct Grouping FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+  typedef GroupingBuilder Builder;
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+    VT_KEYS = 4
+  };
+  /// Expressions to group by
+  const flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Expression>> *keys() const {
+    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Expression>> *>(VT_KEYS);
+  }
+  bool Verify(flatbuffers::Verifier &verifier) const {
+    return VerifyTableStart(verifier) &&
+           VerifyOffsetRequired(verifier, VT_KEYS) &&
+           verifier.VerifyVector(keys()) &&
+           verifier.VerifyVectorOfTables(keys()) &&
+           verifier.EndTable();
+  }
+};
+
+struct GroupingBuilder {
+  typedef Grouping Table;
+  flatbuffers::FlatBufferBuilder &fbb_;
+  flatbuffers::uoffset_t start_;
+  void add_keys(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Expression>>> keys) {
+    fbb_.AddOffset(Grouping::VT_KEYS, keys);
+  }
+  explicit GroupingBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+        : fbb_(_fbb) {
+    start_ = fbb_.StartTable();
+  }
+  GroupingBuilder &operator=(const GroupingBuilder &);
+  flatbuffers::Offset<Grouping> Finish() {
+    const auto end = fbb_.EndTable(start_);
+    auto o = flatbuffers::Offset<Grouping>(end);
+    fbb_.Required(o, Grouping::VT_KEYS);
+    return o;
+  }
+};
+
+inline flatbuffers::Offset<Grouping> CreateGrouping(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Expression>>> keys = 0) {
+  GroupingBuilder builder_(_fbb);
+  builder_.add_keys(keys);
+  return builder_.Finish();
+}
+
+inline flatbuffers::Offset<Grouping> CreateGroupingDirect(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    const std::vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Expression>> *keys = nullptr) {
+  auto keys__ = keys ? _fbb.CreateVector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Expression>>(*keys) : 0;
+  return org::apache::arrow::computeir::flatbuf::CreateGrouping(
+      _fbb,
+      keys__);
+}
+
+/// Aggregate operation
+struct Aggregate FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+  typedef AggregateBuilder Builder;
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+    VT_BASE = 4,
+    VT_REL = 6,
+    VT_MEASURES = 8,
+    VT_GROUPINGS = 10
+  };
+  /// Common options
+  const org::apache::arrow::computeir::flatbuf::RelBase *base() const {
+    return GetPointer<const org::apache::arrow::computeir::flatbuf::RelBase *>(VT_BASE);
+  }
+  /// Child relation
+  const org::apache::arrow::computeir::flatbuf::Relation *rel() const {
+    return GetPointer<const org::apache::arrow::computeir::flatbuf::Relation *>(VT_REL);
+  }
+  /// Expressions which will be evaluated to produce to
+  /// the rows of the aggregate relation's output.
+  const flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Expression>> *measures() const {
+    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Expression>> *>(VT_MEASURES);
+  }
+  /// Keys by which `aggregations` will be grouped.
+  ///
+  /// The nested list here is to support grouping sets
+  /// eg
+  ///
+  /// SELECT a, b, c, sum(d)
+  /// FROM t
+  /// GROUP BY
+  ///   GROUPING SETS (
+  ///     (a, b, c),
+  ///     (a, b),
+  ///     (a),
+  ///     ()
+  ///   );
+  const flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Grouping>> *groupings() const {
+    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Grouping>> *>(VT_GROUPINGS);
+  }
+  bool Verify(flatbuffers::Verifier &verifier) const {
+    return VerifyTableStart(verifier) &&
+           VerifyOffsetRequired(verifier, VT_BASE) &&
+           verifier.VerifyTable(base()) &&
+           VerifyOffsetRequired(verifier, VT_REL) &&
+           verifier.VerifyTable(rel()) &&
+           VerifyOffsetRequired(verifier, VT_MEASURES) &&
+           verifier.VerifyVector(measures()) &&
+           verifier.VerifyVectorOfTables(measures()) &&
+           VerifyOffsetRequired(verifier, VT_GROUPINGS) &&
+           verifier.VerifyVector(groupings()) &&
+           verifier.VerifyVectorOfTables(groupings()) &&
+           verifier.EndTable();
+  }
+};
+
+struct AggregateBuilder {
+  typedef Aggregate Table;
+  flatbuffers::FlatBufferBuilder &fbb_;
+  flatbuffers::uoffset_t start_;
+  void add_base(flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelBase> base) {
+    fbb_.AddOffset(Aggregate::VT_BASE, base);
+  }
+  void add_rel(flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation> rel) {
+    fbb_.AddOffset(Aggregate::VT_REL, rel);
+  }
+  void add_measures(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Expression>>> measures) {
+    fbb_.AddOffset(Aggregate::VT_MEASURES, measures);
+  }
+  void add_groupings(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Grouping>>> groupings) {
+    fbb_.AddOffset(Aggregate::VT_GROUPINGS, groupings);
+  }
+  explicit AggregateBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+        : fbb_(_fbb) {
+    start_ = fbb_.StartTable();
+  }
+  AggregateBuilder &operator=(const AggregateBuilder &);
+  flatbuffers::Offset<Aggregate> Finish() {
+    const auto end = fbb_.EndTable(start_);
+    auto o = flatbuffers::Offset<Aggregate>(end);
+    fbb_.Required(o, Aggregate::VT_BASE);
+    fbb_.Required(o, Aggregate::VT_REL);
+    fbb_.Required(o, Aggregate::VT_MEASURES);
+    fbb_.Required(o, Aggregate::VT_GROUPINGS);
+    return o;
+  }
+};
+
+inline flatbuffers::Offset<Aggregate> CreateAggregate(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelBase> base = 0,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation> rel = 0,
+    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Expression>>> measures = 0,
+    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Grouping>>> groupings = 0) {
+  AggregateBuilder builder_(_fbb);
+  builder_.add_groupings(groupings);
+  builder_.add_measures(measures);
+  builder_.add_rel(rel);
+  builder_.add_base(base);
+  return builder_.Finish();
+}
+
+inline flatbuffers::Offset<Aggregate> CreateAggregateDirect(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelBase> base = 0,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation> rel = 0,
+    const std::vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Expression>> *measures = nullptr,
+    const std::vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Grouping>> *groupings = nullptr) {
+  auto measures__ = measures ? _fbb.CreateVector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Expression>>(*measures) : 0;
+  auto groupings__ = groupings ? _fbb.CreateVector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Grouping>>(*groupings) : 0;
+  return org::apache::arrow::computeir::flatbuf::CreateAggregate(
+      _fbb,
+      base,
+      rel,
+      measures__,
+      groupings__);
+}
+
+/// Join between two tables
+struct Join FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+  typedef JoinBuilder Builder;
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+    VT_BASE = 4,
+    VT_LEFT = 6,
+    VT_RIGHT = 8,
+    VT_ON_EXPRESSION = 10,
+    VT_JOIN_KIND = 12
+  };
+  /// Common options
+  const org::apache::arrow::computeir::flatbuf::RelBase *base() const {
+    return GetPointer<const org::apache::arrow::computeir::flatbuf::RelBase *>(VT_BASE);
+  }
+  /// Left relation
+  const org::apache::arrow::computeir::flatbuf::Relation *left() const {
+    return GetPointer<const org::apache::arrow::computeir::flatbuf::Relation *>(VT_LEFT);
+  }
+  /// Right relation
+  const org::apache::arrow::computeir::flatbuf::Relation *right() const {
+    return GetPointer<const org::apache::arrow::computeir::flatbuf::Relation *>(VT_RIGHT);
+  }
+  /// The expression which will be evaluated against rows from each
+  /// input to determine whether they should be included in the
+  /// join relation's output.
+  const org::apache::arrow::computeir::flatbuf::Expression *on_expression() const {
+    return GetPointer<const org::apache::arrow::computeir::flatbuf::Expression *>(VT_ON_EXPRESSION);
+  }
+  /// The kind of join to use.
+  org::apache::arrow::computeir::flatbuf::JoinKind join_kind() const {
+    return static_cast<org::apache::arrow::computeir::flatbuf::JoinKind>(GetField<uint8_t>(VT_JOIN_KIND, 0));
+  }
+  bool Verify(flatbuffers::Verifier &verifier) const {
+    return VerifyTableStart(verifier) &&
+           VerifyOffsetRequired(verifier, VT_BASE) &&
+           verifier.VerifyTable(base()) &&
+           VerifyOffsetRequired(verifier, VT_LEFT) &&
+           verifier.VerifyTable(left()) &&
+           VerifyOffsetRequired(verifier, VT_RIGHT) &&
+           verifier.VerifyTable(right()) &&
+           VerifyOffsetRequired(verifier, VT_ON_EXPRESSION) &&
+           verifier.VerifyTable(on_expression()) &&
+           VerifyField<uint8_t>(verifier, VT_JOIN_KIND) &&
+           verifier.EndTable();
+  }
+};
+
+struct JoinBuilder {
+  typedef Join Table;
+  flatbuffers::FlatBufferBuilder &fbb_;
+  flatbuffers::uoffset_t start_;
+  void add_base(flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelBase> base) {
+    fbb_.AddOffset(Join::VT_BASE, base);
+  }
+  void add_left(flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation> left) {
+    fbb_.AddOffset(Join::VT_LEFT, left);
+  }
+  void add_right(flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation> right) {
+    fbb_.AddOffset(Join::VT_RIGHT, right);
+  }
+  void add_on_expression(flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Expression> on_expression) {
+    fbb_.AddOffset(Join::VT_ON_EXPRESSION, on_expression);
+  }
+  void add_join_kind(org::apache::arrow::computeir::flatbuf::JoinKind join_kind) {
+    fbb_.AddElement<uint8_t>(Join::VT_JOIN_KIND, static_cast<uint8_t>(join_kind), 0);
+  }
+  explicit JoinBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+        : fbb_(_fbb) {
+    start_ = fbb_.StartTable();
+  }
+  JoinBuilder &operator=(const JoinBuilder &);
+  flatbuffers::Offset<Join> Finish() {
+    const auto end = fbb_.EndTable(start_);
+    auto o = flatbuffers::Offset<Join>(end);
+    fbb_.Required(o, Join::VT_BASE);
+    fbb_.Required(o, Join::VT_LEFT);
+    fbb_.Required(o, Join::VT_RIGHT);
+    fbb_.Required(o, Join::VT_ON_EXPRESSION);
+    return o;
+  }
+};
+
+inline flatbuffers::Offset<Join> CreateJoin(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelBase> base = 0,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation> left = 0,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation> right = 0,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Expression> on_expression = 0,
+    org::apache::arrow::computeir::flatbuf::JoinKind join_kind = org::apache::arrow::computeir::flatbuf::JoinKind::Anti) {
+  JoinBuilder builder_(_fbb);
+  builder_.add_on_expression(on_expression);
+  builder_.add_right(right);
+  builder_.add_left(left);
+  builder_.add_base(base);
+  builder_.add_join_kind(join_kind);
+  return builder_.Finish();
+}
+
+/// Order by relation
+struct OrderBy FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+  typedef OrderByBuilder Builder;
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+    VT_BASE = 4,
+    VT_REL = 6,
+    VT_KEYS = 8
+  };
+  /// Common options
+  const org::apache::arrow::computeir::flatbuf::RelBase *base() const {
+    return GetPointer<const org::apache::arrow::computeir::flatbuf::RelBase *>(VT_BASE);
+  }
+  /// Child relation
+  const org::apache::arrow::computeir::flatbuf::Relation *rel() const {
+    return GetPointer<const org::apache::arrow::computeir::flatbuf::Relation *>(VT_REL);
+  }
+  /// Define sort order for rows of output.
+  /// Keys with higher precedence are ordered ahead of other keys.
+  const flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::SortKey>> *keys() const {
+    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::SortKey>> *>(VT_KEYS);
+  }
+  bool Verify(flatbuffers::Verifier &verifier) const {
+    return VerifyTableStart(verifier) &&
+           VerifyOffsetRequired(verifier, VT_BASE) &&
+           verifier.VerifyTable(base()) &&
+           VerifyOffsetRequired(verifier, VT_REL) &&
+           verifier.VerifyTable(rel()) &&
+           VerifyOffsetRequired(verifier, VT_KEYS) &&
+           verifier.VerifyVector(keys()) &&
+           verifier.VerifyVectorOfTables(keys()) &&
+           verifier.EndTable();
+  }
+};
+
+struct OrderByBuilder {
+  typedef OrderBy Table;
+  flatbuffers::FlatBufferBuilder &fbb_;
+  flatbuffers::uoffset_t start_;
+  void add_base(flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelBase> base) {
+    fbb_.AddOffset(OrderBy::VT_BASE, base);
+  }
+  void add_rel(flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation> rel) {
+    fbb_.AddOffset(OrderBy::VT_REL, rel);
+  }
+  void add_keys(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::SortKey>>> keys) {
+    fbb_.AddOffset(OrderBy::VT_KEYS, keys);
+  }
+  explicit OrderByBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+        : fbb_(_fbb) {
+    start_ = fbb_.StartTable();
+  }
+  OrderByBuilder &operator=(const OrderByBuilder &);
+  flatbuffers::Offset<OrderBy> Finish() {
+    const auto end = fbb_.EndTable(start_);
+    auto o = flatbuffers::Offset<OrderBy>(end);
+    fbb_.Required(o, OrderBy::VT_BASE);
+    fbb_.Required(o, OrderBy::VT_REL);
+    fbb_.Required(o, OrderBy::VT_KEYS);
+    return o;
+  }
+};
+
+inline flatbuffers::Offset<OrderBy> CreateOrderBy(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelBase> base = 0,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation> rel = 0,
+    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::SortKey>>> keys = 0) {
+  OrderByBuilder builder_(_fbb);
+  builder_.add_keys(keys);
+  builder_.add_rel(rel);
+  builder_.add_base(base);
+  return builder_.Finish();
+}
+
+inline flatbuffers::Offset<OrderBy> CreateOrderByDirect(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelBase> base = 0,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation> rel = 0,
+    const std::vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::SortKey>> *keys = nullptr) {
+  auto keys__ = keys ? _fbb.CreateVector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::SortKey>>(*keys) : 0;
+  return org::apache::arrow::computeir::flatbuf::CreateOrderBy(
+      _fbb,
+      base,
+      rel,
+      keys__);
+}
+
+/// Limit operation
+struct Limit FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+  typedef LimitBuilder Builder;
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+    VT_BASE = 4,
+    VT_REL = 6,
+    VT_OFFSET = 8,
+    VT_COUNT = 10
+  };
+  /// Common options
+  const org::apache::arrow::computeir::flatbuf::RelBase *base() const {
+    return GetPointer<const org::apache::arrow::computeir::flatbuf::RelBase *>(VT_BASE);
+  }
+  /// Child relation
+  const org::apache::arrow::computeir::flatbuf::Relation *rel() const {
+    return GetPointer<const org::apache::arrow::computeir::flatbuf::Relation *>(VT_REL);
+  }
+  /// Starting index of rows
+  uint32_t offset() const {
+    return GetField<uint32_t>(VT_OFFSET, 0);
+  }
+  /// The maximum number of rows of output.
+  uint32_t count() const {
+    return GetField<uint32_t>(VT_COUNT, 0);
+  }
+  bool Verify(flatbuffers::Verifier &verifier) const {
+    return VerifyTableStart(verifier) &&
+           VerifyOffsetRequired(verifier, VT_BASE) &&
+           verifier.VerifyTable(base()) &&
+           VerifyOffsetRequired(verifier, VT_REL) &&
+           verifier.VerifyTable(rel()) &&
+           VerifyField<uint32_t>(verifier, VT_OFFSET) &&
+           VerifyField<uint32_t>(verifier, VT_COUNT) &&
+           verifier.EndTable();
+  }
+};
+
+struct LimitBuilder {
+  typedef Limit Table;
+  flatbuffers::FlatBufferBuilder &fbb_;
+  flatbuffers::uoffset_t start_;
+  void add_base(flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelBase> base) {
+    fbb_.AddOffset(Limit::VT_BASE, base);
+  }
+  void add_rel(flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation> rel) {
+    fbb_.AddOffset(Limit::VT_REL, rel);
+  }
+  void add_offset(uint32_t offset) {
+    fbb_.AddElement<uint32_t>(Limit::VT_OFFSET, offset, 0);
+  }
+  void add_count(uint32_t count) {
+    fbb_.AddElement<uint32_t>(Limit::VT_COUNT, count, 0);
+  }
+  explicit LimitBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+        : fbb_(_fbb) {
+    start_ = fbb_.StartTable();
+  }
+  LimitBuilder &operator=(const LimitBuilder &);
+  flatbuffers::Offset<Limit> Finish() {
+    const auto end = fbb_.EndTable(start_);
+    auto o = flatbuffers::Offset<Limit>(end);
+    fbb_.Required(o, Limit::VT_BASE);
+    fbb_.Required(o, Limit::VT_REL);
+    return o;
+  }
+};
+
+inline flatbuffers::Offset<Limit> CreateLimit(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelBase> base = 0,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation> rel = 0,
+    uint32_t offset = 0,
+    uint32_t count = 0) {
+  LimitBuilder builder_(_fbb);
+  builder_.add_count(count);
+  builder_.add_offset(offset);
+  builder_.add_rel(rel);
+  builder_.add_base(base);
+  return builder_.Finish();
+}
+
+/// A set operation on two or more relations
+struct SetOperation FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+  typedef SetOperationBuilder Builder;
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+    VT_BASE = 4,
+    VT_RELS = 6,
+    VT_SET_OP = 8
+  };
+  /// Common options
+  const org::apache::arrow::computeir::flatbuf::RelBase *base() const {
+    return GetPointer<const org::apache::arrow::computeir::flatbuf::RelBase *>(VT_BASE);
+  }
+  /// Child relations
+  const flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation>> *rels() const {
+    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation>> *>(VT_RELS);
+  }
+  /// The kind of set operation
+  org::apache::arrow::computeir::flatbuf::SetOpKind set_op() const {
+    return static_cast<org::apache::arrow::computeir::flatbuf::SetOpKind>(GetField<uint8_t>(VT_SET_OP, 0));
+  }
+  bool Verify(flatbuffers::Verifier &verifier) const {
+    return VerifyTableStart(verifier) &&
+           VerifyOffsetRequired(verifier, VT_BASE) &&
+           verifier.VerifyTable(base()) &&
+           VerifyOffsetRequired(verifier, VT_RELS) &&
+           verifier.VerifyVector(rels()) &&
+           verifier.VerifyVectorOfTables(rels()) &&
+           VerifyField<uint8_t>(verifier, VT_SET_OP) &&
+           verifier.EndTable();
+  }
+};
+
+struct SetOperationBuilder {
+  typedef SetOperation Table;
+  flatbuffers::FlatBufferBuilder &fbb_;
+  flatbuffers::uoffset_t start_;
+  void add_base(flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelBase> base) {
+    fbb_.AddOffset(SetOperation::VT_BASE, base);
+  }
+  void add_rels(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation>>> rels) {
+    fbb_.AddOffset(SetOperation::VT_RELS, rels);
+  }
+  void add_set_op(org::apache::arrow::computeir::flatbuf::SetOpKind set_op) {
+    fbb_.AddElement<uint8_t>(SetOperation::VT_SET_OP, static_cast<uint8_t>(set_op), 0);
+  }
+  explicit SetOperationBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+        : fbb_(_fbb) {
+    start_ = fbb_.StartTable();
+  }
+  SetOperationBuilder &operator=(const SetOperationBuilder &);
+  flatbuffers::Offset<SetOperation> Finish() {
+    const auto end = fbb_.EndTable(start_);
+    auto o = flatbuffers::Offset<SetOperation>(end);
+    fbb_.Required(o, SetOperation::VT_BASE);
+    fbb_.Required(o, SetOperation::VT_RELS);
+    return o;
+  }
+};
+
+inline flatbuffers::Offset<SetOperation> CreateSetOperation(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelBase> base = 0,
+    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation>>> rels = 0,
+    org::apache::arrow::computeir::flatbuf::SetOpKind set_op = org::apache::arrow::computeir::flatbuf::SetOpKind::Union) {
+  SetOperationBuilder builder_(_fbb);
+  builder_.add_rels(rels);
+  builder_.add_base(base);
+  builder_.add_set_op(set_op);
+  return builder_.Finish();
+}
+
+inline flatbuffers::Offset<SetOperation> CreateSetOperationDirect(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelBase> base = 0,
+    const std::vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation>> *rels = nullptr,
+    org::apache::arrow::computeir::flatbuf::SetOpKind set_op = org::apache::arrow::computeir::flatbuf::SetOpKind::Union) {
+  auto rels__ = rels ? _fbb.CreateVector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation>>(*rels) : 0;
+  return org::apache::arrow::computeir::flatbuf::CreateSetOperation(
+      _fbb,
+      base,
+      rels__,
+      set_op);
+}
+
+/// A single column of literal values.
+struct LiteralColumn FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+  typedef LiteralColumnBuilder Builder;
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+    VT_ELEMENTS = 4
+  };
+  /// The literal values of the column
+  const flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Literal>> *elements() const {
+    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Literal>> *>(VT_ELEMENTS);
+  }
+  bool Verify(flatbuffers::Verifier &verifier) const {
+    return VerifyTableStart(verifier) &&
+           VerifyOffsetRequired(verifier, VT_ELEMENTS) &&
+           verifier.VerifyVector(elements()) &&
+           verifier.VerifyVectorOfTables(elements()) &&
+           verifier.EndTable();
+  }
+};
+
+struct LiteralColumnBuilder {
+  typedef LiteralColumn Table;
+  flatbuffers::FlatBufferBuilder &fbb_;
+  flatbuffers::uoffset_t start_;
+  void add_elements(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Literal>>> elements) {
+    fbb_.AddOffset(LiteralColumn::VT_ELEMENTS, elements);
+  }
+  explicit LiteralColumnBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+        : fbb_(_fbb) {
+    start_ = fbb_.StartTable();
+  }
+  LiteralColumnBuilder &operator=(const LiteralColumnBuilder &);
+  flatbuffers::Offset<LiteralColumn> Finish() {
+    const auto end = fbb_.EndTable(start_);
+    auto o = flatbuffers::Offset<LiteralColumn>(end);
+    fbb_.Required(o, LiteralColumn::VT_ELEMENTS);
+    return o;
+  }
+};
+
+inline flatbuffers::Offset<LiteralColumn> CreateLiteralColumn(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Literal>>> elements = 0) {
+  LiteralColumnBuilder builder_(_fbb);
+  builder_.add_elements(elements);
+  return builder_.Finish();
+}
+
+inline flatbuffers::Offset<LiteralColumn> CreateLiteralColumnDirect(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    const std::vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Literal>> *elements = nullptr) {
+  auto elements__ = elements ? _fbb.CreateVector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Literal>>(*elements) : 0;
+  return org::apache::arrow::computeir::flatbuf::CreateLiteralColumn(
+      _fbb,
+      elements__);
+}
+
+/// Literal relation
+struct LiteralRelation FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+  typedef LiteralRelationBuilder Builder;
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+    VT_BASE = 4,
+    VT_COLUMNS = 6
+  };
+  /// Common options
+  const org::apache::arrow::computeir::flatbuf::RelBase *base() const {
+    return GetPointer<const org::apache::arrow::computeir::flatbuf::RelBase *>(VT_BASE);
+  }
+  /// The columns of this literal relation.
+  const flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::LiteralColumn>> *columns() const {
+    return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::LiteralColumn>> *>(VT_COLUMNS);
+  }
+  bool Verify(flatbuffers::Verifier &verifier) const {
+    return VerifyTableStart(verifier) &&
+           VerifyOffsetRequired(verifier, VT_BASE) &&
+           verifier.VerifyTable(base()) &&
+           VerifyOffsetRequired(verifier, VT_COLUMNS) &&
+           verifier.VerifyVector(columns()) &&
+           verifier.VerifyVectorOfTables(columns()) &&
+           verifier.EndTable();
+  }
+};
+
+struct LiteralRelationBuilder {
+  typedef LiteralRelation Table;
+  flatbuffers::FlatBufferBuilder &fbb_;
+  flatbuffers::uoffset_t start_;
+  void add_base(flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelBase> base) {
+    fbb_.AddOffset(LiteralRelation::VT_BASE, base);
+  }
+  void add_columns(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::LiteralColumn>>> columns) {
+    fbb_.AddOffset(LiteralRelation::VT_COLUMNS, columns);
+  }
+  explicit LiteralRelationBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+        : fbb_(_fbb) {
+    start_ = fbb_.StartTable();
+  }
+  LiteralRelationBuilder &operator=(const LiteralRelationBuilder &);
+  flatbuffers::Offset<LiteralRelation> Finish() {
+    const auto end = fbb_.EndTable(start_);
+    auto o = flatbuffers::Offset<LiteralRelation>(end);
+    fbb_.Required(o, LiteralRelation::VT_BASE);
+    fbb_.Required(o, LiteralRelation::VT_COLUMNS);
+    return o;
+  }
+};
+
+inline flatbuffers::Offset<LiteralRelation> CreateLiteralRelation(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelBase> base = 0,
+    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::LiteralColumn>>> columns = 0) {
+  LiteralRelationBuilder builder_(_fbb);
+  builder_.add_columns(columns);
+  builder_.add_base(base);
+  return builder_.Finish();
+}
+
+inline flatbuffers::Offset<LiteralRelation> CreateLiteralRelationDirect(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelBase> base = 0,
+    const std::vector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::LiteralColumn>> *columns = nullptr) {
+  auto columns__ = columns ? _fbb.CreateVector<flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::LiteralColumn>>(*columns) : 0;
+  return org::apache::arrow::computeir::flatbuf::CreateLiteralRelation(
+      _fbb,
+      base,
+      columns__);
+}
+
+/// An external source of tabular data
+struct Source FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+  typedef SourceBuilder Builder;
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+    VT_BASE = 4,
+    VT_NAME = 6,
+    VT_SCHEMA = 8
+  };
+  const org::apache::arrow::computeir::flatbuf::RelBase *base() const {
+    return GetPointer<const org::apache::arrow::computeir::flatbuf::RelBase *>(VT_BASE);
+  }
+  const flatbuffers::String *name() const {
+    return GetPointer<const flatbuffers::String *>(VT_NAME);
+  }
+  const org::apache::arrow::flatbuf::Schema *schema() const {
+    return GetPointer<const org::apache::arrow::flatbuf::Schema *>(VT_SCHEMA);
+  }
+  bool Verify(flatbuffers::Verifier &verifier) const {
+    return VerifyTableStart(verifier) &&
+           VerifyOffsetRequired(verifier, VT_BASE) &&
+           verifier.VerifyTable(base()) &&
+           VerifyOffsetRequired(verifier, VT_NAME) &&
+           verifier.VerifyString(name()) &&
+           VerifyOffsetRequired(verifier, VT_SCHEMA) &&
+           verifier.VerifyTable(schema()) &&
+           verifier.EndTable();
+  }
+};
+
+struct SourceBuilder {
+  typedef Source Table;
+  flatbuffers::FlatBufferBuilder &fbb_;
+  flatbuffers::uoffset_t start_;
+  void add_base(flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelBase> base) {
+    fbb_.AddOffset(Source::VT_BASE, base);
+  }
+  void add_name(flatbuffers::Offset<flatbuffers::String> name) {
+    fbb_.AddOffset(Source::VT_NAME, name);
+  }
+  void add_schema(flatbuffers::Offset<org::apache::arrow::flatbuf::Schema> schema) {
+    fbb_.AddOffset(Source::VT_SCHEMA, schema);
+  }
+  explicit SourceBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+        : fbb_(_fbb) {
+    start_ = fbb_.StartTable();
+  }
+  SourceBuilder &operator=(const SourceBuilder &);
+  flatbuffers::Offset<Source> Finish() {
+    const auto end = fbb_.EndTable(start_);
+    auto o = flatbuffers::Offset<Source>(end);
+    fbb_.Required(o, Source::VT_BASE);
+    fbb_.Required(o, Source::VT_NAME);
+    fbb_.Required(o, Source::VT_SCHEMA);
+    return o;
+  }
+};
+
+inline flatbuffers::Offset<Source> CreateSource(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelBase> base = 0,
+    flatbuffers::Offset<flatbuffers::String> name = 0,
+    flatbuffers::Offset<org::apache::arrow::flatbuf::Schema> schema = 0) {
+  SourceBuilder builder_(_fbb);
+  builder_.add_schema(schema);
+  builder_.add_name(name);
+  builder_.add_base(base);
+  return builder_.Finish();
+}
+
+inline flatbuffers::Offset<Source> CreateSourceDirect(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::RelBase> base = 0,
+    const char *name = nullptr,
+    flatbuffers::Offset<org::apache::arrow::flatbuf::Schema> schema = 0) {
+  auto name__ = name ? _fbb.CreateString(name) : 0;
+  return org::apache::arrow::computeir::flatbuf::CreateSource(
+      _fbb,
+      base,
+      name__,
+      schema);
+}
+
+/// A table holding an instance of the possible relation types.
+struct Relation FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+  typedef RelationBuilder Builder;
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+    VT_IMPL_TYPE = 4,
+    VT_IMPL = 6
+  };
+  org::apache::arrow::computeir::flatbuf::RelationImpl impl_type() const {
+    return static_cast<org::apache::arrow::computeir::flatbuf::RelationImpl>(GetField<uint8_t>(VT_IMPL_TYPE, 0));
+  }
+  const void *impl() const {
+    return GetPointer<const void *>(VT_IMPL);
+  }
+  template<typename T> const T *impl_as() const;
+  const org::apache::arrow::computeir::flatbuf::Aggregate *impl_as_Aggregate() const {
+    return impl_type() == org::apache::arrow::computeir::flatbuf::RelationImpl::Aggregate ? static_cast<const org::apache::arrow::computeir::flatbuf::Aggregate *>(impl()) : nullptr;
+  }
+  const org::apache::arrow::computeir::flatbuf::Filter *impl_as_Filter() const {
+    return impl_type() == org::apache::arrow::computeir::flatbuf::RelationImpl::Filter ? static_cast<const org::apache::arrow::computeir::flatbuf::Filter *>(impl()) : nullptr;
+  }
+  const org::apache::arrow::computeir::flatbuf::Join *impl_as_Join() const {
+    return impl_type() == org::apache::arrow::computeir::flatbuf::RelationImpl::Join ? static_cast<const org::apache::arrow::computeir::flatbuf::Join *>(impl()) : nullptr;
+  }
+  const org::apache::arrow::computeir::flatbuf::Limit *impl_as_Limit() const {
+    return impl_type() == org::apache::arrow::computeir::flatbuf::RelationImpl::Limit ? static_cast<const org::apache::arrow::computeir::flatbuf::Limit *>(impl()) : nullptr;
+  }
+  const org::apache::arrow::computeir::flatbuf::LiteralRelation *impl_as_LiteralRelation() const {
+    return impl_type() == org::apache::arrow::computeir::flatbuf::RelationImpl::LiteralRelation ? static_cast<const org::apache::arrow::computeir::flatbuf::LiteralRelation *>(impl()) : nullptr;
+  }
+  const org::apache::arrow::computeir::flatbuf::OrderBy *impl_as_OrderBy() const {
+    return impl_type() == org::apache::arrow::computeir::flatbuf::RelationImpl::OrderBy ? static_cast<const org::apache::arrow::computeir::flatbuf::OrderBy *>(impl()) : nullptr;
+  }
+  const org::apache::arrow::computeir::flatbuf::Project *impl_as_Project() const {
+    return impl_type() == org::apache::arrow::computeir::flatbuf::RelationImpl::Project ? static_cast<const org::apache::arrow::computeir::flatbuf::Project *>(impl()) : nullptr;
+  }
+  const org::apache::arrow::computeir::flatbuf::SetOperation *impl_as_SetOperation() const {
+    return impl_type() == org::apache::arrow::computeir::flatbuf::RelationImpl::SetOperation ? static_cast<const org::apache::arrow::computeir::flatbuf::SetOperation *>(impl()) : nullptr;
+  }
+  const org::apache::arrow::computeir::flatbuf::Source *impl_as_Source() const {
+    return impl_type() == org::apache::arrow::computeir::flatbuf::RelationImpl::Source ? static_cast<const org::apache::arrow::computeir::flatbuf::Source *>(impl()) : nullptr;
+  }
+  bool Verify(flatbuffers::Verifier &verifier) const {
+    return VerifyTableStart(verifier) &&
+           VerifyField<uint8_t>(verifier, VT_IMPL_TYPE) &&
+           VerifyOffsetRequired(verifier, VT_IMPL) &&
+           VerifyRelationImpl(verifier, impl(), impl_type()) &&
+           verifier.EndTable();
+  }
+};
+
+template<> inline const org::apache::arrow::computeir::flatbuf::Aggregate *Relation::impl_as<org::apache::arrow::computeir::flatbuf::Aggregate>() const {
+  return impl_as_Aggregate();
+}
+
+template<> inline const org::apache::arrow::computeir::flatbuf::Filter *Relation::impl_as<org::apache::arrow::computeir::flatbuf::Filter>() const {
+  return impl_as_Filter();
+}
+
+template<> inline const org::apache::arrow::computeir::flatbuf::Join *Relation::impl_as<org::apache::arrow::computeir::flatbuf::Join>() const {
+  return impl_as_Join();
+}
+
+template<> inline const org::apache::arrow::computeir::flatbuf::Limit *Relation::impl_as<org::apache::arrow::computeir::flatbuf::Limit>() const {
+  return impl_as_Limit();
+}
+
+template<> inline const org::apache::arrow::computeir::flatbuf::LiteralRelation *Relation::impl_as<org::apache::arrow::computeir::flatbuf::LiteralRelation>() const {
+  return impl_as_LiteralRelation();
+}
+
+template<> inline const org::apache::arrow::computeir::flatbuf::OrderBy *Relation::impl_as<org::apache::arrow::computeir::flatbuf::OrderBy>() const {
+  return impl_as_OrderBy();
+}
+
+template<> inline const org::apache::arrow::computeir::flatbuf::Project *Relation::impl_as<org::apache::arrow::computeir::flatbuf::Project>() const {
+  return impl_as_Project();
+}
+
+template<> inline const org::apache::arrow::computeir::flatbuf::SetOperation *Relation::impl_as<org::apache::arrow::computeir::flatbuf::SetOperation>() const {
+  return impl_as_SetOperation();
+}
+
+template<> inline const org::apache::arrow::computeir::flatbuf::Source *Relation::impl_as<org::apache::arrow::computeir::flatbuf::Source>() const {
+  return impl_as_Source();
+}
+
+struct RelationBuilder {
+  typedef Relation Table;
+  flatbuffers::FlatBufferBuilder &fbb_;
+  flatbuffers::uoffset_t start_;
+  void add_impl_type(org::apache::arrow::computeir::flatbuf::RelationImpl impl_type) {
+    fbb_.AddElement<uint8_t>(Relation::VT_IMPL_TYPE, static_cast<uint8_t>(impl_type), 0);
+  }
+  void add_impl(flatbuffers::Offset<void> impl) {
+    fbb_.AddOffset(Relation::VT_IMPL, impl);
+  }
+  explicit RelationBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+        : fbb_(_fbb) {
+    start_ = fbb_.StartTable();
+  }
+  RelationBuilder &operator=(const RelationBuilder &);
+  flatbuffers::Offset<Relation> Finish() {
+    const auto end = fbb_.EndTable(start_);
+    auto o = flatbuffers::Offset<Relation>(end);
+    fbb_.Required(o, Relation::VT_IMPL);
+    return o;
+  }
+};
+
+inline flatbuffers::Offset<Relation> CreateRelation(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    org::apache::arrow::computeir::flatbuf::RelationImpl impl_type = org::apache::arrow::computeir::flatbuf::RelationImpl::NONE,
+    flatbuffers::Offset<void> impl = 0) {
+  RelationBuilder builder_(_fbb);
+  builder_.add_impl(impl);
+  builder_.add_impl_type(impl_type);
+  return builder_.Finish();
+}
+
+inline bool VerifyEmit(flatbuffers::Verifier &verifier, const void *obj, Emit type) {
+  switch (type) {
+    case Emit::NONE: {
+      return true;
+    }
+    case Emit::Remap: {
+      auto ptr = reinterpret_cast<const org::apache::arrow::computeir::flatbuf::Remap *>(obj);
+      return verifier.VerifyTable(ptr);
+    }
+    case Emit::PassThrough: {
+      auto ptr = reinterpret_cast<const org::apache::arrow::computeir::flatbuf::PassThrough *>(obj);
+      return verifier.VerifyTable(ptr);
+    }
+    default: return true;
+  }
+}
+
+inline bool VerifyEmitVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector<flatbuffers::Offset<void>> *values, const flatbuffers::Vector<uint8_t> *types) {
+  if (!values || !types) return !values && !types;
+  if (values->size() != types->size()) return false;
+  for (flatbuffers::uoffset_t i = 0; i < values->size(); ++i) {
+    if (!VerifyEmit(
+        verifier,  values->Get(i), types->GetEnum<Emit>(i))) {
+      return false;
+    }
+  }
+  return true;
+}
+
+inline bool VerifyRelationImpl(flatbuffers::Verifier &verifier, const void *obj, RelationImpl type) {
+  switch (type) {
+    case RelationImpl::NONE: {
+      return true;
+    }
+    case RelationImpl::Aggregate: {
+      auto ptr = reinterpret_cast<const org::apache::arrow::computeir::flatbuf::Aggregate *>(obj);
+      return verifier.VerifyTable(ptr);
+    }
+    case RelationImpl::Filter: {
+      auto ptr = reinterpret_cast<const org::apache::arrow::computeir::flatbuf::Filter *>(obj);
+      return verifier.VerifyTable(ptr);
+    }
+    case RelationImpl::Join: {
+      auto ptr = reinterpret_cast<const org::apache::arrow::computeir::flatbuf::Join *>(obj);
+      return verifier.VerifyTable(ptr);
+    }
+    case RelationImpl::Limit: {
+      auto ptr = reinterpret_cast<const org::apache::arrow::computeir::flatbuf::Limit *>(obj);
+      return verifier.VerifyTable(ptr);
+    }
+    case RelationImpl::LiteralRelation: {
+      auto ptr = reinterpret_cast<const org::apache::arrow::computeir::flatbuf::LiteralRelation *>(obj);
+      return verifier.VerifyTable(ptr);
+    }
+    case RelationImpl::OrderBy: {
+      auto ptr = reinterpret_cast<const org::apache::arrow::computeir::flatbuf::OrderBy *>(obj);
+      return verifier.VerifyTable(ptr);
+    }
+    case RelationImpl::Project: {
+      auto ptr = reinterpret_cast<const org::apache::arrow::computeir::flatbuf::Project *>(obj);
+      return verifier.VerifyTable(ptr);
+    }
+    case RelationImpl::SetOperation: {
+      auto ptr = reinterpret_cast<const org::apache::arrow::computeir::flatbuf::SetOperation *>(obj);
+      return verifier.VerifyTable(ptr);
+    }
+    case RelationImpl::Source: {
+      auto ptr = reinterpret_cast<const org::apache::arrow::computeir::flatbuf::Source *>(obj);
+      return verifier.VerifyTable(ptr);
+    }
+    default: return true;
+  }
+}
+
+inline bool VerifyRelationImplVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector<flatbuffers::Offset<void>> *values, const flatbuffers::Vector<uint8_t> *types) {
+  if (!values || !types) return !values && !types;
+  if (values->size() != types->size()) return false;
+  for (flatbuffers::uoffset_t i = 0; i < values->size(); ++i) {
+    if (!VerifyRelationImpl(
+        verifier,  values->Get(i), types->GetEnum<RelationImpl>(i))) {
+      return false;
+    }
+  }
+  return true;
+}
+
+inline const org::apache::arrow::computeir::flatbuf::Relation *GetRelation(const void *buf) {
+  return flatbuffers::GetRoot<org::apache::arrow::computeir::flatbuf::Relation>(buf);
+}
+
+inline const org::apache::arrow::computeir::flatbuf::Relation *GetSizePrefixedRelation(const void *buf) {
+  return flatbuffers::GetSizePrefixedRoot<org::apache::arrow::computeir::flatbuf::Relation>(buf);
+}
+
+inline bool VerifyRelationBuffer(
+    flatbuffers::Verifier &verifier) {
+  return verifier.VerifyBuffer<org::apache::arrow::computeir::flatbuf::Relation>(nullptr);
+}
+
+inline bool VerifySizePrefixedRelationBuffer(
+    flatbuffers::Verifier &verifier) {
+  return verifier.VerifySizePrefixedBuffer<org::apache::arrow::computeir::flatbuf::Relation>(nullptr);
+}
+
+inline void FinishRelationBuffer(
+    flatbuffers::FlatBufferBuilder &fbb,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation> root) {
+  fbb.Finish(root);
+}
+
+inline void FinishSizePrefixedRelationBuffer(
+    flatbuffers::FlatBufferBuilder &fbb,
+    flatbuffers::Offset<org::apache::arrow::computeir::flatbuf::Relation> root) {
+  fbb.FinishSizePrefixed(root);
+}
+
+}  // namespace flatbuf
+}  // namespace computeir
+}  // namespace arrow
+}  // namespace apache
+}  // namespace org
+
+#endif  // FLATBUFFERS_GENERATED_RELATION_ORG_APACHE_ARROW_COMPUTEIR_FLATBUF_H_