Skip to content

Commit d2836d3

Browse files
committed
Remove "KeyType" specific members on ColumnType.
- IsKey - KeyCount - KeyCountCore Part of the work necessary for dotnet#1860 and contributes to dotnet#1533.
1 parent 447e94e commit d2836d3

File tree

55 files changed

+204
-199
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+204
-199
lines changed

src/Microsoft.ML.Core/Data/ColumnType.cs

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ public abstract class ColumnType : IEquatable<ColumnType>
2222
private ColumnType()
2323
{
2424
IsVector = this is VectorType;
25-
IsKey = this is KeyType;
2625
}
2726

2827
/// <summary>
@@ -71,27 +70,6 @@ private protected ColumnType(Type rawType, DataKind rawKind)
7170
[BestFriend]
7271
internal DataKind RawKind { get; }
7372

74-
/// <summary>
75-
/// Whether this type is a key type, which implies that the order of values is not significant,
76-
/// and arithmetic is non-sensical. A key type can define a cardinality.
77-
/// External code should use <c>is <see cref="KeyType"/></c>.
78-
/// </summary>
79-
[BestFriend]
80-
internal bool IsKey { get; }
81-
82-
/// <summary>
83-
/// Zero return means either it's not a key type or the cardinality is unknown. External code should first
84-
/// test whether this is of type <see cref="KeyType"/>, then if so get the <see cref="KeyType.Count"/> property
85-
/// from that.
86-
/// </summary>
87-
[BestFriend]
88-
internal int KeyCount => KeyCountCore;
89-
90-
/// <summary>
91-
/// The only sub-class that should override this is <see cref="KeyType"/>.
92-
/// </summary>
93-
private protected virtual int KeyCountCore => 0;
94-
9573
/// <summary>
9674
/// Whether this is a vector type. External code should just check directly against whether this type
9775
/// is <see cref="VectorType"/>.
@@ -602,7 +580,6 @@ private KeyType(Type type, DataKind kind, ulong min, int count, bool contiguous)
602580
Contiguous = contiguous;
603581
Min = min;
604582
Count = count;
605-
Contracts.Assert(IsKey);
606583
}
607584

608585
public KeyType(Type type, ulong min, int count, bool contiguous = true)
@@ -662,8 +639,6 @@ public static bool IsValidDataType(Type type)
662639
return type == typeof(byte) || type == typeof(ushort) || type == typeof(uint) || type == typeof(ulong);
663640
}
664641

665-
private protected override int KeyCountCore => Count;
666-
667642
/// <summary>
668643
/// This is the Min of the key type for display purposes and conversion to/from text. The values
669644
/// actually stored always start at 1 (for the smallest legal value), with zero being reserved

src/Microsoft.ML.Core/Data/ColumnTypeExtensions.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,10 @@ internal static class ColumnTypeExtensions
1717
public static bool IsStandardScalar(this ColumnType columnType) =>
1818
(columnType is NumberType) || (columnType is TextType) || (columnType is BoolType) ||
1919
(columnType is TimeSpanType) || (columnType is DateTimeType) || (columnType is DateTimeOffsetType);
20+
21+
/// <summary>
22+
/// Zero return means either it's not a key type or the cardinality is unknown.
23+
/// </summary>
24+
public static int KeyCount(this ColumnType columnType) => (columnType as KeyType)?.Count ?? 0;
2025
}
2126
}

src/Microsoft.ML.Core/Data/IEstimator.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ internal Column(string name, VectorKind vecKind, ColumnType itemType, bool isKey
6262
{
6363
Contracts.CheckNonEmpty(name, nameof(name));
6464
Contracts.CheckValueOrNull(metadata);
65-
Contracts.CheckParam(!itemType.IsKey, nameof(itemType), "Item type cannot be a key");
65+
Contracts.CheckParam(!(itemType is KeyType), nameof(itemType), "Item type cannot be a key");
6666
Contracts.CheckParam(!itemType.IsVector, nameof(itemType), "Item type cannot be a vector");
6767
Contracts.CheckParam(!isKey || KeyType.IsValidDataKind(itemType.RawKind), nameof(itemType), "The item type must be valid for a key");
6868

@@ -154,9 +154,9 @@ internal static void GetColumnTypeShape(ColumnType type,
154154
vecKind = Column.VectorKind.Scalar;
155155

156156
itemType = type.ItemType;
157-
if (type.ItemType.IsKey)
157+
isKey = type.ItemType is KeyType;
158+
if (isKey)
158159
itemType = PrimitiveType.FromKind(type.ItemType.RawKind);
159-
isKey = type.ItemType.IsKey;
160160
}
161161

162162
/// <summary>

src/Microsoft.ML.Core/Data/MetadataUtils.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ public static uint GetMaxMetadataKind(this Schema schema, out int colMax, string
238238
for (int col = 0; col < schema.Count; col++)
239239
{
240240
var columnType = schema[col].Metadata.Schema.GetColumnOrNull(metadataKind)?.Type;
241-
if (columnType == null || !columnType.IsKey || columnType.RawKind != DataKind.U4)
241+
if (columnType == null || !(columnType is KeyType) || columnType.RawKind != DataKind.U4)
242242
continue;
243243
if (filterFunc != null && !filterFunc(schema, col))
244244
continue;
@@ -263,7 +263,7 @@ internal static IEnumerable<int> GetColumnSet(this Schema schema, string metadat
263263
for (int col = 0; col < schema.Count; col++)
264264
{
265265
var columnType = schema[col].Metadata.Schema.GetColumnOrNull(metadataKind)?.Type;
266-
if (columnType != null && columnType.IsKey && columnType.RawKind == DataKind.U4)
266+
if (columnType != null && columnType is KeyType && columnType.RawKind == DataKind.U4)
267267
{
268268
uint val = 0;
269269
schema[col].Metadata.GetValue(metadataKind, ref val);

src/Microsoft.ML.Data/Commands/CrossValidationCommand.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ private string GetSplitColumn(IChannel ch, IDataView input, ref IDataView output
298298
{
299299
// Check if group column key type with known cardinality.
300300
var type = schema[index].Type;
301-
if (type.KeyCount > 0)
301+
if (type.KeyCount() > 0)
302302
stratificationColumn = group;
303303
}
304304
}

src/Microsoft.ML.Data/Commands/ShowSchemaCommand.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ private static void ShowMetadataValue(IndentedTextWriter itw, Schema schema, int
212212
Contracts.AssertValue(type);
213213
Contracts.Assert(!type.IsVector);
214214

215-
if (!type.IsStandardScalar() && !type.IsKey)
215+
if (!type.IsStandardScalar() && !(type is KeyType))
216216
{
217217
itw.Write(": Can't display value of this type");
218218
return;
@@ -252,7 +252,7 @@ private static void ShowMetadataValueVec(IndentedTextWriter itw, Schema schema,
252252
Contracts.AssertValue(type);
253253
Contracts.Assert(type.IsVector);
254254

255-
if (!type.ItemType.IsStandardScalar() && !type.ItemType.IsKey)
255+
if (!type.ItemType.IsStandardScalar() && !(type.ItemType is KeyType))
256256
{
257257
itw.Write(": Can't display value of this type");
258258
return;

src/Microsoft.ML.Data/Data/Conversion.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,7 @@ public ValueMapper<TSrc, SB> GetKeyStringConversion<TSrc>(KeyType key)
567567
public TryParseMapper<TDst> GetTryParseConversion<TDst>(ColumnType typeDst)
568568
{
569569
Contracts.CheckValue(typeDst, nameof(typeDst));
570-
Contracts.CheckParam(typeDst.IsStandardScalar() || typeDst.IsKey, nameof(typeDst),
570+
Contracts.CheckParam(typeDst.IsStandardScalar() || typeDst is KeyType, nameof(typeDst),
571571
"Parse conversion only supported for standard types");
572572
Contracts.Check(typeDst.RawType == typeof(TDst), "Wrong TDst type parameter");
573573

@@ -676,7 +676,7 @@ public InPredicate<T> GetIsDefaultPredicate<T>(ColumnType type)
676676

677677
var t = type;
678678
Delegate del;
679-
if (!t.IsStandardScalar() && !t.IsKey || !_isDefaultDelegates.TryGetValue(t.RawKind, out del))
679+
if (!t.IsStandardScalar() && !(t is KeyType) || !_isDefaultDelegates.TryGetValue(t.RawKind, out del))
680680
throw Contracts.Except("No IsDefault predicate for '{0}'", type);
681681

682682
return (InPredicate<T>)del;
@@ -713,7 +713,7 @@ public bool TryGetIsNAPredicate(ColumnType type, out Delegate del)
713713
Contracts.CheckParam(!type.IsVector, nameof(type));
714714

715715
var t = type;
716-
if (t.IsKey)
716+
if (t is KeyType)
717717
{
718718
// REVIEW: Should we test for out of range when KeyCount > 0?
719719
Contracts.Assert(_isDefaultDelegates.ContainsKey(t.RawKind));
@@ -736,7 +736,7 @@ public InPredicate<VBuffer<T>> GetHasMissingPredicate<T>(VectorType type)
736736

737737
var t = type.ItemType;
738738
Delegate del;
739-
if (t.IsKey)
739+
if (t is KeyType)
740740
{
741741
// REVIEW: Should we test for out of range when KeyCount > 0?
742742
Contracts.Assert(_hasZeroDelegates.ContainsKey(t.RawKind));

src/Microsoft.ML.Data/Data/RowCursorUtils.cs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ public static Func<bool> GetIsNewGroupDelegate(Row cursor, int col)
298298
Contracts.CheckValue(cursor, nameof(cursor));
299299
Contracts.Check(0 <= col && col < cursor.Schema.Count);
300300
ColumnType type = cursor.Schema[col].Type;
301-
Contracts.Check(type.IsKey);
301+
Contracts.Check(type is KeyType);
302302
return Utils.MarshalInvoke(GetIsNewGroupDelegateCore<int>, type.RawType, cursor, col);
303303
}
304304

@@ -335,7 +335,7 @@ public static string TestGetLabelGetter(ColumnType type, bool allowKeys)
335335
if (type == NumberType.R4 || type == NumberType.R8 || type is BoolType)
336336
return null;
337337

338-
if (allowKeys && type.IsKey)
338+
if (allowKeys && type is KeyType)
339339
return null;
340340

341341
return allowKeys ? "Expected R4, R8, Bool or Key type" : "Expected R4, R8 or Bool type";
@@ -382,9 +382,11 @@ private static ValueGetter<Single> GetLabelGetterNotFloat(Row cursor, int labelI
382382
};
383383
}
384384

385-
Contracts.Check(type.IsKey, "Only floating point number, boolean, and key type values can be used as label.");
385+
if (!(type is KeyType keyType))
386+
throw Contracts.Except("Only floating point number, boolean, and key type values can be used as label.");
387+
386388
Contracts.Assert(TestGetLabelGetter(type) == null);
387-
ulong keyMax = (ulong)type.KeyCount;
389+
ulong keyMax = (ulong)keyType.Count;
388390
if (keyMax == 0)
389391
keyMax = ulong.MaxValue;
390392
var getSrc = RowCursorUtils.GetGetterAs<ulong>(NumberType.U8, cursor, labelIndex);
@@ -407,9 +409,12 @@ public static ValueGetter<VBuffer<Single>> GetLabelGetter(SlotCursor cursor)
407409
return cursor.GetGetter<Single>();
408410
if (type == NumberType.R8 || type is BoolType)
409411
return GetVecGetterAs<Single>(NumberType.R4, cursor);
410-
Contracts.Check(type.IsKey, "Only floating point number, boolean, and key type values can be used as label.");
412+
if (!(type is KeyType keyType))
413+
{
414+
throw Contracts.Except("Only floating point number, boolean, and key type values can be used as label.");
415+
}
411416
Contracts.Assert(TestGetLabelGetter(type) == null);
412-
ulong keyMax = (ulong)type.KeyCount;
417+
ulong keyMax = (ulong)keyType.Count;
413418
if (keyMax == 0)
414419
keyMax = ulong.MaxValue;
415420
var getSrc = RowCursorUtils.GetVecGetterAs<ulong>(NumberType.U8, cursor);

src/Microsoft.ML.Data/DataLoadSave/Binary/CodecFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ private void RegisterOtherCodec(string name, GetCodecFromStreamDelegate fn)
9898
public bool TryGetCodec(ColumnType type, out IValueCodec codec)
9999
{
100100
// Handle the primier types specially.
101-
if (type.IsKey)
101+
if (type is KeyType)
102102
return GetKeyCodec(type, out codec);
103103
if (type.IsVector)
104104
return GetVBufferCodec(type, out codec);

src/Microsoft.ML.Data/DataLoadSave/Binary/Codecs.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1288,7 +1288,7 @@ private bool GetKeyCodec(Stream definitionStream, out IValueCodec codec)
12881288

12891289
private bool GetKeyCodec(ColumnType type, out IValueCodec codec)
12901290
{
1291-
if (!type.IsKey)
1291+
if (!(type is KeyType))
12921292
throw Contracts.ExceptParam(nameof(type), "type must be a key type");
12931293
// Create the internal codec the key codec will use to do the actual reading/writing.
12941294
IValueCodec innerCodec;

src/Microsoft.ML.Data/DataLoadSave/DataOperations.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public IDataView FilterByKeyColumnFraction(IDataView input, string columnName, d
8585
Environment.CheckParam(lowerBound <= upperBound, nameof(upperBound), "Must be no less than lowerBound");
8686

8787
var type = input.Schema[columnName].Type;
88-
if (type.KeyCount == 0)
88+
if (type.KeyCount() == 0)
8989
throw Environment.ExceptSchemaMismatch(nameof(columnName), "filter", columnName, "a known cardinality key", type.ToString());
9090
return new RangeFilter(Environment, input, columnName, lowerBound, upperBound, false);
9191
}

src/Microsoft.ML.Data/DataLoadSave/Text/TextLoader.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -848,7 +848,7 @@ public void Save(ModelSaveContext ctx)
848848
var type = info.ColType.ItemType;
849849
Contracts.Assert((DataKind)(byte)type.RawKind == type.RawKind);
850850
ctx.Writer.Write((byte)type.RawKind);
851-
ctx.Writer.WriteBoolByte(type.IsKey);
851+
ctx.Writer.WriteBoolByte(type is KeyType);
852852
if (type is KeyType key)
853853
{
854854
ctx.Writer.WriteBoolByte(key.Contiguous);

src/Microsoft.ML.Data/DataLoadSave/Text/TextLoaderParser.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ private Func<RowSet, ColumnPipe> GetCreatorOneCore(PrimitiveType type)
7070

7171
private Func<RowSet, ColumnPipe> GetCreatorOneCore<T>(PrimitiveType type)
7272
{
73-
Contracts.Assert(type.IsStandardScalar() || type.IsKey);
73+
Contracts.Assert(type.IsStandardScalar() || type is KeyType);
7474
Contracts.Assert(typeof(T) == type.RawType);
7575
var fn = _conv.GetTryParseConversion<T>(type);
7676
return rows => new PrimitivePipe<T>(rows, type, fn);
@@ -84,7 +84,7 @@ private Func<RowSet, ColumnPipe> GetCreatorVecCore(PrimitiveType type)
8484

8585
private Func<RowSet, ColumnPipe> GetCreatorVecCore<T>(PrimitiveType type)
8686
{
87-
Contracts.Assert(type.IsStandardScalar() || type.IsKey);
87+
Contracts.Assert(type.IsStandardScalar() || type is KeyType);
8888
Contracts.Assert(typeof(T) == type.RawType);
8989
var fn = _conv.GetTryParseConversion<T>(type);
9090
return rows => new VectorPipe<T>(rows, type, fn);

src/Microsoft.ML.Data/DataLoadSave/Text/TextSaver.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ private abstract class ValueWriterBase<T> : ValueWriter
8686
protected ValueWriterBase(PrimitiveType type, int source, char sep)
8787
: base(source)
8888
{
89-
Contracts.Assert(type.IsStandardScalar() || type.IsKey);
89+
Contracts.Assert(type.IsStandardScalar() || type is KeyType);
9090
Contracts.Assert(type.RawType == typeof(T));
9191

9292
Sep = sep;
@@ -314,7 +314,7 @@ public static string SeparatorCharToString(char separator)
314314
public bool IsColumnSavable(ColumnType type)
315315
{
316316
var item = type.ItemType;
317-
return item.IsStandardScalar() || item.IsKey;
317+
return item.IsStandardScalar() || item is KeyType;
318318
}
319319

320320
public void SaveData(Stream stream, IDataView data, params int[] cols)

src/Microsoft.ML.Data/DataView/ArrayDataViewBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ public DataView(IHostEnvironment env, ArrayDataViewBuilder builder, int rowCount
223223
meta.AddSlotNames(_columns[i].Type.VectorSize, slotNamesGetter);
224224

225225
if (builder._getKeyValues.TryGetValue(builder._names[i], out var keyValueGetter))
226-
meta.AddKeyValues(_columns[i].Type.KeyCount, TextType.Instance, keyValueGetter);
226+
meta.AddKeyValues(_columns[i].Type.KeyCount(), TextType.Instance, keyValueGetter);
227227
schemaBuilder.AddColumn(builder._names[i], _columns[i].Type, meta.GetMetadata());
228228
}
229229

src/Microsoft.ML.Data/DataView/LambdaColumnMapper.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public static IDataView Create<TSrc, TDst>(IHostEnvironment env, string name, ID
2929
env.CheckValue(typeSrc, nameof(typeSrc));
3030
env.CheckValue(typeDst, nameof(typeDst));
3131
env.CheckValue(mapper, nameof(mapper));
32-
env.Check(keyValueGetter == null || typeDst.ItemType.IsKey);
32+
env.Check(keyValueGetter == null || typeDst.ItemType is KeyType);
3333
env.Check(slotNamesGetter == null || typeDst.IsKnownSizeVector);
3434

3535
if (typeSrc.RawType != typeof(TSrc))
@@ -122,10 +122,10 @@ public Impl(IHostEnvironment env, string name, IDataView input, OneToOneColumn c
122122
{
123123
if (keyValueGetter != null)
124124
{
125-
Host.Assert(_typeDst.ItemType.KeyCount > 0);
125+
Host.Assert(_typeDst.ItemType.KeyCount() > 0);
126126
MetadataUtils.MetadataGetter<VBuffer<ReadOnlyMemory<char>>> mdGetter =
127127
(int c, ref VBuffer<ReadOnlyMemory<char>> dst) => keyValueGetter(ref dst);
128-
bldr.AddGetter(MetadataUtils.Kinds.KeyValues, new VectorType(TextType.Instance, _typeDst.ItemType.KeyCount), mdGetter);
128+
bldr.AddGetter(MetadataUtils.Kinds.KeyValues, new VectorType(TextType.Instance, _typeDst.ItemType.KeyCount()), mdGetter);
129129
}
130130
if (slotNamesGetter != null)
131131
{

src/Microsoft.ML.Data/EntryPoints/PredictorModelImpl.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ internal override string[] GetLabelInfo(IHostEnvironment env, out ColumnType lab
125125
if (trainRms.Label != null)
126126
{
127127
labelType = trainRms.Label.Value.Type;
128-
if (labelType is KeyType && trainRms.Label.Value.HasKeyValues(labelType.KeyCount))
128+
if (labelType is KeyType keyType && trainRms.Label.Value.HasKeyValues(keyType.Count))
129129
{
130130
VBuffer<ReadOnlyMemory<char>> keyValues = default;
131131
trainRms.Label.Value.Metadata.GetValue(MetadataUtils.Kinds.KeyValues, ref keyValues);

src/Microsoft.ML.Data/Evaluators/AnomalyDetectionEvaluator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ private protected override void CheckScoreAndLabelTypes(RoleMappedSchema schema)
9898
throw Host.Except("Score column '{0}' has type '{1}' but must be R4", score, t).MarkSensitive(MessageSensitivity.Schema);
9999
Host.Check(schema.Label.HasValue, "Could not find the label column");
100100
t = schema.Label.Value.Type;
101-
if (t != NumberType.Float && t.KeyCount != 2)
101+
if (t != NumberType.Float && t.KeyCount() != 2)
102102
throw Host.Except("Label column '{0}' has type '{1}' but must be R4 or a 2-value key", schema.Label.Value.Name, t).MarkSensitive(MessageSensitivity.Schema);
103103
}
104104

src/Microsoft.ML.Data/Evaluators/BinaryClassifierEvaluator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ private protected override void CheckScoreAndLabelTypes(RoleMappedSchema schema)
131131
throw host.ExceptSchemaMismatch(nameof(schema), "score", score.Name, "R4", t.ToString());
132132
host.Check(schema.Label.HasValue, "Could not find the label column");
133133
t = schema.Label.Value.Type;
134-
if (t != NumberType.R4 && t != NumberType.R8 && t != BoolType.Instance && t.KeyCount != 2)
134+
if (t != NumberType.R4 && t != NumberType.R8 && t != BoolType.Instance && t.KeyCount() != 2)
135135
throw host.ExceptSchemaMismatch(nameof(schema), "label", schema.Label.Value.Name, "R4, R8, BL or a 2-value key", t.ToString());
136136
}
137137

@@ -1096,7 +1096,7 @@ private void CheckInputColumnTypes(Schema schema)
10961096
Host.AssertNonEmpty(LabelCol);
10971097

10981098
var t = schema[(int) LabelIndex].Type;
1099-
if (t != NumberType.R4 && t != NumberType.R8 && t != BoolType.Instance && t.KeyCount != 2)
1099+
if (t != NumberType.R4 && t != NumberType.R8 && t != BoolType.Instance && t.KeyCount() != 2)
11001100
throw Host.Except("Label column '{0}' has type '{1}' but must be R4, R8, BL or a 2-value key", LabelCol, t);
11011101

11021102
t = schema[ScoreIndex].Type;

src/Microsoft.ML.Data/Evaluators/EvaluatorBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ internal static AggregatorDictionaryBase Create(RoleMappedSchema schema, string
365365
Contracts.AssertNonWhiteSpace(stratCol);
366366
Contracts.AssertValue(createAgg);
367367

368-
if (stratType.KeyCount == 0 && !(stratType is TextType))
368+
if (stratType.KeyCount() == 0 && !(stratType is TextType))
369369
{
370370
throw Contracts.ExceptUserArg(nameof(MamlEvaluatorBase.ArgumentsBase.StratColumn),
371371
"Stratification column '{0}' has type '{1}', but must be a known count key or text", stratCol, stratType);

0 commit comments

Comments
 (0)