diff --git a/c-busqueda/handler.cr b/c-busqueda/handler.cr index c6241fe..d2b557f 100644 --- a/c-busqueda/handler.cr +++ b/c-busqueda/handler.cr @@ -7,8 +7,9 @@ require "uuid" require "db" require "pg" -USER = File.read("/var/openfaas/secrets/nombres-user").strip -PASS = File.read("/var/openfaas/secrets/nombres-pass").strip +USER = File.read("/var/openfaas/secrets/nombres-user").strip +PASS = File.read("/var/openfaas/secrets/nombres-pass").strip +DB_URL = "postgres://#{USER}:#{PASS}@10.61.0.1:5432/nombres" class Handler def format_buffer(buffer, canvas_name, title = "") @@ -47,12 +48,12 @@ class Handler # Returns an array of values [[Year,Count]...] # Or nil if there are no results - DB.open("postgres://#{USER}:#{PASS}@10.61.0.1:5432/nombres") do |db| - db.query sql do |rs| + DB.open("postgres://#{USER}:#{PASS}@10.61.0.1:5432/nombres") do |cursor| + cursor.query sql do |result_set| result = [] of Tuple(Int32, Int32) - rs.each do - year = rs.read(Int32) - contador = rs.read(Int32) + result_set.each do + year = result_set.read(Int32) + contador = result_set.read(Int32) result.push({year, contador}) end return result @@ -65,12 +66,13 @@ class Handler def normalize_name(s) # Remove diacritics, turn lowercase normalized = s.unicode_normalize(:nfkd).chars - normalized.reject! { |c| - !c.ascii_letter? + normalized.reject! { |character| + !character.ascii_letter? }.join("").downcase end def feminidad(nombre) + # Yes this database is upper case nombre = nombre.to_s.upcase sql1 = %( SELECT COALESCE(frecuencia,0) @@ -82,28 +84,31 @@ class Handler FROM hombres WHERE nombre='#{nombre}' ) - # Yes this database is upper case - mujeres = query(sql1) - mujeres = mujeres.nil? ? 0 : mujeres[0][0].as_i - hombres = query(sql2) - hombres = hombres.nil? ? 0 : hombres[0][0].as_i + DB.open("postgres://#{USER}:#{PASS}@10.61.0.1:5432/nombres") do |cursor| + cursor.query sql1 do |result| + mujeres = result.read(Int32) + end + cursor.query sql2 do |_| + hombres = result.read(Int32) + end + end if hombres == mujeres == 0 return 0.5 end - return mujeres / (hombres + mujeres) + mujeres / (hombres + mujeres) end def split_por_genero(nombres) femeninos = Array(Array(String | Int32)).new masculinos = Array(Array(String | Int32)).new - nombres.map { |n| - fem = feminidad(n[1]) + nombres.map { |nombre| + fem = feminidad(nombre[1]) # El overlap en 0.5 es intencional! if fem >= 0.5 - femeninos << n + femeninos << nombre end if fem <= 0.5 - masculinos << n + masculinos << nombre end } { @@ -120,22 +125,20 @@ class Handler # { # p: prefijo del nombre, # g: genero del nombre, - # y: año de nacimiento + # y: year de nacimiento # } - unless (body = request.body).nil? - query = Hash(String, String).from_json(body) - else + if (body = request.body).nil? query = {"p": "", "g": "", a: ""} + else + query = Hash(String, String).from_json(body) end - p! query - # Sanitize input. # Each one either a valid string or nil prefijo = query.fetch("p", "") genero = query.fetch("g", "") - año = query.fetch("y", "") + year = query.fetch("y", "") if !prefijo.empty? prefijo = normalize_name(prefijo) @@ -147,9 +150,9 @@ class Handler genero = nil end - año = año.to_i? + year = year.to_i? - if prefijo.nil? && año.nil? + if prefijo.nil? && year.nil? # Global totals sql = %( SELECT total, nombre @@ -157,17 +160,17 @@ class Handler ORDER BY total DESC LIMIT 50 ) - elsif prefijo.nil? && !año.nil? + elsif prefijo.nil? && !year.nil? # Per-year totals sql = %( SELECT contador, nombre FROM nombres WHERE - anio = '#{año}' + anio = '#{year}' ORDER BY contador DESC LIMIT 50 ) - elsif !prefijo.nil? && año.nil? + elsif !prefijo.nil? && year.nil? # Filter only by prefix sql = %( SELECT total, nombre @@ -183,15 +186,26 @@ class Handler SELECT contador, nombre FROM nombres WHERE - anio = '#{año}' AND + anio = '#{year}' AND nombre LIKE '#{prefijo}%' ORDER BY contador DESC LIMIT 50 ) end - results = query(sql) - if results.nil? + DB.open("postgres://#{USER}:#{PASS}@10.61.0.1:5432/nombres") do |cursor| + cursor.query sql do |result_set| + datos = [] of Tuple(Int32, String) + result_set.each do + valor = result_set.read(Int32) + nombre = result_set.read(String) + datos.push({valor, nombre}) + end + end + end + + + if datos.empty? # This is bad 😀 return { body: "Que raro, no tengo *idea*!", @@ -199,13 +213,10 @@ class Handler headers: HTTP::Headers{"Content-Type" => "text/html"}, } end - datos = results.map { |r| - [r[0].as_i, r[1].as_s] - } # In this context, remove all composite names - datos.reject! { |r| - r[1].to_s.includes? " " + datos.reject! { |row| + row[1].to_s.includes? " " } if genero @@ -224,14 +235,14 @@ class Handler buffer = IO::Memory.new Ishi.new(buffer) do x = (0..datos.size - 1).to_a - y = datos.map { |r| - r[0].to_f / 1000 + y = datos.map { |row| + row[0].to_f / 1000 } yrange(0..(y.max*1.1).to_i + 1) xtics = Hash(Float64, String).new - datos.each_with_index { |r, i| - xtics[i.to_f] = r[1].to_s.titleize + datos.each_with_index { |row, i| + xtics[i.to_f] = row[1].to_s.titleize } canvas_size(800, 300) diff --git a/c-historico/handler.cr b/c-historico/handler.cr index d30150e..b90956c 100644 --- a/c-historico/handler.cr +++ b/c-historico/handler.cr @@ -47,12 +47,12 @@ class Handler # Returns an array of values [[Year,Count]...] # Or nil if there are no results - DB.open("postgres://#{USER}:#{PASS}@10.61.0.1:5432/nombres") do |db| - db.query sql do |rs| + DB.open("postgres://#{USER}:#{PASS}@10.61.0.1:5432/nombres") do |cursor| + cursor.query sql do |result_set| result = [] of Tuple(Int32, Int32) - rs.each do - year = rs.read(Int32) - contador = rs.read(Int32) + result_set.each do + year = result_set.read(Int32) + contador = result_set.read(Int32) result.push({year, contador}) end return result @@ -67,8 +67,8 @@ class Handler def normalize_name(s) # Remove diacritics, turn lowercase normalized = s.unicode_normalize(:nfkd).chars - normalized.reject! { |c| - !c.ascii_letter? + normalized.reject! { |_| + !ccharacter.ascii_letter? }.join("").downcase end @@ -76,7 +76,7 @@ class Handler unless (body = request.body).nil? query = JSON.parse(body) nombres = query["i"].as_s.split(",").map(&.strip) - nombres.reject! { |n| n.size == 0 } + nombres.reject! { |nombre| nombre.size == 0 } end if nombres.nil? || nombres.empty? @@ -84,8 +84,8 @@ class Handler end # Remove all diacritics and whatnot - nombres = nombres.map { |n| - normalize_name n + nombres = nombres.map { |nombre| + normalize_name nombre } puts "Processing #{nombres}"