.. Licensed to the Apache Software Foundation (ASF) under one
.. or more contributor license agreements.  See the NOTICE file
.. distributed with this work for additional information
.. regarding copyright ownership.  The ASF licenses this file
.. to you under the Apache License, Version 2.0 (the
.. "License"); you may not use this file except in compliance
.. with the License.  You may obtain a copy of the License at

..   http://www.apache.org/licenses/LICENSE-2.0

.. Unless required by applicable law or agreed to in writing,
.. software distributed under the License is distributed on an
.. "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
.. KIND, either express or implied.  See the License for the
.. specific language governing permissions and limitations
.. under the License.

=======
Dataset
=======

Interface
=========

.. doxygenclass:: arrow::dataset::Fragment
   :members:

.. doxygenclass:: arrow::dataset::Dataset
   :members:

Partitioning
============

.. doxygengroup:: dataset-partitioning
   :content-only:
   :members:

Dataset discovery/factories
===========================

.. doxygengroup:: dataset-discovery
   :content-only:
   :members:

Scanning
========

.. doxygengroup:: dataset-scanning
   :content-only:
   :members:

Concrete implementations
========================

.. doxygengroup:: dataset-implementations
   :content-only:
   :members:

File System Datasets
--------------------

.. doxygengroup:: dataset-filesystem
   :content-only:
   :members:

File Formats
------------

.. doxygengroup:: dataset-file-formats
   :content-only:
   :members:
