Question

How do I make "greater than" or "less than" where-conditions in CQL queries on the timeuuid data type using the Datastax C# driver?

I have a table in Cassandra for storing cookie history sorted by time stamp as timeuuid:

CREATE TABLE cookie_history (
    cookie_id text,
    create_date timeuuid,
    item_id text,
    PRIMARY KEY ((cookie_id), create_date)
);

The table is mapped using a C# class for querying using the Datastax C# Cassandra driver:

[Table("cookie_history")]
public class CookieHistoryDataEntry
{
    [PartitionKey(1)]
    [Column("cookie_id")]
    public string CookieID;

    [ClusteringKey(1)]
    [Column("create_date")]
    public Guid CreateDate;

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

For a given cookie I want all items after a given time stamp.

        var myTimeUuid = new Guid("5812e74d-ba49-11e3-8d27-27303e6a4831");
        var table = session.GetTable<CookieHistoryDataEntry>();
        var query = table.Where(x => x.CookieID == myCookieId
                                  && x.CreateDate > myTimeUuid);

But this (x.CreateDate > myTimeUuid) gives me a compile time error:

Operator '>' cannot be applied to operands of type 'System.Guid' and 'System.Guid'
Was it helpful?

Solution

It is possible to use "greater than" on timeuuid in raw CQL. So one solution is to execute raw CQL from the driver:

session.Execute(@"select * 
    from cookie_history 
    where cookie_id = 1242a96c-4bd4-8505-1bea-803784f80c18 
    and create_date > 5812e74d-ba49-11e3-8d27-27303e6a4831;");

OTHER TIPS

You can use Linq if you use CompareTo():

var query = table.Where(x => x.CookieID == myCookieId &&
                        x.CreateDate.CompareTo(myTimeUuid) > 0;

Here's the code that handles the CompareTo.

Related: If you need to compare partition keys which require use of the Cassandra token() method, you can do that with CqlToken.Create:

var query = table.Where(x => 
    CqlToken.Create(x.PartitionKeyProperty) >= CqlToken.Create(3);

Is there a reason that you want to attempt to represent your date as a Guid and not an actual date type? There's no concept of greater than or less than with regards to Guid's, unless this is some edge case that I'm not aware of. Date A can be greater than Date B, from everything I've ever seen that's not true of Guid's.

Actually it is also possible to do with QueryBuilder not just as raw CQL:

select.where(QueryBuilder.eq('cookie_id', cookie_id).  
  and(QueryBuilder.gt("create_date", 
      QueryBuilder.fcall("maxTimeuuid", 
          QueryBuilder.fcall("unixTimestampOf", 
              QueryBuilder.raw(timeuuid_as_string))));
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top