org.apache.phoenix.schema.stats.NoOpStatsCollectorIT.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.phoenix.schema.stats.NoOpStatsCollectorIT.java

Source

/*
 * 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.
 */
package org.apache.phoenix.schema.stats;

import com.google.common.collect.Maps;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.phoenix.end2end.NeedsOwnMiniClusterTest;
import org.apache.phoenix.end2end.ParallelStatsDisabledIT;
import org.apache.phoenix.query.QueryServices;
import org.apache.phoenix.util.PropertiesUtil;
import org.apache.phoenix.util.ReadOnlyProps;
import org.apache.phoenix.util.SchemaUtil;
import org.apache.phoenix.util.TestUtil;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;

import java.sql.Array;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Map;
import java.util.Properties;

import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES;

/**
 * Tests the behavior of stats collection code when stats are disabled on server side
 * explicitly using QueryServices#STATS_COLLECTION_ENABLED property
 */
@Category(NeedsOwnMiniClusterTest.class)
public class NoOpStatsCollectorIT extends ParallelStatsDisabledIT {

    private static final Log LOG = LogFactory.getLog(NoOpStatsCollectorIT.class);

    private String fullTableName;
    private String physicalTableName;
    private Connection conn;

    /**
     * Disable stats on server side by setting QueryServices#STATS_COLLECTION_ENABLED to false
     */
    @BeforeClass
    public static void doSetup() throws Exception {
        Map<String, String> props = Maps.newHashMapWithExpectedSize(1);
        props.put(QueryServices.STATS_COLLECTION_ENABLED, Boolean.FALSE.toString());
        setUpTestDriver(new ReadOnlyProps(props.entrySet().iterator()));
    }

    @Before
    public void beforeTest() throws SQLException {
        String schemaName = generateUniqueName();
        String tableName = "T_" + generateUniqueName();
        fullTableName = SchemaUtil.getTableName(schemaName, tableName);
        physicalTableName = SchemaUtil.getPhysicalHBaseTableName(schemaName, tableName, false).getString();
        conn = getConnection();
        conn.createStatement()
                .execute("CREATE TABLE " + fullTableName + " ( k VARCHAR, a_string_array VARCHAR(100) ARRAY[4],"
                        + " b_string_array VARCHAR(100) ARRAY[4] \n"
                        + " CONSTRAINT pk PRIMARY KEY (k, b_string_array DESC)) GUIDE_POSTS_WIDTH = 10");
        upsertValues(conn, fullTableName);
    }

    /**
     * Update Statistics SQL statement should be disallowed
     */
    @Test
    public void testStatsCollectionViaSql() throws SQLException {
        String updateStatisticsSql = "UPDATE STATISTICS " + fullTableName;
        LOG.info("Running SQL to collect stats: " + updateStatisticsSql);
        Statement stmt = conn.createStatement();
        try {
            stmt.execute(updateStatisticsSql);
            Assert.fail("Update Statistics SQL should have failed");
        } catch (SQLException e) {
            Assert.assertEquals("StatsCollectionDisabledOnServerException expected", 1401, e.getErrorCode());
            Assert.assertEquals("StatsCollectionDisabledOnServerException expected", "STS01", e.getSQLState());
        }
    }

    /**
     * Major compaction should not compute / persist statistics
     */
    @Test
    public void testStatsCollectionDuringMajorCompaction() throws Exception {
        LOG.info("Running major compaction on table: " + physicalTableName);
        TestUtil.doMajorCompaction(conn, physicalTableName);

        String q1 = "SELECT SUM(GUIDE_POSTS_ROW_COUNT) FROM SYSTEM.STATS WHERE PHYSICAL_NAME = '"
                + physicalTableName + "'";
        ResultSet rs1 = conn.createStatement().executeQuery(q1);
        rs1.next();
        int rowCountFromStats = rs1.getInt(1);

        String q2 = "SELECT COUNT(*) FROM " + fullTableName;
        ResultSet rs2 = conn.createStatement().executeQuery(q2);
        rs2.next();
        int rowCountFromTable = rs2.getInt(1);

        Assert.assertTrue("Stats collection is disabled, hence row counts should not match",
                rowCountFromStats != rowCountFromTable);
        Assert.assertEquals("Stats collection is disabled, hence row counts from stats should be 0", 0,
                rowCountFromStats);
    }

    private Connection getConnection() throws SQLException {
        Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
        return DriverManager.getConnection(getUrl(), props);
    }

    private void upsertValues(Connection conn, String tableName) throws SQLException {
        PreparedStatement stmt = conn.prepareStatement("UPSERT INTO " + tableName + " VALUES(?,?,?)");
        stmt.setString(1, "a");
        String[] s = new String[] { "abc", "def", "ghi", "jkll", null, null, "xxx" };
        Array array = conn.createArrayOf("VARCHAR", s);
        stmt.setArray(2, array);
        s = new String[] { "abc", "def", "ghi", "jkll", null, null, null, "xxx" };
        array = conn.createArrayOf("VARCHAR", s);
        stmt.setArray(3, array);
        stmt.execute();
        conn.commit();
    }

}