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

=====
Table
=====

Table
=====

A :class:`~pyflink.table.Table` object is the core abstraction of the Table API.
Similar to how the DataStream API has DataStream,
the Table API is built around :class:`~pyflink.table.Table`.

A :class:`~pyflink.table.Table` object describes a pipeline of data transformations. It does not
contain the data itself in any way. Instead, it describes how to read data from a table source,
and how to eventually write data to a table sink. The declared pipeline can be
printed, optimized, and eventually executed in a cluster. The pipeline can work with bounded or
unbounded streams which enables both streaming and batch scenarios.

By the definition above, a :class:`~pyflink.table.Table` object can actually be considered as
a view in SQL terms.

The initial :class:`~pyflink.table.Table` object is constructed by a
:class:`~pyflink.table.TableEnvironment`. For example,
:func:`~pyflink.table.TableEnvironment.from_path` obtains a table from a catalog.
Every :class:`~pyflink.table.Table` object has a schema that is available through
:func:`~pyflink.table.Table.get_schema`. A :class:`~pyflink.table.Table` object is
always associated with its original table environment during programming.

Every transformation (i.e. :func:`~pyflink.table.Table.select`} or
:func:`~pyflink.table.Table.filter` on a :class:`~pyflink.table.Table` object leads to a new
:class:`~pyflink.table.Table` object.

Use :func:`~pyflink.table.Table.execute` to execute the pipeline and retrieve the transformed
data locally during development. Otherwise, use :func:`~pyflink.table.Table.execute_insert` to
write the data into a table sink.

Many methods of this class take one or more :class:`~pyflink.table.Expression` as parameters.
For fluent definition of expressions and easier readability, we recommend to add a star import:

Example:
::

    >>> from pyflink.table.expressions import *

Check the documentation for more programming language specific APIs.

The following example shows how to work with a :class:`~pyflink.table.Table` object.

Example:
::

    >>> from pyflink.table import EnvironmentSettings, TableEnvironment
    >>> from pyflink.table.expressions import *
    >>> env_settings = EnvironmentSettings.in_streaming_mode()
    >>> t_env = TableEnvironment.create(env_settings)
    >>> table = t_env.from_path("my_table").select(col("colA").trim(), col("colB") + 12)
    >>> table.execute().print()

.. currentmodule:: pyflink.table

.. autosummary::
    :toctree: api/

    Table.add_columns
    Table.add_or_replace_columns
    Table.aggregate
    Table.alias
    Table.distinct
    Table.drop_columns
    Table.drop_columns
    Table.execute
    Table.execute_insert
    Table.explain
    Table.print_explain
    Table.fetch
    Table.filter
    Table.flat_aggregate
    Table.flat_map
    Table.full_outer_join
    Table.get_schema
    Table.get_resolved_schema
    Table.group_by
    Table.intersect
    Table.intersect_all
    Table.join
    Table.join_lateral
    Table.left_outer_join
    Table.left_outer_join_lateral
    Table.limit
    Table.map
    Table.minus
    Table.minus_all
    Table.offset
    Table.order_by
    Table.over_window
    Table.print_schema
    Table.rename_columns
    Table.right_outer_join
    Table.select
    Table.to_pandas
    Table.union
    Table.union_all
    Table.where
    Table.window


GroupedTable
============

A table that has been grouped on a set of grouping keys.

.. currentmodule:: pyflink.table

.. autosummary::
    :toctree: api/

    GroupedTable.select
    GroupedTable.aggregate
    GroupedTable.flat_aggregate


GroupWindowedTable
==================

A table that has been windowed for :class:`~pyflink.table.GroupWindow`.

.. currentmodule:: pyflink.table

.. autosummary::
    :toctree: api/

    GroupWindowedTable.group_by


WindowGroupedTable
==================

A table that has been windowed and grouped for :class:`~pyflink.table.window.GroupWindow`.

.. currentmodule:: pyflink.table

.. autosummary::
    :toctree: api/

    WindowGroupedTable.select
    WindowGroupedTable.aggregate


OverWindowedTable
=================

A table that has been windowed for :class:`~pyflink.table.window.OverWindow`.

Unlike group windows, which are specified in the GROUP BY clause, over windows do not collapse
rows. Instead over window aggregates compute an aggregate for each input row over a range of
its neighboring rows.

.. currentmodule:: pyflink.table

.. autosummary::
    :toctree: api/

    OverWindowedTable.select


AggregatedTable
===============

A table that has been performed on the aggregate function.

.. currentmodule:: pyflink.table.table

.. autosummary::
    :toctree: api/

    AggregatedTable.select


FlatAggregateTable
==================

A table that performs flatAggregate on a :class:`~pyflink.table.Table`, a
:class:`~pyflink.table.GroupedTable` or a :class:`~pyflink.table.WindowGroupedTable`

.. currentmodule:: pyflink.table.table

.. autosummary::
    :toctree: api/

    FlatAggregateTable.select
