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

com.hmsonline.cassandra.index.CassandraIndexAspect Maven / Gradle / Ivy

package com.hmsonline.cassandra.index;

import static com.hmsonline.cassandra.index.util.IndexUtil.INDEXING_KEYSPACE;
import static com.hmsonline.cassandra.index.util.IndexUtil.buildIndexes;
import static com.hmsonline.cassandra.index.util.IndexUtil.fetchRow;
import static com.hmsonline.cassandra.index.util.IndexUtil.getIndexValues;
import static com.hmsonline.cassandra.index.util.IndexUtil.getNewRow;
import static com.hmsonline.cassandra.index.util.IndexUtil.indexChanged;

import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.cassandra.db.ColumnFamily;
import org.apache.cassandra.db.IMutation;
import org.apache.cassandra.db.RowMutation;
import org.apache.cassandra.thrift.ConsistencyLevel;
import org.apache.cassandra.utils.ByteBufferUtil;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

import com.hmsonline.cassandra.index.dao.ConfigurationDao;
import com.hmsonline.cassandra.index.dao.DaoFactory;
import com.hmsonline.cassandra.index.dao.IndexDao;

@Aspect
public class CassandraIndexAspect {
    private IndexDao indexDao = DaoFactory.getIndexDAO();
    private ConfigurationDao configurationDao = DaoFactory.getConfigurationDAO();

    @Around("execution(* org.apache.cassandra.thrift.CassandraServer.doInsert(..))")
    public void process(ProceedingJoinPoint joinPoint) throws Throwable {
        ConsistencyLevel consistency = (ConsistencyLevel) joinPoint.getArgs()[0];
        @SuppressWarnings("unchecked")
        List mutations = (List) joinPoint.getArgs()[1];
        index(mutations, consistency);
        joinPoint.proceed(joinPoint.getArgs());
    }

    private void index(List mutations, ConsistencyLevel consistency) throws Throwable {
        Configuration conf = configurationDao.getConfiguration();

        for (IMutation mutation : mutations) {
            String keyspace = mutation.getTable();
            String rowKey = ByteBufferUtil.string(mutation.key());
            Collection cfs = ((RowMutation) mutation).getColumnFamilies();
            if (INDEXING_KEYSPACE.equals(keyspace)) {
                continue;
            }

            // Iterate over mutated column families and create indexes for each
            for (ColumnFamily cf : cfs) {
                String cfName = cf.metadata().cfName;
                Map> configuredIndexes = conf.getIndexes(keyspace, cfName);
                if (configuredIndexes.isEmpty()) {
                    continue;
                }

                // Get all index columns configured for this column family
                Set cfIndexColumns = new HashSet();
                for (List columns : configuredIndexes.values()) {
                    cfIndexColumns.addAll(columns);
                }

                // Skip indexing if none of index columns changed
                if (!cf.isMarkedForDelete() && !indexChanged(cf, cfIndexColumns)) {
                    continue;
                }

                Map currentRow = fetchRow(keyspace, cfName, rowKey, cfIndexColumns);
                Map newRow = getNewRow(currentRow, cf);
                Map> currentIndexValues = getIndexValues(currentRow, cfIndexColumns);
                Map> newIndexValues = getIndexValues(newRow, cfIndexColumns);

                // Iterate over configured indexes and create indexes for each
                for (String indexName : configuredIndexes.keySet()) {
                    List indexColumns = configuredIndexes.get(indexName);

                    if (cf.isMarkedForDelete()) {
                        indexDao.deleteIndexes(indexName, buildIndexes(indexColumns, rowKey, currentIndexValues),
                                consistency);
                    } else if (indexChanged(cf, indexColumns)) {
                        indexDao.deleteIndexes(indexName, buildIndexes(indexColumns, rowKey, currentIndexValues),
                                consistency);
                        indexDao.insertIndexes(indexName, buildIndexes(indexColumns, rowKey, newIndexValues),
                                consistency);
                    }
                }
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy