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