/// <summary>
        /// Converts object value from public to internal format.
        /// </summary>
        /// <param name="value">an object in public format to convert</param>
        /// <returns>converted object in internal format</returns>
        protected virtual AnyValueMap ConvertFromPublic(T value)
        {
            var json = JsonConverter.ToJson(value);
            var map  = new AnyValueMap(MapConverter.ToMap(JsonConverter.FromJson(json)));

            return(map);
        }
Beispiel #2
0
        public async Task TestModifyNestedCollection()
        {
            // arrange
            var dummy = await _persistence.CreateAsync(null, _dummy1);

            var innerInnerDummies = new List <InnerDummy>()
            {
                new InnerDummy()
                {
                    Id   = "Test Inner Id #1",
                    Name = "Test Inner Dummy #1"
                },
                new InnerDummy()
                {
                    Id   = "Test Inner Id #2",
                    Name = "Test Inner Dummy #2"
                },
            };

            var updateMap = new AnyValueMap()
            {
                { "inner_dummy.inner_inner_dummies", innerInnerDummies }
            };

            // act - It's important to pass the type of updated object!
            var result = await _persistence.ModifyByIdAsync(null, dummy.Id, ComposeUpdate <List <InnerDummy> >(updateMap));

            // assert 1
            Assert.NotNull(result);
            Assert.Equal(innerInnerDummies[0].Id, result.InnerDummy.InnerInnerDummies[0].Id);
            Assert.Equal(innerInnerDummies[0].Name, result.InnerDummy.InnerInnerDummies[0].Name);
            Assert.Equal(innerInnerDummies[1].Id, result.InnerDummy.InnerInnerDummies[1].Id);
            Assert.Equal(innerInnerDummies[1].Name, result.InnerDummy.InnerInnerDummies[1].Name);
        }
        /// <summary>
        /// Updates only few selected fields in a data item.
        /// </summary>
        /// <param name="correlation_id">(optional) transaction id to trace execution through call chain.</param>
        /// <param name="id">an id of data item to be updated.</param>
        /// <param name="data">a map with fields to be updated.</param>
        /// <returns>updated item.</returns>
        public async Task <T> UpdatePartiallyAsync(string correlationId, K id, AnyValueMap data)
        {
            _lock.EnterWriteLock();

            object item;

            try
            {
                var index = _items.FindIndex(x => x.Id.Equals(id));

                if (index < 0)
                {
                    return(default(T));
                }

                item = _items[index];

                var properties = ObjectReader.GetProperties(data.GetAsObject());
                ObjectWriter.SetProperties(item, properties);

                _items[index] = (T)item;

                _logger.Trace(correlationId, "Partially updated item {0}", id);
            }
            finally
            {
                _lock.ExitWriteLock();
            }

            await SaveAsync(correlationId);

            return((T)item);
        }
        /// <summary>
        /// Converts object value from internal to public format.
        /// </summary>
        /// <param name="map">an object in internal format to convert</param>
        /// <returns>converted object in public format</returns>
        protected virtual T ConvertToPublic(AnyValueMap map)
        {
            var json = JsonConverter.ToJson(map);
            T   obj  = JsonConverter.FromJson <T>(json);

            return(obj);
        }
        /// <summary>
        /// Converts object value from internal to public format.
        /// </summary>
        /// <param name="value">an object in internal format to convert.</param>
        /// <returns>converted object in public format.</returns>
        protected override T ConvertToPublic(AnyValueMap map)
        {
            if (map != null && map.TryGetValue("data", out object value) && value != null)
            {
                return(base.ConvertToPublic(value as AnyValueMap));
            }

            return(default);
Beispiel #6
0
        public RestOperationParameters GetAsNullableParameters(string key)
        {
            AnyValueMap asNullableMap = this.GetAsNullableMap(key);

            if (asNullableMap == null)
            {
                return((RestOperationParameters)null);
            }
            return(new RestOperationParameters((IDictionary)asNullableMap));
        }
Beispiel #7
0
        private static LogMessageV1 ExtractLogMessage(AnyValueMap map)
        {
            var time          = map.GetAsDateTimeWithDefault("time", DateTime.UtcNow);
            var level         = map.GetAsEnum <LogLevel>("level");
            var source        = map.GetAsStringWithDefault("source", string.Empty);
            var correlationId = map.GetAsStringWithDefault("correlation_id", string.Empty);
            var error         = ExtractError(map.GetAsMap("error"));
            var message       = map.GetAsStringWithDefault("message", string.Empty);

            return(new LogMessageV1(time, level, source, correlationId, error, message));
        }
        public virtual async Task <T> ModifyAsync(string correlationId, string id, AnyValueMap updateMap)
        {
            updateMap = updateMap ?? new AnyValueMap();

            var order = await GetByIdAsync(correlationId, id);

            foreach (var propertyName in updateMap.Keys)
            {
                ModifyObjectFields(order, propertyName, updateMap[propertyName]);
            }

            return(order);
        }
Beispiel #9
0
        private LogMessageV1[] ExtractLogMessages(Parameters args)
        {
            var result = new List <LogMessageV1>();

            foreach (var parameters in args.GetAsParameters("messages").Values)
            {
                var message = ExtractLogMessage(AnyValueMap.FromValue(parameters));

                result.Add(message);
            }

            return(result.ToArray());
        }
        public async Task TestCrudOperationsAsync()
        {
            // Create one dummy
            var dummy1 = await _persistence.CreateAsync(null, _dummy1);

            Assert.NotNull(dummy1);
            Assert.NotNull(dummy1.Id);
            Assert.Equal(_dummy1.Key, dummy1.Key);
            Assert.Equal(_dummy1.Content, dummy1.Content);

            // Create another dummy
            var dummy2 = await _persistence.CreateAsync(null, _dummy2);

            Assert.NotNull(dummy2);
            Assert.NotNull(dummy2.Id);
            Assert.Equal(_dummy2.Key, dummy2.Key);
            Assert.Equal(_dummy2.Content, dummy2.Content);

            //// Get all dummies
            //var dummies = await _get.GetAllAsync(null);
            //Assert.NotNull(dummies);
            //Assert.Equal(2, dummies.Count());

            // Update the dummy
            dummy1.Content = "Updated Content 1";
            var dummy = await _persistence.UpdateAsync(null, dummy1);

            Assert.NotNull(dummy);
            Assert.Equal(dummy1.Id, dummy.Id);
            Assert.Equal(dummy1.Key, dummy.Key);
            Assert.Equal(dummy1.Content, dummy.Content);

            // Update partially the dummy
            dummy = await _persistence.UpdatePartiallyAsync(null, dummy1.Id, AnyValueMap.FromTuples(
                                                                "content", "Partially Updated Content 1"
                                                                ));

            Assert.NotNull(dummy);
            Assert.Equal(dummy1.Id, dummy.Id);
            Assert.Equal(dummy1.Key, dummy.Key);
            Assert.Equal("Partially Updated Content 1", dummy.Content);

            // Delete the dummy
            await _persistence.DeleteByIdAsync(null, dummy1.Id);

            // Try to get deleted dummy
            dummy = await _persistence.GetOneByIdAsync(null, dummy1.Id);

            Assert.Null(dummy);
        }
Beispiel #11
0
        protected virtual UpdateDefinition <T> ComposeUpdate(AnyValueMap updateMap)
        {
            updateMap = updateMap ?? new AnyValueMap();

            var builder           = Builders <T> .Update;
            var updateDefinitions = new List <UpdateDefinition <T> >();

            foreach (var key in updateMap.Keys)
            {
                updateDefinitions.Add(builder.Set(key, updateMap[key]));
            }

            return(builder.Combine(updateDefinitions));
        }
        public void TestGetAsString()
        {
            var message = AnyValueMap.FromTuples(
                "key1", 123,
                "key2", "ABC"
                );

            var restoredMessageObject = JsonConverter.FromJson <object>(JsonConverter.ToJson(message));
            var restoredMessage       = AnyValueMap.FromValue(restoredMessageObject);

            Assert.Equal(2, restoredMessage.Count);
            Assert.Equal(123, restoredMessage.GetAsInteger("key1"));
            Assert.Equal("ABC", restoredMessage.GetAsString("key2"));
        }
Beispiel #13
0
        private UpdateDefinition <Dummy> ComposeUpdate <T>(AnyValueMap updateMap)
            where T : class
        {
            updateMap = updateMap ?? new AnyValueMap();

            var builder           = Builders <Dummy> .Update;
            var updateDefinitions = new List <UpdateDefinition <Dummy> >();

            foreach (var key in updateMap.Keys)
            {
                updateDefinitions.Add(builder.Set(key, (T)updateMap[key]));
            }

            return(builder.Combine(updateDefinitions));
        }
        public void TestSetMapProperty()
        {
            AnyValueMap map = AnyValueMap.FromTuples(
                "key1", 123,
                "key2", "ABC"
                );

            ObjectWriter.SetProperty(map, "key3", "AAAA");
            Assert.Equal("AAAA", map.Get("key3"));

            ObjectWriter.SetProperty(map, "Key1", 5555);
            Assert.Equal(5555, map.Get("Key1"));

            ObjectWriter.SetProperty(map, "Key2", "BBBB");
            Assert.Equal("BBBB", map.Get("Key2"));
        }
Beispiel #15
0
        private static ErrorDescription ExtractError(AnyValueMap map)
        {
            if (map.Count == 0)
            {
                return(null);
            }

            var code        = map.GetAsStringWithDefault("code", string.Empty);
            var message     = map.GetAsStringWithDefault("message", string.Empty);
            var stack_trace = map.GetAsStringWithDefault("stack_trace", string.Empty);

            return(new ErrorDescription()
            {
                Code = code,
                Message = message,
                StackTrace = stack_trace
            });
        }
Beispiel #16
0
        public void TestGetMapProperties()
        {
            AnyValueMap map = AnyValueMap.FromTuples(
                "key1", 123,
                "key2", "ABC"
                );
            var names = ObjectReader.GetPropertyNames(map);

            Assert.Equal(2, names.Count);
            Assert.Contains("key1", names);
            Assert.Contains("key2", names);

            var values = ObjectReader.GetProperties(map);

            Assert.Equal(2, values.Count);
            Assert.Equal(123, values["key1"]);
            Assert.Equal("ABC", values["key2"]);
        }
Beispiel #17
0
        public void TestGetMapProperty()
        {
            var map = AnyValueMap.FromTuples(
                "key1", 123,
                "key2", "ABC"
                );

            var key3Value = ObjectReader.GetProperty(map, "key3");

            Assert.Null(key3Value);

            var key1Value = ObjectReader.GetProperty(map, "Key1");

            Assert.Equal(123, key1Value);

            var key2Value = ObjectReader.GetProperty(map, "KEY2");

            Assert.Equal("ABC", key2Value);
        }
Beispiel #18
0
        public async Task TestModifyExistingPropertiesBySelectedFields()
        {
            // arrange
            var dummy = await _persistence.CreateAsync(null, _dummy1);

            var updateMap = new AnyValueMap()
            {
                { "Content", "Modified Content" },
                { "InnerDummy.Description", "Modified InnerDummy Description" }
            };

            // act
            var result = await _persistence.ModifyByIdAsync(null, dummy.Id, ComposeUpdate(updateMap));

            // assert
            Assert.NotNull(result);
            Assert.Equal(dummy.Id, result.Id);
            Assert.Equal("Modified Content", result.Content);
            Assert.Equal("Modified InnerDummy Description", result.InnerDummy.Description);
        }
Beispiel #19
0
        public void TestConfigFromObject()
        {
            var value = AnyValueMap.FromTuples(
                "field1", ConfigParams.FromString("field11=123;field12=ABC"),
                "field2", AnyValueArray.FromValues(
                    123, "ABC", ConfigParams.FromString("field21=543;field22=XYZ")
                    ),
                "field3", true
                );

            var config = ConfigParams.FromValue(value);

            Assert.Equal(7, config.Count);
            Assert.Equal(123, config.GetAsInteger("field1.field11"));
            Assert.Equal("ABC", config.GetAsString("field1.field12"));
            Assert.Equal(123, config.GetAsInteger("field2.0"));
            Assert.Equal("ABC", config.GetAsString("field2.1"));
            Assert.Equal(543, config.GetAsInteger("field2.2.field21"));
            Assert.Equal("XYZ", config.GetAsString("field2.2.field22"));
            Assert.Equal(true, config.GetAsBoolean("field3"));
        }
Beispiel #20
0
        public async Task TestMultiThreadOperationsAsync(int i)
        {
            var dummy = new Dummy
            {
                Id            = null,
                Key           = $"Key {i}",
                Content       = "Content 1",
                CreateTimeUtc = DateTime.UtcNow,
                SubDummy      = new SubDummy {
                    Type = "some type", ArrayOfDouble = new double[] { 10, 10 }
                }
            };

            // Create one dummy
            var dummy1 = await _persistence.CreateAsync(null, dummy);

            Assert.NotNull(dummy1);
            Assert.NotNull(dummy1.SubDummy);
            Assert.Equal(dummy.Key, dummy1.Key);
            Assert.Equal(dummy.Content, dummy1.Content);
            Assert.Equal(dummy.CreateTimeUtc, dummy1.CreateTimeUtc, TimeSpan.FromMilliseconds(1000));
            Assert.Equal(dummy.SubDummy.Type, dummy1.SubDummy.Type);
            Assert.Equal(dummy.SubDummy.ArrayOfDouble, dummy1.SubDummy.ArrayOfDouble);

            // Update the dummy
            dummy1.Content = "Updated Content 1";
            var result = await _persistence.UpdateAsync(null, dummy1);

            Assert.NotNull(result);
            Assert.NotNull(result.SubDummy);
            Assert.Equal(dummy1.Id, result.Id);
            Assert.Equal(dummy1.Key, result.Key);
            Assert.Equal(dummy1.Content, result.Content);
            Assert.Equal(dummy1.CreateTimeUtc, result.CreateTimeUtc, TimeSpan.FromMilliseconds(1000));
            Assert.Equal(dummy1.SubDummy.Type, result.SubDummy.Type);
            Assert.Equal(dummy1.SubDummy.ArrayOfDouble, result.SubDummy.ArrayOfDouble);

            // Set the dummy
            dummy1.Content = "Updated Content 2";
            result         = await _persistence.SetAsync(null, dummy1);

            Assert.NotNull(result);
            Assert.NotNull(result.SubDummy);
            Assert.Equal(dummy1.Id, result.Id);
            Assert.Equal(dummy1.Key, result.Key);
            Assert.Equal(dummy1.Content, result.Content);
            Assert.Equal(dummy1.CreateTimeUtc, result.CreateTimeUtc, TimeSpan.FromMilliseconds(1000));
            Assert.Equal(dummy1.SubDummy.Type, result.SubDummy.Type);
            Assert.Equal(dummy1.SubDummy.ArrayOfDouble, result.SubDummy.ArrayOfDouble);

            // Partially update the dummy
            result = await _persistence.UpdatePartially(null, dummy1.Id,
                                                        AnyValueMap.FromTuples("content", "Partially Updated Content 1"));

            Assert.NotNull(result);
            Assert.Equal(dummy1.Id, result.Id);
            Assert.Equal(dummy1.Key, result.Key);
            Assert.Equal("Partially Updated Content 1", result.Content);

            // Get the dummy by Id
            result = await _persistence.GetOneByIdAsync(null, dummy1.Id);

            Assert.NotNull(result);
            Assert.Equal(dummy1.Id, result.Id);
            Assert.Equal(dummy1.Key, result.Key);

            // Delete the dummy
            result = await _persistence.DeleteByIdAsync(null, dummy1.Id);

            Assert.NotNull(result);
            Assert.Equal(dummy1.Id, result.Id);
            Assert.Equal(dummy1.Key, result.Key);

            // Get the deleted dummy
            result = await _persistence.GetOneByIdAsync(null, dummy1.Id);

            Assert.Null(result);
        }
Beispiel #21
0
 /// <summary>
 /// Creates a new Parameters object filled with provided key-value pairs called
 /// tuples.Tuples parameters contain a sequence of key1, value1, key2, value2, ... pairs.
 /// </summary>
 /// <param name="tuples">the tuples to fill a new Parameters object.</param>
 /// <returns>a new Parameters object.</returns>
 /// See <see cref="AnyValueMap.FromTuples(object[])"/>
 public new static Parameters FromTuples(params object[] tuples)
 {
     return(new Parameters(AnyValueMap.FromTuples(tuples)));
 }
Beispiel #22
0
        public async Task TestCrudOperationsAsync()
        {
            // Create one dummy
            var dummy1 = await _persistence.CreateAsync(null, _dummy1);

            Assert.NotNull(dummy1);
            Assert.NotNull(dummy1.SubDummy);
            Assert.Equal(_dummy1.Key, dummy1.Key);
            Assert.Equal(_dummy1.Content, dummy1.Content);
            Assert.Equal(_dummy1.CreateTimeUtc, dummy1.CreateTimeUtc, TimeSpan.FromMilliseconds(1000));
            Assert.Equal(_dummy1.SubDummy.Type, dummy1.SubDummy.Type);
            Assert.Equal(_dummy1.SubDummy.ArrayOfDouble, dummy1.SubDummy.ArrayOfDouble);

            // Create another dummy
            var dummy2 = await _persistence.CreateAsync(null, _dummy2);

            Assert.NotNull(dummy2);
            Assert.NotNull(dummy2.SubDummy);
            Assert.Equal(_dummy2.Key, dummy2.Key);
            Assert.Equal(_dummy2.Content, dummy2.Content);
            Assert.Equal(_dummy2.CreateTimeUtc, dummy2.CreateTimeUtc, TimeSpan.FromMilliseconds(1000));
            Assert.Equal(_dummy2.SubDummy.Type, dummy2.SubDummy.Type);
            Assert.Equal(_dummy2.SubDummy.ArrayOfDouble, dummy2.SubDummy.ArrayOfDouble);

            var page = await _persistence.GetPageByFilterAsync(null, null, null);

            Assert.NotNull(page);
            Assert.Equal(2, page.Data.Count);

            page = await _persistence.GetPageByFilterAsync(null, FilterParams.FromTuples("key", _dummy2.Key), null);

            Assert.NotNull(page);
            Assert.Single(page.Data);

            // Update the dummy
            dummy1.Content = "Updated Content 1";
            var result = await _persistence.UpdateAsync(null, dummy1);

            Assert.NotNull(result);
            Assert.NotNull(result.SubDummy);
            Assert.Equal(dummy1.Id, result.Id);
            Assert.Equal(dummy1.Key, result.Key);
            Assert.Equal(dummy1.Content, result.Content);
            Assert.Equal(dummy1.CreateTimeUtc, result.CreateTimeUtc, TimeSpan.FromMilliseconds(1000));
            Assert.Equal(dummy1.SubDummy.Type, result.SubDummy.Type);
            Assert.Equal(dummy1.SubDummy.ArrayOfDouble, result.SubDummy.ArrayOfDouble);

            // Set the dummy
            dummy1.Content = "Updated Content 2";
            result         = await _persistence.SetAsync(null, dummy1);

            Assert.NotNull(result);
            Assert.NotNull(result.SubDummy);
            Assert.Equal(dummy1.Id, result.Id);
            Assert.Equal(dummy1.Key, result.Key);
            Assert.Equal(dummy1.Content, result.Content);
            Assert.Equal(dummy1.CreateTimeUtc, result.CreateTimeUtc, TimeSpan.FromMilliseconds(1000));
            Assert.Equal(dummy1.SubDummy.Type, result.SubDummy.Type);
            Assert.Equal(dummy1.SubDummy.ArrayOfDouble, result.SubDummy.ArrayOfDouble);

            // Partially update the dummy
            result = await _persistence.UpdatePartially(null, dummy1.Id,
                                                        AnyValueMap.FromTuples("content", "Partially Updated Content 1"));

            Assert.NotNull(result);
            Assert.Equal(dummy1.Id, result.Id);
            Assert.Equal(dummy1.Key, result.Key);
            Assert.Equal("Partially Updated Content 1", result.Content);

            // Get the dummy by Id
            result = await _persistence.GetOneByIdAsync(null, dummy1.Id);

            Assert.NotNull(result);
            Assert.Equal(dummy1.Id, result.Id);
            Assert.Equal(dummy1.Key, result.Key);

            // Delete the dummy
            result = await _persistence.DeleteByIdAsync(null, dummy1.Id);

            Assert.NotNull(result);
            Assert.Equal(dummy1.Id, result.Id);
            Assert.Equal(dummy1.Key, result.Key);

            // Get the deleted dummy
            result = await _persistence.GetOneByIdAsync(null, dummy1.Id);

            Assert.Null(result);

            var count = await _persistence.GetCountByFilterAsync(null, null);

            Assert.Equal(1, count);
        }
Beispiel #23
0
 private UpdateDefinition <Dummy> ComposeUpdate(AnyValueMap updateMap)
 {
     return(ComposeUpdate <object>(updateMap));
 }
 /// <summary>
 /// Generates a list of column names to use in SQL statements like: "column1,column2,column3"
 /// </summary>
 /// <param name="map">key-value map</param>
 /// <returns>a generated list of column names</returns>
 protected string GenerateColumns(AnyValueMap map)
 {
     return(GenerateColumns(map.Keys.ToList()));
 }
 /// <summary>
 /// Generates a list of column sets to use in UPDATE statements like: column1=@Param1,column2=@Param2
 /// </summary>
 /// <param name="map">a key-value map with columns and values</param>
 /// <returns></returns>
 protected string GenerateSetParameters(AnyValueMap map)
 {
     return(GenerateSetParameters(map.Keys.ToList()));
 }
 /// <summary>
 /// Generates a list of column parameters
 /// </summary>
 /// <param name="map">a key-value map with columns and values</param>
 /// <returns>generated list of column values</returns>
 protected List <object> GenerateValues(AnyValueMap map)
 {
     return(map.Values.ToList());
 }
Beispiel #27
0
 public static RestOperationParameters MergeParams(params RestOperationParameters[] parameters)
 {
     return(new RestOperationParameters((IDictionary)AnyValueMap.FromMaps((IDictionary[])parameters)));
 }
Beispiel #28
0
 public static new RestOperationParameters FromTuples(params object[] tuples)
 {
     return(new RestOperationParameters((IDictionary)AnyValueMap.FromTuples(tuples)));
 }
Beispiel #29
0
 public async Task <Dummy> ModifyAsync(string correlationId, string id, AnyValueMap updateMap)
 {
     return(await ModifyByIdAsync(correlationId, id, ComposeUpdate(updateMap)));
 }
        /// <summary>
        /// Updates only few selected fields in a data item.
        /// </summary>
        /// <param name="correlationId">(optional) transaction id to trace execution through call chain.</param>
        /// <param name="id">an id of data item to be updated.</param>
        /// <param name="data">a map with fields to be updated.</param>
        /// <returns>the updated item.</returns>
        public virtual async Task <T> UpdatePartiallyAsync(string correlationId, K id, AnyValueMap data)
        {
            if (id == null)
            {
                return(default(T));
            }

            var options = new FindOneAndUpdateOptions <T>
            {
                ReturnDocument = ReturnDocument.After,
                IsUpsert       = false
            };

            var builder = Builders <T> .Filter;
            var filter  = builder.Eq(x => x.Id, id);

            var update = ComposeUpdate(data);
            var result = await _collection.FindOneAndUpdateAsync(filter, update, options);

            if (result != null)
            {
                _logger.Trace(correlationId, "Updated partially in {0} with id = {1}", _collectionName, id);
            }

            return(result);
        }