ricarthlima/eo-project-es

View on GitHub
app/controllers/busca_controller.rb

Summary

Maintainability
A
35 mins
Test Coverage
class BuscaController < ApplicationController
    #before_action :authenticate_usuario!
    
    def index
    end
    
    def show
    end
    
    def buscar_ocr
        @ocr = params[:ocr]
        produtos = Produto.all
        ocr = @ocr.split(" ")
        
        menor_palavra = [ocr[0], 10000]
        ocr.each do |palavra|
            produtos.each do |produto|
                distancia = leven_quebrar(palavra, produto.nome)
                if distancia < menor_palavra[1]
                    menor_palavra = [palavra, distancia]
                end
            end
        end
        
        if menor_palavra[1] < 2
            redirect_to controller: "busca", action: 'buscar', texto: menor_palavra[0]
            
        else
            flash[:notice] = "Não conseguimos encontrar com seu rótulo. :("
            redirect_to inicio_path
        end
        
        
    end

    def buscar_cod
        cod = params[:cod]
        produtos = Produto.where("cod_barras = '"+cod+"'")
        
        if produtos.size > 0
            redirect_to produtos[0]
        else
            flash[:notice] = "Não achamos nenhum produto com esse código de barras."
            redirect_to inicio_path
        end
    end
    
    def buscar
        @nome_busca = params[:texto]
        @proximos = leven(@nome_busca)
        
        if busca_vazia
            redirect_to inicio_path
            return
        end
        
        @candidatos_produtos = Produto.where "lower(nome) like lower(?)", "%#{@nome_busca}%"
        @candidatos_marcas = Marca.where "lower(nome) like lower(?)", "%#{@nome_busca}%"
        @candidatos_componentes = Componente.where "lower(nome) like lower(?)", "%#{@nome_busca}%"
        
        if @candidatos_produtos.size == 1 and (@candidatos_marcas.size == 0) and (@candidatos_componentes.size == 0)
            redirect_to(produtos_url+"/"+@candidatos_produtos[0].id.to_s)
            
        elsif @candidatos_marcas.size == 1 and (@candidatos_produtos.size == 0) and (@candidatos_componentes.size == 0)
            redirect_to(marcas_url+"/"+@candidatos_marcas[0].id.to_s)
            
        elsif @candidatos_componentes.size == 1 and (@candidatos_marcas.size == 0) and (@candidatos_produtos.size == 0)
            redirect_to(componentes_url+"/"+@candidatos_componentes[0].id.to_s)
        else
            render :index
        end
    end
    
    private 
    
    def busca_vazia
        if @nome_busca == ""
            return true
        else
            return false
        end
    end
    
    # Essa função pega todos elementos do banco e compara com o termo buscado numa
    # distância de Levenshtein maior que 0 (mesmo termo), e menor que 3.
    def leven(busca)
        proximos = Array.new
        objetos = Array.new
        
        objetos = objetos + Produto.all + Marca.all + Componente.all
        objetos.each do |obj|
            distancia = leven_quebrar(busca,obj.nome)
            if distancia > 0 and distancia < 3
                proximos << obj
            end
        end
        
        return proximos
    end
    
    # Essa função faz o valor "distância" da função anterior ser comparado por cada
    # palavra dentro dos termo buscado, e não o termo buscado completo.
    def leven_quebrar(busca, termo)
        menor = Levenshtein.distance(termo.downcase,busca.to_s.downcase)
        termo = termo.split(" ")
        
        termo.each do |palavra|
            if Levenshtein.distance(palavra.downcase,busca.to_s.downcase) < menor
                menor = Levenshtein.distance(palavra.downcase,busca.to_s.downcase)
            end
        end
        
        return menor
    end
end