package org.hivedb.services;
import org.hibernate.shards.strategy.access.ShardAccessStrategy;
import org.hivedb.Hive;
import org.hivedb.configuration.EntityConfig;
import org.hivedb.hibernate.*;
import java.io.Serializable;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class BaseClassDaoService<T,ID extends Serializable> implements ClassDaoService<T,ID> {
protected EntityConfig config;
protected DataAccessObject<Object, Serializable> dao;
@SuppressWarnings("unchecked")
public static BaseClassDaoService create(Class<?> clazz, Hive hive, ShardAccessStrategy strategy) {
ConfigurationReader reader = new ConfigurationReader(clazz);
List classes = Collections.singletonList(clazz);
HiveSessionFactory factory = new HiveSessionFactoryBuilderImpl(hive.getUri(), classes, strategy);
BaseDataAccessObject dao = new BaseDataAccessObject(reader.getEntityConfig(clazz.getName()), hive, factory);
return new BaseClassDaoService(reader.getEntityConfig(clazz.getName()), dao);
}
public BaseClassDaoService(EntityConfig config, DataAccessObject<Object, Serializable> dao) {
this.config = config;
this.dao = dao;
}
@SuppressWarnings("unchecked")
public ID delete(ID id) {
return (ID) dao.delete(id);
}
public boolean exists(ID id) {
return dao.exists(id);
}
@SuppressWarnings("unchecked")
public T get(ID id) {
return (T) dao.get(id);
}
@SuppressWarnings("unchecked")
public Collection<T> getByReference(String property, Object referenceKey) {
return (Collection<T>) dao.findByProperty(property, referenceKey);
}
@SuppressWarnings("unchecked")
public Collection<T> getByReferenceRange(String property, Object start, Object end) {
return (Collection<T>) dao.findByPropertyRange(property, start, end);
}
public String getPersistedClass() {
return config.getRepresentedInterface().getName();
}
@SuppressWarnings("unchecked")
public T save(T obj) {
return (T) dao.save(obj);
}
@SuppressWarnings("unchecked")
public Collection<T> saveAll(Collection<T> instances) {
return (Collection<T>) dao.saveAll((Collection<Object>)instances);
}
//Debugging
@SuppressWarnings("unchecked")
public Collection<T> getAll() {
return (Collection<T>)dao.getAll();
}
public Collection<T> queryDataIndex(String joinTableName, Object primaryIndexKey) {
return (Collection<T>)dao.queryDataIndex(joinTableName, primaryIndexKey);
}
public Integer getCountByReference(String property, Object referenceKey) {
return dao.getCount(property, referenceKey);
}
}