Kinetica   C#   API  Version 7.2.3.1
TypeBuilder.cs
Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 
4 namespace kinetica.Records;
5 
21  public sealed class TypeBuilder
22  {
23  private readonly string _label;
24  private readonly List<Column> _columns;
25  private (string Name, ColumnType Type, List<string> Properties)? _currentColumn;
26 
31  public TypeBuilder(string label)
32  {
33  _label = label ?? throw new ArgumentNullException(nameof(label));
34  _columns = new List<Column>();
35  _currentColumn = null;
36  }
37 
38  private void FinishCurrentColumn()
39  {
40  if (_currentColumn.HasValue)
41  {
42  var (name, type, props) = _currentColumn.Value;
43  _columns.Add(Column.WithProperties(name, type, props));
44  _currentColumn = null;
45  }
46  }
47 
48  #region Add Column Methods
49 
53  public TypeBuilder AddColumn(Column column)
54  {
55  FinishCurrentColumn();
56  _columns.Add(column);
57  return this;
58  }
59 
63  public TypeBuilder AddIntColumn(string name)
64  {
65  FinishCurrentColumn();
66  _currentColumn = (name, ColumnType.Integer, new List<string>());
67  return this;
68  }
69 
73  public TypeBuilder AddLongColumn(string name)
74  {
75  FinishCurrentColumn();
76  _currentColumn = (name, ColumnType.Long, new List<string>());
77  return this;
78  }
79 
83  public TypeBuilder AddFloatColumn(string name)
84  {
85  FinishCurrentColumn();
86  _currentColumn = (name, ColumnType.Float, new List<string>());
87  return this;
88  }
89 
93  public TypeBuilder AddDoubleColumn(string name)
94  {
95  FinishCurrentColumn();
96  _currentColumn = (name, ColumnType.Double, new List<string>());
97  return this;
98  }
99 
103  public TypeBuilder AddStringColumn(string name)
104  {
105  FinishCurrentColumn();
106  _currentColumn = (name, ColumnType.String, new List<string>());
107  return this;
108  }
109 
113  public TypeBuilder AddBytesColumn(string name)
114  {
115  FinishCurrentColumn();
116  _currentColumn = (name, ColumnType.Bytes, new List<string>());
117  return this;
118  }
119 
123  public TypeBuilder AddTimestampColumn(string name)
124  {
125  FinishCurrentColumn();
126  _currentColumn = (name, ColumnType.Timestamp, new List<string> { "timestamp" });
127  return this;
128  }
129 
133  public TypeBuilder AddDateColumn(string name)
134  {
135  FinishCurrentColumn();
136  _currentColumn = (name, ColumnType.Date, new List<string> { "date" });
137  return this;
138  }
139 
143  public TypeBuilder AddDateTimeColumn(string name)
144  {
145  FinishCurrentColumn();
146  _currentColumn = (name, ColumnType.DateTime, new List<string> { "datetime" });
147  return this;
148  }
149 
153  public TypeBuilder AddTimeColumn(string name)
154  {
155  FinishCurrentColumn();
156  _currentColumn = (name, ColumnType.Time, new List<string> { "time" });
157  return this;
158  }
159 
163  public TypeBuilder AddBooleanColumn(string name)
164  {
165  FinishCurrentColumn();
166  _currentColumn = (name, ColumnType.Boolean, new List<string> { "boolean" });
167  return this;
168  }
169 
173  public TypeBuilder AddInt8Column(string name)
174  {
175  FinishCurrentColumn();
176  _currentColumn = (name, ColumnType.Int8, new List<string> { "int8" });
177  return this;
178  }
179 
183  public TypeBuilder AddInt16Column(string name)
184  {
185  FinishCurrentColumn();
186  _currentColumn = (name, ColumnType.Int16, new List<string> { "int16" });
187  return this;
188  }
189 
193  public TypeBuilder AddDecimalColumn(string name)
194  {
195  FinishCurrentColumn();
196  _currentColumn = (name, ColumnType.Decimal, new List<string> { "decimal" });
197  return this;
198  }
199 
203  public TypeBuilder AddIpv4Column(string name)
204  {
205  FinishCurrentColumn();
206  _currentColumn = (name, ColumnType.Ipv4, new List<string> { "ipv4" });
207  return this;
208  }
209 
213  public TypeBuilder AddUuidColumn(string name)
214  {
215  FinishCurrentColumn();
216  _currentColumn = (name, ColumnType.Uuid, new List<string> { "uuid" });
217  return this;
218  }
219 
225  public TypeBuilder AddCharColumn(string name, int length)
226  {
227  FinishCurrentColumn();
228  var (type, prop) = length switch
229  {
230  1 => (ColumnType.Char1, "char1"),
231  2 => (ColumnType.Char2, "char2"),
232  4 => (ColumnType.Char4, "char4"),
233  8 => (ColumnType.Char8, "char8"),
234  16 => (ColumnType.Char16, "char16"),
235  32 => (ColumnType.Char32, "char32"),
236  64 => (ColumnType.Char64, "char64"),
237  128 => (ColumnType.Char128, "char128"),
238  256 => (ColumnType.Char256, "char256"),
239  _ => throw new ArgumentException($"Invalid char length: {length}. Must be 1, 2, 4, 8, 16, 32, 64, 128, or 256.", nameof(length))
240  };
241  _currentColumn = (name, type, new List<string> { prop });
242  return this;
243  }
244 
248  public TypeBuilder AddWktColumn(string name)
249  {
250  FinishCurrentColumn();
251  _currentColumn = (name, ColumnType.Wkt, new List<string> { "wkt" });
252  return this;
253  }
254 
258  public TypeBuilder AddJsonColumn(string name)
259  {
260  FinishCurrentColumn();
261  _currentColumn = (name, ColumnType.Json, new List<string> { "json" });
262  return this;
263  }
264 
265  #endregion
266 
267  #region Property Modifiers
268 
273  {
274  if (_currentColumn.HasValue)
275  {
276  var (name, type, props) = _currentColumn.Value;
277  if (!props.Contains("primary_key"))
278  props.Add("primary_key");
279  _currentColumn = (name, type, props);
280  }
281  return this;
282  }
283 
288  {
289  if (_currentColumn.HasValue)
290  {
291  var (name, type, props) = _currentColumn.Value;
292  if (!props.Contains("shard_key"))
293  props.Add("shard_key");
294  _currentColumn = (name, type, props);
295  }
296  return this;
297  }
298 
303  {
304  if (_currentColumn.HasValue)
305  {
306  var (name, type, props) = _currentColumn.Value;
307  if (!props.Contains("nullable"))
308  props.Add("nullable");
309  _currentColumn = (name, type, props);
310  }
311  return this;
312  }
313 
317  public TypeBuilder Data()
318  {
319  if (_currentColumn.HasValue)
320  {
321  var (name, type, props) = _currentColumn.Value;
322  if (!props.Contains("data"))
323  props.Add("data");
324  _currentColumn = (name, type, props);
325  }
326  return this;
327  }
328 
332  public TypeBuilder WithProperty(string property)
333  {
334  if (_currentColumn.HasValue && !string.IsNullOrEmpty(property))
335  {
336  var (name, type, props) = _currentColumn.Value;
337  if (!props.Contains(property))
338  props.Add(property);
339  _currentColumn = (name, type, props);
340  }
341  return this;
342  }
343 
344  #endregion
345 
346  #region Build Methods
347 
352  public Type Build()
353  {
354  FinishCurrentColumn();
355  return new Type(_label, _columns);
356  }
357 
358  #endregion
359  }
TypeBuilder AddLongColumn(string name)
Adds a long column.
Definition: TypeBuilder.cs:73
TypeBuilder Data()
Marks the current column as data column.
Definition: TypeBuilder.cs:317
TypeBuilder AddUuidColumn(string name)
Adds a UUID column.
Definition: TypeBuilder.cs:213
Type Build()
Builds the Type.
Definition: TypeBuilder.cs:352
TypeBuilder AddBooleanColumn(string name)
Adds a boolean column (stored as int).
Definition: TypeBuilder.cs:163
TypeBuilder AddFloatColumn(string name)
Adds a float column.
Definition: TypeBuilder.cs:83
TypeBuilder WithProperty(string property)
Adds a custom property to the current column.
Definition: TypeBuilder.cs:332
TypeBuilder AddIpv4Column(string name)
Adds an IPv4 column.
Definition: TypeBuilder.cs:203
TypeBuilder AddJsonColumn(string name)
Adds a JSON column.
Definition: TypeBuilder.cs:258
TypeBuilder AddIntColumn(string name)
Adds an integer column.
Definition: TypeBuilder.cs:63
TypeBuilder ShardKey()
Marks the current column as shard key.
Definition: TypeBuilder.cs:287
TypeBuilder AddTimestampColumn(string name)
Adds a timestamp column.
Definition: TypeBuilder.cs:123
TypeBuilder PrimaryKey()
Marks the current column as primary key.
Definition: TypeBuilder.cs:272
TypeBuilder AddColumn(Column column)
Adds a column with the specified type.
Definition: TypeBuilder.cs:53
TypeBuilder AddDateColumn(string name)
Adds a date column.
Definition: TypeBuilder.cs:133
TypeBuilder AddDateTimeColumn(string name)
Adds a datetime column.
Definition: TypeBuilder.cs:143
Immutable metadata about a column in a Kinetica type.
Definition: Column.cs:11
TypeBuilder AddCharColumn(string name, int length)
Adds a char(N) column.
Definition: TypeBuilder.cs:225
TypeBuilder AddInt16Column(string name)
Adds an int16 column.
Definition: TypeBuilder.cs:183
TypeBuilder AddInt8Column(string name)
Adds an int8 column.
Definition: TypeBuilder.cs:173
TypeBuilder AddDecimalColumn(string name)
Adds a decimal column.
Definition: TypeBuilder.cs:193
Builder for constructing a Type with a fluent API.
Definition: TypeBuilder.cs:21
Immutable collection of metadata about a Kinetica type.
Definition: Type.cs:36
TypeBuilder Nullable()
Marks the current column as nullable.
Definition: TypeBuilder.cs:302
static Column WithProperties(string name, ColumnType columnType, IEnumerable< string > properties)
Creates a column with properties from a list.
TypeBuilder(string label)
Creates a new TypeBuilder with the specified label.
Definition: TypeBuilder.cs:31
TypeBuilder AddTimeColumn(string name)
Adds a time column.
Definition: TypeBuilder.cs:153
TypeBuilder AddDoubleColumn(string name)
Adds a double column.
Definition: TypeBuilder.cs:93
TypeBuilder AddWktColumn(string name)
Adds a WKT (Well-Known Text) geometry column.
Definition: TypeBuilder.cs:248
TypeBuilder AddStringColumn(string name)
Adds a string column.
Definition: TypeBuilder.cs:103
TypeBuilder AddBytesColumn(string name)
Adds a bytes column.
Definition: TypeBuilder.cs:113