/// <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)); }