cassandra-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Thomas Atwood (JIRA)" <j...@apache.org>
Subject [jira] [Created] (CASSANDRA-7996) Cassandra C# driver errors on virtual properties when using CreateIfNotExists method
Date Tue, 23 Sep 2014 23:06:33 GMT
Thomas Atwood created CASSANDRA-7996:
----------------------------------------

             Summary: Cassandra C# driver errors on virtual properties when using CreateIfNotExists
method
                 Key: CASSANDRA-7996
                 URL: https://issues.apache.org/jira/browse/CASSANDRA-7996
             Project: Cassandra
          Issue Type: Improvement
          Components: Drivers (now out of tree)
            Reporter: Thomas Atwood
             Fix For: 2.1.0


When using the Cassandra C# driver, I receive the error "An unhandled exception of type 'Cassandra.SyntxError'
occurred in Cassandra.dll when attempting to create a table with an overridden property using
the Linq functionality with the driver.  If the property is not overriden, the driver creates
the table without any issues.

Example:  concrete object inherits from abstract object where the Id field is virtual on the
abstract object.  Reason to override this field would be to apply certain regex validation
for format depending on the derived concrete object (Id will still be unique across all objects
that inherit from the abstract object).

Abstract object:
using System;
using System.ComponentModel;
using Cassandra.Data.Linq;

namespace TestDatastaxCsDriver.Abstract
{
    [AllowFiltering]
    [Serializable]
    public class AbstractEntity: INotifyPropertyChanged
    {
        private string _id;
        private string _name;
        private string _insertuser;
        private DateTime _insertimestamp;
        private DateTime _modifiedtimestamp;

        public event PropertyChangedEventHandler PropertyChanged;
        public AbstractEntity(string id, string name, string insertuser)
        {
            Id = _id;
            Name = _name;
            InsertUser = _insertuser;
            InsertTimestamp = DateTime.Now;
            ModifiedTimestamp = DateTime.Now;
        }

        [PartitionKey]
        [Column("id")]
        public virtual string Id
        {
            get { return _id; }
            set
            {
                if (value != _id)
                {
                    _id = value;
                    NotifyPropertyChanged("Id");
                }
            }
        }

        [Column("name")]
        public string Name
        {
            get { return _name; }
            set
            {
                if (value != _name)
                {
                    _name = value;
                    NotifyPropertyChanged("Name");
                }
            }
        }

        [Column("insertuser")]
        public string InsertUser
        {
            get { return _insertuser; }
            set
            {
                if (value != _insertuser)
                {
                    _insertuser = value;
                    NotifyPropertyChanged("InsertUser");
                }
            }
        }

        [Column("inserttimestamp")]
        public DateTime InsertTimestamp
        {
            get { return _insertimestamp; }
            set
            {
                if (value != _insertimestamp)
                {
                    _insertimestamp = value;
                    NotifyPropertyChanged("InsertTimestamp");
                }
            }
        }

        [Column("modifiedtimestamp")]
        public DateTime ModifiedTimestamp
        {
            get { return _modifiedtimestamp; }
            set
            {
                if (value != _modifiedtimestamp)
                {
                    _modifiedtimestamp = value;
                    NotifyPropertyChanged("ModifiedTimestamp");
                }
            }
        }

        private void NotifyPropertyChanged(String propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                ModifiedTimestamp = DateTime.Now;
            }
        }
    }
}

Concrete object:
using System.ComponentModel.DataAnnotations;
using Cassandra.Data.Linq;
using TestDatastaxCsDriver.Abstract;

namespace TestDatastaxCsDriver.Concrete
{
    [Table("issuer")]
    public class Issuer : AbstractEntity
    {
        public Issuer(string id, string name, string insertuser) : base(id, name, insertuser)
        {
        }

//Cassandra C# driver chokes on this.  No issues if the property is not overriden.  Please
note I also tried adding a column attribute to see if it fixed the problem and it did not.

        [MaxLength(3,ErrorMessage = "Id cannot be longer than 3 characters.")]
        public override string Id
        {
            get
            {
                return base.Id;
            }
            set
            {
                base.Id = value;
            }
        }
    }
}

Program.cs to test:
using Cassandra;
using Cassandra.Data.Linq;
using TestDatastaxCsDriver.Concrete;

namespace TestDatastaxCsDriver
{
    class Program
    {
        static void Main(string[] args)
        {
            Cluster cluster =
                Cluster.Builder().AddContactPoint("127.0.0.1").WithCredentials("cassandra",
"cassandra").Build();
            var session = cluster.Connect();
            session.CreateKeyspaceIfNotExists("test");
            session.ChangeKeyspace("test");

            var issuer = session.GetTable<Issuer>();
            issuer.CreateIfNotExists();
        }
    }
}


The request would be to allow for the CreateIfNotExists method to ignore the override keyword
and to create the property with the type specified as long as the type is one of the types
supported by the driver (e.g. string, int, bool, etc.).

Please let me know if you need more sample code or additional clarification regarding this
request.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message