Example #1
0
        public static async Task <IEnumerable <TEntity> > Get <TEntity>(string tableName, QueryFactoryHelper queryFactoryHelper, IEnumerable <CompositeKey> ids)
        {
            var queryFactory = queryFactoryHelper.GetQueryFactory();

            var whereIn = DataLoaderUtility.GetWhereIn(ids);

            const float maximumIdCount    = 1000;
            var         idCount           = whereIn.First().Value.Length;
            var         aggregatedResults = new List <TEntity>();

            var totalPages = Math.Ceiling(idCount / maximumIdCount);

            for (var page = 0; page < totalPages; page++)
            {
                var batchedCompositeIds = new Dictionary <string, string[]>();

                foreach (var(key, value) in whereIn)
                {
                    batchedCompositeIds.Add(key,
                                            value.Skip((int)(page * maximumIdCount)).Take((int)maximumIdCount).ToArray());
                }

                var query = queryFactory
                            .Query(tableName);

                foreach (var(field, fieldIds) in batchedCompositeIds)
                {
                    query.WhereIn(field, fieldIds);
                }
                var results = await query.GetAsync <TEntity>();

                aggregatedResults.AddRange(results);
            }

            return(aggregatedResults);
        }
Example #2
0
        private void InitQuery <TFieldType, TModelType>(string tableName) where TFieldType : IGraphType
        {
            var entityName = typeof(TModelType).Name;

            FieldAsync <ResultType <TFieldType, TModelType> >(
                entityName.ToLowerInvariant(),
                arguments: new QueryArguments(
                    new QueryArgument <ListGraphType <FilterGraphType> >()
            {
                Name = "filter", Description = "Filter by any field using standard operators"
            },
                    new QueryArgument <StringGraphType>()
            {
                Name = "orderBy", Description = "The name of the field to order by"
            },
                    new QueryArgument <NonNullGraphType <IntGraphType> >()
            {
                Name = "pageSize", Description = "Page size for pagination"
            },
                    new QueryArgument <IntGraphType>()
            {
                Name = "page", Description = "Page for pagination"
            }
                    ),
                resolve: async context =>
            {
                // get arguments

                var filters = context.GetArgument <List <Filter> >("filter")?.ToList() ?? new List <Filter>();
                var orderBy = context.GetArgument <string>("orderBy");

                // build query

                var queryFactory = _queryFactoryHelper.GetQueryFactory();
                var query        = queryFactory.Query(tableName);

                foreach (var item in filters)
                {
                    if (!new[] { "in", "not in", "notin" }.Contains(item.Op.ToLower()))
                    {
                        query.Where(item.Field, item.Op, item.Value);
                    }

                    if (item.Op.ToLower() == "in")
                    {
                        query.WhereIn(item.Field, item.Value.Split(',').Select(_ => _.Trim()));
                    }

                    if (new[] { "not in", "notin" }.Contains(item.Op.ToLower()))
                    {
                        query.WhereNotIn(item.Field, item.Value.Split(',').Select(_ => _.Trim()));
                    }
                }

                if (!string.IsNullOrEmpty(orderBy))
                {
                    query.OrderBy(orderBy);
                }

                // execute query

                return(await query.UseOffsetPaginationAsync <TModelType>(context));
            }
                );
        }