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

me.prettyprint.hom.KeyConcatenationDelimiterStrategyImpl Maven / Gradle / Ivy

There is a newer version: 3.0-04
Show newest version
package me.prettyprint.hom;

import java.nio.ByteBuffer;
import java.util.LinkedList;
import java.util.List;

/**
 * Keys in Cassandra cannot inherently be multi-field, so a strategy must be
 * employed to concatenate fields together.
 * 
 * 

* This strategy uses a delimiter to segment the fields. By default the * delimiter is 2 pipes, ||, but can be overriden by calling * {@link #setDelimiter(byte[])}. * * @author B. Todd Burruss */ public class KeyConcatenationDelimiterStrategyImpl implements KeyConcatenationStrategy { private byte[] delimiter = "||".getBytes(); @Override public byte[] concat(List segmentList) { int totalSegmentSize = 0; for (byte[] ba : segmentList) { totalSegmentSize += ba.length; } ByteBuffer colFamKey = ByteBuffer.allocate(totalSegmentSize + (segmentList.size() - 1) * delimiter.length); int segNum = 1; for (byte[] ba : segmentList) { colFamKey.put(ba); if (segNum++ < segmentList.size()) { colFamKey.put(delimiter); } } return colFamKey.array(); } @Override public List split(byte[] colFamKey) { ByteBuffer bb = ByteBuffer.wrap(colFamKey); List segmentList = new LinkedList(); int segStart = 0; bb.mark(); while (bb.remaining() >= delimiter.length) { // compare delimeter to current position boolean delimiterFound = true; for (byte b : delimiter) { if (bb.get() != b) { delimiterFound = false; break; } } if (delimiterFound) { int segSize = bb.position() - segStart-delimiter.length; segmentList.add(copyFromMark(bb, segStart, segSize)); bb.position(bb.position() + delimiter.length); segStart = bb.position(); bb.mark(); } } segmentList.add(copyFromMark(bb, segStart, bb.capacity()-segStart)); return segmentList; } private byte[] copyFromMark(ByteBuffer bb, int segStart, int segSize) { byte[] newSeg = new byte[segSize]; bb.reset(); bb.get(newSeg, 0, segSize); return newSeg; } public byte[] getDelimiter() { return delimiter; } public void setDelimiter(byte[] delimiter) { this.delimiter = delimiter; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy