/// <summary> /// Gets a page of data items retrieved by a given filter and sorted according to sort parameters. /// /// This method shall be called by a public getPageByFilter method from child /// class that receives FilterParams and converts them into a filter function. /// </summary> /// <param name="correlationId">(optional) transaction id to trace execution through call chain.</param> /// <param name="filterDefinition">(optional) a filter JSON object</param> /// <param name="paging">(optional) paging parameters</param> /// <param name="sortDefinition">(optional) sorting JSON object</param> /// <returns>data page of results by filter.</returns> public virtual async Task <DataPage <T> > GetPageByFilterAsync(string correlationId, FilterDefinition <T> filterDefinition, PagingParams paging = null, SortDefinition <T> sortDefinition = null) { var documentSerializer = BsonSerializer.SerializerRegistry.GetSerializer <T>(); var renderedFilter = filterDefinition.Render(documentSerializer, BsonSerializer.SerializerRegistry); var query = _collection.Find(renderedFilter); if (sortDefinition != null) { query = query.Sort(sortDefinition); } paging = paging ?? new PagingParams(); var skip = paging.GetSkip(0); var take = paging.GetTake(_maxPageSize); var count = paging.Total ? (long?)await query.CountDocumentsAsync() : null; var items = await query.Skip((int)skip).Limit((int)take).ToListAsync(); _logger.Trace(correlationId, $"Retrieved {items.Count} from {_collection}"); return(new DataPage <T>() { Data = items, Total = count }); }
public Task <DataPage <BeaconV1> > GetPageByFilterAsync(string correlationId, FilterParams filter, PagingParams paging) { filter = filter ?? new FilterParams(); var site_id = filter.GetAsNullableString("site_id"); lock (_lock) { var foundBeacons = new List <BeaconV1>(); foreach (var beacon in _beacons.Values) { if (site_id != null && !site_id.Contains(beacon.SiteId)) { continue; } foundBeacons.Add(beacon); } paging = paging ?? new PagingParams(); var skip = paging.GetSkip(0); var take = paging.GetTake(MaxPageSize); var page = foundBeacons.Skip((int)skip).Take((int)take).ToList(); var total = foundBeacons.Count; return(Task.FromResult(new DataPage <BeaconV1>(page, total))); } }
public async Task <DataPage <BeaconV1> > GetBeaconsAsync(string correlationId, FilterParams filter, PagingParams paging) { var filterBeacons = ComposeFilter(filter); var beacons = _items.FindAll(beacon => filterBeacons(beacon)); paging = paging ?? new PagingParams(); var skip = Convert.ToInt32(paging.GetSkip(-1)); var take = Convert.ToInt32(paging.GetTake(maxPageSize)); long?total = null; if (paging.Total) { total = beacons.Count(); } if (skip > 0) { beacons = beacons.Skip(skip).Take(take).ToList(); } var page = await Task.FromResult(new DataPage <BeaconV1>(beacons, total)); return(page); }
/// <summary> /// Gets a page of data items retrieved by a given filter and sorted according to sort parameters. /// /// This method shall be called by a public getPageByFilter method from child class that /// receives FilterParams and converts them into a filter function. /// </summary> /// <param name="correlationId">(optional) transaction id to trace execution through call chain.</param> /// <param name="matchFunctions">(optional) a filter function to filter items</param> /// <param name="paging">(optional) paging parameters</param> /// <returns>a data page of result by filter.</returns> public async Task <DataPage <T> > GetPageByFilterAsync(string correlationId, IList <Func <T, bool> > matchFunctions, PagingParams paging) { _lock.EnterReadLock(); try { var filteredItems = Filter(_items, matchFunctions); paging = paging ?? new PagingParams(); var skip = paging.GetSkip(0); var take = paging.GetTake(_maxPageSize); _logger.Trace(correlationId, $"Retrieved {filteredItems.Count} items"); return(await Task.FromResult(new DataPage <T>() { Data = filteredItems.Take((int)take).Skip((int)skip).ToList(), Total = paging.Total ? filteredItems.Count : (long?)null })); } finally { _lock.ExitReadLock(); } }
/// <summary> /// Gets a page of data items retrieved by a given filter and sorted according to sort parameters. /// /// This method shall be called by a public getPageByFilter method from child /// class that receives FilterParams and converts them into a filter function. /// </summary> /// <param name="correlationId">(optional) transaction id to trace execution through call chain.</param> /// <param name="filterDefinition">(optional) a filter JSON object</param> /// <param name="paging">(optional) paging parameters</param> /// <param name="sortDefinition">(optional) sorting JSON object</param> /// <param name="projection">(optional) projection parameters</param> /// <returns>data page of results by filter.</returns> public virtual async Task <DataPage <object> > GetPageByFilterAndProjectionAsync(string correlationId, FilterDefinition <T> filterDefinition, PagingParams paging = null, SortDefinition <T> sortDefinition = null, ProjectionParams projection = null) { var documentSerializer = BsonSerializer.SerializerRegistry.GetSerializer <T>(); var renderedFilter = filterDefinition.Render(documentSerializer, BsonSerializer.SerializerRegistry); var query = _collection.Find(renderedFilter); if (sortDefinition != null) { query = query.Sort(sortDefinition); } var projectionBuilder = Builders <T> .Projection; var projectionDefinition = CreateProjectionDefinition(projection, projectionBuilder); paging = paging ?? new PagingParams(); var skip = paging.GetSkip(0); var take = paging.GetTake(_maxPageSize); var count = paging.Total ? (long?)await query.CountDocumentsAsync() : null; var result = new DataPage <object>() { Data = new List <object>(), Total = count }; using (var cursor = await query.Project(projectionDefinition).Skip((int)skip).Limit((int)take).ToCursorAsync()) { while (await cursor.MoveNextAsync()) { foreach (var doc in cursor.Current) { if (doc.ElementCount != 0) { result.Data.Add(BsonSerializer.Deserialize <object>(doc)); } } } } _logger.Trace(correlationId, $"Retrieved {result.Total} from {_collection} with projection fields = '{StringConverter.ToString(projection)}'"); return(result); }
/// <summary> /// Gets a page of data items retrieved by a given filter and sorted according to sort parameters. /// /// This method shall be called by a public getPageByFilter method from child /// class that receives FilterParams and converts them into a filter function. /// </summary> /// <param name="correlationId">(optional) transaction id to trace execution through call chain.</param> /// <param name="filterDefinition">(optional) a filter JSON object</param> /// <param name="paging">(optional) paging parameters</param> /// <param name="sortDefinition">(optional) sorting JSON object</param> /// <returns>data page of results by filter.</returns> public virtual async Task <DataPage <T> > GetPageByFilterAsync(string correlationId, string filter, PagingParams paging = null, string sort = null, string select = null) { select = string.IsNullOrWhiteSpace(select) ? "*" : select; var query = string.Format("SELECT {0} FROM {1}", select, QuoteIdentifier(_tableName)); // Adjust max item count based on configuration paging = paging ?? new PagingParams(); var skip = paging.GetSkip(-1); var take = paging.GetTake(_maxPageSize); var pagingEnabled = paging.Total; if (!string.IsNullOrWhiteSpace(filter)) { query += " WHERE " + filter; } if (!string.IsNullOrWhiteSpace(sort)) { query += " ORDER BY " + sort; } else { query += " ORDER BY 1"; } if (skip < 0) { skip = 0; } query += " OFFSET " + skip + " ROWS FETCH NEXT " + take + " ROWS ONLY"; var result = await ExecuteReaderAsync(query); var items = result.Select(map => ConvertToPublic(map)).ToList(); long?total = pagingEnabled ? (long?) await GetCountByFilterAsync(correlationId, filter) : null; return(new DataPage <T> { Data = items, Total = total }); }
public Task <DataPage <NoteV1> > GetNotesAsync(string correlationId, FilterParams filter, PagingParams paging) { filter = filter ?? new FilterParams(); lock (_lock) { var foundNotes = new List <NoteV1>(); foreach (var notes in _notes.Values) { foundNotes.Add(notes); } paging = paging ?? new PagingParams(); var skip = paging.GetSkip(0); var take = paging.GetTake(MaxPageSize); var page = foundNotes.Skip((int)skip).Take((int)take).ToList(); var total = foundNotes.Count; return(Task.FromResult(new DataPage <NoteV1>(page, total))); } }
public async Task <DataPage <Dummy> > GetPageByFilterAsync(string correlationId, FilterParams filter, PagingParams paging) { filter = filter != null ? filter : new FilterParams(); var key = filter.GetAsNullableString("key"); paging = paging != null ? paging : new PagingParams(); var skip = paging.GetSkip(0); var take = paging.GetTake(100); var result = new List <Dummy>(); lock (_lock) { foreach (var entity in _entities) { if (key != null && !key.Equals(entity.Key)) { continue; } skip--; if (skip >= 0) { continue; } take--; if (take < 0) { break; } result.Add(entity); } } return(await Task.FromResult(new DataPage <Dummy>(result))); }
public virtual Task <DataPage <T> > GetAsync(string correlationId, FilterParams filter, PagingParams paging) { filter = filter ?? new FilterParams(); lock (_lock) { var foundObjects = new List <T>(); foreach (dynamic obj in _objects.Values) { var isFiltered = false; foreach (var filterKey in filter.Keys) { if (filterKey.Equals("ids")) { var ids = filter.GetAsNullableString("ids"); if (ids != null && !ids.Contains(obj.Id)) { isFiltered = true; break; } continue; } var propertyValue = GetObjectFieldValue(obj, filterKey); if (propertyValue != null) { var propertyValues = propertyValue as List <object>; if (propertyValues != null) { if (!ContainsFilterValue(propertyValues, filter[filterKey])) { isFiltered = true; break; } } else if (!propertyValue.Equals(filter[filterKey])) { isFiltered = true; break; } } } if (!isFiltered) { foundObjects.Add(obj); } } paging = paging ?? new PagingParams(); var skip = paging.GetSkip(0); var take = paging.GetTake(MaxPageSize); var page = foundObjects.Skip((int)skip).Take((int)take).ToList(); var total = foundObjects.Count; return(Task.FromResult(new DataPage <T>(page, total))); } }
public async Task <DataPage <BlobInfoV1> > GetBlobsByFilterAsync(string correlationId, FilterParams filter, PagingParams paging) { var filterFuncs = ComposeFilter(filter); paging = paging ?? new PagingParams(); var skip = paging.GetSkip(0); var take = paging.GetTake(_maxTake); var data = new List <BlobInfoV1>(); var completed = false; string token = null; while (completed == false && data.Count < take) { var result = await _client.ListObjectsAsync(new ListObjectsRequest { BucketName = _bucket, Marker = token, MaxKeys = (int)_maxTake }); token = result.NextMarker; // If nothing is returned then exit if (result.S3Objects.Count == 0) { completed = true; break; } // Extract ids and retrieve objects var ids = new string[result.S3Objects.Count]; for (var index = 0; index < ids.Length; index++) { ids[index] = result.S3Objects[index].Key; } var items = await GetBlobsByIdsAsync(correlationId, ids); // Add items to data foreach (var item in items) { // Filter items using provided criteria var selected = true; foreach (var filterFunc in filterFuncs) { selected = selected && filterFunc(item); } if (!selected) { continue; } // Continue if skipped completely if (skip > 0) { skip--; continue; } // Include items until page is over if (take > 0) { data.Add(item); take--; } } if (!result.IsTruncated) { break; } } return(new DataPage <BlobInfoV1>(data, 0)); }
public Task <LogMessageV1[]> GetPageByFilterAsync(string correlationId, FilterParams filter, PagingParams paging) { filter = filter ?? new FilterParams(); var search = filter.GetAsNullableString("search"); var level = filter.GetAsNullableInteger("level"); var maxLevel = filter.GetAsNullableInteger("max_level"); var fromTime = filter.GetAsNullableDateTime("from_time"); var toTime = filter.GetAsNullableDateTime("to_time"); var errorsOnly = filter.GetAsBooleanWithDefault("errors_only", false); paging = paging ?? new PagingParams(); var skip = paging.GetSkip(0); var take = paging.GetTake(MaxPageSize); var data = new List <LogMessageV1>(); var messages = errorsOnly ? ErrorMessages : Messages; for (var index = 0; index < messages.Count; index++) { var message = messages[index]; if (search != null && !MessageContains(message, search)) { continue; } if (level != null && level != (int)message.Level) { continue; } if (maxLevel != null && maxLevel < (int)message.Level) { continue; } if (fromTime != null && fromTime > message.Time) { continue; } if (toTime != null && toTime <= message.Time) { continue; } skip--; if (skip >= 0) { continue; } data.Insert(0, message); take--; if (take <= 0) { break; } } return(Task.FromResult(data.ToArray())); }