From 19f25017f059ca8ea189a134dd399e7f3313b762 Mon Sep 17 00:00:00 2001 From: Roberto Alsina Date: Wed, 15 May 2024 21:15:34 -0300 Subject: [PATCH] Make split by gender faster --- c-busqueda/handler.cr | 62 +++++++++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 23 deletions(-) diff --git a/c-busqueda/handler.cr b/c-busqueda/handler.cr index 57b4c42..444a5a1 100644 --- a/c-busqueda/handler.cr +++ b/c-busqueda/handler.cr @@ -75,24 +75,24 @@ class Handler mujeres / (hombres + mujeres) end - def split_por_genero(cursor, nombres) - femeninos = Array(Tuple(Int32, String)).new - masculinos = Array(Tuple(Int32, String)).new - nombres.map { |nombre| - fem = feminidad(cursor, nombre[1]) - # El overlap en 0.5 es intencional! - if fem >= 0.5 - femeninos << nombre - end - if fem <= 0.5 - masculinos << nombre - end - } - { - "f": femeninos, - "m": masculinos, - } - end + # def split_por_genero(cursor, nombres) + # femeninos = Array(Tuple(Int32, String)).new + # masculinos = Array(Tuple(Int32, String)).new + # nombres.map { |nombre| + # fem = feminidad(cursor, nombre[1]) + # # El overlap en 0.5 es intencional! + # if fem >= 0.5 + # femeninos << nombre + # end + # if fem <= 0.5 + # masculinos << nombre + # end + # } + # { + # "f": femeninos, + # "m": masculinos, + # } + # end def run(request : HTTP::Request) # Try to find most popular names based on a prefix, year and gender. @@ -174,7 +174,7 @@ class Handler puts "QUERY: #{sql}" datos = [] of Tuple(Int32, String) - DB.open("postgres://#{USER}:#{PASS}@10.61.0.1:5432/nombres") do |cursor| + DB.open(DB_URL) do |cursor| cursor.query sql do |result_set| result_set.each do puts "loop" @@ -202,14 +202,30 @@ class Handler } if genero - DB.open("postgres://#{USER}:#{PASS}@10.61.0.1:5432/nombres") do |cursor| + DB.open(DB_URL) do |cursor| filtered = Array(Tuple(Int32, String)).new datos.map { |nombre| - fem = feminidad(cursor, nombre[1]) + # How feminine is this name? + # Yes this database is upper case + nombre = nombre.to_s.upcase + feminidad = 0 + sql = %( + SELECT COALESCE((SELECT frecuencia FROM mujeres WHERE nombre='#{nombre}'), 0) AS mujeres, + COALESCE((SELECT frecuencia FROM hombres WHERE nombre='#{nombre}'), 0) AS hombres + ) + cursor.query sql do |result| + mujeres = result.read(Int32) + hombres = result.read(Int32) + if hombres == mujeres == 0 + feminidad = 0.5 + else + feminidad = mujeres / (hombres + mujeres) + end + end # El overlap en 0.5 es intencional! - if fem >= 0.5 && genero == "f" + if feminidad >= 0.5 && genero == "f" filtered << nombre - elsif fem <= 0.5 && genero == "m" + elsif feminidad <= 0.5 && genero == "m" filtered << nombre end }