public async Task <JToken> GetData(DynDatabaseRequest request, bool shallow = false) { var domain = DbService.GetDomainPath(request.DatabaseId); var dataPath = new FlatJsonPath(request.Path); return(await Task.Run(() => { if (!DbService.Store.Exists(domain)) { return null; // 404 - There's no data container } // Unflatten and retrieve JSON object var flatJsonDict = new Dictionary <string, string>(); // Use an optimization to only fetch requested keys foreach (var key in DbService.Store.GetKeysEnumerable(domain).Where(x => x.StartsWith(dataPath.TokenPrefix, StringComparison.Ordinal) || x.StartsWith(dataPath.ArrayPrefix, StringComparison.Ordinal))) { var val = DbService.Store.Get(domain, key); flatJsonDict.Add(key, val); } var unflattenedJObj = new FlatJsonObject(flatJsonDict).Unflatten(); if (shallow) { var resultObject = unflattenedJObj.SelectToken(dataPath.TokenPath); if (resultObject is JArray) { return new JArray(resultObject.Children().Select(c => new JValue(c ?? false))); } if (resultObject is JObject) { var filteredProps = (resultObject as JObject).Properties().Select(p => new JProperty(p.Name, (p.Children().FirstOrDefault() is JObject ? true : p.Value) ?? false)); return new JObject(filteredProps); } return null; } return unflattenedJObj.SelectToken(dataPath.TokenPath); })); }
public static async Task <JToken> GetData(string path) { var convTokenPath = FlatJsonPath.ConvertUriPathToTokenPath(path); return(await Task.Run(() => { var db = DatabaseAccessService.OpenOrCreateDefault(); var store = db.GetCollection <JsonObjectStoreContainer>(DatabaseAccessService.GetDataStoreKey(0)); var rootObjectContainer = store.FindAll().FirstOrDefault(); var unflattenedJObj = new FlatJsonObject(rootObjectContainer.FlattenedJObject).Unflatten(); return unflattenedJObj.SelectToken(convTokenPath); })); }