コード例 #1
0
        public JObject Execute(IDbState state, JObject parameters)
        {
            if (parameters.Count != 0)
            {
                return(Result.Error.InvalidRequest);
            }

            return(Result.Ok.WithContent(new JObject(state.Collections.Select(collection => new JProperty(collection.Key, collection.Value.Select(kvp => GetJObject(kvp.Key, kvp.Value)))))));
        }
コード例 #2
0
        public JObject Execute(IDbState state, JObject parameters)
        {
            if (parameters.Count != 1)
            {
                return(Result.Error.InvalidRequest);
            }

            var collectionProperty = parameters.Properties().First();
            var collectionName     = collectionProperty.Name;

            if (collectionProperty.Count != 1)
            {
                return(Result.Error.InvalidRequest);
            }

            if (collectionProperty.Value.Type != JTokenType.String)
            {
                return(Result.Error.InvalidRequest);
            }

            var key = collectionProperty.Value.ToObject <string>();

            var collectionIndexies = state.Indexies.GetOrAdd(collectionName, _ => new ConcurrentDictionary <string, ConcurrentDictionary <string, List <string> > >());

            if (collectionIndexies.ContainsKey(key))
            {
                return(Result.Error.AlreadyExists);
            }

            var indexKeys = collectionIndexies.GetOrAdd(key, _ => new ConcurrentDictionary <string, List <string> >());

            var collection = state.Collections.GetOrAdd(collectionName, _ => new ConcurrentDictionary <string, ConcurrentDictionary <string, string> >());

            // заполнить indexKeys[возможное значение ключа] = "список айдишников, где есть такое значение ключа"
            foreach (var idAndDocument in collection)
            {
                var document = idAndDocument.Value;
                if (document.TryGetValue(key, out var value))
                {
                    indexKeys.AddOrUpdate(value, new List <string> {
                        idAndDocument.Key
                    }, (key, list) =>
                    {
                        list.Add(idAndDocument.Key);
                        return(list);
                    });
                }
            }

            return(Result.Ok.Empty);
        }
コード例 #3
0
        public JObject Execute(IDbState state, string collectionName, JToken parameters)
        {
            var id = parameters.ToObject <string>();

            if (!state.Collections.TryGetValue(collectionName, out var collection))
            {
                return(Result.Error.NotFound);
            }

            if (!collection.ContainsKey(id))
            {
                return(Result.Error.NotFound);
            }

            return(Result.Ok.WithContent(GetJObject(id, collection[id])));
        }
コード例 #4
0
        public JObject Execute(IDbState state, JObject parameters)
        {
            if (parameters.Count != 1)
            {
                return(Result.Error.InvalidRequest);
            }

            var property       = parameters.Properties().First();
            var collectionName = property.Name;

            if (property.Value.Type != JTokenType.String)
            {
                return(Result.Error.InvalidRequest);
            }

            var id = property.Value.ToObject <string>();

            if (!state.Collections.TryGetValue(collectionName, out var collection))
            {
                return(Result.Error.NotFound);
            }

            if (!collection.ContainsKey(id))
            {
                return(Result.Error.NotFound);
            }

            collection.TryRemove(id, out var deleted);
            foreach (var kvp in deleted)
            {
                if (state.Indexies.TryGetValue(collectionName, out var collectionIndexies) &&
                    collectionIndexies.TryGetValue(kvp.Key, out var indexFields) &&
                    indexFields.TryGetValue(kvp.Value, out var list))
                {
                    list.Remove(id);
                }
            }



            return(Result.Ok.Empty);
        }
コード例 #5
0
        public JObject Execute(IDbState state, JObject parameters)
        {
            if (parameters.Count != 1)
            {
                return(Result.Error.InvalidRequest);
            }

            var collectionProperty = parameters.Properties().First();
            var collectionName     = collectionProperty.Name;

            if (collectionProperty.Count != 1)
            {
                return(Result.Error.InvalidRequest);
            }

            if (collectionProperty.Value.Type != JTokenType.String)
            {
                return(Result.Error.InvalidRequest);
            }

            var key = collectionProperty.Value.ToObject <string>();

            if (!state.Indexies.TryGetValue(collectionName, out var collectionIndexies))
            {
                return(Result.Error.NotFound);
            }

            if (!collectionIndexies.ContainsKey(key))
            {
                return(Result.Error.NotFound);
            }

            collectionIndexies.TryRemove(key, out _);

            return(Result.Ok.Empty);
        }
コード例 #6
0
        public JObject Execute(IDbState state, JObject parameters)
        {
            if (parameters.Count != 1)
            {
                return(Result.Error.InvalidRequest);
            }

            var collectionProperty = parameters.Properties().First();
            var collectionName     = collectionProperty.Name;

            if (collectionProperty.Count != 1)
            {
                return(Result.Error.InvalidRequest);
            }

            if (collectionProperty.First() is not JObject idAndOperations)
            {
                return(Result.Error.InvalidRequest);
            }

            var idProperty = idAndOperations.Properties().First();
            var id         = idProperty.Name;

            var collection = state.Collections.GetOrAdd(collectionName, _ => new ConcurrentDictionary <string, ConcurrentDictionary <string, string> >());


            if (idProperty.First() is not JArray operations)
            {
                return(Result.Error.InvalidRequest);
            }

            if (!operations.All(op => op.Type == JTokenType.Object))
            {
                return(Result.Error.InvalidRequest);
            }


            foreach (JObject operation in operations)
            {
                switch (operation.Properties().First().Name)
                {
                case "set":
                    if (!collection.ContainsKey(id))
                    {
                        return(Result.Error.NotFound);
                    }
                    break;

                case "unset":
                    if (!collection.ContainsKey(id))
                    {
                        return(Result.Error.NotFound);
                    }
                    break;

                default:
                    return(Result.Error.InvalidRequest);

                    break;
                }
            }

            foreach (JObject obj in operations.Children <JObject>())
            {
                var objProp = obj.Properties().First();
                switch (objProp.Name)
                {
                case "set":
                    var kvp = objProp.Value.ToObject <JObject>().Properties().First();
                    collection[id][kvp.Name] = kvp.Value.ToObject <string>();
                    break;

                case "unset":
                    collection[id].TryRemove(objProp.Value.ToObject <string>(), out _);
                    break;

                default:
                    return(Result.Error.InvalidRequest);

                    break;
                }
            }

            return(Result.Ok.Empty);
        }