Cassandra timeuuid在Datastax C#驱动程序中

时间:2014-02-25 15:41:06

标签: c# cassandra driver datastax

什么C#类型相当于Datastax Cassandra C#驱动程序中的timeuuid?

我正在编写一个简单的用户跟踪服务,并希望访问最新的用户历史记录。我正在尝试创建一个与此create语句等效的表:

CREATE TABLE IF NOT EXISTS user_history (
    user_id text,
    event_type text,
    create_date timeuuid,
    item_id text,
    PRIMARY KEY ((user_id, event_type), create_date)
);

我做了以下课程:

[AllowFiltering]
[Table("user_history")]
public class UserHistory
{
    [PartitionKey(1)]
    [Column("user_id")]
    public string UserID;

    [PartitionKey(2)]
    [Column("event_type")]
    public string EventType;

    [ClusteringKey(1)]
    [Column("create_date")]
    public DateTime CreateDate { get; set; }

    [Column("item_id")] 
    public string ItemID;
}

我正在使用此语句在Cassandra中创建表:

var table = Session.GetTable<UserHistory>();
table.CreateIfNotExists();

但是这给了我下面的表格:

CREATE TABLE user_history (
  user_id text,
  event_type text,
  create_date timestamp,
  item_id text,
  PRIMARY KEY ((user_id, event_type), create_date)
)

如您所见,create_date的类型为timestamp而不是timeuuid

我已尝试Guid而不是DateTime,但在我致电uuid时,这会给我.CreateIfNotExists()

我是否应该使用Guid代替DateTime CreateDate并使用原始CQL3创建表格?我想这将允许我从Cassandra读取和写入timeuuid(使用FluentCassandra项目中的GuidGenerator)? (回想一下:我正在使用Datastax驱动程序)

2 个答案:

答案 0 :(得分:5)

听起来你通过手动创建表来解决问题。

对于将来寻找此信息的人,由于我们在BCL中没有本机类型来表示像Java这样的TimeUUID,因此2.1.3版本的DataStax .NET驱动程序引入了TimeUuid结构帮助这个场景。你可以找到the source here。如果您将它用作属性的返回类型,则它与System.Guid进行隐式转换,并且应该与LINQ驱动程序的表创建方法一起使用。

答案 1 :(得分:4)

Timeuuid基本上是一个guid,所以你应该使用guid,the following code is taken from here: creating-a-time-uuid-guid-in-net and is part of the FluentCassandra project

“以下是在.NET中生成Time UUID或基于时间的Guid对象所需的所有代码。”

public static Guid GenerateTimeBasedGuid(DateTime dateTime)  
{
    long ticks = dateTime.Ticks - GregorianCalendarStart.Ticks;

    byte[] guid = new byte[ByteArraySize];
    byte[] clockSequenceBytes = BitConverter.GetBytes(Convert.ToInt16(Environment.TickCount % Int16.MaxValue));
    byte[] timestamp = BitConverter.GetBytes(ticks);

    // copy node
    Array.Copy(Node, 0, guid, NodeByte, Node.Length);

    // copy clock sequence
    Array.Copy(clockSequenceBytes, 0, guid, GuidClockSequenceByte, clockSequenceBytes.Length);

    // copy timestamp
    Array.Copy(timestamp, 0, guid, 0, timestamp.Length);

    // set the variant
    guid[VariantByte] &= (byte)VariantByteMask;
    guid[VariantByte] |= (byte)VariantByteShift;

    // set the version
    guid[VersionByte] &= (byte)VersionByteMask;
    guid[VersionByte] |= (byte)((int)GuidVersion.TimeBased << VersionByteShift);

    return new Guid(guid);
}