Exemplo n.º 1
0
        /// <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)));
            }
        }
Exemplo n.º 3
0
        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();
            }
        }
Exemplo n.º 5
0
        /// <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);
        }
Exemplo n.º 6
0
        /// <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
            });
        }
Exemplo n.º 7
0
        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)));
            }
        }
Exemplo n.º 8
0
        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)));
            }
        }
Exemplo n.º 10
0
        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()));
        }