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

com.hmsonline.cassandra.index.util.IndexUtil Maven / Gradle / Ivy

package com.hmsonline.cassandra.index.util;

import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.cassandra.db.ColumnFamily;
import org.apache.cassandra.db.IColumn;
import org.apache.cassandra.db.IMutation;
import org.apache.cassandra.db.RowMutation;
import org.apache.cassandra.thrift.CassandraServer;
import org.apache.cassandra.thrift.ColumnOrSuperColumn;
import org.apache.cassandra.thrift.ColumnParent;
import org.apache.cassandra.thrift.ConsistencyLevel;
import org.apache.cassandra.thrift.SlicePredicate;
import org.apache.cassandra.utils.ByteBufferUtil;

import com.hmsonline.cassandra.index.LogEntry;
import com.hmsonline.cassandra.index.LogEntry.Status;

/**
 * A helper class providing utility methods for handling indexing.
 * 
 * @author pnguyen
 */
public class IndexUtil {
  public static final String INDEXING_KEYSPACE = "Indexing";

  public static ByteBuffer buildIndex(Set indexColumns, String rowKey,
          Map row) throws Exception {
    List parts = new ArrayList();
    for (String columnName : indexColumns) {
      parts.add(row.get(columnName));
    }
    parts.add(rowKey);
    return CompositeUtil.compose(parts);
  }

  public static Map getRowMutation(ColumnFamily columnFamily)
          throws Exception {
    Map mutation = new HashMap();
    for (IColumn column : columnFamily.getSortedColumns()) {
      String value = column.isMarkedForDelete() ? null : ByteBufferUtil
              .string(column.value());
      mutation.put(ByteBufferUtil.string(column.name()), value);
    }
    return mutation;
  }

  public static Map getRowMutation(ColumnFamily columnFamily,
          Set indexColumns) throws Exception {
    Map mutation = new HashMap();
    for (IColumn column : columnFamily.getSortedColumns()) {
      String columnName = ByteBufferUtil.string(column.name());
      if (!indexColumns.contains(columnName)) {
        continue;
      }
      mutation.put(columnName, column.isMarkedForDelete() ? null
              : ByteBufferUtil.string(column.value()));
    }
    return mutation;
  }

  public static Map getNewRow(Map currentRow,
          ColumnFamily columnFamily, Set indexColumns) throws Exception {
    Map newRow = new HashMap(currentRow);
    newRow.putAll(getRowMutation(columnFamily, indexColumns));
    return newRow;
  }

  public static boolean indexChanged(Set indexColumns,
          ColumnFamily columnFamily) throws Exception {
    for (ByteBuffer columnName : columnFamily.getColumnNames()) {
      if (indexColumns.contains(ByteBufferUtil.string(columnName))) {
        return true;
      }
    }
    return false;
  }

  public static boolean isEmptyIndex(Set indexColumns,
          Map row) {
    for (String column : indexColumns) {
      if (row.get(column) != null) {
        return false;
      }
    }
    return true;
  }

  public static Map fetchRow(String keyspace,
          String columnFamily, String key, Set indexColumns)
          throws Exception {
    List columnNames = new ArrayList();
    for (String column : indexColumns) {
      columnNames.add(ByteBufferUtil.bytes(column));
    }

    SlicePredicate predicate = new SlicePredicate();
    predicate.setColumn_names(columnNames);
    ColumnParent parent = new ColumnParent(columnFamily);
    CassandraServer conn = new CassandraServer();
    conn.set_keyspace(keyspace);
    List columns = conn.get_slice(
            ByteBufferUtil.bytes(key), parent, predicate, ConsistencyLevel.ONE);
    Map result = new HashMap();

    for (ColumnOrSuperColumn column : columns) {
      result.put(ByteBufferUtil.string(column.column.name),
              ByteBufferUtil.string(column.column.value));
    }

    return result;
  }

  public static List getLogEntries(List mutations)
          throws Exception {
    List entries = new ArrayList();

    for (IMutation mutation : mutations) {
      String keyspace = mutation.getTable();
      if (INDEXING_KEYSPACE.equals(keyspace)) {
        continue;
      }

      for (ColumnFamily cf : ((RowMutation) mutation).getColumnFamilies()) {
        entries.add(new LogEntry(keyspace, cf.metadata().cfName, ByteBufferUtil
                .string(mutation.key()), Status.PENDING, getRowMutation(cf)));
      }
    }

    return entries;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy