/// <summary>
        /// Helper method to generate a list column info of nested lists
        /// </summary>
        private static ListColumnInfo GetNestedListColumnInfo(int level, ColumnTypeCode singleType)
        {
            var columnInfo = new ListColumnInfo();

            if (level == 0)
            {
                columnInfo.ValueTypeCode = singleType;
                columnInfo.ValueTypeInfo = null;
            }
            else
            {
                columnInfo.ValueTypeCode = ColumnTypeCode.List;
                columnInfo.ValueTypeInfo = GetNestedListColumnInfo(level - 1, singleType);
            }
            return(columnInfo);
        }
        public ColumnTypeCode GetCqlType(Type type, out IColumnInfo typeInfo)
        {
            typeInfo = null;
            ITypeSerializer typeSerializer;

            if (_primitiveSerializers.TryGetValue(type, out typeSerializer))
            {
                return(typeSerializer.CqlType);
            }
            if (_customSerializers.Count > 0 && _customSerializers.TryGetValue(type, out typeSerializer))
            {
                typeInfo = typeSerializer.TypeInfo;
                return(typeSerializer.CqlType);
            }
            if (type.IsArray)
            {
                IColumnInfo    valueTypeInfo;
                ColumnTypeCode valueTypeCode = GetCqlType(type.GetElementType(), out valueTypeInfo);
                typeInfo = new ListColumnInfo
                {
                    ValueTypeCode = valueTypeCode,
                    ValueTypeInfo = valueTypeInfo
                };
                return(ColumnTypeCode.List);
            }
            if (type.GetTypeInfo().IsGenericType)
            {
                if (type.GetGenericTypeDefinition() == typeof(Nullable <>))
                {
                    return(GetCqlType(type.GetTypeInfo().GetGenericArguments()[0], out typeInfo));
                }
                if (typeof(IEnumerable).GetTypeInfo().IsAssignableFrom(type))
                {
                    IColumnInfo    valueTypeInfo;
                    ColumnTypeCode valueTypeCode;
                    var            interfaces = type.GetTypeInfo().GetInterfaces();
                    if (typeof(IDictionary).GetTypeInfo().IsAssignableFrom(type) &&
                        interfaces.Any(t => t.GetTypeInfo().IsGenericType&& t.GetGenericTypeDefinition() == typeof(IDictionary <,>)))
                    {
                        IColumnInfo keyTypeInfo;
                        var         keyTypeCode = GetCqlType(type.GetTypeInfo().GetGenericArguments()[0], out keyTypeInfo);
                        valueTypeCode = GetCqlType(type.GetTypeInfo().GetGenericArguments()[1], out valueTypeInfo);
                        typeInfo      = new MapColumnInfo
                        {
                            KeyTypeCode   = keyTypeCode,
                            KeyTypeInfo   = keyTypeInfo,
                            ValueTypeCode = valueTypeCode,
                            ValueTypeInfo = valueTypeInfo
                        };
                        return(ColumnTypeCode.Map);
                    }
                    if (interfaces.Any(t => t.GetTypeInfo().IsGenericType&& t.GetGenericTypeDefinition() == typeof(ISet <>)))
                    {
                        IColumnInfo keyTypeInfo;
                        var         keyTypeCode = GetCqlType(type.GetTypeInfo().GetGenericArguments()[0], out keyTypeInfo);
                        typeInfo = new SetColumnInfo
                        {
                            KeyTypeCode = keyTypeCode,
                            KeyTypeInfo = keyTypeInfo
                        };
                        return(ColumnTypeCode.Set);
                    }
                    valueTypeCode = GetCqlType(type.GetTypeInfo().GetGenericArguments()[0], out valueTypeInfo);
                    typeInfo      = new ListColumnInfo
                    {
                        ValueTypeCode = valueTypeCode,
                        ValueTypeInfo = valueTypeInfo
                    };
                    return(ColumnTypeCode.List);
                }
                if (typeof(IStructuralComparable).GetTypeInfo().IsAssignableFrom(type) && type.FullName.StartsWith("System.Tuple"))
                {
                    typeInfo = new TupleColumnInfo
                    {
                        Elements = type.GetTypeInfo().GetGenericArguments().Select(t =>
                        {
                            IColumnInfo tupleSubTypeInfo;
                            var dataType = new ColumnDesc
                            {
                                TypeCode = GetCqlType(t, out tupleSubTypeInfo),
                                TypeInfo = tupleSubTypeInfo
                            };
                            return(dataType);
                        }).ToList()
                    };
                    return(ColumnTypeCode.Tuple);
                }
            }
            //Determine if its a Udt type
            var udtMap = _udtSerializer.GetUdtMap(type);

            if (udtMap != null)
            {
                typeInfo = udtMap.Definition;
                return(ColumnTypeCode.Udt);
            }
            throw new InvalidTypeException("Unknown Cassandra target type for CLR type " + type.FullName);
        }
 /// <summary>
 /// Helper method to generate a list column info of nested lists
 /// </summary>
 private static ListColumnInfo GetNestedListColumnInfo(int level, ColumnTypeCode singleType)
 {
     var columnInfo = new ListColumnInfo();
     if (level == 0)
     {
         columnInfo.ValueTypeCode = singleType;
         columnInfo.ValueTypeInfo = null;
     }
     else
     {
         columnInfo.ValueTypeCode = ColumnTypeCode.List;
         columnInfo.ValueTypeInfo = GetNestedListColumnInfo(level - 1, singleType);
     }
     return columnInfo;
 }
Exemple #4
0
 public ColumnTypeCode GetCqlType(Type type, out IColumnInfo typeInfo)
 {
     typeInfo = null;
     ITypeSerializer typeSerializer;
     if (_primitiveSerializers.TryGetValue(type, out typeSerializer))
     {
         return typeSerializer.CqlType;
     }
     if (_customSerializers.Count > 0 && _customSerializers.TryGetValue(type, out typeSerializer))
     {
         typeInfo = typeSerializer.TypeInfo;
         return typeSerializer.CqlType;
     }
     if (type.IsArray)
     {
         IColumnInfo valueTypeInfo;
         ColumnTypeCode valueTypeCode = GetCqlType(type.GetElementType(), out valueTypeInfo);
         typeInfo = new ListColumnInfo
         {
             ValueTypeCode = valueTypeCode,
             ValueTypeInfo = valueTypeInfo
         };
         return ColumnTypeCode.List;
     }
     if (type.IsGenericType)
     {
         if (type.GetGenericTypeDefinition() == typeof(Nullable<>))
         {
             return GetCqlType(type.GetGenericArguments()[0], out typeInfo);
         }
         if (typeof(IEnumerable).IsAssignableFrom(type))
         {
             IColumnInfo valueTypeInfo;
             ColumnTypeCode valueTypeCode;
             var interfaces = type.GetInterfaces();
             if (typeof(IDictionary).IsAssignableFrom(type) && 
                 interfaces.Any(t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IDictionary<,>)))
             {
                 IColumnInfo keyTypeInfo;
                 var keyTypeCode = GetCqlType(type.GetGenericArguments()[0], out keyTypeInfo);
                 valueTypeCode = GetCqlType(type.GetGenericArguments()[1], out valueTypeInfo);
                 typeInfo = new MapColumnInfo
                 {
                     KeyTypeCode = keyTypeCode,
                     KeyTypeInfo = keyTypeInfo,
                     ValueTypeCode = valueTypeCode,
                     ValueTypeInfo = valueTypeInfo
                 };
                 return ColumnTypeCode.Map;
             }
             if (interfaces.Any(t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(ISet<>)))
             {
                 IColumnInfo keyTypeInfo;
                 var keyTypeCode = GetCqlType(type.GetGenericArguments()[0], out keyTypeInfo);
                 typeInfo = new SetColumnInfo
                 {
                     KeyTypeCode = keyTypeCode,
                     KeyTypeInfo = keyTypeInfo
                 };
                 return ColumnTypeCode.Set;
             }
             valueTypeCode = GetCqlType(type.GetGenericArguments()[0], out valueTypeInfo);
             typeInfo = new ListColumnInfo
             {
                 ValueTypeCode = valueTypeCode,
                 ValueTypeInfo = valueTypeInfo
             };
             return ColumnTypeCode.List;
         }
         if (typeof(IStructuralComparable).IsAssignableFrom(type) && type.FullName.StartsWith("System.Tuple"))
         {
             typeInfo = new TupleColumnInfo
             {
                 Elements = type.GetGenericArguments().Select(t =>
                 {
                     IColumnInfo tupleSubTypeInfo;
                     var dataType = new ColumnDesc
                     {
                         TypeCode = GetCqlType(t, out tupleSubTypeInfo),
                         TypeInfo = tupleSubTypeInfo
                     };
                     return dataType;
                 }).ToList()
             };
             return ColumnTypeCode.Tuple;
         }
     }
     //Determine if its a Udt type
     var udtMap = _udtSerializer.GetUdtMap(type);
     if (udtMap != null)
     {
         typeInfo = udtMap.Definition;
         return ColumnTypeCode.Udt;
     }
     throw new InvalidTypeException("Unknown Cassandra target type for CLR type " + type.FullName);
 }