/**
* Copyright 2013 Cloudera Inc.
*
* Licensed 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 com.cloudera.cdk.data.hbase.impl;
import com.cloudera.cdk.data.PartitionKey;
import com.cloudera.cdk.data.PartitionStrategy;
import org.apache.hadoop.hbase.client.HTablePool;
/**
* A DAO implementation that uses a constructor provided EntityMapper to do
* basic conversion between entities and HBase Gets and Puts.
*
* @param <E>
* The entity type.
*/
public class BaseDao<E> implements Dao<E> {
private final String tableName;
private final EntityMapper<E> entityMapper;
private final HBaseClientTemplate clientTemplate;
/**
* Constructor that will internally create an HBaseClientTemplate from the
* tablePool and the tableName.
*
* @param transactionManager
* The TransactionManager that will manage transactional entities.
* @param tablePool
* A pool of HBase Tables.
* @param tableName
* The name of the table this dao persists to and fetches from.
* @param entityMapper
* Maps between entities and the HBase operations.
*/
public BaseDao(HTablePool tablePool, String tableName,
EntityMapper<E> entityMapper) {
this.tableName = tableName;
this.entityMapper = entityMapper;
this.clientTemplate = new HBaseClientTemplate(tablePool, tableName);
}
/**
* Constructor that copies an existing dao.
*
* @param dao
* Dao to copy.
*/
public BaseDao(BaseDao<E> dao) {
this.tableName = dao.tableName;
this.clientTemplate = new HBaseClientTemplate(dao.clientTemplate);
this.entityMapper = dao.entityMapper;
}
@Override
public E get(PartitionKey key) {
return clientTemplate.get(key, entityMapper);
}
@Override
public boolean put(E entity) {
return clientTemplate.put(entity, entityMapper);
}
@Override
public long increment(PartitionKey key, String fieldName, long amount) {
return clientTemplate.increment(key, fieldName, amount, entityMapper);
}
public void delete(PartitionKey key) {
clientTemplate.delete(key, entityMapper.getRequiredColumns(), null,
entityMapper.getKeySerDe());
}
@Override
public boolean delete(E entity) {
VersionCheckAction checkAction = entityMapper.mapFromEntity(entity)
.getVersionCheckAction();
PartitionKey key = getPartitionStrategy().partitionKeyForEntity(entity);
return clientTemplate.delete(key, entityMapper.getRequiredColumns(),
checkAction, entityMapper.getKeySerDe());
}
@Override
public EntityScanner<E> getScanner() {
return getScanner(null, null);
}
@Override
public EntityScanner<E> getScanner(PartitionKey startKey, PartitionKey stopKey) {
return getScanner(startKey, true, stopKey, true);
}
@Override
public EntityScanner<E> getScanner(PartitionKey startKey,
boolean startInclusive, PartitionKey stopKey, boolean stopInclusive) {
return clientTemplate.getScannerBuilder(entityMapper).setStartKey(startKey)
.setStartInclusive(startInclusive).setStopKey(stopKey)
.setStopInclusive(stopInclusive).build();
}
public EntityScannerBuilder<E> getScannerBuilder() {
return clientTemplate.getScannerBuilder(entityMapper);
}
@Override
public EntityBatch<E> newBatch(long writeBufferSize) {
return clientTemplate.createBatch(entityMapper, writeBufferSize);
}
@Override
public EntityBatch<E> newBatch() {
return clientTemplate.createBatch(entityMapper);
}
/**
* Get the HBaseClientTemplate instance this DAO is using to interact with
* HBase.
*
* @return The HBaseClientTemplate instance.
*/
public HBaseClientTemplate getHBaseClientTemplate() {
return clientTemplate;
}
@Override
public KeySchema getKeySchema() {
return entityMapper.getKeySchema();
}
@Override
public EntitySchema getEntitySchema() {
return entityMapper.getEntitySchema();
}
/**
* Gets the key serde for this DAO
*
* @return The KeySerDe
*/
public KeySerDe getKeySerDe() {
return entityMapper.getKeySerDe();
}
/**
* Gets the entity serde for this DAO
*
* @return The EntitySerDe
*/
public EntitySerDe<E> getEntitySerDe() {
return entityMapper.getEntitySerDe();
}
/**
* Gets the EntityMapper for this DAO.
*
* @return EntityMapper
*/
public EntityMapper<E> getEntityMapper() {
return this.entityMapper;
}
public String getTableName() {
return tableName;
}
@Override
public PartitionStrategy getPartitionStrategy() {
return entityMapper.getKeySchema().getPartitionStrategy();
}
}