5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-11-16 08:21:41 +00:00

crear la tabla de indexación de posts

los posts se siguen guardando en el sitio jekyll, lo que guardamos en la
base de datos es una representación indexable que tiene los datos
mínimos de los posts para buscarlos por distintos parámetros.

esto nos permite cargar la lista de artículos y filtrarla de distintas
formas sin cargar todo jekyll en memoria, lo que reduciría el consumo de
recursos y aceleraría el panel.  ya tenemos caché así que el problema
estaba mitigado, pero igual es un avance.

ya que migramos la base de datos a postgresql, aparecieron todas las
tablas y campos en el schema.rb, que es lo que usa rails para configurar
una base de datos desde cero.
This commit is contained in:
f 2021-05-06 12:45:33 -03:00
parent 26d186721d
commit ceaadeb7bf
3 changed files with 235 additions and 21 deletions

View file

@ -0,0 +1,9 @@
# frozen_string_literal: true
# Habilitar las extensiones de búsqueda de texto libre
class CreatePgSearchExtensions < ActiveRecord::Migration[6.1]
def change
enable_extension 'plpgsql'
enable_extension 'pg_trgm'
end
end

View file

@ -0,0 +1,44 @@
# frozen_string_literal: true
# Crea la tabla donde se indexa el contenido de los artículos, los
# IndexedPosts van a estar relacionados con un Post del mismo UUID.
#
# Solo contienen la información mínima necesaria para mostrar los
# resultados de búsqueda.
class CreateIndexedPosts < ActiveRecord::Migration[6.1]
def change
# Necesario para gen_random_uuid()
#
# XXX: En realidad no lo necesitamos porque cada IndexedPost va a
# tener el UUID del Post correspondiente.
enable_extension 'pgcrypto'
create_table :indexed_posts, id: false do |t|
t.primary_key :id, :uuid, default: 'public.gen_random_uuid()'
t.belongs_to :site, index: true
t.timestamps
# Filtramos por idioma
t.string :locale, default: 'simple', index: true
# Vamos a querer filtrar por layout
t.string :layout, null: false, index: true
# Esta es la ruta al artículo
t.string :path, null: false
# Queremos mostrar el título por separado
t.string :title, default: ''
# También vamos a mostrar las categorías
t.jsonb :front_matter, default: '{}'
t.string :content, default: ''
t.tsvector :indexed_content
t.index :indexed_content, using: 'gin'
t.index :front_matter, using: 'gin'
end
# Crea un trigger que actualiza el índice tsvector con el título y
# contenido del artículo y su idioma.
create_trigger(compatibility: 1).on(:indexed_posts).before(:insert, :update) do
"new.indexed_content := to_tsvector(('pg_catalog.' || new.locale)::regconfig, coalesce(new.title, '') || '\n' || coalesce(new.content,''));"
end
end
end

View file

@ -10,16 +10,74 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 2021_04_14_152728) do
ActiveRecord::Schema.define(version: 2021_05_04_224343) do
# Could not dump table "access_logs" because of following StandardError
# Unknown type '' for column 'id'
# These are extensions that must be enabled in order to support this database
enable_extension "pg_trgm"
enable_extension "pgcrypto"
enable_extension "plpgsql"
create_table "access_logs", id: :uuid, default: nil, force: :cascade do |t|
t.string "host"
t.float "msec"
t.string "server_protocol"
t.string "request_method"
t.string "request_completion"
t.string "uri"
t.string "query_string"
t.integer "status"
t.string "sent_http_content_type"
t.string "sent_http_content_encoding"
t.string "sent_http_etag"
t.string "sent_http_last_modified"
t.string "http_accept"
t.string "http_accept_encoding"
t.string "http_accept_language"
t.string "http_pragma"
t.string "http_cache_control"
t.string "http_if_none_match"
t.string "http_dnt"
t.string "http_user_agent"
t.string "http_origin"
t.float "request_time"
t.integer "bytes_sent"
t.integer "body_bytes_sent"
t.integer "request_length"
t.string "http_connection"
t.string "pipe"
t.integer "connection_requests"
t.string "geoip2_data_country_name"
t.string "geoip2_data_city_name"
t.string "ssl_server_name"
t.string "ssl_protocol"
t.string "ssl_early_data"
t.string "ssl_session_reused"
t.string "ssl_curves"
t.string "ssl_ciphers"
t.string "ssl_cipher"
t.string "sent_http_x_xss_protection"
t.string "sent_http_x_frame_options"
t.string "sent_http_x_content_type_options"
t.string "sent_http_strict_transport_security"
t.string "nginx_version"
t.integer "pid"
t.string "remote_user"
t.boolean "crawler", default: false
t.string "http_referer"
t.index ["geoip2_data_city_name"], name: "index_access_logs_on_geoip2_data_city_name"
t.index ["geoip2_data_country_name"], name: "index_access_logs_on_geoip2_data_country_name"
t.index ["host"], name: "index_access_logs_on_host"
t.index ["http_origin"], name: "index_access_logs_on_http_origin"
t.index ["http_user_agent"], name: "index_access_logs_on_http_user_agent"
t.index ["status"], name: "index_access_logs_on_status"
t.index ["uri"], name: "index_access_logs_on_uri"
end
create_table "action_text_rich_texts", force: :cascade do |t|
t.string "name", null: false
t.text "body"
t.string "record_type", null: false
t.integer "record_id", null: false
t.bigint "record_id", null: false
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["record_type", "record_id", "name"], name: "index_action_text_rich_texts_uniqueness", unique: true
@ -28,8 +86,8 @@ ActiveRecord::Schema.define(version: 2021_04_14_152728) do
create_table "active_storage_attachments", force: :cascade do |t|
t.string "name", null: false
t.string "record_type", null: false
t.integer "record_id", null: false
t.integer "blob_id", null: false
t.bigint "record_id", null: false
t.bigint "blob_id", null: false
t.datetime "created_at", null: false
t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id"
t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true
@ -40,7 +98,7 @@ ActiveRecord::Schema.define(version: 2021_04_14_152728) do
t.string "filename", null: false
t.string "content_type"
t.text "metadata"
t.integer "byte_size", null: false
t.bigint "byte_size", null: false
t.string "checksum", null: false
t.datetime "created_at", null: false
t.string "service_name", null: false
@ -53,10 +111,65 @@ ActiveRecord::Schema.define(version: 2021_04_14_152728) do
t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true
end
create_table "blazer_audits", force: :cascade do |t|
t.bigint "user_id"
t.bigint "query_id"
t.text "statement"
t.string "data_source"
t.datetime "created_at"
t.index ["query_id"], name: "index_blazer_audits_on_query_id"
t.index ["user_id"], name: "index_blazer_audits_on_user_id"
end
create_table "blazer_checks", force: :cascade do |t|
t.bigint "creator_id"
t.bigint "query_id"
t.string "state"
t.string "schedule"
t.text "emails"
t.text "slack_channels"
t.string "check_type"
t.text "message"
t.datetime "last_run_at"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["creator_id"], name: "index_blazer_checks_on_creator_id"
t.index ["query_id"], name: "index_blazer_checks_on_query_id"
end
create_table "blazer_dashboard_queries", force: :cascade do |t|
t.bigint "dashboard_id"
t.bigint "query_id"
t.integer "position"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["dashboard_id"], name: "index_blazer_dashboard_queries_on_dashboard_id"
t.index ["query_id"], name: "index_blazer_dashboard_queries_on_query_id"
end
create_table "blazer_dashboards", force: :cascade do |t|
t.bigint "creator_id"
t.text "name"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["creator_id"], name: "index_blazer_dashboards_on_creator_id"
end
create_table "blazer_queries", force: :cascade do |t|
t.bigint "creator_id"
t.string "name"
t.text "description"
t.text "statement"
t.string "data_source"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["creator_id"], name: "index_blazer_queries_on_creator_id"
end
create_table "build_stats", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "deploy_id"
t.bigint "deploy_id"
t.integer "bytes"
t.float "seconds"
t.string "action", null: false
@ -65,13 +178,27 @@ ActiveRecord::Schema.define(version: 2021_04_14_152728) do
t.index ["deploy_id"], name: "index_build_stats_on_deploy_id"
end
# Could not dump table "csp_reports" because of following StandardError
# Unknown type 'uuid' for column 'id'
create_table "csp_reports", id: :uuid, default: nil, force: :cascade do |t|
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.string "disposition"
t.string "referrer"
t.string "blocked_uri"
t.string "document_uri"
t.string "effective_directive"
t.string "original_policy"
t.string "script_sample"
t.string "status_code"
t.string "violated_directive"
t.integer "column_number"
t.integer "line_number"
t.string "source_file"
end
create_table "deploys", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "site_id"
t.bigint "site_id"
t.string "type"
t.text "values"
t.index ["site_id"], name: "index_deploys_on_site_id"
@ -91,6 +218,24 @@ ActiveRecord::Schema.define(version: 2021_04_14_152728) do
t.string "designer_url"
end
create_table "indexed_posts", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
t.bigint "site_id"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.string "locale", default: "simple"
t.string "layout", null: false
t.string "path", null: false
t.string "title", default: ""
t.jsonb "front_matter", default: "{}"
t.string "content", default: ""
t.tsvector "indexed_content"
t.index ["front_matter"], name: "index_indexed_posts_on_front_matter", using: :gin
t.index ["indexed_content"], name: "index_indexed_posts_on_indexed_content", using: :gin
t.index ["layout"], name: "index_indexed_posts_on_layout"
t.index ["locale"], name: "index_indexed_posts_on_locale"
t.index ["site_id"], name: "index_indexed_posts_on_site_id"
end
create_table "licencias", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
@ -104,7 +249,7 @@ ActiveRecord::Schema.define(version: 2021_04_14_152728) do
create_table "log_entries", force: :cascade do |t|
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.integer "site_id"
t.bigint "site_id"
t.text "text"
t.boolean "sent", default: false
t.index ["site_id"], name: "index_log_entries_on_site_id"
@ -124,7 +269,7 @@ ActiveRecord::Schema.define(version: 2021_04_14_152728) do
t.string "key", null: false
t.string "value"
t.string "translatable_type"
t.integer "translatable_id"
t.bigint "translatable_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["translatable_id", "translatable_type", "key"], name: "index_mobility_string_translations_on_translatable_attribute"
@ -137,7 +282,7 @@ ActiveRecord::Schema.define(version: 2021_04_14_152728) do
t.string "key", null: false
t.text "value"
t.string "translatable_type"
t.integer "translatable_id"
t.bigint "translatable_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["translatable_id", "translatable_type", "key"], name: "index_mobility_text_translations_on_translatable_attribute"
@ -147,8 +292,8 @@ ActiveRecord::Schema.define(version: 2021_04_14_152728) do
create_table "roles", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "site_id"
t.integer "usuarie_id"
t.bigint "site_id"
t.bigint "usuarie_id"
t.string "rol"
t.boolean "temporal"
t.index ["site_id", "usuarie_id"], name: "index_roles_on_site_id_and_usuarie_id", unique: true
@ -160,15 +305,14 @@ ActiveRecord::Schema.define(version: 2021_04_14_152728) do
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "name"
t.integer "design_id"
t.integer "licencia_id"
t.bigint "design_id"
t.bigint "licencia_id"
t.string "status", default: "waiting"
t.text "description"
t.string "title"
t.boolean "colaboracion_anonima", default: false
t.boolean "contact", default: false
t.string "private_key_ciphertext"
t.boolean "invitades", default: false
t.boolean "acepta_invitades", default: false
t.string "tienda_api_key_ciphertext", default: ""
t.string "tienda_url", default: ""
@ -200,7 +344,7 @@ ActiveRecord::Schema.define(version: 2021_04_14_152728) do
t.datetime "invitation_accepted_at"
t.integer "invitation_limit"
t.string "invited_by_type"
t.integer "invited_by_id"
t.bigint "invited_by_id"
t.integer "invitations_count", default: 0
t.string "lang", default: "es"
t.index ["confirmation_token"], name: "index_usuaries_on_confirmation_token", unique: true
@ -208,11 +352,28 @@ ActiveRecord::Schema.define(version: 2021_04_14_152728) do
t.index ["invitation_token"], name: "index_usuaries_on_invitation_token", unique: true
t.index ["invitations_count"], name: "index_usuaries_on_invitations_count"
t.index ["invited_by_id"], name: "index_usuaries_on_invited_by_id"
t.index ["invited_by_type", "invited_by_id"], name: "index_usuaries_on_invited_by_type_and_invited_by_id"
t.index ["invited_by_type", "invited_by_id"], name: "index_usuaries_on_invited_by"
t.index ["reset_password_token"], name: "index_usuaries_on_reset_password_token", unique: true
t.index ["unlock_token"], name: "index_usuaries_on_unlock_token", unique: true
end
add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"
add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id"
# no candidate create_trigger statement could be found, creating an adapter-specific one
execute(<<-SQL)
CREATE OR REPLACE FUNCTION public.indexed_posts_before_insert_update_row_tr()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
BEGIN
new.indexed_content := to_tsvector(('pg_catalog.' || new.locale)::regconfig, coalesce(new.title, '') || '
' || coalesce(new.content,''));
RETURN NEW;
END;
$function$
SQL
# no candidate create_trigger statement could be found, creating an adapter-specific one
execute("CREATE TRIGGER indexed_posts_before_insert_update_row_tr BEFORE INSERT OR UPDATE ON \"indexed_posts\" FOR EACH ROW EXECUTE PROCEDURE indexed_posts_before_insert_update_row_tr()")
end