chore(*.sql): use sql-formatter for sql formatting

This commit is contained in:
Cory Dransfeldt 2025-06-14 17:10:41 -07:00
parent cf1ee4c97f
commit 1d7f13d1f5
No known key found for this signature in database
63 changed files with 4432 additions and 2358 deletions

View file

@ -1,65 +1,117 @@
CREATE OR REPLACE VIEW optimized_all_activity AS
WITH feed_data AS (
SELECT json_build_object(
'title', p.title,
'url', p.url,
'description', p.content,
'date', p.date,
'type', 'article',
'label', 'Post',
'content', p.content
) AS feed
FROM optimized_posts p
UNION ALL
SELECT json_build_object(
'title', CONCAT(l.title, ' via ', l.author->>'name'),
'url', l.link,
'description', l.description,
'date', l.date,
'type', 'link',
'label', 'Link',
'author', l.author
) AS feed
FROM optimized_links l
UNION ALL
SELECT CASE
WHEN LOWER(b.status) = 'finished' THEN
WITH
feed_data AS (
SELECT
json_build_object(
'title', CONCAT(b.title, ' by ', b.author,
CASE WHEN b.rating IS NOT NULL THEN CONCAT(' (', b.rating, ')') ELSE '' END
),
'url', b.url,
'description', COALESCE(b.review, b.description),
'date', b.date_finished,
'type', 'books',
'label', 'Book',
'image', b.image,
'rating', b.rating
)
ELSE NULL
END AS feed
FROM optimized_books b
UNION ALL
SELECT CASE
WHEN m.last_watched IS NOT NULL THEN
'title',
p.title,
'url',
p.url,
'description',
p.content,
'date',
p.date,
'type',
'article',
'label',
'Post',
'content',
p.content
) AS feed
FROM
optimized_posts p
UNION ALL
SELECT
json_build_object(
'title', CONCAT(m.title,
CASE WHEN m.rating IS NOT NULL THEN CONCAT(' (', m.rating, ')') ELSE '' END
),
'url', m.url,
'description', COALESCE(m.review, m.description),
'date', m.last_watched,
'type', 'movies',
'label', 'Movie',
'image', m.image,
'rating', m.rating
)
ELSE NULL
END AS feed
FROM optimized_movies m
)
SELECT feed
FROM feed_data
WHERE feed IS NOT NULL
ORDER BY (feed->>'date')::timestamp DESC
LIMIT 20;
'title',
CONCAT(l.title, ' via ', l.author ->> 'name'),
'url',
l.link,
'description',
l.description,
'date',
l.date,
'type',
'link',
'label',
'Link',
'author',
l.author
) AS feed
FROM
optimized_links l
UNION ALL
SELECT
CASE
WHEN LOWER(b.status) = 'finished' THEN json_build_object(
'title',
CONCAT(
b.title,
' by ',
b.author,
CASE
WHEN b.rating IS NOT NULL THEN CONCAT(' (', b.rating, ')')
ELSE ''
END
),
'url',
b.url,
'description',
COALESCE(b.review, b.description),
'date',
b.date_finished,
'type',
'books',
'label',
'Book',
'image',
b.image,
'rating',
b.rating
)
ELSE NULL
END AS feed
FROM
optimized_books b
UNION ALL
SELECT
CASE
WHEN m.last_watched IS NOT NULL THEN json_build_object(
'title',
CONCAT(
m.title,
CASE
WHEN m.rating IS NOT NULL THEN CONCAT(' (', m.rating, ')')
ELSE ''
END
),
'url',
m.url,
'description',
COALESCE(m.review, m.description),
'date',
m.last_watched,
'type',
'movies',
'label',
'Movie',
'image',
m.image,
'rating',
m.rating
)
ELSE NULL
END AS feed
FROM
optimized_movies m
)
SELECT
feed
FROM
feed_data
WHERE
feed IS NOT NULL
ORDER BY
(feed ->> 'date')::timestamp DESC
LIMIT
20;

View file

@ -1,12 +1,12 @@
CREATE OR REPLACE VIEW optimized_headers AS
SELECT
p.path AS resource_path,
json_agg(json_build_object('header_name', hr.name, 'header_value', hr.value)) AS headers
json_agg(
json_build_object('header_name', hr.name, 'header_value', hr.value)
) AS headers
FROM
paths p
JOIN
paths_header_rules phr ON p.id = phr.paths_id
JOIN
header_rules hr ON phr.header_rules_id = hr.id
JOIN paths_header_rules phr ON p.id = phr.paths_id
JOIN header_rules hr ON phr.header_rules_id = hr.id
GROUP BY
p.path;

View file

@ -1,70 +1,151 @@
CREATE OR REPLACE VIEW optimized_oembed AS
WITH oembed_data AS (
SELECT
'post' AS type,
p.url::TEXT AS url,
p.title AS title,
p.description AS description,
COALESCE(NULLIF(p.metadata->>'open_graph_image', ''), (SELECT metadata->>'open_graph_image' FROM optimized_globals LIMIT 1)) AS image_url,
p.date AS content_date
FROM optimized_posts p
UNION ALL
SELECT
'page' AS type,
pa.permalink::TEXT AS url,
pa.title AS title,
pa.description AS description,
COALESCE(NULLIF(pa.metadata->>'open_graph_image', ''), (SELECT metadata->>'open_graph_image' FROM optimized_globals LIMIT 1)) AS image_url,
NULL::timestamptz AS content_date
FROM optimized_pages pa
UNION ALL
SELECT
'book' AS type,
b.url::TEXT AS url,
b.title AS title,
b.description AS description,
COALESCE(NULLIF(b.metadata->>'open_graph_image', ''), (SELECT metadata->>'open_graph_image' FROM optimized_globals LIMIT 1)) AS image_url,
b.date_finished AS content_date
FROM optimized_books b
UNION ALL
SELECT
'artist' AS type,
ar.url::TEXT AS url,
ar.name AS title,
ar.description AS description,
COALESCE(NULLIF(ar.metadata->>'open_graph_image', ''), (SELECT metadata->>'open_graph_image' FROM optimized_globals LIMIT 1)) AS image_url,
CURRENT_TIMESTAMP AS content_date
FROM optimized_artists ar
UNION ALL
SELECT
'genre' AS type,
g.url::TEXT AS url,
g.name AS title,
g.description AS description,
COALESCE(NULLIF(g.metadata->>'open_graph_image', ''), (SELECT metadata->>'open_graph_image' FROM optimized_globals LIMIT 1)) AS image_url,
CURRENT_TIMESTAMP AS content_date
FROM optimized_genres g
UNION ALL
SELECT
'show' AS type,
s.url::TEXT AS url,
s.title AS title,
s.description AS description,
COALESCE(NULLIF(s.metadata->>'open_graph_image', ''), (SELECT metadata->>'open_graph_image' FROM optimized_globals LIMIT 1)) AS image_url,
s.last_watched_at AS content_date
FROM optimized_shows s
UNION ALL
SELECT
'movie' AS type,
m.url::TEXT AS url,
m.title AS title,
m.description AS description,
COALESCE(NULLIF(m.metadata->>'open_graph_image', ''), (SELECT metadata->>'open_graph_image' FROM optimized_globals LIMIT 1)) AS image_url,
m.last_watched AS content_date
FROM optimized_movies m
)
SELECT
ROW_NUMBER() OVER (ORDER BY url) AS id,
*
FROM
CREATE OR REPLACE VIEW optimized_oembed AS
WITH
oembed_data AS (
SELECT
'post' AS type,
p.url::TEXT AS url,
p.title AS title,
p.description AS description,
COALESCE(
NULLIF(p.metadata ->> 'open_graph_image', ''),
(
SELECT
metadata ->> 'open_graph_image'
FROM
optimized_globals
LIMIT
1
)
) AS image_url,
p.date AS content_date
FROM
optimized_posts p
UNION ALL
SELECT
'page' AS type,
pa.permalink::TEXT AS url,
pa.title AS title,
pa.description AS description,
COALESCE(
NULLIF(pa.metadata ->> 'open_graph_image', ''),
(
SELECT
metadata ->> 'open_graph_image'
FROM
optimized_globals
LIMIT
1
)
) AS image_url,
NULL::timestamptz AS content_date
FROM
optimized_pages pa
UNION ALL
SELECT
'book' AS type,
b.url::TEXT AS url,
b.title AS title,
b.description AS description,
COALESCE(
NULLIF(b.metadata ->> 'open_graph_image', ''),
(
SELECT
metadata ->> 'open_graph_image'
FROM
optimized_globals
LIMIT
1
)
) AS image_url,
b.date_finished AS content_date
FROM
optimized_books b
UNION ALL
SELECT
'artist' AS type,
ar.url::TEXT AS url,
ar.name AS title,
ar.description AS description,
COALESCE(
NULLIF(ar.metadata ->> 'open_graph_image', ''),
(
SELECT
metadata ->> 'open_graph_image'
FROM
optimized_globals
LIMIT
1
)
) AS image_url,
CURRENT_TIMESTAMP AS content_date
FROM
optimized_artists ar
UNION ALL
SELECT
'genre' AS type,
g.url::TEXT AS url,
g.name AS title,
g.description AS description,
COALESCE(
NULLIF(g.metadata ->> 'open_graph_image', ''),
(
SELECT
metadata ->> 'open_graph_image'
FROM
optimized_globals
LIMIT
1
)
) AS image_url,
CURRENT_TIMESTAMP AS content_date
FROM
optimized_genres g
UNION ALL
SELECT
'show' AS type,
s.url::TEXT AS url,
s.title AS title,
s.description AS description,
COALESCE(
NULLIF(s.metadata ->> 'open_graph_image', ''),
(
SELECT
metadata ->> 'open_graph_image'
FROM
optimized_globals
LIMIT
1
)
) AS image_url,
s.last_watched_at AS content_date
FROM
optimized_shows s
UNION ALL
SELECT
'movie' AS type,
m.url::TEXT AS url,
m.title AS title,
m.description AS description,
COALESCE(
NULLIF(m.metadata ->> 'open_graph_image', ''),
(
SELECT
metadata ->> 'open_graph_image'
FROM
optimized_globals
LIMIT
1
)
) AS image_url,
m.last_watched AS content_date
FROM
optimized_movies m
)
SELECT
ROW_NUMBER() OVER (
ORDER BY
url
) AS id,
*
FROM
oembed_data;

View file

@ -1,124 +1,147 @@
CREATE OR REPLACE VIEW optimized_recent_activity AS
WITH activity_data AS (
SELECT
NULL::bigint AS id,
p.date AS content_date,
p.title,
p.content AS description,
p.url AS url,
p.featured AS featured,
p.tags::TEXT[],
NULL AS author,
NULL AS image,
NULL AS rating,
NULL AS artist_url,
NULL AS venue_lat,
NULL AS venue_lon,
NULL AS venue_name,
NULL AS notes,
'article' AS type,
'Post' AS label
FROM optimized_posts p
UNION ALL
SELECT
NULL::bigint AS id,
l.date AS content_date,
l.title,
l.description,
l.link AS url,
NULL AS featured,
l.tags::TEXT[],
l.author,
NULL AS image,
NULL AS rating,
NULL AS artist_url,
NULL AS venue_lat,
NULL AS venue_lon,
NULL AS venue_name,
NULL AS notes,
'link' AS type,
'Link' AS label
FROM optimized_links l
UNION ALL
SELECT
NULL::bigint AS id,
b.date_finished AS content_date,
CONCAT(b.title,
CASE WHEN b.rating IS NOT NULL THEN CONCAT(' (', b.rating, ')') ELSE '' END
) AS title,
b.description,
b.url AS url,
NULL AS featured,
b.tags::TEXT[],
NULL AS author,
b.image,
b.rating,
NULL AS artist_url,
NULL AS venue_lat,
NULL AS venue_lon,
NULL AS venue_name,
NULL AS notes,
'books' AS type,
'Book' AS label
FROM optimized_books b
WHERE LOWER(b.status) = 'finished'
UNION ALL
SELECT
NULL::bigint AS id,
m.last_watched AS content_date,
CONCAT(m.title,
CASE WHEN m.rating IS NOT NULL THEN CONCAT(' (', m.rating, ')') ELSE '' END
) AS title,
m.description,
m.url AS url,
NULL AS featured,
m.tags::TEXT[],
NULL AS author,
m.image,
m.rating,
NULL AS artist_url,
NULL AS venue_lat,
NULL AS venue_lon,
NULL AS venue_name,
NULL AS notes,
'movies' AS type,
'Movie' AS label
FROM optimized_movies m
WHERE m.last_watched IS NOT NULL
UNION ALL
SELECT
c.id,
c.date AS content_date,
CONCAT(c.artist->>'name', ' at ', c.venue->>'name_short') AS title,
c.concert_notes AS description,
NULL AS url,
NULL AS featured,
NULL AS tags,
NULL AS author,
NULL AS image,
NULL AS rating,
c.artist->>'url' AS artist_url,
c.venue->>'latitude' AS venue_lat,
c.venue->>'longitude' AS venue_lon,
c.venue->>'name_short' AS venue_name,
c.concert_notes AS notes,
'concerts' AS type,
'Concert' AS label
FROM optimized_concerts c
)
SELECT json_agg(recent_activity_data ORDER BY recent_activity_data.content_date DESC) AS feed
FROM (
SELECT *
FROM activity_data
WHERE content_date IS NOT NULL
ORDER BY content_date DESC
LIMIT 20
) AS recent_activity_data;
WITH
activity_data AS (
SELECT
NULL::bigint AS id,
p.date AS content_date,
p.title,
p.content AS description,
p.url AS url,
p.featured AS featured,
p.tags::TEXT[],
NULL AS author,
NULL AS image,
NULL AS rating,
NULL AS artist_url,
NULL AS venue_lat,
NULL AS venue_lon,
NULL AS venue_name,
NULL AS notes,
'article' AS type,
'Post' AS label
FROM
optimized_posts p
UNION ALL
SELECT
NULL::bigint AS id,
l.date AS content_date,
l.title,
l.description,
l.link AS url,
NULL AS featured,
l.tags::TEXT[],
l.author,
NULL AS image,
NULL AS rating,
NULL AS artist_url,
NULL AS venue_lat,
NULL AS venue_lon,
NULL AS venue_name,
NULL AS notes,
'link' AS type,
'Link' AS label
FROM
optimized_links l
UNION ALL
SELECT
NULL::bigint AS id,
b.date_finished AS content_date,
CONCAT(
b.title,
CASE
WHEN b.rating IS NOT NULL THEN CONCAT(' (', b.rating, ')')
ELSE ''
END
) AS title,
b.description,
b.url AS url,
NULL AS featured,
b.tags::TEXT[],
NULL AS author,
b.image,
b.rating,
NULL AS artist_url,
NULL AS venue_lat,
NULL AS venue_lon,
NULL AS venue_name,
NULL AS notes,
'books' AS type,
'Book' AS label
FROM
optimized_books b
WHERE
LOWER(b.status) = 'finished'
UNION ALL
SELECT
NULL::bigint AS id,
m.last_watched AS content_date,
CONCAT(
m.title,
CASE
WHEN m.rating IS NOT NULL THEN CONCAT(' (', m.rating, ')')
ELSE ''
END
) AS title,
m.description,
m.url AS url,
NULL AS featured,
m.tags::TEXT[],
NULL AS author,
m.image,
m.rating,
NULL AS artist_url,
NULL AS venue_lat,
NULL AS venue_lon,
NULL AS venue_name,
NULL AS notes,
'movies' AS type,
'Movie' AS label
FROM
optimized_movies m
WHERE
m.last_watched IS NOT NULL
UNION ALL
SELECT
c.id,
c.date AS content_date,
CONCAT(
c.artist ->> 'name',
' at ',
c.venue ->> 'name_short'
) AS title,
c.concert_notes AS description,
NULL AS url,
NULL AS featured,
NULL AS tags,
NULL AS author,
NULL AS image,
NULL AS rating,
c.artist ->> 'url' AS artist_url,
c.venue ->> 'latitude' AS venue_lat,
c.venue ->> 'longitude' AS venue_lon,
c.venue ->> 'name_short' AS venue_name,
c.concert_notes AS notes,
'concerts' AS type,
'Concert' AS label
FROM
optimized_concerts c
)
SELECT
json_agg(
recent_activity_data
ORDER BY
recent_activity_data.content_date DESC
) AS feed
FROM
(
SELECT
*
FROM
activity_data
WHERE
content_date IS NOT NULL
ORDER BY
content_date DESC
LIMIT
20
) AS recent_activity_data;

View file

@ -1,12 +1,14 @@
CREATE OR REPLACE VIEW optimized_robots AS
SELECT
r.path,
array_agg(ua.user_agent ORDER BY ua.user_agent) AS user_agents
array_agg(
ua.user_agent
ORDER BY
ua.user_agent
) AS user_agents
FROM
robots AS r
JOIN
robots_user_agents AS rua ON r.id = rua.robots_id
JOIN
user_agents AS ua ON rua.user_agents_id = ua.id
JOIN robots_user_agents AS rua ON r.id = rua.robots_id
JOIN user_agents AS ua ON rua.user_agents_id = ua.id
GROUP BY
r.path;

View file

@ -1,118 +1,125 @@
CREATE OR REPLACE VIEW optimized_search_index AS
WITH search_data AS (
SELECT
p.title,
p.url::TEXT AS url,
p.description AS description,
p.tags,
NULL AS genre_name,
NULL AS genre_url,
NULL::TEXT AS total_plays,
p.date AS content_date,
'article' AS type,
'post' AS section
FROM
optimized_posts p
UNION ALL
SELECT
CONCAT(l.title, ' via ', l.name) AS title,
l.link::TEXT AS url,
l.description AS description,
l.tags,
NULL AS genre_name,
NULL AS genre_url,
NULL::TEXT AS total_plays,
l.date AS content_date,
'link' AS type,
'link' AS section
FROM
optimized_links l
UNION ALL
SELECT
CASE WHEN b.rating IS NOT NULL THEN
CONCAT(b.title, ' (', b.rating, ')')
ELSE
b.title
END AS title,
b.url::TEXT AS url,
b.description AS description,
b.tags,
NULL AS genre_name,
NULL AS genre_url,
NULL::TEXT AS total_plays,
b.date_finished AS content_date,
'books' AS type,
'book' AS section
FROM
optimized_books b
WHERE
LOWER(b.status) = 'finished'
UNION ALL
SELECT
ar.name AS title,
ar.url::TEXT AS url,
ar.description AS description,
ARRAY[ar.genre_name] AS tags,
CONCAT(COALESCE(ar.emoji, ar.genre_emoji, '🎧'), ' ', ar.genre_name) AS genre_name,
ar.genre_slug AS genre_url,
TO_CHAR(ar.total_plays::NUMERIC, 'FM999,999,999,999') AS total_plays,
NULL AS content_date,
'music' AS type,
'artist' AS section
FROM
optimized_artists ar
UNION ALL
SELECT
g.name AS title,
g.url::TEXT AS url,
g.description AS description,
NULL AS tags,
g.name AS genre_name,
g.url AS genre_url,
g.total_plays AS total_plays,
NULL AS content_date,
'music' AS type,
'genre' AS section
FROM
optimized_genres g
UNION ALL
SELECT
CONCAT(s.title, ' (', s.year, ')') AS title,
s.url::TEXT AS url,
s.description AS description,
s.tags,
NULL AS genre_name,
NULL AS genre_url,
NULL::TEXT AS total_plays,
s.last_watched_at AS content_date,
'tv' AS type,
'show' AS section
FROM
optimized_shows s
WHERE
s.last_watched_at IS NOT NULL
UNION ALL
SELECT
CASE
WHEN m.rating IS NOT NULL THEN CONCAT(m.title, ' (', m.rating, ')')
ELSE CONCAT(m.title, ' (', m.year, ')')
END AS title,
m.url::TEXT AS url,
m.description AS description,
m.tags,
NULL AS genre_name,
NULL AS genre_url,
NULL::TEXT AS total_plays,
m.last_watched AS content_date,
'movies' AS type,
'movie' AS section
FROM
optimized_movies m
WHERE
m.last_watched IS NOT NULL
)
WITH
search_data AS (
SELECT
p.title,
p.url::TEXT AS url,
p.description AS description,
p.tags,
NULL AS genre_name,
NULL AS genre_url,
NULL::TEXT AS total_plays,
p.date AS content_date,
'article' AS type,
'post' AS section
FROM
optimized_posts p
UNION ALL
SELECT
CONCAT(l.title, ' via ', l.name) AS title,
l.link::TEXT AS url,
l.description AS description,
l.tags,
NULL AS genre_name,
NULL AS genre_url,
NULL::TEXT AS total_plays,
l.date AS content_date,
'link' AS type,
'link' AS section
FROM
optimized_links l
UNION ALL
SELECT
CASE
WHEN b.rating IS NOT NULL THEN CONCAT(b.title, ' (', b.rating, ')')
ELSE b.title
END AS title,
b.url::TEXT AS url,
b.description AS description,
b.tags,
NULL AS genre_name,
NULL AS genre_url,
NULL::TEXT AS total_plays,
b.date_finished AS content_date,
'books' AS type,
'book' AS section
FROM
optimized_books b
WHERE
LOWER(b.status) = 'finished'
UNION ALL
SELECT
ar.name AS title,
ar.url::TEXT AS url,
ar.description AS description,
ARRAY[ar.genre_name] AS tags,
CONCAT(
COALESCE(ar.emoji, ar.genre_emoji, '🎧'),
' ',
ar.genre_name
) AS genre_name,
ar.genre_slug AS genre_url,
TO_CHAR(ar.total_plays::NUMERIC, 'FM999,999,999,999') AS total_plays,
NULL AS content_date,
'music' AS type,
'artist' AS section
FROM
optimized_artists ar
UNION ALL
SELECT
g.name AS title,
g.url::TEXT AS url,
g.description AS description,
NULL AS tags,
g.name AS genre_name,
g.url AS genre_url,
g.total_plays AS total_plays,
NULL AS content_date,
'music' AS type,
'genre' AS section
FROM
optimized_genres g
UNION ALL
SELECT
CONCAT(s.title, ' (', s.year, ')') AS title,
s.url::TEXT AS url,
s.description AS description,
s.tags,
NULL AS genre_name,
NULL AS genre_url,
NULL::TEXT AS total_plays,
s.last_watched_at AS content_date,
'tv' AS type,
'show' AS section
FROM
optimized_shows s
WHERE
s.last_watched_at IS NOT NULL
UNION ALL
SELECT
CASE
WHEN m.rating IS NOT NULL THEN CONCAT(m.title, ' (', m.rating, ')')
ELSE CONCAT(m.title, ' (', m.year, ')')
END AS title,
m.url::TEXT AS url,
m.description AS description,
m.tags,
NULL AS genre_name,
NULL AS genre_url,
NULL::TEXT AS total_plays,
m.last_watched AS content_date,
'movies' AS type,
'movie' AS section
FROM
optimized_movies m
WHERE
m.last_watched IS NOT NULL
)
SELECT
ROW_NUMBER() OVER (ORDER BY url) AS id,
ROW_NUMBER() OVER (
ORDER BY
url
) AS id,
*
FROM
search_data;

View file

@ -1,49 +1,54 @@
CREATE OR REPLACE VIEW optimized_sitemap AS
WITH sitemap_data AS (
SELECT
p.url::TEXT AS url
FROM
optimized_posts p
UNION ALL
SELECT
b.url::TEXT AS url
FROM
optimized_books b
UNION ALL
SELECT
m.url::TEXT AS url
FROM
optimized_movies m
UNION ALL
SELECT
ar.url::TEXT AS url
FROM
optimized_artists ar
UNION ALL
SELECT
g.url::TEXT AS url
FROM
optimized_genres g
UNION ALL
SELECT
s.url::TEXT AS url
FROM
optimized_shows s
UNION ALL
SELECT
pa.permalink::TEXT AS url
FROM
optimized_pages pa
UNION ALL
SELECT
ss.slug AS url
FROM
static_slugs ss
UNION ALL
SELECT CONCAT('/tags/', LOWER(REPLACE(tag, ' ', '-'))) AS url
FROM optimized_all_tags
WHERE tag IS NOT NULL AND TRIM(tag) <> ''
)
WITH
sitemap_data AS (
SELECT
p.url::TEXT AS url
FROM
optimized_posts p
UNION ALL
SELECT
b.url::TEXT AS url
FROM
optimized_books b
UNION ALL
SELECT
m.url::TEXT AS url
FROM
optimized_movies m
UNION ALL
SELECT
ar.url::TEXT AS url
FROM
optimized_artists ar
UNION ALL
SELECT
g.url::TEXT AS url
FROM
optimized_genres g
UNION ALL
SELECT
s.url::TEXT AS url
FROM
optimized_shows s
UNION ALL
SELECT
pa.permalink::TEXT AS url
FROM
optimized_pages pa
UNION ALL
SELECT
ss.slug AS url
FROM
static_slugs ss
UNION ALL
SELECT
CONCAT('/tags/', LOWER(REPLACE(tag, ' ', '-'))) AS url
FROM
optimized_all_tags
WHERE
tag IS NOT NULL
AND TRIM(tag) <> ''
)
SELECT
url
FROM

View file

@ -1,190 +1,412 @@
CREATE OR REPLACE VIEW optimized_stats AS
WITH artist_stats AS (
SELECT
TO_CHAR(COUNT(DISTINCT artist_name), 'FM999,999,999') AS artist_count
FROM optimized_listens
WHERE artist_name IS NOT NULL
),
track_stats AS (
SELECT
TO_CHAR(COUNT(*), 'FM999,999,999') AS listen_count
FROM optimized_listens
),
concert_stats AS (
SELECT
TO_CHAR(COUNT(*), 'FM999,999,999') AS concert_count
FROM concerts
),
venue_stats AS (
SELECT
TO_CHAR(COUNT(DISTINCT venue), 'FM999,999,999') AS venue_count
FROM concerts
),
yearly_data AS (
SELECT
EXTRACT(YEAR FROM e.last_watched_at) AS year,
0 AS artist_count,
0 AS listen_count,
0 AS genre_count,
COUNT(DISTINCT e.show) AS show_count,
COUNT(*) AS episode_count,
0 AS post_count,
0 AS link_count,
0 AS book_count,
0 AS movie_count,
0 AS concert_count,
0 AS venue_count
FROM episodes e
GROUP BY EXTRACT(YEAR FROM e.last_watched_at)
HAVING EXTRACT(YEAR FROM e.last_watched_at) >= 2023
UNION ALL
SELECT
EXTRACT(YEAR FROM p.date) AS year,
0 AS artist_count,
0 AS listen_count,
0 AS genre_count,
0 AS show_count,
0 AS episode_count,
COUNT(*) AS post_count,
0 AS link_count,
0 AS book_count,
0 AS movie_count,
0 AS concert_count,
0 AS venue_count
FROM optimized_posts p
GROUP BY EXTRACT(YEAR FROM p.date)
HAVING EXTRACT(YEAR FROM p.date) >= 2023
UNION ALL
SELECT
EXTRACT(YEAR FROM o.date) AS year,
0 AS artist_count,
0 AS listen_count,
0 AS genre_count,
0 AS show_count,
0 AS episode_count,
0 AS post_count,
COUNT(*) AS link_count,
0 AS book_count,
0 AS movie_count,
0 AS concert_count,
0 AS venue_count
FROM optimized_links o
GROUP BY EXTRACT(YEAR FROM o.date)
HAVING EXTRACT(YEAR FROM o.date) >= 2023
UNION ALL
SELECT
EXTRACT(YEAR FROM b.date_finished) AS year,
0 AS artist_count,
0 AS listen_count,
0 AS genre_count,
0 AS show_count,
0 AS episode_count,
0 AS post_count,
0 AS link_count,
COUNT(*) AS book_count,
0 AS movie_count,
0 AS concert_count,
0 AS venue_count
FROM optimized_books b
WHERE LOWER(b.status) = 'finished'
GROUP BY EXTRACT(YEAR FROM b.date_finished)
HAVING EXTRACT(YEAR FROM b.date_finished) >= 2023
UNION ALL
SELECT
EXTRACT(YEAR FROM m.last_watched) AS year,
0 AS artist_count,
0 AS listen_count,
0 AS genre_count,
0 AS show_count,
0 AS episode_count,
0 AS post_count,
0 AS link_count,
0 AS book_count,
COUNT(*) AS movie_count,
0 AS concert_count,
0 AS venue_count
FROM optimized_movies m
GROUP BY EXTRACT(YEAR FROM m.last_watched)
HAVING EXTRACT(YEAR FROM m.last_watched) >= 2023
UNION ALL
SELECT
EXTRACT(YEAR FROM TO_TIMESTAMP(l.listened_at)) AS year,
COUNT(DISTINCT l.artist_name) AS artist_count,
COUNT(l.id) AS listen_count,
COUNT(DISTINCT l.genre_name) AS genre_count,
0 AS show_count,
0 AS episode_count,
0 AS post_count,
0 AS link_count,
0 AS book_count,
0 AS movie_count,
0 AS concert_count,
0 AS venue_count
FROM optimized_listens l
GROUP BY EXTRACT(YEAR FROM TO_TIMESTAMP(l.listened_at))
HAVING EXTRACT(YEAR FROM TO_TIMESTAMP(l.listened_at)) >= 2023
UNION ALL
SELECT
EXTRACT(YEAR FROM c.date) AS year,
0 AS artist_count,
0 AS listen_count,
0 AS genre_count,
0 AS show_count,
0 AS episode_count,
0 AS post_count,
0 AS link_count,
0 AS book_count,
0 AS movie_count,
COUNT(*) AS concert_count,
COUNT(DISTINCT c.venue) AS venue_count
FROM concerts c
GROUP BY EXTRACT(YEAR FROM c.date)
HAVING EXTRACT(YEAR FROM c.date) >= 2023
),
aggregated_yearly_stats AS (
SELECT
year,
SUM(artist_count) AS artist_count,
SUM(listen_count) AS listen_count,
SUM(genre_count) AS genre_count,
SUM(show_count) AS show_count,
SUM(episode_count) AS episode_count,
SUM(post_count) AS post_count,
SUM(link_count) AS link_count,
SUM(book_count) AS book_count,
SUM(movie_count) AS movie_count,
SUM(concert_count) AS concert_count,
SUM(venue_count) AS venue_count
FROM yearly_data
GROUP BY year
ORDER BY year DESC
)
WITH
artist_stats AS (
SELECT
TO_CHAR(COUNT(DISTINCT artist_name), 'FM999,999,999') AS artist_count
FROM
optimized_listens
WHERE
artist_name IS NOT NULL
),
track_stats AS (
SELECT
TO_CHAR(COUNT(*), 'FM999,999,999') AS listen_count
FROM
optimized_listens
),
concert_stats AS (
SELECT
TO_CHAR(COUNT(*), 'FM999,999,999') AS concert_count
FROM
concerts
),
venue_stats AS (
SELECT
TO_CHAR(COUNT(DISTINCT venue), 'FM999,999,999') AS venue_count
FROM
concerts
),
yearly_data AS (
SELECT
EXTRACT(
YEAR
FROM
e.last_watched_at
) AS year,
0 AS artist_count,
0 AS listen_count,
0 AS genre_count,
COUNT(DISTINCT e.show) AS show_count,
COUNT(*) AS episode_count,
0 AS post_count,
0 AS link_count,
0 AS book_count,
0 AS movie_count,
0 AS concert_count,
0 AS venue_count
FROM
episodes e
GROUP BY
EXTRACT(
YEAR
FROM
e.last_watched_at
)
HAVING
EXTRACT(
YEAR
FROM
e.last_watched_at
) >= 2023
UNION ALL
SELECT
EXTRACT(
YEAR
FROM
p.date
) AS year,
0 AS artist_count,
0 AS listen_count,
0 AS genre_count,
0 AS show_count,
0 AS episode_count,
COUNT(*) AS post_count,
0 AS link_count,
0 AS book_count,
0 AS movie_count,
0 AS concert_count,
0 AS venue_count
FROM
optimized_posts p
GROUP BY
EXTRACT(
YEAR
FROM
p.date
)
HAVING
EXTRACT(
YEAR
FROM
p.date
) >= 2023
UNION ALL
SELECT
EXTRACT(
YEAR
FROM
o.date
) AS year,
0 AS artist_count,
0 AS listen_count,
0 AS genre_count,
0 AS show_count,
0 AS episode_count,
0 AS post_count,
COUNT(*) AS link_count,
0 AS book_count,
0 AS movie_count,
0 AS concert_count,
0 AS venue_count
FROM
optimized_links o
GROUP BY
EXTRACT(
YEAR
FROM
o.date
)
HAVING
EXTRACT(
YEAR
FROM
o.date
) >= 2023
UNION ALL
SELECT
EXTRACT(
YEAR
FROM
b.date_finished
) AS year,
0 AS artist_count,
0 AS listen_count,
0 AS genre_count,
0 AS show_count,
0 AS episode_count,
0 AS post_count,
0 AS link_count,
COUNT(*) AS book_count,
0 AS movie_count,
0 AS concert_count,
0 AS venue_count
FROM
optimized_books b
WHERE
LOWER(b.status) = 'finished'
GROUP BY
EXTRACT(
YEAR
FROM
b.date_finished
)
HAVING
EXTRACT(
YEAR
FROM
b.date_finished
) >= 2023
UNION ALL
SELECT
EXTRACT(
YEAR
FROM
m.last_watched
) AS year,
0 AS artist_count,
0 AS listen_count,
0 AS genre_count,
0 AS show_count,
0 AS episode_count,
0 AS post_count,
0 AS link_count,
0 AS book_count,
COUNT(*) AS movie_count,
0 AS concert_count,
0 AS venue_count
FROM
optimized_movies m
GROUP BY
EXTRACT(
YEAR
FROM
m.last_watched
)
HAVING
EXTRACT(
YEAR
FROM
m.last_watched
) >= 2023
UNION ALL
SELECT
EXTRACT(
YEAR
FROM
TO_TIMESTAMP(l.listened_at)
) AS year,
COUNT(DISTINCT l.artist_name) AS artist_count,
COUNT(l.id) AS listen_count,
COUNT(DISTINCT l.genre_name) AS genre_count,
0 AS show_count,
0 AS episode_count,
0 AS post_count,
0 AS link_count,
0 AS book_count,
0 AS movie_count,
0 AS concert_count,
0 AS venue_count
FROM
optimized_listens l
GROUP BY
EXTRACT(
YEAR
FROM
TO_TIMESTAMP(l.listened_at)
)
HAVING
EXTRACT(
YEAR
FROM
TO_TIMESTAMP(l.listened_at)
) >= 2023
UNION ALL
SELECT
EXTRACT(
YEAR
FROM
c.date
) AS year,
0 AS artist_count,
0 AS listen_count,
0 AS genre_count,
0 AS show_count,
0 AS episode_count,
0 AS post_count,
0 AS link_count,
0 AS book_count,
0 AS movie_count,
COUNT(*) AS concert_count,
COUNT(DISTINCT c.venue) AS venue_count
FROM
concerts c
GROUP BY
EXTRACT(
YEAR
FROM
c.date
)
HAVING
EXTRACT(
YEAR
FROM
c.date
) >= 2023
),
aggregated_yearly_stats AS (
SELECT
year,
SUM(artist_count) AS artist_count,
SUM(listen_count) AS listen_count,
SUM(genre_count) AS genre_count,
SUM(show_count) AS show_count,
SUM(episode_count) AS episode_count,
SUM(post_count) AS post_count,
SUM(link_count) AS link_count,
SUM(book_count) AS book_count,
SUM(movie_count) AS movie_count,
SUM(concert_count) AS concert_count,
SUM(venue_count) AS venue_count
FROM
yearly_data
GROUP BY
year
ORDER BY
year DESC
)
SELECT
(SELECT artist_count FROM artist_stats) AS artist_count,
(SELECT listen_count FROM track_stats) AS listen_count,
(SELECT concert_count FROM concert_stats) AS concert_count,
(SELECT venue_count FROM venue_stats) AS venue_count,
(SELECT TO_CHAR(COUNT(DISTINCT e.show), 'FM999,999,999') FROM episodes e) AS show_count,
(SELECT TO_CHAR(COUNT(*), 'FM999,999,999') FROM episodes e) AS episode_count,
(SELECT TO_CHAR(COUNT(*), 'FM999,999,999') FROM optimized_posts) AS post_count,
(SELECT TO_CHAR(COUNT(*), 'FM999,999,999') FROM optimized_links) AS link_count,
(SELECT TO_CHAR(COUNT(*), 'FM999,999,999') FROM optimized_books WHERE LOWER(status) = 'finished') AS book_count,
(SELECT TO_CHAR(COUNT(*), 'FM999,999,999') FROM optimized_movies WHERE last_watched IS NOT NULL) AS movie_count,
(SELECT TO_CHAR(COUNT(DISTINCT genre_name), 'FM999,999,999') FROM optimized_listens WHERE genre_name IS NOT NULL) AS genre_count,
(
SELECT
artist_count
FROM
artist_stats
) AS artist_count,
(
SELECT
listen_count
FROM
track_stats
) AS listen_count,
(
SELECT
concert_count
FROM
concert_stats
) AS concert_count,
(
SELECT
venue_count
FROM
venue_stats
) AS venue_count,
(
SELECT
TO_CHAR(COUNT(DISTINCT e.show), 'FM999,999,999')
FROM
episodes e
) AS show_count,
(
SELECT
TO_CHAR(COUNT(*), 'FM999,999,999')
FROM
episodes e
) AS episode_count,
(
SELECT
TO_CHAR(COUNT(*), 'FM999,999,999')
FROM
optimized_posts
) AS post_count,
(
SELECT
TO_CHAR(COUNT(*), 'FM999,999,999')
FROM
optimized_links
) AS link_count,
(
SELECT
TO_CHAR(COUNT(*), 'FM999,999,999')
FROM
optimized_books
WHERE
LOWER(status) = 'finished'
) AS book_count,
(
SELECT
TO_CHAR(COUNT(*), 'FM999,999,999')
FROM
optimized_movies
WHERE
last_watched IS NOT NULL
) AS movie_count,
(
SELECT
TO_CHAR(COUNT(DISTINCT genre_name), 'FM999,999,999')
FROM
optimized_listens
WHERE
genre_name IS NOT NULL
) AS genre_count,
JSON_AGG(
JSON_BUILD_OBJECT(
'year', ys.year,
'artist_count', CASE WHEN ys.artist_count > 0 THEN TO_CHAR(ys.artist_count, 'FM999,999,999') ELSE NULL END,
'listen_count', CASE WHEN ys.listen_count > 0 THEN TO_CHAR(ys.listen_count, 'FM999,999,999') ELSE NULL END,
'genre_count', CASE WHEN ys.genre_count > 0 THEN TO_CHAR(ys.genre_count, 'FM999,999,999') ELSE NULL END,
'show_count', CASE WHEN ys.show_count > 0 THEN TO_CHAR(ys.show_count, 'FM999,999,999') ELSE NULL END,
'episode_count', CASE WHEN ys.episode_count > 0 THEN TO_CHAR(ys.episode_count, 'FM999,999,999') ELSE NULL END,
'post_count', CASE WHEN ys.post_count > 0 THEN TO_CHAR(ys.post_count, 'FM999,999,999') ELSE NULL END,
'link_count', CASE WHEN ys.link_count > 0 THEN TO_CHAR(ys.link_count, 'FM999,999,999') ELSE NULL END,
'book_count', CASE WHEN ys.book_count > 0 THEN TO_CHAR(ys.book_count, 'FM999,999,999') ELSE NULL END,
'movie_count', CASE WHEN ys.movie_count > 0 THEN TO_CHAR(ys.movie_count, 'FM999,999,999') ELSE NULL END,
'concert_count', CASE WHEN ys.concert_count > 0 THEN TO_CHAR(ys.concert_count, 'FM999,999,999') ELSE NULL END,
'venue_count', CASE WHEN ys.venue_count > 0 THEN TO_CHAR(ys.venue_count, 'FM999,999,999') ELSE NULL END
'year',
ys.year,
'artist_count',
CASE
WHEN ys.artist_count > 0 THEN TO_CHAR(ys.artist_count, 'FM999,999,999')
ELSE NULL
END,
'listen_count',
CASE
WHEN ys.listen_count > 0 THEN TO_CHAR(ys.listen_count, 'FM999,999,999')
ELSE NULL
END,
'genre_count',
CASE
WHEN ys.genre_count > 0 THEN TO_CHAR(ys.genre_count, 'FM999,999,999')
ELSE NULL
END,
'show_count',
CASE
WHEN ys.show_count > 0 THEN TO_CHAR(ys.show_count, 'FM999,999,999')
ELSE NULL
END,
'episode_count',
CASE
WHEN ys.episode_count > 0 THEN TO_CHAR(ys.episode_count, 'FM999,999,999')
ELSE NULL
END,
'post_count',
CASE
WHEN ys.post_count > 0 THEN TO_CHAR(ys.post_count, 'FM999,999,999')
ELSE NULL
END,
'link_count',
CASE
WHEN ys.link_count > 0 THEN TO_CHAR(ys.link_count, 'FM999,999,999')
ELSE NULL
END,
'book_count',
CASE
WHEN ys.book_count > 0 THEN TO_CHAR(ys.book_count, 'FM999,999,999')
ELSE NULL
END,
'movie_count',
CASE
WHEN ys.movie_count > 0 THEN TO_CHAR(ys.movie_count, 'FM999,999,999')
ELSE NULL
END,
'concert_count',
CASE
WHEN ys.concert_count > 0 THEN TO_CHAR(ys.concert_count, 'FM999,999,999')
ELSE NULL
END,
'venue_count',
CASE
WHEN ys.venue_count > 0 THEN TO_CHAR(ys.venue_count, 'FM999,999,999')
ELSE NULL
END
)
) AS yearly_breakdown
FROM aggregated_yearly_stats ys;
FROM
aggregated_yearly_stats ys;

View file

@ -1,93 +1,153 @@
CREATE OR REPLACE VIEW optimized_syndication AS
WITH syndication_data AS (
SELECT
p.date AS content_date,
json_build_object(
'title', CONCAT('📝 ', p.title, ' ', (
SELECT array_to_string(
array_agg('#' || initcap(replace(trim(tag_part), ' ', ''))),
' '
)
FROM unnest(p.tags) AS t(name),
regexp_split_to_table(t.name, '\s*&\s*') AS tag_part
)),
'description', p.description,
'url', p.url,
'image', p.image,
'date', p.date
) AS feed
FROM optimized_posts p
UNION ALL
SELECT
l.date AS content_date,
json_build_object(
'title', CONCAT('🔗 ', l.title, CASE
WHEN l.mastodon IS NOT NULL THEN ' via @' || split_part(l.mastodon, '@', 2) || '@' || split_part(split_part(l.mastodon, 'https://', 2), '/', 1)
ELSE CONCAT(' via ', l.name)
END, ' ', (
SELECT array_to_string(
array_agg('#' || initcap(replace(trim(tag_part), ' ', ''))),
' '
)
FROM unnest(l.tags) AS t(name),
regexp_split_to_table(t.name, '\s*&\s*') AS tag_part
)),
'description', l.description,
'url', l.link,
'date', l.date
) AS feed
FROM optimized_links l
UNION ALL
SELECT
b.date_finished AS content_date,
CASE
WHEN LOWER(b.status) = 'finished' THEN
json_build_object(
'title', CONCAT('📖 ', b.title, CASE
WHEN b.rating IS NOT NULL THEN ' (' || b.rating || ')' ELSE '' END, ' ', (
SELECT array_to_string(
WITH
syndication_data AS (
SELECT
p.date AS content_date,
json_build_object(
'title',
CONCAT(
'📝 ',
p.title,
' ',
(
SELECT
array_to_string(
array_agg('#' || initcap(replace(trim(tag_part), ' ', ''))),
' '
)
FROM unnest(b.tags) AS t(name),
regexp_split_to_table(t.name, '\s*&\s*') AS tag_part
)
),
'description', b.description,
'url', b.url,
'image', b.image,
'date', b.date_finished
)
ELSE NULL
END AS feed
FROM optimized_books b
UNION ALL
SELECT
m.last_watched AS content_date,
CASE
WHEN m.last_watched IS NOT NULL THEN
json_build_object(
'title', CONCAT('🎥 ', m.title, CASE
WHEN m.rating IS NOT NULL THEN ' (' || m.rating || ')' ELSE '' END, ' ', (
SELECT array_to_string(
FROM
unnest(p.tags) AS t (name),
regexp_split_to_table(t.name, '\s*&\s*') AS tag_part
)
),
'description',
p.description,
'url',
p.url,
'image',
p.image,
'date',
p.date
) AS feed
FROM
optimized_posts p
UNION ALL
SELECT
l.date AS content_date,
json_build_object(
'title',
CONCAT(
'🔗 ',
l.title,
CASE
WHEN l.mastodon IS NOT NULL THEN ' via @' || split_part(l.mastodon, '@', 2) || '@' || split_part(split_part(l.mastodon, 'https://', 2), '/', 1)
ELSE CONCAT(' via ', l.name)
END,
' ',
(
SELECT
array_to_string(
array_agg('#' || initcap(replace(trim(tag_part), ' ', ''))),
' '
)
FROM unnest(m.tags) AS t(name),
regexp_split_to_table(t.name, '\s*&\s*') AS tag_part
FROM
unnest(l.tags) AS t (name),
regexp_split_to_table(t.name, '\s*&\s*') AS tag_part
)
),
'description',
l.description,
'url',
l.link,
'date',
l.date
) AS feed
FROM
optimized_links l
UNION ALL
SELECT
b.date_finished AS content_date,
CASE
WHEN LOWER(b.status) = 'finished' THEN json_build_object(
'title',
CONCAT(
'📖 ',
b.title,
CASE
WHEN b.rating IS NOT NULL THEN ' (' || b.rating || ')'
ELSE ''
END,
' ',
(
SELECT
array_to_string(
array_agg('#' || initcap(replace(trim(tag_part), ' ', ''))),
' '
)
FROM
unnest(b.tags) AS t (name),
regexp_split_to_table(t.name, '\s*&\s*') AS tag_part
)
),
'description', m.description,
'url', m.url,
'image', m.image,
'date', m.last_watched
'description',
b.description,
'url',
b.url,
'image',
b.image,
'date',
b.date_finished
)
ELSE NULL
END AS feed
FROM optimized_movies m
)
SELECT feed
FROM syndication_data
WHERE feed IS NOT NULL
ORDER BY content_date DESC
LIMIT 3;
ELSE NULL
END AS feed
FROM
optimized_books b
UNION ALL
SELECT
m.last_watched AS content_date,
CASE
WHEN m.last_watched IS NOT NULL THEN json_build_object(
'title',
CONCAT(
'🎥 ',
m.title,
CASE
WHEN m.rating IS NOT NULL THEN ' (' || m.rating || ')'
ELSE ''
END,
' ',
(
SELECT
array_to_string(
array_agg('#' || initcap(replace(trim(tag_part), ' ', ''))),
' '
)
FROM
unnest(m.tags) AS t (name),
regexp_split_to_table(t.name, '\s*&\s*') AS tag_part
)
),
'description',
m.description,
'url',
m.url,
'image',
m.image,
'date',
m.last_watched
)
ELSE NULL
END AS feed
FROM
optimized_movies m
)
SELECT
feed
FROM
syndication_data
WHERE
feed IS NOT NULL
ORDER BY
content_date DESC
LIMIT
3;

View file

@ -10,7 +10,8 @@ SELECT
p.tags::TEXT[],
'article'::TEXT AS type,
'Post'::TEXT AS label
FROM optimized_posts p
FROM
optimized_posts p
UNION ALL
SELECT
unnest(l.tags) AS tag,
@ -23,7 +24,8 @@ SELECT
l.tags::TEXT[],
'link'::TEXT AS type,
'Link'::TEXT AS label
FROM optimized_links l
FROM
optimized_links l
UNION ALL
SELECT
unnest(b.tags) AS tag,
@ -36,8 +38,10 @@ SELECT
b.tags::TEXT[],
'books'::TEXT AS type,
'Book'::TEXT AS label
FROM optimized_books b
WHERE LOWER(b.status) = 'finished'
FROM
optimized_books b
WHERE
LOWER(b.status) = 'finished'
UNION ALL
SELECT
unnest(m.tags) AS tag,
@ -50,8 +54,10 @@ SELECT
m.tags::TEXT[],
'movies'::TEXT AS type,
'Movie'::TEXT AS label
FROM optimized_movies m
WHERE m.last_watched IS NOT NULL
FROM
optimized_movies m
WHERE
m.last_watched IS NOT NULL
UNION ALL
SELECT
unnest(s.tags) AS tag,
@ -64,5 +70,7 @@ SELECT
s.tags::TEXT[],
'tv'::TEXT AS type,
'Show'::TEXT AS label
FROM optimized_shows s
WHERE s.last_watched_at IS NOT NULL;
FROM
optimized_shows s
WHERE
s.last_watched_at IS NOT NULL;

View file

@ -2,6 +2,9 @@ CREATE OR REPLACE VIEW optimized_all_tags AS
SELECT
tag,
COUNT(*) AS uses
FROM optimized_tagged_content
GROUP BY tag
ORDER BY tag ASC;
FROM
optimized_tagged_content
GROUP BY
tag
ORDER BY
tag ASC;