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

info.archinnov.achilles.context.ThriftAbstractFlushContext Maven / Gradle / Ivy

There is a newer version: 2.0.9
Show newest version
package info.archinnov.achilles.context;

import info.archinnov.achilles.consistency.AchillesConsistencyLevelPolicy;
import info.archinnov.achilles.counter.AchillesCounter;
import info.archinnov.achilles.dao.ThriftAbstractDao;
import info.archinnov.achilles.dao.ThriftCounterDao;
import info.archinnov.achilles.dao.ThriftGenericEntityDao;
import info.archinnov.achilles.dao.ThriftGenericWideRowDao;
import info.archinnov.achilles.type.ConsistencyLevel;
import info.archinnov.achilles.type.Pair;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import me.prettyprint.hector.api.mutation.Mutator;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.base.Optional;

/**
 * ThriftAbstractFlushContext
 * 
 * @author DuyHai DOAN
 * 
 */
public abstract class ThriftAbstractFlushContext> extends
		AchillesFlushContext
{
	protected static final Logger log = LoggerFactory.getLogger(ThriftAbstractFlushContext.class);

	protected ThriftDaoContext thriftDaoContext;
	protected ThriftConsistencyContext consistencyContext;

	protected Map, ThriftAbstractDao>> mutatorMap = new HashMap, ThriftAbstractDao>>();
	protected boolean hasCustomConsistencyLevels = false;

	protected ThriftAbstractFlushContext(ThriftDaoContext thriftDaoContext,
			AchillesConsistencyLevelPolicy policy, Optional readLevelO,
			Optional writeLevelO, Optional ttlO)
	{
		super(ttlO);
		this.thriftDaoContext = thriftDaoContext;
		this.consistencyContext = new ThriftConsistencyContext(policy, readLevelO, writeLevelO);
	}

	protected ThriftAbstractFlushContext(ThriftDaoContext thriftDaoContext,
			ThriftConsistencyContext consistencyContext,
			Map, ThriftAbstractDao>> mutatorMap,
			boolean hasCustomConsistencyLevels,
			Optional ttlO)
	{
		super(ttlO);
		this.thriftDaoContext = thriftDaoContext;
		this.consistencyContext = consistencyContext;
		this.mutatorMap = mutatorMap;
		this.hasCustomConsistencyLevels = hasCustomConsistencyLevels;
	}

	protected void doFlush()
	{
		log.debug("Execute mutations flush");
		try
		{
			for (Entry, ThriftAbstractDao>> entry : mutatorMap
					.entrySet())
			{
				ThriftAbstractDao dao = entry.getValue().right;
				Mutator mutator = entry.getValue().left;
				dao.executeMutator(mutator);
			}
		}
		finally
		{
			cleanUp();
		}
	}

	@Override
	public void cleanUp()
	{
		log.debug("Cleaning up flush context");
		consistencyContext.reinitConsistencyLevels();
		hasCustomConsistencyLevels = false;
		mutatorMap.clear();
	}

	@Override
	public void setWriteConsistencyLevel(Optional writeLevelO)
	{
		hasCustomConsistencyLevels = true;
		consistencyContext.setWriteConsistencyLevel(writeLevelO);
	}

	@Override
	public void setReadConsistencyLevel(Optional readLevelO)
	{
		hasCustomConsistencyLevels = true;
		consistencyContext.setReadConsistencyLevel(readLevelO);
	}

	@Override
	public void reinitConsistencyLevels()
	{
		if (!hasCustomConsistencyLevels)
		{
			consistencyContext.reinitConsistencyLevels();
		}
	}

	public Mutator getEntityMutator(String tableName)
	{
		Mutator mutator = null;
		if (mutatorMap.containsKey(tableName))
		{
			mutator = mutatorMap.get(tableName).left;
		}
		else
		{
			ThriftGenericEntityDao entityDao = thriftDaoContext.findEntityDao(tableName);

			if (entityDao != null)
			{
				mutator = entityDao.buildMutator();
				mutatorMap.put(tableName, new Pair, ThriftAbstractDao>(mutator,
						entityDao));
			}
		}
		return mutator;
	}

	public Mutator getWideRowMutator(String tableName)
	{
		Mutator mutator = null;
		if (mutatorMap.containsKey(tableName))
		{
			mutator = mutatorMap.get(tableName).left;
		}
		else
		{
			ThriftGenericWideRowDao columnFamilyDao = thriftDaoContext.findWideRowDao(tableName);

			if (columnFamilyDao != null)
			{
				mutator = columnFamilyDao.buildMutator();
				mutatorMap.put(tableName, new Pair, ThriftAbstractDao>(mutator,
						columnFamilyDao));
			}
		}
		return mutator;
	}

	public Mutator getCounterMutator()
	{
		Mutator mutator = null;
		if (mutatorMap.containsKey(AchillesCounter.THRIFT_COUNTER_CF))
		{
			mutator = mutatorMap.get(AchillesCounter.THRIFT_COUNTER_CF).left;
		}
		else
		{
			ThriftCounterDao thriftCounterDao = thriftDaoContext.getCounterDao();
			mutator = thriftCounterDao.buildMutator();
			mutatorMap.put(AchillesCounter.THRIFT_COUNTER_CF,
					new Pair, ThriftAbstractDao>(mutator, thriftCounterDao));
		}
		return mutator;
	}

	public ThriftConsistencyContext getConsistencyContext()
	{
		return consistencyContext;
	}
}