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

import pytest
from tests.common.custom_cluster_test_suite import CustomClusterTestSuite
from tests.common.test_dimensions import (
    create_exec_option_dimension,
    create_single_exec_option_dimension,
    create_uncompressed_text_dimension)

class TestStatsExtrapolation(CustomClusterTestSuite):
  """Minimal end-to-end test for the --enable_stats_extrapolation impalad flag. This test
  primarly checks that the flag is propagated to the FE. More testing is done in FE unit
  tests and metadata/test_stats_extrapolation.py."""

  @classmethod
  def get_workload(self):
    return 'functional-query'

  @classmethod
  def add_test_dimensions(cls):
    super(TestStatsExtrapolation, cls).add_test_dimensions()
    cls.ImpalaTestMatrix.add_dimension(create_single_exec_option_dimension())
    cls.ImpalaTestMatrix.add_dimension(
        create_uncompressed_text_dimension(cls.get_workload()))

  @pytest.mark.execute_serially
  @CustomClusterTestSuite.with_args(impalad_args="--enable_stats_extrapolation=true")
  def test_stats_extrapolation(self, vector, unique_database):
    # Test row count extrapolation
    self.client.execute("set explain_level=2")
    explain_result = self.client.execute("explain select * from functional.alltypes")
    assert "extrapolated-rows=7300" in " ".join(explain_result.data)
    # Test COMPUTE STATS TABLESAMPLE
    part_test_tbl = unique_database + ".alltypes"
    self.clone_table("functional.alltypes", part_test_tbl, True, vector)
    self.client.execute(
        "compute stats {0} tablesample system (13)".format(part_test_tbl))
    # Check that column stats were set.
    col_stats = self.client.execute("show column stats {0}".format(part_test_tbl))
    col_names = [fs.name.upper() for fs in col_stats.schema.fieldSchemas]
    ndv_col_idx = col_names.index("#DISTINCT VALUES")
    for row in col_stats.data:
      assert int(row.split("\t")[ndv_col_idx]) >= 0
