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();
        }
Beispiel #2
0
        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++;
            }
        }