Ejemplo n.º 1
0
            internal static AppendOperation Parse(BlittableJsonReaderObject input)
            {
                if (input.TryGet(nameof(Timestamp), out DateTime ts) == false)
                {
                    throw new InvalidDataException($"Missing '{nameof(Timestamp)}' property");
                }

                if (input.TryGet(nameof(Values), out BlittableJsonReaderArray values) == false || values == null)
                {
                    throw new InvalidDataException($"Missing '{nameof(Values)}' property");
                }

                input.TryGet(nameof(Tag), out string tag); // optional

                var doubleValues = new double[values.Length];

                for (int i = 0; i < doubleValues.Length; i++)
                {
                    doubleValues[i] = values.GetByIndex <double>(i);
                }

                var op = new AppendOperation
                {
                    Timestamp = ts,
                    Values    = doubleValues,
                    Tag       = tag
                };

                return(op);
            }
Ejemplo n.º 2
0
        public void Prepare_InsertsEvents(
            [Frozen] Mock <IBatchOperation> operationMock,
            [Frozen] string streamName,
            [Frozen] EventStreamHeader header,
            JournaledEvent[] events,
            AppendOperation operation)
        {
            operation.Prepare(events);

            var version = header.Version;

            foreach (var journaledEvent in events)
            {
                var e = journaledEvent;
                version = version.Increment();

                VerifyInsertOperation(
                    operationMock: operationMock,
                    partitionKey: streamName,
                    rowKey: version.ToString(),
                    verifyColumns: columns =>
                    columns["EventId"].Equals(e.EventId) &&
                    columns["EventType"].Equals(e.EventTypeName));
            }
        }
Ejemplo n.º 3
0
        public void Prepare_CreatesBatchOperation(
            [Frozen] Mock <ICloudTable> tableMock,
            JournaledEvent[] events,
            AppendOperation operation)
        {
            operation.Prepare(events);

            tableMock.Verify(self => self.PrepareBatchOperation(), Times.Once());
        }
Ejemplo n.º 4
0
        public async Task Execute_ReturnsHeaderWithNewETag(
            [Frozen] IReadOnlyList <OperationResult> batchResult,
            JournaledEvent[] events,
            AppendOperation operation)
        {
            operation.Prepare(events);

            var result = await operation.ExecuteAsync();

            Assert.Equal(batchResult[0].ETag, result.ETag);
        }
Ejemplo n.º 5
0
        public async Task Execute_ReturnsHeaderWithIncrementedVersion(
            [Frozen] StreamVersion currentVersion,
            JournaledEvent[] events,
            AppendOperation operation)
        {
            var targetVersion = currentVersion.Increment(events.Count());

            operation.Prepare(events);

            var result = await operation.ExecuteAsync();

            Assert.Equal(targetVersion, result.Version);
        }
Ejemplo n.º 6
0
        internal static TimeSeriesOperation Parse(BlittableJsonReaderObject input)
        {
            if (input.TryGet(nameof(Name), out string name) == false || name == null)
            {
                ThrowMissingProperty(nameof(Name));
            }

            var result = new TimeSeriesOperation
            {
                Name = name
            };

            if (input.TryGet(nameof(Appends), out BlittableJsonReaderArray operations) && operations != null)
            {
                var sorted = new SortedList <long, AppendOperation>();

                foreach (var op in operations)
                {
                    if (!(op is BlittableJsonReaderObject bjro))
                    {
                        ThrowNotBlittableJsonReaderObjectOperation(op);
                        return(null); //never hit
                    }

                    var append = AppendOperation.Parse(bjro);

                    sorted[append.Timestamp.Ticks] = append;
                }

                result._appends = sorted;
            }

            if (input.TryGet(nameof(Deletes), out operations) && operations != null)
            {
                result.Deletes = new List <DeleteOperation>();

                foreach (var op in operations)
                {
                    if (!(op is BlittableJsonReaderObject bjro))
                    {
                        ThrowNotBlittableJsonReaderObjectOperation(op);
                        return(null); //never hit
                    }

                    result.Deletes.Add(DeleteOperation.Parse(bjro));
                }
            }

            return(result);
        }
Ejemplo n.º 7
0
        public void Prepare_ForUnknownHeader_InsertsHeaderRow(
            [Frozen] Mock <IBatchOperation> operationMock,
            [Frozen] string streamName,
            [Frozen] EventStreamHeader header,
            JournaledEvent[] events,
            AppendOperation operation)
        {
            var targetVersion = (int)header.Version.Increment(events.Count());

            operation.Prepare(events);

            VerifyInsertOperation(
                operationMock,
                streamName,
                "HEAD",
                name => name.Equals("Version"),
                value => value.Equals(targetVersion));
        }
Ejemplo n.º 8
0
 public void Append(AppendOperation appendOperation)
 {
     _appends ??= new SortedList <long, AppendOperation>();
     appendOperation.Timestamp = appendOperation.Timestamp.EnsureUtc().EnsureMilliseconds();
     _appends[appendOperation.Timestamp.Ticks] = appendOperation; // on duplicate values the last one overrides
 }
Ejemplo n.º 9
0
        internal static TimeSeriesOperation ParseForBulkInsert(BlittableJsonReaderObject input)
        {
            if (input.TryGet(nameof(Name), out string name) == false || name == null)
            {
                ThrowMissingProperty(nameof(Name));
            }

            input.TryGet(TimeSeriesFormat, out TimeFormat format);

            var result = new TimeSeriesOperation
            {
                Name = name
            };

            if (input.TryGet(nameof(Appends), out BlittableJsonReaderArray operations) == false || operations == null)
            {
                ThrowMissingProperty(nameof(Appends));
            }

            var sorted = new SortedList <long, AppendOperation>();

            foreach (var op in operations)
            {
                if (!(op is BlittableJsonReaderArray bjro))
                {
                    ThrowNotBlittableJsonReaderArrayOperation(op);
                    return(null); //never hit
                }

                var time = GetLong(bjro[0]);

                switch (format)
                {
                case TimeFormat.UnixTimeInMs:
                    time = FromUnixMs(time);
                    break;

                case TimeFormat.UnixTimeInNs:
                    time = FromUnixNs(time);
                    break;

                case TimeFormat.DotNetTicks:
                    break;

                default:
                    throw new ArgumentException($"Unknown time-format '{format}'");
                }

                var append = new AppendOperation
                {
                    Timestamp = new DateTime(time)
                };

                var numberOfValues = GetLong(bjro[1]);
                var doubleValues   = new double[numberOfValues];

                for (var i = 0; i < numberOfValues; i++)
                {
                    var obj = bjro[i + 2];
                    switch (obj)
                    {
                    case long l:
                        // when we send the number without the decimal point
                        // this is the same as what Convert.ToDouble is doing
                        doubleValues[i] = l;
                        break;

                    case LazyNumberValue lnv:
                        doubleValues[i] = lnv;
                        break;

                    default:
                        doubleValues[i] = Convert.ToDouble(obj);
                        break;
                    }
                }

                append.Values = doubleValues;

                var tagIndex = 2 + numberOfValues;
                if (bjro.Length > tagIndex)
                {
                    if (BlittableJsonReaderObject.ChangeTypeToString(bjro[(int)tagIndex], out string tagAsString) == false)
                    {
                        ThrowNotString(bjro[0]);
                    }

                    append.Tag = tagAsString;
                }

                sorted[append.Timestamp.Ticks] = append;
            }

            result._appends = sorted;

            return(result);
Ejemplo n.º 10
0
 public async Task Execute_WhenOperationHasNotBeenPrepared_Throws(
     AppendOperation operation)
 {
     await Assert.ThrowsAsync <InvalidOperationException>(operation.ExecuteAsync);
 }