public KeyValueView(ISchema originalSchema, IPayload originalPayload) { IPayload key, value; ISchemaBuilder k, v; IEnumerable <IGrouping <bool, IField> > groups; if ((object)originalSchema == null) { throw new ArgumentNullException(nameof(originalSchema)); } if ((object)originalPayload == null) { throw new ArgumentNullException(nameof(originalPayload)); } groups = originalSchema.Fields.Values.OrderBy(f => f.FieldIndex).GroupBy(f => f.IsFieldKeyComponent); key = new Payload(); value = new Payload(); k = new SchemaBuilder(); v = new SchemaBuilder(); foreach (IGrouping <bool, IField> grouping in groups) { foreach (IField field in grouping) { originalPayload.TryGetValue(field.FieldName, out object fieldValue); (grouping.Key ? key : value).Add(field.FieldName, fieldValue); (grouping.Key ? k : v).AddField(field.FieldName, field.FieldType, field.IsFieldOptional, field.IsFieldKeyComponent, field.FieldSchema); } } this.originalSchema = originalSchema; this.originalPayload = originalPayload; this.keyPayload = key; this.valuePayload = value; this.keySchema = k.Build(); this.valueSchema = v.Build(); }
public override async Task WriteRecordsAsync(IAsyncEnumerable <IPayload> records, CancellationToken cancellationToken) { IAsyncEnumerator <IPayload> recordz; if ((object)records == null) { throw new ArgumentNullException(nameof(records)); } if (!this.HeaderRecordWritten) { await this.WriteHeaderFieldsAsync(null, cancellationToken); // force fields if not explicitly called in advance } recordz = records.GetEnumerator(); long recordIndex = 0; while (await recordz.MoveNext(cancellationToken)) { IPayload record = recordz.Current; long fieldIndex = 0; if (record.TryGetValue(string.Empty, out object rawFieldValue)) { string safeFieldValue; safeFieldValue = rawFieldValue.SafeToString(null, string.Empty); await this.BaseTextWriter.WriteAsync(safeFieldValue /*, cancellationToken*/); // TODO: no CT overload in 2.0 - SMH fieldIndex++; } if (!SolderFascadeAccessor.DataTypeFascade.IsNullOrEmpty(this.TextualSpec.RecordDelimiter)) { await this.BaseTextWriter.WriteAsync(this.TextualSpec.RecordDelimiter /*, cancellationToken*/); // TODO: no CT overload in 2.0 - SMH } recordIndex++; } }