Don't use pg pool, too flaky for now
This commit is contained in:
@ -1,5 +1,6 @@
|
||||
require "json"
|
||||
require "kemal"
|
||||
require "db"
|
||||
require "pg"
|
||||
require "pool/connection"
|
||||
|
||||
@ -11,11 +12,6 @@ DBHOST = File.read("/secrets/dbhost").strip
|
||||
DBURL = "postgres://#{USER}:#{PASS}@#{DBHOST}:5432/nombres"
|
||||
puts "Connnecting to #{DBURL}"
|
||||
|
||||
# Create a connection pool to the database
|
||||
pg = ConnectionPool.new(capacity: 25, timeout: 1.seconds) do
|
||||
PG.connect(DBURL)
|
||||
end
|
||||
|
||||
def normalize(s : String) : String
|
||||
s.unicode_normalize(:nfkd)
|
||||
.chars.reject! { |character|
|
||||
@ -25,6 +21,7 @@ end
|
||||
|
||||
# A basic hello world get endpoint
|
||||
post "/" do |env|
|
||||
db = DB.open DBURL
|
||||
prefijo = env.params.json["p"].as(String)
|
||||
genero = env.params.json["g"].as(String)
|
||||
year = env.params.json["a"].as(String)
|
||||
@ -35,34 +32,33 @@ post "/" do |env|
|
||||
end
|
||||
datos = [] of Tuple(String, Int32 | String)
|
||||
# Connect using credentials provided
|
||||
pg.connection do |cursor|
|
||||
if prefijo.empty? && year.empty?
|
||||
result_set = cursor.query("
|
||||
if prefijo.empty? && year.empty?
|
||||
result_set = db.query("
|
||||
SELECT nombre, total::integer
|
||||
FROM totales
|
||||
ORDER BY total DESC
|
||||
LIMIT 50")
|
||||
elsif prefijo.empty? && !year.empty?
|
||||
# Per-year totals
|
||||
result_set = cursor.query("
|
||||
elsif prefijo.empty? && !year.empty?
|
||||
# Per-year totals
|
||||
result_set = db.query("
|
||||
SELECT nombre, contador::integer
|
||||
FROM nombres
|
||||
WHERE
|
||||
anio = $1
|
||||
ORDER BY contador DESC
|
||||
LIMIT 50", year)
|
||||
elsif !prefijo.empty? && year.empty?
|
||||
# Filter only by prefix
|
||||
result_set = cursor.query("
|
||||
elsif !prefijo.empty? && year.empty?
|
||||
# Filter only by prefix
|
||||
result_set = db.query("
|
||||
SELECT nombre, total::integer
|
||||
FROM totales
|
||||
WHERE
|
||||
nombre LIKE $1
|
||||
ORDER BY total DESC
|
||||
LIMIT 50", prefijo + "%")
|
||||
elsif !prefijo.empty? && !year.empty?
|
||||
# We have both
|
||||
result_set = cursor.query("
|
||||
elsif !prefijo.empty? && !year.empty?
|
||||
# We have both
|
||||
result_set = db.query("
|
||||
SELECT nombre, contador::integer
|
||||
FROM nombres
|
||||
WHERE
|
||||
@ -70,20 +66,19 @@ post "/" do |env|
|
||||
nombre LIKE $2
|
||||
ORDER BY contador DESC
|
||||
LIMIT 50", year, prefijo + "%")
|
||||
end
|
||||
end
|
||||
|
||||
if !result_set.nil?
|
||||
result_set.each do
|
||||
nombre = result_set.read(String)
|
||||
valor = result_set.read(Int32)
|
||||
datos.push({nombre, valor})
|
||||
end
|
||||
result_set.close
|
||||
if !result_set.nil?
|
||||
result_set.each do
|
||||
nombre = result_set.read(String)
|
||||
valor = result_set.read(Int32)
|
||||
datos.push({nombre, valor})
|
||||
end
|
||||
result_set.close
|
||||
end
|
||||
|
||||
if datos.empty?
|
||||
raise "No data found"
|
||||
end
|
||||
if datos.empty?
|
||||
raise "No data found"
|
||||
end
|
||||
# In this context, remove all composite names
|
||||
datos.reject! { |row|
|
||||
@ -92,39 +87,37 @@ post "/" do |env|
|
||||
datos.insert(0, {"Nombre", "Cuantos?"})
|
||||
|
||||
if genero
|
||||
pg.connection do |cursor|
|
||||
datos.reject! { |row|
|
||||
# How feminine is this name?
|
||||
# Yes this database is upper case
|
||||
puts "Checking #{row[1]} #{row[0]}"
|
||||
feminidad = 0
|
||||
sql = %(
|
||||
datos.reject! { |row|
|
||||
# How feminine is this name?
|
||||
# Yes this database is upper case
|
||||
puts "Checking #{row[1]} #{row[0]}"
|
||||
feminidad = 0
|
||||
sql = %(
|
||||
SELECT COALESCE((SELECT frecuencia FROM mujeres WHERE nombre='#{row[0]?.to_s.upcase}'), 0) AS mujeres,
|
||||
COALESCE((SELECT frecuencia FROM hombres WHERE nombre='#{row[0]?.to_s.upcase}'), 0) AS hombres
|
||||
)
|
||||
puts "SQL: #{sql}"
|
||||
cursor.query sql do |result_set|
|
||||
result_set.each do
|
||||
mujeres = result_set.read(Int32)
|
||||
hombres = result_set.read(Int32)
|
||||
puts "frecuencias: #{mujeres} #{hombres}"
|
||||
if hombres == mujeres == 0
|
||||
feminidad = 0.5
|
||||
else
|
||||
feminidad = mujeres / (hombres + mujeres)
|
||||
end
|
||||
puts "SQL: #{sql}"
|
||||
db.query sql do |result_set|
|
||||
result_set.each do
|
||||
mujeres = result_set.read(Int32)
|
||||
hombres = result_set.read(Int32)
|
||||
puts "frecuencias: #{mujeres} #{hombres}"
|
||||
if hombres == mujeres == 0
|
||||
feminidad = 0.5
|
||||
else
|
||||
feminidad = mujeres / (hombres + mujeres)
|
||||
end
|
||||
end
|
||||
# El overlap en 0.5 es intencional!
|
||||
if (feminidad >= 0.5 && genero == "f") ||
|
||||
(feminidad <= 0.5 && genero == "m")
|
||||
false
|
||||
else
|
||||
true
|
||||
end
|
||||
}
|
||||
puts "Data split by gender"
|
||||
end
|
||||
end
|
||||
# El overlap en 0.5 es intencional!
|
||||
if (feminidad >= 0.5 && genero == "f") ||
|
||||
(feminidad <= 0.5 && genero == "m")
|
||||
false
|
||||
else
|
||||
true
|
||||
end
|
||||
}
|
||||
puts "Data split by gender"
|
||||
end
|
||||
datos = datos[..10].map { |row|
|
||||
[row[0].capitalize, row[1]]
|
||||
@ -141,9 +134,14 @@ post "/" do |env|
|
||||
"title" => title,
|
||||
"data" => datos,
|
||||
}.to_json
|
||||
ensure
|
||||
db.try &.close
|
||||
end
|
||||
|
||||
get "/ping/" do
|
||||
pg.connection.exec("SELECT 42")
|
||||
db = DB.open DBURL
|
||||
db.exec("SELECT 42")
|
||||
"OK"
|
||||
ensure
|
||||
db.try &.close
|
||||
end
|
||||
|
Reference in New Issue
Block a user