public Bindings(ModelLoadContext ctx, DatabaseLoader parent) { Contracts.AssertValue(ctx); // *** Binary format *** // int: number of columns // foreach column: // int: id of column name // byte: DataKind // byte: bool of whether this is a key type // for a key type: // ulong: count for key range // byte: bool of whether the source index is valid // for a valid source index: // int: source index int cinfo = ctx.Reader.ReadInt32(); Contracts.CheckDecode(cinfo > 0); Infos = new ColInfo[cinfo]; for (int iinfo = 0; iinfo < cinfo; iinfo++) { string name = ctx.LoadNonEmptyString(); PrimitiveDataViewType itemType; var kind = (InternalDataKind)ctx.Reader.ReadByte(); Contracts.CheckDecode(Enum.IsDefined(typeof(InternalDataKind), kind)); bool isKey = ctx.Reader.ReadBoolByte(); if (isKey) { ulong count; Contracts.CheckDecode(KeyDataViewType.IsValidDataType(kind.ToType())); count = ctx.Reader.ReadUInt64(); Contracts.CheckDecode(0 < count); itemType = new KeyDataViewType(kind.ToType(), count); } else { itemType = ColumnTypeExtensions.PrimitiveTypeFromKind(kind); } int? sourceIndex = null; bool hasSourceIndex = ctx.Reader.ReadBoolByte(); if (hasSourceIndex) { sourceIndex = ctx.Reader.ReadInt32(); } Infos[iinfo] = new ColInfo(name, sourceIndex, itemType); } OutputSchema = ComputeOutputSchema(); }
/// <summary> /// Construct a <see cref="KeyDataViewType"/> out of the DbType and the keyCount. /// </summary> private static KeyDataViewType ConstructKeyType(DbType dbType, KeyCount keyCount) { Contracts.CheckValue(keyCount, nameof(keyCount)); KeyDataViewType keyType; Type rawType = dbType.ToType(); Contracts.CheckUserArg(KeyDataViewType.IsValidDataType(rawType), nameof(DatabaseLoader.Column.Type), "Bad item type for Key"); if (keyCount.Count == null) { keyType = new KeyDataViewType(rawType, rawType.ToMaxInt()); } else { keyType = new KeyDataViewType(rawType, keyCount.Count.GetValueOrDefault()); } return(keyType); }
/// <summary> /// Construct a <see cref="KeyDataViewType"/> out of the data kind and the keyCount. /// </summary> public static KeyDataViewType ConstructKeyType(InternalDataKind?type, KeyCount keyCount) { Contracts.CheckValue(keyCount, nameof(keyCount)); KeyDataViewType keyType; Type rawType = type.HasValue ? type.Value.ToType() : InternalDataKind.U8.ToType(); Contracts.CheckUserArg(KeyDataViewType.IsValidDataType(rawType), nameof(TextLoader.Column.Type), "Bad item type for Key"); if (keyCount.Count == null) { keyType = new KeyDataViewType(rawType, rawType.ToMaxInt()); } else { keyType = new KeyDataViewType(rawType, keyCount.Count.GetValueOrDefault()); } return(keyType); }
public Bindings(ModelLoadContext ctx, DatabaseLoader parent) { Contracts.AssertValue(ctx); // *** Binary format *** // int: number of columns // foreach column: // int: id of column name // byte: DataKind // byte: bool of whether this is a key type // for a key type: // ulong: count for key range // int: number of segments // foreach segment: // string id: name // int: min // int: lim // byte: force vector (verWrittenCur: verIsVectorSupported) int cinfo = ctx.Reader.ReadInt32(); Contracts.CheckDecode(cinfo > 0); Infos = new ColInfo[cinfo]; for (int iinfo = 0; iinfo < cinfo; iinfo++) { string name = ctx.LoadNonEmptyString(); PrimitiveDataViewType itemType; var kind = (InternalDataKind)ctx.Reader.ReadByte(); Contracts.CheckDecode(Enum.IsDefined(typeof(InternalDataKind), kind)); bool isKey = ctx.Reader.ReadBoolByte(); if (isKey) { ulong count; Contracts.CheckDecode(KeyDataViewType.IsValidDataType(kind.ToType())); count = ctx.Reader.ReadUInt64(); Contracts.CheckDecode(0 < count); itemType = new KeyDataViewType(kind.ToType(), count); } else { itemType = ColumnTypeExtensions.PrimitiveTypeFromKind(kind); } int cseg = ctx.Reader.ReadInt32(); Segment[] segs; if (cseg == 0) { segs = null; } else { Contracts.CheckDecode(cseg > 0); segs = new Segment[cseg]; for (int iseg = 0; iseg < cseg; iseg++) { string columnName = ctx.LoadStringOrNull(); int min = ctx.Reader.ReadInt32(); int lim = ctx.Reader.ReadInt32(); Contracts.CheckDecode(0 <= min && min < lim); bool forceVector = ctx.Reader.ReadBoolByte(); segs[iseg] = (columnName is null) ? new Segment(min, lim, forceVector) : new Segment(columnName, forceVector); } } // Note that this will throw if the segments are ill-structured, including the case // of multiple variable segments (since those segments will overlap and overlapping // segments are illegal). Infos[iinfo] = ColInfo.Create(name, itemType, segs, false); } OutputSchema = ComputeOutputSchema(); }
/// <summary> /// Sometimes it is necessary to cast the Count to an int. This performs overflow check. /// </summary> public static int GetCountAsInt32(this KeyDataViewType key, IExceptionContext ectx = null) { ectx.Check(key.Count <= int.MaxValue, nameof(KeyDataViewType) + "." + nameof(KeyDataViewType.Count) + " exceeds int.MaxValue."); return((int)key.Count); }