Skip to content

Commit

Permalink
pesquisabr - componente 1.0.3.3
Browse files Browse the repository at this point in the history
  • Loading branch information
luizanisio authored May 9, 2023
1 parent f005ac4 commit f042e83
Showing 1 changed file with 36 additions and 11 deletions.
47 changes: 36 additions & 11 deletions servico_regras/app/regras_controller_aplicar.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
###################################################################
# componente de pesquisa
from copy import deepcopy
from datetime import datetime
import regex as re # para uso do timeout
from pesquisabr import PesquisaBR, RegrasPesquisaBR


###################################################################
from app_config import obj_regras_model
from app_config import obj_regras_model, CONFIG
###################################################################
from regras_controller import regras_filtradas, regras_filtradas_cache, get_msg_resumo_regras, get_exemplo
from regras_util import lista_regras_corrigir_tags

###################################################################
###################################################################
# retorno dos dados do health
# o health é usado para loadbalance também, então pode ser chamado a cada 5s
def get_dados_health():
criterios = 'casas ADJ2 papeis PROX10 legal PROX10 seriado nao teste nao bla remover(teste) recortar(inicio;fim)'
texto = 'bla bla bla inicio a casa teste teste de teste teste papel teste é teste um teste seriado muito legal fim bla bla bla'
Expand All @@ -31,7 +33,9 @@ def get_dados_health():
print('\n\n')
raise Exception(f'Health check - ERRO na avaliação do critério de pesquisa')
print(f'\n===== HEALTH CHECK OK ({get_msg_resumo_regras()}) =====\n')
return {'ok': True, 'criterios': pb.criterios, 'criterios_aon': pb.criterios_and_or_not, 'texto': pb.texto }
return {'ok': True, 'criterios': pb.criterios, 'criterios_aon': pb.criterios_and_or_not, 'texto': pb.texto,
'cache': {'id_cache': CONFIG.id_cache,
'data_carga_regras' : CONFIG.data_carga_regras }}

# exemplo: chaves_filtros = {'ano_regra' : 2001, 'tipo_regra': 'tipo1'}
# filtros são as chaves do json de entrada do POST do serviço que não tem relação com as regras
Expand All @@ -40,7 +44,7 @@ def get_dados_health():
'extrair','grifar','tags',
'primeiro_do_grupo', 'exemplo',
'analisar-criterios', 'analisar-regras',
'regras_externas', 'rodando-testes'}
'regras_externas', 'rodando-testes', 'limpar_cache','modo_teste'}
def get_chaves_filtros(dados):
return {c: v for c, v in dados.items() if c.lower() not in CHAVES_NAO_FILTROS}

Expand All @@ -52,14 +56,15 @@ def get_chaves_filtros(dados):
def analisar_regras(dados, front_end = False):
obj_regras_model.conversao_entrada(dados, front_end = front_end, analisar_regras = True)
# para o caso de lista de textos, o tratamento é diferente pois a pesquisa trata apenas de dicionários
#_texto = dados.get('texto', '')
_texto = dados.get("texto","")
_texto = corrige_quebras_n( dados.get("texto","") )
_detalhar = str(dados.get("detalhar","")) not in ("","0","False")
_extrair = str(dados.get("extrair","1")) not in ("","0","False")
_tags = str(dados.get("tags",""))
_primeiro_do_grupo = bool(dados.get("primeiro_do_grupo"))
_id_print = CONFIG.sha1_mini(_texto) if CONFIG.em_debug() else ''
CONFIG.print_log_debug('analisar_regras', f'preparando texto com {len(dados.get("texto",""))} caracteres [{_id_print}]')

pbr = RegrasPesquisaBR(regras=[], print_debug=False)
pbr = RegrasPesquisaBR(regras=[])
# não envia as regras como parâmetro para o construtor para não reprocessar a ordenação,
# só para diminuir o tempo de processamento
# filtra as regras com uma das tags e com todos os filtros preenchidos nas chaves
Expand All @@ -74,9 +79,16 @@ def analisar_regras(dados, front_end = False):
#print('tags: ', _tags)
pbr.regras = regras_filtradas(_tags, chaves_filtros = tuple(chaves_filtros.items()),
regras_externas = regras_externas )
CONFIG.print_log_debug('analisar_regras', f'aplicando {len(pbr.regras)} regras externas [{_id_print}]')
else:
pbr.regras = regras_filtradas_cache(_tags, chaves_filtros = tuple(chaves_filtros.items()))
pbr.regras = regras_filtradas_cache(_tags, chaves_filtros = tuple(chaves_filtros.items()), id_cache = CONFIG.id_cache)
CONFIG.print_log_debug('analisar_regras', f'aplicando {len(pbr.regras)} regras [{_id_print}]')

if len(pbr.regras) ==1:
_regra = pbr.regras[0]['regra']
CONFIG.print_log_debug('analisar_regras', f'Regra: {_regra} [{_id_print}]')
res = pbr.aplicar_regras(texto=_texto, detalhar=_detalhar, primeiro_do_grupo = _primeiro_do_grupo, extrair= _extrair)
CONFIG.print_log_debug('analisar_regras', f'finalizando dicionário de saída [{_id_print}]')
if _detalhar:
res['texto_analise'] = _texto
# para o conversor
Expand Down Expand Up @@ -105,25 +117,38 @@ def carregar_exemplo_solicitado(dados, criterios = True):
# criterios_ok = SIM / NÃO se os critérios foram atendidos
def analisar_criterios(dados, front_end = False):
obj_regras_model.conversao_entrada(dados, front_end = front_end, analisar_criterios = True)
_texto = dados.get("texto","")
_texto = corrige_quebras_n( dados.get("texto","") )
_texto = _texto if type(_texto) is dict or type(_texto) is list else str(_texto)
_criterios = str(dados.get("criterios","")) or str(dados.get("criterio",""))
_detalhar = str(dados.get("detalhar","")) not in ("","0","False")
_grifar = str(dados.get("grifar","")) not in ("","0","False")
_extrair = str(dados.get("extrair","1")) not in ("","0","False")

# a nova versão do componente já vai fazer isso
_criterios = _criterios.replace('\r',' ').replace('\n',' ')

res = RegrasPesquisaBR.aplicar_criterios(texto = _texto,
criterios= _criterios,
extrair= _extrair,
detalhar= _detalhar,
grifar= _grifar)
if _detalhar:
res['texto_analise'] = _texto
# para o conversor
res['texto_analise'] = _texto
# para o conversor
res['front-end'] = front_end
res['analisar-criterios'] = True
if dados.get('rodando-testes'):
res['rodando-testes'] = True
obj_regras_model.conversao_retorno(res)
return res

# corrige textos recebidos com \n como string ignorando \\n como string
RE_QUEBRA_BARRA_N = re.compile(r'(?<=[^\\])\\n')
def corrige_quebras_n(texto):
if type(texto) is dict:
_texto = {c: corrige_quebras_n(str(v)) for c, v in texto.items()}
return _texto
elif type(texto) is list:
return [corrige_quebras_n(str(v)) for v in texto]
else:
return RE_QUEBRA_BARRA_N.sub('\n',str(texto))

0 comments on commit f042e83

Please sign in to comment.