#!/usr/bin/env ruby # frozen_string_literal: true require 'connection_pool' require 'pg' require 'sinatra' require 'sinatra/json' $DB_POOL = ConnectionPool.new size: 5, timeout: 5 do PG.connect( host: 'pg.causa-arcana.com', dbname: 'leqsikoni', user: 'leqsikoni', password: 'ggeucene3ou7mqh2upehhm52tfp5bkcj', ).tap do |conn| conn.type_map_for_results = PG::BasicTypeMapForResults.new conn end end before do headers 'Access-Control-Allow-Origin' => '*' end get '/words/:id' do $DB_POOL.with do |db_conn| word_id = Integer params[:id] part_of_speech_name = db_conn.exec_params( ( <<~SQL SELECT parts.english_name FROM words INNER JOIN parts ON words.part_id = parts.id WHERE words.id = $1 LIMIT 1 SQL ), [word_id], ).values.first.first examples = db_conn.exec_params( ( <<~SQL SELECT array_agg(foo.value ORDER BY foo.language_id DESC)::text[] AS values FROM example_texts foo INNER JOIN ( SELECT example_id, language_id, MIN(index) as min_index FROM example_texts WHERE example_id = ANY( SELECT example_texts.example_id FROM words INNER JOIN word_forms ON word_forms.word_id = words.id INNER JOIN word_form_example_texts ON word_form_example_texts.word_form_id = word_forms.id INNER JOIN example_texts ON example_texts.id = word_form_example_texts.example_text_id WHERE words.id = $1 GROUP BY example_texts.example_id ) AND (language_id = 5 OR language_id = 2) GROUP BY example_id, language_id ) bar ON foo.example_id = bar.example_id AND foo.language_id = bar.language_id AND foo.index = bar.min_index GROUP BY foo.example_id SQL ), [word_id], ).map { |row| row['values'] } json({ part_of_speech: part_of_speech_name, examples: examples, }) end end