Пример #1
0
 static BulkResult <T> CreateResult <T>(T data, BulkWrite wcr) where T : IDocument
 {
     return(new BulkResult <T> {
         Data = data,
         BulkWrite = wcr
     });
 }
Пример #2
0
        public BulkResult <Descarga> UpdateCuestionario(UpdateCuestionario request)
        {
            var descarga = Single <Descarga> (q => q.Token == request.Data.Descarga.Token &&
                                              q.IdDiagnostico == request.Data.Descarga.IdDiagnostico
                                              );

            if (descarga.Id.IsNullOrEmpty())
            {
                throw new Exception("Token token:'{0}' No encontrado".Fmt(request.Data.Descarga.Token));
            }

            if (descarga.Estado == "green")
            {
                throw new Exception("Cuestionario asociado al Token token:'{0}' ya esta actualizado"
                                    .Fmt(request.Data.Descarga.Token));
            }

            if (descarga.Estado == "red")
            {
                descarga.Estado = "yellow";
                Put(descarga);
            }

            var bwr = new BulkWrite();

            if (request.Data.Respuestas.Count > 0)
            {
                var cl = GetCollection <Respuesta> ();
                BulkWriteOperation bw = cl.InitializeOrderedBulkOperation();
                request.Data.Respuestas.ForEach(r => {
                    if (r.Respuestas.Count > 0)
                    {
                        r.Valor = (short?)(r.Respuestas.Exists(v => v == false)?0:1);
                    }
                    bw.Find(Query <Respuesta> .Where(q => q.IdDiagnostico == descarga.IdDiagnostico && q.IdPregunta == r.IdPregunta))
                    .Upsert().UpdateOne(Update <Respuesta>
                                        .Set(f => f.Valor, r.Valor).Set(f => f.NoAplicaChecked, r.NoAplicaChecked).Set(f => f.Respuestas, r.Respuestas));
                });
                var wc = bw.Execute();
                bwr.PopulateWith(wc);
                bwr.UpsertsCount = wc.Upserts.Count;
            }

            if (request.Data.RespuestasGuias.Count > 0)
            {
                var gIds = request.Data.RespuestasGuias.ConvertAll(e => e.IdGuia);

                var guias = GetCollection <Guia>().Find(Query <Guia> .In((q) => q.Id, gIds));

                var cl2 = GetCollection <RespuestaGuia> ();
                BulkWriteOperation bw2 = cl2.InitializeOrderedBulkOperation();
                request.Data.RespuestasGuias.ForEach(r => {
                    var guia = guias.FirstOrDefault(g => g.Id == r.IdGuia);
                    bw2.Find(Query <RespuestaGuia>
                             .Where(q => q.IdDiagnostico == descarga.IdDiagnostico && q.IdGuia == r.IdGuia))
                    .Upsert().UpdateOne(Update <RespuestaGuia>
                                        .Set(f => f.Valor, r.Valor)
                                        .Set(f => f.NoAplicaChecked, r.NoAplicaChecked)
                                        .Set(f => f.Tipo, guia.Tipo));
                });

                var wc2 = bw2.Execute();
                bwr.DeleteCount   += wc2.DeletedCount;
                bwr.InsertedCount += wc2.InsertedCount;
                bwr.MatchedCount  += wc2.MatchedCount;
                bwr.UpsertsCount  += wc2.Upserts.Count;
            }
            if ((request.Data.Respuestas.Count + request.Data.RespuestasGuias.Count) > 0 &&
                ((bwr.UpsertsCount + bwr.MatchedCount) ==
                 (request.Data.Respuestas.Count + request.Data.RespuestasGuias.Count)))
            {
                descarga.Estado = "green";
                Put(descarga);
                GetCollection <Diagnostico> ().FindAndModify(new FindAndModifyArgs {
                    Query  = Query <Diagnostico> .EQ(x => x.Id, descarga.IdDiagnostico),
                    Update = Update <Diagnostico> .Inc(x => x.Revision, 1).Set(x => x.FechaRevision, DateTime.UtcNow)
                });
            }

            return(CreateResult(descarga, bwr));
        }