/// <summary> /// Procesa el item del documento del hecho /// </summary> /// <param name="document">Documento a procesar</param> public override void ProcessItem(EntBlockStoreDocumentosyFiltros document) { var resultado = con.actualizaroInsertar("BlockStoreHecho", document); if (resultado.TieneError) { document.estatusRegistroHecho.resultadoOperacion.Resultado = false; document.estatusRegistroHecho.resultadoOperacion.Mensaje = resultado.MensajeError; lock (document.estatusRegistroHecho.resultadoOperacion) Monitor.Pulse(document.estatusRegistroHecho.resultadoOperacion); } else { lock (document.estatusRegistroHecho) { document.estatusRegistroHecho.AgregarHechoRegistro(); if (document.estatusRegistroHecho.ObtenerNumeroRegistrosAplicados() == document.estatusRegistroHecho.numeroRegistrosPorAplicar) { document.estatusRegistroHecho.resultadoOperacion.Resultado = true; lock (document.estatusRegistroHecho.resultadoOperacion) Monitor.Pulse(document.estatusRegistroHecho.resultadoOperacion); } } } }
/// <summary> /// Realiza la distribucion del hecho en algun consumidor /// </summary> /// <param name="blockStoreDocumento">Documento con la informacion del hecho</param> public void distribuirHecho(EntBlockStoreDocumentosyFiltros blockStoreDocumento) { var documentoHecho = blockStoreDocumento.registroBlockStore; var idConcepto = documentoHecho["concepto"].AsBsonDocument["Id"].AsString; if (consumidoresPorConcepto.ContainsKey(idConcepto)) { var consumer = consumidoresPorConcepto[idConcepto]; consumer.AddItemToCollection(blockStoreDocumento); } else { if (numeroConsumidoresCreados >= numeroMaximoConsumidores) { var consumer = ObtenerConsumidorUtilizar(); consumidoresPorConcepto[idConcepto] = consumer; consumidoresPorConcepto[idConcepto].idConceptos.Add(idConcepto); } else { numeroConsumidoresCreados++; consumidoresPorConcepto[idConcepto] = new ConsumerTaskHechoImpl(con); consumidoresPorConcepto[idConcepto].idConceptos.Add(idConcepto); consumidoresPorCreacion[numeroConsumidoresCreados] = consumidoresPorConcepto[idConcepto]; } var consumerConcepto = consumidoresPorConcepto[idConcepto]; consumerConcepto.AddItemToCollection(blockStoreDocumento); } }
/// <summary> /// /// </summary> public EntLogActualizarInsertar() { miReplaceOneResultsMongo = new List <ReplaceOneResult>(); miColleccionObjetosRepetidos = new EntBlockStoreDocumentosyFiltros() { registroBlockStore = new BsonDocument(), filtrosBlockStore = new BsonDocument() }; }
/// <summary> /// Actualiza o inserta el json sobre la colección. /// </summary> /// <param name="iMongoCollection">Objeto que define en que collection de MogoDB sera insertada la información.</param> /// <param name="oBlockStoreDocumentosyFiltros">Objeto que contiene el documento en </param> /// <returns>Resultado de la inserción</returns> public async Task <EntLogActualizarInsertar> actualizaroInsertar(IMongoCollection <BsonDocument> iMongoCollection, EntBlockStoreDocumentosyFiltros oBlockStoreDocumentosyFiltros) { var log = new EntLogActualizarInsertar { miReplaceOneResultsMongo = new List <ReplaceOneResult>(), miColleccionObjetosRepetidos = new EntBlockStoreDocumentosyFiltros { filtrosBlockStore = new BsonDocument(), registroBlockStore = new BsonDocument() }, TieneError = false }; try { var remplazar = await iMongoCollection.ReplaceOneAsync(oBlockStoreDocumentosyFiltros.filtrosBlockStore, options : new UpdateOptions { IsUpsert = true }, replacement : oBlockStoreDocumentosyFiltros.registroBlockStore); if (oBlockStoreDocumentosyFiltros.EsValorChunks) { var stream = new System.IO.MemoryStream(); var writer = new System.IO.StreamWriter(stream); writer.Write(oBlockStoreDocumentosyFiltros.ValorHecho); writer.Flush(); stream.Position = 0; var options = new MongoGridFSCreateOptions { ChunkSize = AbaxXBRLBlockStore.Common.Constants.ConstBlockStoreHechos.MAX_STRING_VALUE_LENGTH, ContentType = "text/plain", Metadata = new BsonDocument { { "codigoHashRegistro", oBlockStoreDocumentosyFiltros.CodigoHashRegistro } } }; miConectionServer.ObtenerInterfaceGridFS().Upload(stream, oBlockStoreDocumentosyFiltros.CodigoHashRegistro, options); } } catch (Exception ex) { log.TieneError = true; log.MensajeError = ex.Message; LogUtil.Error(ex); } return(log); }
public EntLogActualizarInsertar actualizaroInsertar(string collection, EntBlockStoreDocumentosyFiltros oBlockStoreDocumentosyFiltros) { var resultado = actualizaroInsertar(miConectionServer.obtenerInterfaceCollection(collection), oBlockStoreDocumentosyFiltros); return(resultado.Result); }
public async void actualizaroInsertar(IMongoCollection <BsonDocument> iMongoCollection, EntBlockStoreDocumentosyFiltros oBlockStoreDocumentosyFiltros) { for (var cont = 0; cont <= oBlockStoreDocumentosyFiltros.miListaElementosBlockStore.Count; cont++) { var filtro = oBlockStoreDocumentosyFiltros.miListaFiltrosBlockStore[cont]; var valor = oBlockStoreDocumentosyFiltros.miListaElementosBlockStore[cont]; var result = await iMongoCollection.ReplaceOneAsync(filtro, options : new UpdateOptions { IsUpsert = true }, replacement : valor); } }
public void actualizaroInsertar(EntBlockStoreDocumentosyFiltros oBlockStoreDocumentosyFiltros) { actualizaroInsertar(miConectionServer.miIMongoCollection, oBlockStoreDocumentosyFiltros); }
/// <summary> /// Asigna un valor a la coleccion /// </summary> /// <param name="item">Item que se agrega para registro</param> public void AddItemToCollection(EntBlockStoreDocumentosyFiltros item) { items.Add(item); }
/// <summary> /// Procesa el item del documento /// </summary> /// <param name="document">Informacion del documento</param> public abstract void ProcessItem(EntBlockStoreDocumentosyFiltros document);
/// <summary> /// En base a los filtros de consulta si no encuentra el registro realiza un insert de lo contrario actualiza el valor. /// </summary> /// <param name="collection">Coleccion que intenta buscar</param> /// <param name="oBlockStoreDocumentosyFiltros">Filtros de consulta y/o documento a insertar</param> public void actualizaroInsertarBlockStore(string collection, EntBlockStoreDocumentosyFiltros oBlockStoreDocumentosyFiltros) { var miCollectionMongo = (IMongoCollection <BsonDocument>)miConexion.miConectionServer.ObtenerCollection(collection); miConexion.actualizaroInsertar(miCollectionMongo, oBlockStoreDocumentosyFiltros); }
public EntLogActualizarInsertar insertarBlockStore(string collection, EntBlockStoreDocumentosyFiltros oBlockStoreDocumentosyFiltros) { miCollection = miConexion.miConectionServer.obtenerCollection(collection); return(miConexion.actualizaroInsertar(collection, oBlockStoreDocumentosyFiltros)); }
/// <summary> /// Realiza el armado del repositorio de información XBRL /// </summary> /// <param name="listEntEstructuraInstancia">Estructura de los hechos que se van a registrar en el repositorio de informacion</param> /// <returns></returns> public List <EntBlockStoreDocumentosyFiltros> armarBlockStoreHashConsulta(List <EntEstructuraInstancia> listEntEstructuraInstancia) { var listadoDocumentos = new List <EntBlockStoreDocumentosyFiltros>(); foreach (var itemEstructuraInstancia in listEntEstructuraInstancia) { var blockStoreDocumentosyFiltros = new EntBlockStoreDocumentosyFiltros { registroBlockStore = new BsonDocument(), filtrosBlockStore = new BsonDocument(), EsValorChunks = false }; var estructuraClone = (EntEstructuraInstancia)itemEstructuraInstancia.Clone(); estructuraClone.Valor = null; estructuraClone.ValorRedondeado = 0; itemEstructuraInstancia.codigoHashRegistro = UtilAbax.CalcularHash(estructuraClone.ToJson()); var elemento = ConstEstandar.AperturaLlave; elemento += string.Format(ConstBlockStoreHechos.CodigoHashRegistro, itemEstructuraInstancia.codigoHashRegistro); blockStoreDocumentosyFiltros.CodigoHashRegistro = itemEstructuraInstancia.codigoHashRegistro; //elemento += string.Format(ConstBlockStoreHechos.Trimestre, itemEstructuraInstancia.Trimestre); //elemento += string.Format(ConstBlockStoreHechos.Ejercicio, itemEstructuraInstancia.Ejercicio); elemento += string.Format(ConstBlockStoreHechos.Taxonomia, itemEstructuraInstancia.EspacioNombresPrincipal); elemento += string.Format(ConstBlockStoreHechos.Entidad, itemEstructuraInstancia.Entidad.miId, itemEstructuraInstancia.Entidad.miEspaciodeNombresEntidad); elemento += !string.IsNullOrEmpty(itemEstructuraInstancia.Rol) ? string.Format(ConstBlockStoreHechos.Roll, itemEstructuraInstancia.Rol) : string.Empty; elemento += string.Format(ConstBlockStoreHechos.Concepto, itemEstructuraInstancia.Concepto.Id, itemEstructuraInstancia.Concepto.Nombre, itemEstructuraInstancia.EspacioNombresPrincipal, itemEstructuraInstancia.Concepto.EspacioNombres); if (itemEstructuraInstancia.Concepto.etiqueta != null && itemEstructuraInstancia.Concepto.etiqueta.Count > 0) { string valorEtiqueta = ""; foreach (var etiqueta in itemEstructuraInstancia.Concepto.etiqueta) { if (etiqueta.roll.Equals("http://www.xbrl.org/2003/role/label")) { valorEtiqueta += string.Format(ConstBlockStoreHechos.EstructuraEtiqueta, etiqueta.lenguaje, etiqueta.valor.Replace(ConstEstandar.ComillaSimple, string.Empty), etiqueta.roll.Replace(ConstEstandar.ComillaSimple, string.Empty)); valorEtiqueta += ConstEstandar.SeparadorComa; } } var etiquetas = string.Format(ConstBlockStoreHechos.ConceptoEtiqueta, valorEtiqueta.Substring(0, valorEtiqueta.Length + ConstEstandar.MenosTres)); elemento += etiquetas; } elemento += !string.IsNullOrEmpty(itemEstructuraInstancia.TipoBalance) ? string.Format(ConstBlockStoreHechos.Balance, itemEstructuraInstancia.TipoBalance) : string.Empty; elemento += string.Format(ConstBlockStoreHechos.ValorDocumentoTipoDato, itemEstructuraInstancia.IdTipoDato, itemEstructuraInstancia.EsTipoDatoNumerico.ToString().ToLower()); if (itemEstructuraInstancia.EsTipoDatoNumerico) { elemento += !string.IsNullOrEmpty(itemEstructuraInstancia.Valor) ? string.Format(ConstBlockStoreHechos.ValorDocumentoTipoDatoNumericoValorRedondeado, itemEstructuraInstancia.Valor, itemEstructuraInstancia.ValorRedondeado) : string.Empty; elemento += !string.IsNullOrEmpty(itemEstructuraInstancia.Precision) ? string.Format(ConstBlockStoreHechos.ValorDocumentoTipoDatoNumericoPrecision, itemEstructuraInstancia.Precision) : string.Empty; elemento += !string.IsNullOrEmpty(itemEstructuraInstancia.Decimales) ? string.Format(ConstBlockStoreHechos.ValorDocumentoTipoDatoNumericoDecimales, itemEstructuraInstancia.Decimales) : string.Empty; elemento += string.Format(ConstBlockStoreHechos.ValorDocumentoTipoDatoNumericoFraccion, itemEstructuraInstancia.EsTipoDatoFraccion.ToString().ToLower()); } else { if (!String.IsNullOrWhiteSpace(itemEstructuraInstancia.Valor) && itemEstructuraInstancia.Valor.Length > ConstBlockStoreHechos.MAX_STRING_VALUE_LENGTH) { blockStoreDocumentosyFiltros.EsValorChunks = true; blockStoreDocumentosyFiltros.ValorHecho = itemEstructuraInstancia.Valor; elemento += string.Format(ConstBlockStoreHechos.EsValorChunks, "true"); } else { elemento += !string.IsNullOrEmpty(itemEstructuraInstancia.Valor) ? string.Format(ConstBlockStoreHechos.ValorDocumentoTipoDatoNumericoValor, WebUtility.HtmlEncode(itemEstructuraInstancia.Valor.Replace("\\", "/"))) : string.Empty; } } elemento += string.Format(ConstBlockStoreHechos.ValorDocumentoTipoDatoValorNil, itemEstructuraInstancia.EsValorNil.ToString().ToLower()); if (!itemEstructuraInstancia.Periodo.EsTipoInstante) { elemento += string.Format(ConstBlockStoreHechos.PeriodoDuracion, itemEstructuraInstancia.Periodo.Tipo, string.Empty + BsonDateTime.Create(itemEstructuraInstancia.Periodo.FechaInicio).ToJson(), string.Empty + BsonDateTime.Create(itemEstructuraInstancia.Periodo.FechaFin).ToJson()); } else { elemento += string.Format(ConstBlockStoreHechos.PeriodoInstante, itemEstructuraInstancia.Periodo.Tipo, string.Empty + BsonDateTime.Create(itemEstructuraInstancia.Periodo.FechaInstante).ToJson()); } var tipoMedidaNumerador = string.Empty; if (itemEstructuraInstancia.Medida != null) { elemento += string.Format(ConstBlockStoreHechos.Medida, itemEstructuraInstancia.Medida.EsDivisoria.ToString().ToLower()); var tipoMedida = ConstBlockStoreHechos.TipoMedida; foreach (var unidad in itemEstructuraInstancia.Medida.Medidas) { tipoMedida += string.Format(ConstBlockStoreHechos.TipoMedidaArray, unidad.Nombre, unidad.EspacioNombres); } tipoMedida = string.Format(ConstEstandar.AnidamientoDos, tipoMedida.Substring(ConstEstandar.NumeroCero, tipoMedida.Length + ConstEstandar.MenosUno), ConstEstandar.CierreCorchete); if (itemEstructuraInstancia.Medida.EsDivisoria) { tipoMedidaNumerador = ConstBlockStoreHechos.TipoMedidaNumerador; foreach (var unidad in itemEstructuraInstancia.Medida.MedidasNumerador) { tipoMedidaNumerador = tipoMedidaNumerador + string.Format(ConstBlockStoreHechos.TipoMedidaArray, unidad.Nombre, unidad.EspacioNombres); } tipoMedidaNumerador = string.Format(ConstEstandar.AnidamientoTres, tipoMedidaNumerador.Substring(ConstEstandar.NumeroCero, tipoMedidaNumerador.Length + ConstEstandar.MenosUno), ConstEstandar.CierreCorchete, ConstEstandar.CierreLlave); } else { tipoMedida += ConstEstandar.CierreLlave; } elemento += string.Format(ConstEstandar.AnidamientoDos, tipoMedida, tipoMedidaNumerador); } if (itemEstructuraInstancia.Dimension != null) { var tipoDimension = ConstBlockStoreHechos.Dimension; foreach (var dimension in itemEstructuraInstancia.Dimension) { tipoDimension += string.Format(ConstBlockStoreHechos.DimensionAtributos, dimension.Explicita.ToString().ToLower(), dimension.QNameDimension, dimension.IdDimension); if (dimension.QNameItemMiembro != null) { tipoDimension += string.Format(ConstBlockStoreHechos.DimensionAtributosNombreElementoMiembro, dimension.QNameItemMiembro, dimension.IdItemMiembro.Replace("\n", "").Replace("'", "").Replace("\"", "")); } if (dimension.ElementoMiembroTipificado != null) { tipoDimension += string.Format(ConstBlockStoreHechos.DimensionMiembroTipificado, string.IsNullOrEmpty(dimension.ElementoMiembroTipificado) ? WebUtility.HtmlEncode(dimension.ElementoMiembroTipificado) : string.Empty); } if (dimension.etiquetasDimension != null) { var estructuraEtiqueta = dimension.etiquetasDimension.Aggregate(string.Empty, (current, itemEtiqueta) => string.Format(ConstEstandar.AnidamientoTres, current, string.Format(ConstBlockStoreHechos.EstructuraEtiqueta, itemEtiqueta.lenguaje, itemEtiqueta.valor.Replace(ConstEstandar.ComillaSimple, string.Empty), itemEtiqueta.roll.Replace(ConstEstandar.ComillaSimple, string.Empty)), ConstEstandar.SeparadorComa)); var etiquetas = string.Format(ConstBlockStoreHechos.ConceptoEtiquetaDimension, estructuraEtiqueta.Substring(0, estructuraEtiqueta.Length + ConstEstandar.MenosTres)); tipoDimension += etiquetas; } if (dimension.etiquetasMiembro != null) { var estructuraEtiqueta = dimension.etiquetasMiembro.Aggregate(string.Empty, (current, itemEtiqueta) => string.Format(ConstEstandar.AnidamientoTres, current, string.Format(ConstBlockStoreHechos.EstructuraEtiqueta, itemEtiqueta.lenguaje, itemEtiqueta.valor.Replace(ConstEstandar.ComillaSimple, string.Empty), itemEtiqueta.roll.Replace(ConstEstandar.ComillaSimple, string.Empty)), ConstEstandar.SeparadorComa)); var etiquetas = string.Format(ConstBlockStoreHechos.ConceptoEtiquetaMiembroDimension, estructuraEtiqueta.Substring(0, estructuraEtiqueta.Length + ConstEstandar.MenosTres)); tipoDimension += etiquetas; } tipoDimension += ConstBlockStore.miCierreLlaveComa; } tipoDimension = string.Format(ConstEstandar.AnidamientoDos, tipoDimension.Substring(0, tipoDimension.Length + ConstEstandar.MenosUno), ConstEstandar.CierreCorchete); elemento += tipoDimension; } elemento += ConstEstandar.CierreLlave; blockStoreDocumentosyFiltros.registroBlockStore.Add(BsonDocument.Parse(elemento)); blockStoreDocumentosyFiltros.filtrosBlockStore.Add(BsonDocument.Parse("{'codigoHashRegistro':'" + itemEstructuraInstancia.codigoHashRegistro + "'}")); listadoDocumentos.Add(blockStoreDocumentosyFiltros); } return(listadoDocumentos); }