/**
* 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 org.kitesdk.data.hbase;
import com.google.common.base.Preconditions;
import java.net.URI;
import java.util.List;
import org.apache.avro.generic.IndexedRecord;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.mapreduce.InputFormat;
import org.kitesdk.data.DatasetDescriptor;
import org.kitesdk.data.Key;
import org.kitesdk.data.hbase.impl.BaseDao;
import org.kitesdk.data.hbase.impl.CompositeBaseDao;
import org.kitesdk.data.hbase.impl.DeleteActionModifier;
import org.kitesdk.data.hbase.impl.GetModifier;
import org.kitesdk.data.hbase.impl.PutActionModifier;
import org.kitesdk.data.hbase.impl.ScanModifier;
import org.kitesdk.data.hbase.spi.HBaseActionModifiable;
import org.kitesdk.data.impl.Accessor;
import org.kitesdk.data.spi.PartitionKey;
import org.kitesdk.data.PartitionStrategy;
import org.kitesdk.data.RandomAccessDataset;
import org.kitesdk.data.RefinableView;
import org.kitesdk.data.hbase.impl.Dao;
import org.kitesdk.data.spi.AbstractDataset;
import org.kitesdk.data.spi.Constraints;
import org.kitesdk.data.spi.InputFormatAccessor;
class DaoDataset<E> extends AbstractDataset<E> implements RandomAccessDataset<E>,
InputFormatAccessor<E>, HBaseActionModifiable {
private final String namespace;
private final String name;
private final Dao<E> dao;
private final DatasetDescriptor descriptor;
private final URI uri;
private final DaoView<E> unbounded;
public DaoDataset(String namespace, String name, Dao<E> dao, DatasetDescriptor descriptor,
URI uri, Class<E> type) {
super(type, descriptor.getSchema());
Preconditions.checkArgument(IndexedRecord.class.isAssignableFrom(type) ||
type == Object.class,
"HBase only supports the generic and specific data models. The entity"
+ " type must implement IndexedRecord");
this.namespace = namespace;
this.name = name;
this.dao = dao;
this.descriptor = descriptor;
this.uri = uri;
this.unbounded = new DaoView<E>(this, type);
}
Dao<E> getDao() {
return dao;
}
@Override
public String getName() {
return name;
}
@Override
public String getNamespace() {
return namespace;
}
@Override
public URI getUri() {
return uri;
}
@Override
public DatasetDescriptor getDescriptor() {
return descriptor;
}
@Override
protected RefinableView<E> asRefinableView() {
return unbounded;
}
@Override
public boolean isEmpty() {
return unbounded.isEmpty();
}
@Override
public DaoView<E> filter(Constraints c) {
return unbounded.filter(c);
}
@Override
@SuppressWarnings("deprecation")
public E get(Key key) {
return dao.get(keyFor(getDescriptor().getPartitionStrategy(), key));
}
@Override
public boolean put(E entity) {
return dao.put(entity);
}
@Override
@SuppressWarnings("deprecation")
public long increment(Key key, String fieldName, long amount) {
return dao.increment(keyFor(getDescriptor().getPartitionStrategy(), key), fieldName, amount);
}
@Override
@SuppressWarnings("deprecation")
public void delete(Key key) {
dao.delete(keyFor(getDescriptor().getPartitionStrategy(), key));
}
@Override
public boolean delete(E entity) {
return dao.delete(entity);
}
@Deprecated
static PartitionKey keyFor(PartitionStrategy strategy, Key key) {
final int size = Accessor.getDefault().getFieldPartitioners(strategy).size();
final Object[] values = new Object[size];
for (int i = 0; i < size; i += 1) {
values[i] = key.get(i);
}
return new PartitionKey(values);
}
@Override
public InputFormat<E, Void> getInputFormat(Configuration conf) {
return new HBaseViewKeyInputFormat<E>(this);
}
@SuppressWarnings("unchecked")
private BaseDao<E> getBaseDao() {
Dao<E> dao = getDao();
if(dao instanceof CompositeBaseDao) {
dao = ((CompositeBaseDao) dao).getDao();
}
if (dao instanceof BaseDao) {
return (BaseDao<E>) dao;
}
throw new UnsupportedOperationException(
"Action not supported for Dao " + dao.getClass());
}
@Override
public void registerGetModifier(GetModifier getModifier) {
getBaseDao().getHBaseClientTemplate().registerGetModifier(getModifier);
}
@Override
public List<GetModifier> getGetModifiers() {
return getBaseDao().getHBaseClientTemplate().getGetModifiers();
}
@Override
public void registerPutActionModifier(
PutActionModifier putActionModifier) {
getBaseDao().getHBaseClientTemplate()
.registerPutActionModifier(putActionModifier);
}
@Override
public List<PutActionModifier> getPutActionModifiers() {
return getBaseDao().getHBaseClientTemplate().getPutActionModifiers();
}
@Override
public void registerDeleteModifier(
DeleteActionModifier deleteActionModifier) {
getBaseDao().getHBaseClientTemplate()
.registerDeleteModifier(deleteActionModifier);
}
@Override
public List<DeleteActionModifier> getDeleteActionModifiers() {
return getBaseDao().getHBaseClientTemplate().getDeleteActionModifiers();
}
@Override
public void registerScanModifier(ScanModifier scanModifier) {
getBaseDao().getHBaseClientTemplate().registerScanModifier(scanModifier);
}
@Override
public List<ScanModifier> getScanModifiers() {
return getBaseDao().getHBaseClientTemplate().getScanModifiers();
}
@Override
public void clearGetModifiers() {
getBaseDao().getHBaseClientTemplate().clearGetModifiers();
}
@Override
public void clearPutActionModifiers() {
getBaseDao().getHBaseClientTemplate().clearPutActionModifiers();
}
@Override
public void clearDeleteActionModifiers() {
getBaseDao().getHBaseClientTemplate().clearDeleteActionModifiers();
}
@Override
public void clearScanModifiers() {
getBaseDao().getHBaseClientTemplate().clearScanModifiers();
}
@Override
public void clearAllModifiers() {
clearGetModifiers();
clearPutActionModifiers();
clearDeleteActionModifiers();
clearScanModifiers();
}
}