private void GetUpdatedLogHeaderIndexRange(ChannelDataReader reader, string[] mnemonics, Dictionary <string, Range <double?> > ranges, bool increasing = true)
        {
            for (var i = 0; i < mnemonics.Length; i++)
            {
                var             mnemonic = mnemonics[i];
                Range <double?> current;

                if (!ranges.TryGetValue(mnemonic, out current))
                {
                    current = new Range <double?>(null, null);
                }

                var update = reader.GetChannelIndexRange(i);
                var start  = current.Start;
                var end    = current.End;

                if (!current.Start.HasValue || !update.StartsAfter(current.Start.Value, increasing))
                {
                    start = update.Start;
                }
                if (!current.End.HasValue || !update.EndsBefore(current.End.Value, increasing))
                {
                    end = update.End;
                }

                ranges[mnemonic] = new Range <double?>(start, end);
            }
        }
        /// <summary>
        /// Updates the channel data for the specified data object URI.
        /// </summary>
        /// <param name="uri">The parent data object URI.</param>
        /// <param name="reader">The update reader.</param>
        public void UpdateChannelData(EtpUri uri, ChannelDataReader reader)
        {
            // TODO: Transaction support needed here
            Logger.Debug($"Updating channel data for URI: {uri}");

            // Capture primary index info when auto-creating data object
            var indexInfos = Exists(uri) ? null : reader.Indices;
            var offset     = reader.Indices.Take(1).Select(x => x.IsTimeIndex).FirstOrDefault()
                ? reader.GetChannelIndexRange(0).Offset
                : null;

            // Ensure data object and parent data objects exist
            var dataProvider = Container.Resolve <IEtpDataProvider>(new ObjectName(uri.ObjectType, uri.Version));

            dataProvider.Ensure(uri);

            // Only use the URI of the channelSet as it is a top level object
            uri        = EtpUris.Witsml200.Append(ObjectTypes.ChannelSet, uri.ObjectId);
            reader.Uri = uri.Uri;

            if (indexInfos != null)
            {
                // Update data object with primary index info after it has been auto-created
                UpdateIndexInfo(uri, indexInfos, offset);
            }

            // Ensure all logCurveInfo elements exist
            UpdateChannels(uri, reader, offset);

            // Update channel data and index range
            UpdateChannelDataAndIndexRange(uri, reader);
        }
Esempio n. 3
0
        public void ChannelDataReader_Can_Calculate_Channel_Min_Max_Indices_With_Multiple_Values()
        {
            var reader = new ChannelDataReader(UpdateLogData3, new[] { "ROP", "GR", "HKLD" })
                         .WithIndex("MD", "m", true, false);

            Assert.AreEqual(1, reader.Depth);
            Assert.AreEqual(4, reader.FieldCount);
            Assert.AreEqual(6, reader.RecordsAffected);

            var range = reader.GetChannelIndexRange(reader.GetOrdinal("GR"));

            Assert.AreEqual(3.5, range.Start);
            Assert.AreEqual(7.0, range.End);
        }