| /* |
| * 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 java.io.IOException; |
| import java.util.Set; |
| |
| import org.apache.hadoop.hbase.TableName; |
| import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment; |
| import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData; |
| import org.apache.phoenix.query.QueryServices; |
| |
| import com.google.common.collect.Sets; |
| |
| /** |
| * Provides new {@link StatisticsCollector} instances based on configuration settings for a |
| * table (or system-wide configuration of statistics). |
| */ |
| public class StatisticsCollectorFactory { |
| |
| public static StatisticsCollector createStatisticsCollector(RegionCoprocessorEnvironment env, |
| String tableName, long clientTimestamp, byte[] guidepostWidthBytes, |
| byte[] guidepostsPerRegionBytes) throws IOException { |
| if (statisticsEnabled(env)) { |
| return new DefaultStatisticsCollector(env, tableName, clientTimestamp, null, |
| guidepostWidthBytes, guidepostsPerRegionBytes); |
| } else { |
| return new NoOpStatisticsCollector(); |
| } |
| } |
| |
| public static StatisticsCollector createStatisticsCollector( |
| RegionCoprocessorEnvironment env, String tableName, long clientTimeStamp, |
| byte[] storeName) throws IOException { |
| if (statisticsEnabled(env)) { |
| return new DefaultStatisticsCollector(env, tableName, clientTimeStamp, storeName, |
| null, null); |
| } else { |
| return new NoOpStatisticsCollector(); |
| } |
| } |
| |
| // TODO: make this declarative through new DISABLE_STATS column on SYSTEM.CATALOG table. |
| // Also useful would be a USE_CURRENT_TIME_FOR_STATS column on SYSTEM.CATALOG table. |
| private static final Set<TableName> DISABLE_STATS = Sets.newHashSetWithExpectedSize(3); |
| static { |
| DISABLE_STATS.add(TableName.valueOf(PhoenixDatabaseMetaData.SYSTEM_CATALOG_NAME)); |
| DISABLE_STATS.add(TableName.valueOf(PhoenixDatabaseMetaData.SYSTEM_FUNCTION_NAME)); |
| DISABLE_STATS.add(TableName.valueOf(PhoenixDatabaseMetaData.SEQUENCE_FULLNAME)); |
| } |
| |
| /** |
| * Determines if statistics are enabled (which is the default). This is done on the |
| * RegionCoprocessorEnvironment for now to allow setting this on a per-table basis, although |
| * it could be moved to the general table metadata in the future if there is a realistic |
| * use case for that. |
| */ |
| private static boolean statisticsEnabled(RegionCoprocessorEnvironment env) { |
| return env.getConfiguration().getBoolean(QueryServices.STATS_ENABLED_ATTRIB, true) && |
| !DISABLE_STATS.contains(env.getRegionInfo().getTable()); |
| } |
| |
| } |