All Downloads are FREE. Search and download functionalities are using the official Maven repository.

info.archinnov.achilles.iterator.factory.ThriftKeyValueFactory Maven / Gradle / Ivy

package info.archinnov.achilles.iterator.factory;

import static info.archinnov.achilles.helper.ThriftLoggerHelper.format;
import info.archinnov.achilles.context.ThriftPersistenceContext;
import info.archinnov.achilles.dao.ThriftGenericEntityDao;
import info.archinnov.achilles.entity.metadata.EntityMeta;
import info.archinnov.achilles.entity.metadata.PropertyMeta;
import info.archinnov.achilles.entity.operations.ThriftEntityProxifier;
import info.archinnov.achilles.helper.ThriftJoinEntityHelper;
import info.archinnov.achilles.type.Counter;
import info.archinnov.achilles.type.KeyValue;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import me.prettyprint.hector.api.beans.Composite;
import me.prettyprint.hector.api.beans.HColumn;
import me.prettyprint.hector.api.beans.HCounterColumn;

import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.collect.Lists;

/**
 * ThriftKeyValueFactory
 * 
 * @author DuyHai DOAN
 * 
 */
public class ThriftKeyValueFactory
{
	private static final Logger log = LoggerFactory.getLogger(ThriftKeyValueFactory.class);

	private ThriftJoinEntityHelper joinHelper = new ThriftJoinEntityHelper();
	private ThriftEntityProxifier proxifier = new ThriftEntityProxifier();
	private ThriftCompositeTransformer thriftCompositeTransformer = new ThriftCompositeTransformer();

	public  KeyValue createKeyValue(ThriftPersistenceContext context,
			PropertyMeta propertyMeta, HColumn hColumn)
	{
		log.trace("Build key/value for property {} of entity class {}",
				propertyMeta.getPropertyName(), propertyMeta.getEntityClassName());
		return thriftCompositeTransformer.buildKeyValue(context, propertyMeta, hColumn);
	}

	public  K createKey(PropertyMeta propertyMeta, HColumn hColumn)
	{
		log.trace("Build key for property {} of entity class {}", propertyMeta.getPropertyName(),
				propertyMeta.getEntityClassName());
		return thriftCompositeTransformer.buildKey(propertyMeta, hColumn);
	}

	public  V createValue(ThriftPersistenceContext context, PropertyMeta propertyMeta,
			HColumn hColumn)
	{
		log.trace("Build key value for property {} of entity class {}",
				propertyMeta.getPropertyName(), propertyMeta.getEntityClassName());
		return thriftCompositeTransformer.buildValue(context, propertyMeta, hColumn);
	}

	public Integer createTtl(HColumn hColumn)
	{
		log.debug("Build ttl from Hcolumn {}", format(hColumn.getName()));
		return hColumn.getTtl();
	}

	public  List createValueList(PropertyMeta propertyMeta,
			List> hColumns)
	{
		log.trace("Build value list for property {} of entity class {}",
				propertyMeta.getPropertyName(), propertyMeta.getEntityClassName());
		return Lists.transform(hColumns,
				thriftCompositeTransformer.buildValueTransformer(propertyMeta));
	}

	public  List createKeyList(PropertyMeta propertyMeta,
			List> hColumns)
	{
		log.trace("Build key list for property {} of entity class {}",
				propertyMeta.getPropertyName(), propertyMeta.getEntityClassName());
		return Lists.transform(hColumns,
				thriftCompositeTransformer.buildKeyTransformer(propertyMeta));
	}

	public  List> createKeyValueList(ThriftPersistenceContext context,
			PropertyMeta propertyMeta, List> hColumns)
	{
		log.trace("Build key/value list for property {} of entity class {}",
				propertyMeta.getPropertyName(), propertyMeta.getEntityClassName());
		return Lists.transform(hColumns,
				thriftCompositeTransformer.buildKeyValueTransformer(context, propertyMeta));
	}

	public  List createJoinValueList(ThriftPersistenceContext context,
			PropertyMeta propertyMeta, List> hColumns)
	{
		log.trace("Build join value list for property {} of entity class {}",
				propertyMeta.getPropertyName(), propertyMeta.getEntityClassName());

		List result = new ArrayList();

		if (CollectionUtils.isNotEmpty(hColumns))
		{

			EntityMeta joinMeta = propertyMeta.joinMeta();

			List joinIds = Lists.transform(hColumns,
					thriftCompositeTransformer.buildRawValueTransformer());

			Map joinEntities = loadJoinEntities(context, propertyMeta, joinMeta, joinIds);

			for (Object joinId : joinIds)
			{
				V proxy = buildProxy(context, joinMeta, joinEntities, joinId);
				result.add(proxy);
			}
		}

		return result;
	}

	public  List> createJoinKeyValueList(ThriftPersistenceContext context,
			PropertyMeta propertyMeta, List> hColumns)
	{
		log.trace("Build join key/value list for property {} of entity class {}",
				propertyMeta.getPropertyName(), propertyMeta.getEntityClassName());

		List> result = new ArrayList>();

		if (CollectionUtils.isNotEmpty(hColumns))
		{

			EntityMeta joinMeta = propertyMeta.joinMeta();
			List keys = Lists.transform(hColumns,
					thriftCompositeTransformer.buildKeyTransformer(propertyMeta));
			List joinIds = Lists.transform(hColumns,
					thriftCompositeTransformer.buildRawValueTransformer());

			Map joinEntities = loadJoinEntities(context, propertyMeta, joinMeta, joinIds);

			List ttls = Lists.transform(hColumns,
					thriftCompositeTransformer.buildTtlTransformer());

			List timestamps = Lists.transform(hColumns,
					thriftCompositeTransformer.buildTimestampTransformer());

			for (int i = 0; i < keys.size(); i++)
			{
				V proxy = buildProxy(context, joinMeta, joinEntities, joinIds.get(i));
				result.add(new KeyValue(keys.get(i), proxy, ttls.get(i), timestamps.get(i)));
			}
		}
		return result;
	}

	// Counter
	public  KeyValue createCounterKeyValue(ThriftPersistenceContext context,
			PropertyMeta propertyMeta, HCounterColumn hColumn)
	{
		log.trace("Build counter key/value for property {} of entity class {}",
				propertyMeta.getPropertyName(), propertyMeta.getEntityClassName());
		return thriftCompositeTransformer.buildCounterKeyValue(context, propertyMeta, hColumn);
	}

	public  K createCounterKey(PropertyMeta propertyMeta,
			HCounterColumn hColumn)
	{
		log.trace("Build counter key for property {} of entity class {}",
				propertyMeta.getPropertyName(), propertyMeta.getEntityClassName());
		return thriftCompositeTransformer.buildCounterKey(propertyMeta, hColumn);
	}

	public  Counter createCounterValue(ThriftPersistenceContext context,
			PropertyMeta propertyMeta, HCounterColumn hColumn)
	{
		log.trace("Build counter value for property {} of entity class {}",
				propertyMeta.getPropertyName(), propertyMeta.getEntityClassName());
		return thriftCompositeTransformer.buildCounterValue(context, propertyMeta, hColumn);
	}

	public  List> createCounterKeyValueList(
			ThriftPersistenceContext context, PropertyMeta propertyMeta,
			List> hColumns)
	{
		log.trace("Build counter key/value list for property {} of entity class {}",
				propertyMeta.getPropertyName(), propertyMeta.getEntityClassName());
		return Lists.transform(hColumns,
				thriftCompositeTransformer.buildCounterKeyValueTransformer(context, propertyMeta));
	}

	public  List createCounterValueList(ThriftPersistenceContext context,
			PropertyMeta propertyMeta, List> hColumns)
	{
		log.trace("Build counter value lsit for property {} of entity class {}",
				propertyMeta.getPropertyName(), propertyMeta.getEntityClassName());
		return Lists.transform(hColumns,
				thriftCompositeTransformer.buildCounterValueTransformer(context, propertyMeta));
	}

	public  List createCounterKeyList(PropertyMeta propertyMeta,
			List> hColumns)
	{
		log.trace("Build counter key list for property {} of entity class {}",
				propertyMeta.getPropertyName(), propertyMeta.getEntityClassName());
		return Lists.transform(hColumns,
				thriftCompositeTransformer.buildCounterKeyTransformer(propertyMeta));
	}

	private  Map loadJoinEntities(ThriftPersistenceContext context,
			PropertyMeta propertyMeta, EntityMeta joinMeta, List joinIds)
	{
		ThriftGenericEntityDao joinEntityDao = context.findEntityDao(joinMeta.getTableName());

		Map joinEntities = joinHelper.loadJoinEntities(propertyMeta.getValueClass(),
				joinIds, joinMeta, joinEntityDao);
		return joinEntities;
	}

	private  V buildProxy(ThriftPersistenceContext context, EntityMeta joinMeta,
			Map joinEntities, Object joinId)
	{
		V joinEntity = joinEntities.get(joinId);
		ThriftPersistenceContext joinContext = context.newPersistenceContext(joinMeta, joinEntity);
		V proxy = proxifier.buildProxy(joinEntity, joinContext);
		return proxy;
	}
}