示例#1
0
        /// <summary>
        /// Bulk tag creation.
        /// </summary>
        /// <param name="settings">The settings.</param>
        /// <returns></returns>
        public Result <BulkResults> BulkCreate(string dataSetName, List <Tag> tags, int parallelLimit, long requestSize)
        {
            var results = new BulkResults();

            var tagIsInteger = DataSet(dataSetName).TagIsInteger;

            if (tagIsInteger && tags.Any(tag => tag.Id.Any(ch => !char.IsDigit(ch))))
            {
                results.Results = tags
                                  .Where(tag => tag.Id.Any(ch => !char.IsDigit(ch)))
                                  .Select(t => BulkResult.Create(
                                              t.Id,
                                              StatusCodes.Status400BadRequest,
                                              string.Format(TagResources.TagIdShouldBeIntegerType, t.ParentId, t.Id)))
                                  .ToList();

                return(Result.Ok(results));
            }

            var tagIdsByLevel = TagHelper.GetTagIdsByLevel(tags, item => item.ParentId, item => item.Id);
            var validIds      = tagIdsByLevel.SelectMany(l => l.Value).ToList();
            var invalidIds    = tags.Select(t => t.Id).Except(validIds);

            if (invalidIds.Any())
            {
                results.Results = tags
                                  .Where(t => invalidIds.Contains(t.Id))
                                  .Select(t => BulkResult.Create(t.Id, StatusCodes.Status404NotFound, string.Format(TagResources.ParentId_0_NotFoundInTagWithId_1, t.ParentId, t.Id))).ToList();

                // returns with OK status, individual items contain error code
                return(Result.Ok(results));
            }

            var orderedTagElasticList = tagIdsByLevel
                                        .SelectMany(dic => dic.Value)
                                        .Select(id =>
            {
                var tag        = tags.FirstOrDefault(t => t.Id == id);
                var tagElastic = new TagElastic
                {
                    Id           = tag.Id,
                    Name         = tag.Name,
                    ParentIdList = new List <string>()
                };
                if (!string.IsNullOrWhiteSpace(tag.ParentId))
                {
                    tagElastic.ParentIdList.Add(tag.ParentId);
                }
                return(tagElastic);
            })
                                        .ToList();

            TagHelper.AdjustTagElastics(orderedTagElasticList);

            var tagQuery = TagQuery(dataSetName);

            tagQuery.DeleteAll();

            var bulkResponseStruct = tagQuery.ParallelBulkIndex(orderedTagElasticList, parallelLimit, requestSize);

            results.Results.AddRange(bulkResponseStruct.ToBulkResult());

            return(Result.Ok(results));
        }