在博客文章《 从Java连接到Cassandra》中 ,我提到了用Java 实现的Cassandra Java开发人员的一个优势是能够创建自定义 Cassandra数据类型 。 在这篇文章中,我将详细介绍如何执行此操作。
Cassandra具有许多内置的数据类型 ,但是在某些情况下,可能需要添加自定义类型。 通过扩展org.apache.cassandra.db.marshal.AbstractType类,可以在Java中实现Cassandra定制数据类型。 扩展此方法的类必须最终实现具有以下签名的三个方法:
public ByteBuffer fromString(final String) throws MarshalException
public TypeSerializer getSerializer()
public int compare(Object, Object)
下一个代码清单中显示了本文的AbstractType
示例实现。
UnitedStatesState.java –扩展AbstractType
package dustin.examples.cassandra.cqltypes;
import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.serializers.MarshalException;
import org.apache.cassandra.serializers.TypeSerializer;
import java.nio.ByteBuffer;
/**
* Representation of a state in the United States that
* can be persisted to Cassandra database.
*/
public class UnitedStatesState extends AbstractType
{
public static final UnitedStatesState instance = new UnitedStatesState();
@Override
public ByteBuffer fromString(final String stateName) throws MarshalException
{
return getStateAbbreviationAsByteBuffer(stateName);
}
@Override
public TypeSerializer getSerializer()
{
return UnitedStatesStateSerializer.instance;
}
@Override
public int compare(Object o1, Object o2)
{
if (o1 == null && o2 == null)
{
return 0;
}
else if (o1 == null)
{
return 1;
}
else if (o2 == null)
{
return -1;
}
else
{
return o1.toString().compareTo(o2.toString());
}
}
/**
* Provide standard two-letter abbreviation for United States
* state whose state name is provided.
*
* @param stateName Name of state whose abbreviation is desired.
* @r