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))))))); }
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); }
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]))); }
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); }
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); }
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); }