protected override bool TryParse(string str) { Contracts.AssertNonEmpty(str); // We accept N:T:S where N is the new column name, T is the new type, // and S is source column names. string extra; if (!base.TryParse(str, out extra)) { return(false); } if (extra == null) { return(true); } DataKind kind; if (!TypeParsingUtils.TryParseDataKind(extra, out kind, out KeyRange)) { return(false); } ResultType = kind == default(DataKind) ? default(DataKind?) : kind; return(true); }
public static bool TryParse(string str, out Column column) { column = null; if (string.IsNullOrEmpty(str)) { return(false); } if (!ColumnParsingUtils.TryParse(str, out string name, out string sourceStr, out string kindStr)) { return(false); } DataKind?kind = null; if (kindStr != null && TypeParsingUtils.TryParseDataKind(kindStr, out DataKind parsedKind, out KeyRange range)) { kind = parsedKind; } if (!int.TryParse(sourceStr, out int source)) { return(false); } column = new Column() { Name = name, Source = source, Type = kind }; return(true); }
private static bool TryCreateEx(IExceptionContext ectx, ColInfo info, DataKind kind, KeyRange range, out PrimitiveType itemType, out ColInfoEx ex) { ectx.AssertValue(info); ectx.Assert(Enum.IsDefined(typeof(DataKind), kind)); ex = null; var typeSrc = info.TypeSrc; if (range != null) { itemType = TypeParsingUtils.ConstructKeyType(kind, range); if (!typeSrc.ItemType.IsKey && !typeSrc.ItemType.IsText) { return(false); } } else if (!typeSrc.ItemType.IsKey) { itemType = PrimitiveType.FromKind(kind); } else if (!KeyType.IsValidDataKind(kind)) { itemType = PrimitiveType.FromKind(kind); return(false); } else { var key = typeSrc.ItemType.AsKey; ectx.Assert(KeyType.IsValidDataKind(key.RawKind)); int count = key.Count; // Technically, it's an error for the counts not to match, but we'll let the Conversions // code return false below. There's a possibility we'll change the standard conversions to // map out of bounds values to zero, in which case, this is the right thing to do. ulong max = kind.ToMaxInt(); if ((ulong)count > max) { count = (int)max; } itemType = new KeyType(kind, key.Min, count, key.Contiguous); } // Ensure that the conversion is legal. We don't actually cache the delegate here. It will get // re-fetched by the utils code when needed. bool identity; Delegate del; if (!Conversions.Instance.TryGetStandardConversion(typeSrc.ItemType, itemType, out del, out identity)) { return(false); } ColumnType typeDst = itemType; if (typeSrc.IsVector) { typeDst = new VectorType(itemType, typeSrc.AsVector); } // An output column is transposable iff the input column was transposable. VectorType slotType = null; if (info.SlotTypeSrc != null) { slotType = new VectorType(itemType, info.SlotTypeSrc); } ex = new ColInfoEx(kind, range != null, typeDst, slotType); return(true); }