blob: 95ea0bab42462795f04c4dd1600b7e28b10be369 [file] [log] [blame]
/*
* 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.query;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HRegionLocation;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Mutation;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.client.TableDescriptor;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.security.User;
import org.apache.hadoop.hbase.util.Pair;
import org.apache.phoenix.compile.MutationPlan;
import org.apache.phoenix.coprocessorclient.MetaDataProtocol.MetaDataMutationResult;
import org.apache.phoenix.exception.SQLExceptionInfo;
import org.apache.phoenix.execute.MutationState;
import org.apache.phoenix.hbase.index.util.KeyValueBuilder;
import org.apache.phoenix.jdbc.PhoenixConnection;
import org.apache.phoenix.log.ConnectionLimiter;
import org.apache.phoenix.log.QueryLoggerDisruptor;
import org.apache.phoenix.parse.PFunction;
import org.apache.phoenix.schema.PColumn;
import org.apache.phoenix.schema.PMetaData;
import org.apache.phoenix.schema.PName;
import org.apache.phoenix.schema.PTable;
import org.apache.phoenix.schema.PTableType;
import org.apache.phoenix.schema.Sequence;
import org.apache.phoenix.schema.SequenceAllocation;
import org.apache.phoenix.schema.SequenceKey;
import org.apache.phoenix.schema.stats.GuidePostsInfo;
import org.apache.phoenix.schema.stats.GuidePostsKey;
import org.apache.phoenix.transaction.PhoenixTransactionClient;
import org.apache.phoenix.transaction.TransactionFactory;
public interface ConnectionQueryServices extends QueryServices, MetaDataMutated {
public static final int INITIAL_META_DATA_TABLE_CAPACITY = 100;
/**
* Get (and create if necessary) a child QueryService for a given tenantId.
* The QueryService will be cached for the lifetime of the parent QueryService
* @param tenantId the organization ID
* @return the child QueryService
*/
public ConnectionQueryServices getChildQueryServices(ImmutableBytesWritable tenantId);
/**
* Get Table by the given name. It is the callers
* responsibility to close the returned Table reference.
*
* @param tableName the name of the HTable
* @return Table interface. It is caller's responsibility to close this
* returned Table reference.
* @throws SQLException
*/
public Table getTable(byte[] tableName) throws SQLException;
/**
* Get Table by the given name. It is the responsibility of callers
* to close the returned Table interface. This method uses additional Admin
* API to ensure if table exists before returning Table interface from
* Connection. If table does not exist, this method will throw
* {@link org.apache.phoenix.schema.TableNotFoundException}
* It is caller's responsibility to close returned Table reference.
*
* @param tableName the name of the Table
* @return Table interface. It is caller's responsibility to close this
* returned Table reference.
* @throws SQLException If something goes wrong while retrieving table
* interface from connection managed by implementor. If table does not
* exist, {@link org.apache.phoenix.schema.TableNotFoundException} will
* be thrown.
*/
Table getTableIfExists(byte[] tableName) throws SQLException;
public TableDescriptor getTableDescriptor(byte[] tableName) throws SQLException;
public HRegionLocation getTableRegionLocation(byte[] tableName, byte[] row) throws SQLException;
/**
* Retrieve the region metadata locations for all regions of the given table.
* This method is Deprecated. Use {@link #getAllTableRegions(byte[], int)} instead.
*
* @param tableName The table name.
* @return The list of table region locations.
* @throws SQLException If fails to retrieve region locations.
*/
@Deprecated
public List<HRegionLocation> getAllTableRegions(byte[] tableName) throws SQLException;
/**
* Retrieve the region metadata locations for all regions of the given table.
* The operation to retrieve the table region locations must be completed within
* the query timeout.
*
* @param tableName Table name.
* @param queryTimeout Phoenix query timeout.
* @return The list of region locations.
* @throws SQLException If fails to retrieve region locations.
*/
public List<HRegionLocation> getAllTableRegions(byte[] tableName, int queryTimeout)
throws SQLException;
/**
* Retrieve table region locations that cover the startRowKey and endRowKey. The start key
* of the first region of the returned list must be less than or equal to startRowKey.
* The end key of the last region of the returned list must be greater than or equal to
* endRowKey.
* This method is Deprecated. Use {@link #getTableRegions(byte[], byte[], byte[], int)} instead.
*
* @param tableName Table name.
* @param startRowKey Start RowKey.
* @param endRowKey End RowKey.
* @return The list of region locations that cover the startRowKey and endRowKey key boundary.
* @throws SQLException If fails to retrieve region locations.
*/
@Deprecated
public List<HRegionLocation> getTableRegions(byte[] tableName, byte[] startRowKey,
byte[] endRowKey) throws SQLException;
/**
* Retrieve table region locations that cover the startRowKey and endRowKey. The start key
* of the first region of the returned list must be less than or equal to startRowKey.
* The end key of the last region of the returned list must be greater than or equal to
* endRowKey. The operation to retrieve the table region locations must be completed within
* the query timeout.
*
* @param tableName Table name.
* @param startRowKey Start RowKey.
* @param endRowKey End RowKey.
* @param queryTimeout Phoenix query timeout.
* @return The list of region locations that cover the startRowKey and endRowKey key boundary.
* @throws SQLException If fails to retrieve region locations.
*/
public List<HRegionLocation> getTableRegions(byte[] tableName, byte[] startRowKey,
byte[] endRowKey,
int queryTimeout) throws SQLException;
public PhoenixConnection connect(String url, Properties info) throws SQLException;
/**
* @param tableTimestamp timestamp of table if its present in the client side cache
* @param clientTimetamp if the client connection has an scn, or of the table is transactional
* the txn write pointer
* @return PTable for the given tenant id, schema and table name
*/
public MetaDataMutationResult getTable(PName tenantId, byte[] schemaName, byte[] tableName,
long tableTimestamp, long clientTimetamp) throws SQLException;
public MetaDataMutationResult getFunctions(PName tenantId, List<Pair<byte[], Long>> functionNameAndTimeStampPairs, long clientTimestamp) throws SQLException;
public MetaDataMutationResult createTable(List<Mutation> tableMetaData, byte[] tableName, PTableType tableType,
Map<String, Object> tableProps,
List<Pair<byte[], Map<String, Object>>> families, byte[][] splits,
boolean isNamespaceMapped, boolean allocateIndexId,
boolean isDoNotUpgradePropSet, PTable parentTable) throws SQLException;
public MetaDataMutationResult dropTable(List<Mutation> tableMetadata, PTableType tableType, boolean cascade) throws SQLException;
public MetaDataMutationResult dropFunction(List<Mutation> tableMetadata, boolean ifExists) throws SQLException;
public MetaDataMutationResult addColumn(List<Mutation> tableMetaData,
PTable table,
PTable parentTable,
PTable transformingNewTable,
Map<String, List<Pair<String, Object>>> properties,
Set<String> colFamiliesForPColumnsToBeAdded,
List<PColumn> columns) throws SQLException;
public MetaDataMutationResult dropColumn(List<Mutation> tableMetadata,
PTableType tableType, PTable parentTable) throws SQLException;
public MetaDataMutationResult updateIndexState(List<Mutation> tableMetadata, String parentTableName) throws SQLException;
public MetaDataMutationResult updateIndexState(List<Mutation> tableMetadata, String parentTableName, Map<String, List<Pair<String,Object>>> stmtProperties, PTable table) throws SQLException;
public MutationState updateData(MutationPlan plan) throws SQLException;
public void init(String url, Properties props) throws SQLException;
public int getLowestClusterHBaseVersion();
public Admin getAdmin() throws SQLException;
void clearTableRegionCache(TableName name) throws SQLException;
boolean hasIndexWALCodec();
long createSequence(String tenantId, String schemaName, String sequenceName, long startWith, long incrementBy, long cacheSize, long minValue, long maxValue, boolean cycle, long timestamp) throws SQLException;
long dropSequence(String tenantId, String schemaName, String sequenceName, long timestamp) throws SQLException;
void validateSequences(List<SequenceAllocation> sequenceAllocations, long timestamp, long[] values, SQLException[] exceptions, Sequence.ValueOp action) throws SQLException;
void incrementSequences(List<SequenceAllocation> sequenceAllocation, long timestamp, long[] values, SQLException[] exceptions) throws SQLException;
long currentSequenceValue(SequenceKey sequenceKey, long timestamp) throws SQLException;
void returnSequences(List<SequenceKey> sequenceKeys, long timestamp, SQLException[] exceptions) throws SQLException;
MetaDataMutationResult createFunction(List<Mutation> functionData, PFunction function, boolean temporary) throws SQLException;
void addConnection(PhoenixConnection connection) throws SQLException;
void removeConnection(PhoenixConnection connection) throws SQLException;
/**
* @return the {@link KeyValueBuilder} that is valid for the locally installed version of HBase.
*/
public KeyValueBuilder getKeyValueBuilder();
public enum Feature {LOCAL_INDEX, RENEW_LEASE};
public boolean supportsFeature(Feature feature);
public String getUserName();
public void clearTableFromCache(final byte[] tenantId, final byte[] schemaName, final byte[] tableName, long clientTS) throws SQLException;
public GuidePostsInfo getTableStats(GuidePostsKey key) throws SQLException;
/**
* Removes cache {@link GuidePostsInfo} for the table with the given name. If no cached guideposts are present, this does nothing.
*
* @param key
*/
void invalidateStats(GuidePostsKey key);
public long clearCache() throws SQLException;
public int getSequenceSaltBuckets();
public long getRenewLeaseThresholdMilliSeconds();
public boolean isRenewingLeasesEnabled();
public MetaDataMutationResult createSchema(List<Mutation> schemaMutations, String schemaName) throws SQLException;
MetaDataMutationResult getSchema(String schemaName, long clientTimestamp) throws SQLException;
public MetaDataMutationResult dropSchema(List<Mutation> schemaMetaData, String schemaName) throws SQLException;
boolean isUpgradeRequired();
void clearUpgradeRequired();
void upgradeSystemTables(String url, Properties props) throws SQLException;
public Configuration getConfiguration();
public User getUser();
public QueryLoggerDisruptor getQueryDisruptor();
public PhoenixTransactionClient initTransactionClient(TransactionFactory.Provider provider) throws SQLException;
/**
* Writes a cell to SYSTEM.MUTEX using checkAndPut to ensure only a single client can execute a
* particular task. The params are used to generate the rowkey.
* @return true if this client was able to successfully acquire the mutex
*/
public boolean writeMutexCell(String tenantId, String schemaName, String tableName,
String columnName, String familyName) throws SQLException;
/**
* Deletes a cell that was written to SYSTEM.MUTEX. The params are used to generate the rowkey.
*/
public void deleteMutexCell(String tenantId, String schemaName, String tableName,
String columnName, String familyName) throws SQLException;
/**
* Close all phoenix connections created using this CQS.
*
* @param reasonBuilder exception builder for building reasons why connection is closed.
*/
default void closeAllConnections(SQLExceptionInfo.Builder reasonBuilder) {
throw new UnsupportedOperationException();
}
PMetaData getMetaDataCache();
public default ConnectionLimiter getConnectionLimiter() {
throw new UnsupportedOperationException();
}
int getConnectionCount(boolean isInternal);
}