Question

Quel type C# est équivalent au timeuuid dans le pilote Datastax Cassandra C# ?

J'écris un service de suivi des utilisateurs simple et je souhaite accéder au dernier historique des utilisateurs.J'essaie de créer une table équivalente à cette instruction 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)
);

J'ai fait le cours suivant :

[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;
}

Et j'utilise cette instruction pour créer la table dans Cassandra :

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

Mais cela me donne le tableau suivant :

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

Comme vous pouvez le constater, le type de create_date est timestamp au lieu de timeuuid.

j'ai essayé Guid au lieu de DateTime, mais cela me donne un uuid quand j'appelle .CreateIfNotExists().

Dois-je utiliser Guid au lieu de DateTime pour le CreateDate et créer la table explicite en utilisant le CQL3 brut ?Je suppose que cela me permettra de lire et d'écrire timeuuid de/vers Cassandra (en utilisant le GuidGenerator trouvé dans le projet FluentCassandra) ?!(Rappel:J'utilise le pilote Datastax)

Était-ce utile?

La solution

Timeuuid est fondamentalement un guid et vous devriez donc utiliser un guid, le code suivant est extrait d'ici :create-a-time-uuid-guid-in-net et fait partie du projet FluentCassandra

"Vous trouverez ci-dessous tout le code dont vous avez besoin pour générer un objet Time UUID ou Time-Based Guid dans .NET."

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);
}

Autres conseils

On dirait que vous avez résolu votre problème en créant le tableau manuellement.

Pour les personnes qui rechercheront ces informations à l'avenir, puisque nous n'avons pas de type natif dans la BCL pour représenter un TimeUUID comme Java, la version 2.1.3 de DataStax .NET Driver a introduit un TimeUuid struct pour vous aider dans ce scénario.Tu peux trouver la source ici.Il a une conversion implicite vers/depuis System.Guid et devrait fonctionner avec les méthodes de création de table du pilote LINQ si vous l'utilisez comme type de retour pour une propriété.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top