es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo utilizar el BigDecimal de Elasticsearch en el código de Java?

Utilizo el lenguaje painless para actualizar documentos. ¿Cómo se utiliza BigDecimal para terminar esto? Utilizando Elasticsearch 6.8.1.
Enlace al Javadoc de Script:
JavaDoc de Script
El constructor de Script es:

public Script(ScriptType type,
              java.lang.String lang,
              java.lang.String idOrCode,
              java.util.Map<java.lang.String, java.lang.Object> params)

Mi código es:

StringBuilder script = new StringBuilder();
Map<String, Object> params = new HashMap<>();
params.put("poundageRate", poundageRate.doubleValue());
script.append("ctx._source.poundage = ctx._source.amount * params.poundageRate;");
Script scriptObj = new Script(INLINE, DEFAULT_SCRIPT_LANG, script.toString(), params);

Mi pregunta es:
¿Cómo puedo hacer que ctx._source.amount * params.poundageRate utilice el método multiply de BigDecimal y setScale?

new BigDecimal("ctx._source.amount").multiply(new BigDecimal("params.poundageRate")).setScale(2, HALF_UP).stripTrailingZeros()

Muchas gracias, lo apreciaré.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para utilizar el método BigDecimal multiply y setScale en un script sin problemas para actualizar un documento en Elasticsearch 6.8.1, reemplace la sección del script del código proporcionado con lo siguiente:

    BigDecimal amount = new BigDecimal(ctx._source.amount.toString());
    BigDecimal poundageRate = new BigDecimal(params.poundageRate.toString());
    BigDecimal poundage = amount.multiply(poundageRate).setScale(2, RoundingMode.HALF_UP);
    ctx._source.poundage = poundage.stripTrailingZeros().doubleValue();
    

    Explicación:

    • El constructor BigDecimal toma una representación en cadena del número a utilizar para cálculos de precisión.
    • El método toString() se utiliza para convertir los valores numéricos almacenados en los campos del documento y los parámetros del script en cadenas para ser utilizadas en el constructor BigDecimal.
    • El método multiply() realiza la operación de multiplicación en los dos BigDecimals.
    • El método setScale() establece la escala (número de dígitos a la derecha del punto decimal) del resultado y especifica el método de redondeo.
    • El método stripTrailingZeros() elimina los ceros finales para mostrar el resultado de la comisión en su forma más simplificada.
    • El método doubleValue() convierte el resultado BigDecimal en un valor double que se puede asignar al campo del documento _source.

Comments are closed.