Max Number os Statemens in Painless loop

Hello, I'm trying to run this scripted field:

/* Calcula a multa assumida para tarefas cumpridas fora do prazo, considerando os dias se passaram desde o vencimento e a periodicidade da multa*/
if (doc['obrigacao_prazo_cumprimento'].size() <= 0){ // Se não houver prazo, retorna null
   return 0;
}
if (doc['status_tarefa.keyword'].size() > 0 && doc['status_tarefa.keyword'].value == 'CONFIRMADO'){ // Faz o cálculo se a tarefa estiver pendente
  def valor = 0;
  def teto = 0;
  def prazo = 0;
  def confirmacao = 0;

  if(doc['obrigacao_valor_da_multa'].size() > 0){
    valor = doc['obrigacao_valor_da_multa'].value;
  }
  if(doc['obrigacao_teto_multa'].size() > 0){
    teto = doc['obrigacao_teto_multa'].value;
  }

  if(doc['data_confirmado_tarefa'].size() > 0){
    confirmacao = doc['data_confirmado_tarefa'].value.getMillis();// Data de confirmação
  }
  prazo = doc['obrigacao_prazo_cumprimento'].value.getMillis(); // Prazo da tarefa


  ZoneId timeZone = ZoneId.of(ZoneId.SHORT_IDS.get('BET'));
  LocalDate dataConfirmacao = LocalDateTime.ofInstant(Instant.ofEpochMilli(confirmacao),timeZone).toLocalDate();
  LocalDate dataPrazo = LocalDateTime.ofInstant(Instant.ofEpochMilli(prazo),timeZone).toLocalDate();

  def diff = ChronoUnit.DAYS.between(dataPrazo, dataConfirmacao); // diferença em dias

   if (diff < 0) {return 0;} //Se não tiver passado do prazo, retorna 0
   if (doc['obrigacao_periodicidade_multa.keyword'].size() > 0 && doc['obrigacao_periodicidade_multa.keyword'].value == 'DIÁRIA'){ // Periodicidade diária
      LocalDate dia = LocalDateTime.ofInstant(Instant.ofEpochMilli(prazo),timeZone).toLocalDate();
      def diaSemana;
      def diasUteis = 0;
      for(int i = 1; i <= diff; i++){ // Loop for que calcula quantidade de dias úteis passados
         dia.plusDays(1); // Incrementa 1 dia
         diaSemana = dia.getDayOfWeek().ordinal(); // Retorna numero que representa dia da semana
         if(diaSemana != 1 && diaSemana != 7){ // 1 é domingo e 7 é sábado
            diasUteis++;
         }
      }

      valor = diasUteis * valor;
      if(valor > teto){
         valor = teto;
      }
      return valor;
    }
    if (doc['obrigacao_periodicidade_multa.keyword'].size() > 0 && doc['obrigacao_periodicidade_multa.keyword'].value == 'MENSAL'){ //Periodicidade mensal
       diff = ChronoUnit.MONTHS.between(dataPrazo, dataConfirmacao);
       return (valor * diff) + valor;
    }
    if (doc['obrigacao_periodicidade_multa.keyword'].size() > 0 && doc['obrigacao_periodicidade_multa.keyword'].value == 'SEMANAL'){ //Periodicidade semanal
       diff = ChronoUnit.WEEKS.between(dataPrazo, dataConfirmacao);
       return (valor * diff) + valor;
    }
  return valor;
}
return null

But it's giving this error when I choose to show 5 years or more.
{"type":"painless_error","reason":"The maximum number of statements that can be executed in a loop has been reached."}}}]},"status":400}

How can I fix?

Thanks

@BrunoSdeMenezes I'm not sure if the Kibana forum is the right venue for this question. I would ask this in the Elasticsearch forum, as there will be more Painless users there, thanks!

1 Like

I've solved here the problem. Thanks, anyway!

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.