.. 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.


.. SCOPE OF THIS SECTION
.. This section should include architectural overview
.. of the Arrow project. If possible the content should be
.. written in words easy understandable to beginner not
.. necessary acquainted with the library and the technical
.. details.

.. _architectural_overview:

**********************
Architectural Overview
**********************

A general overview of Apache Arrow project can be found on the
`front page <https://arrow.apache.org/>`_ and in the
`Apache Arrow Overview <https://arrow.apache.org/overview/>`_.
You can also have a look at the
`Frequently Asked Questions <https://arrow.apache.org/faq/>`_.

For an Architectural Overview of Arrow's libraries please
refer to:

- :ref:`py_arch_overview`
- R package Architecture can be found on this page.


R package Architectural Overview
--------------------------------

.. figure:: ../images/R_architectural_overview.png
   :alt: Main parts of R package architecture: dplyr-*,
         dplyr-funcs*, tools, tests and src/.

* The ``r/R/dplyr-*`` files define the verbs used in a regular
  dplyr syntax on Arrow objects.
* The ``r/R/dplyr-funcs*`` files define bindings to Arrow C++
  functions that can be used with already defined dplyr verbs.
* All the C++ code connected to the R package lives in ``arrow/r/src``.
  It also includes C++ code which connects libarrow (the Arrow C++
  library) and the R code in package.
* If the libarrow source package is bundled with R package using
  ``make sync-cpp`` command then it will be included in the
  ``r/tools/cpp`` folder.

**Additionally**

* The ``r/man`` directory includes generated R documentation that
  shouldn't be updated directly but in the corresponding ``.R`` file.
* The vignettes are
  `"a long-form guide to the package" <https://r-pkgs.org/vignettes.html#introduction>`_
  and can be found in ``r/vignettes``.
