package MyApp::Model::FactoidDB; use v5.30; use Mojo::Base -base, -signatures; use strict; use warnings; use DBI; use Mojo::Pg; has 'dsn'; has 'pg' => sub { my $self = $_[0]; Mojo::Pg->new($self->dsn) }; sub get_factoids($self, $server, $namespace) { my $data = $self->pg->db->query( "WITH RECURSIVE factoid_lookup_order_inner (depth, namespace, server, alias_namespace, alias_server, parent_namespace, parent_server, recursive, gen_server, gen_namespace) AS ( SELECT 0 AS depth, namespace, server, alias_namespace, alias_server, parent_namespace, parent_server, recursive, generated_server, generated_namespace FROM factoid_config WHERE namespace = ? AND server = ? UNION ALL SELECT p.depth+1 AS depth, m.namespace, m.server, m.alias_namespace, m.alias_server, m.parent_namespace, m.parent_server, m.recursive, m.generated_server, m.generated_namespace FROM factoid_config m INNER JOIN factoid_lookup_order_inner p ON m.namespace = p.parent_namespace AND m.server = p.parent_server AND p.recursive ), factoid_lookup_order (depth, namespace, server, alias_namespace, alias_server, parent_namespace, parent_server, recursive, gen_server, gen_namespace) AS ( SELECT * FROM factoid_lookup_order_inner UNION ALL SELECT 0, '', '', NULL, NULL, NULL, NULL, false, '', '' WHERE NOT EXISTS (table factoid_lookup_order_inner) ), get_latest_factoid (depth, factoid_id, subject, copula, predicate, author, modified_time, compose_macro, protected, original_subject, deleted, server, namespace, last_rendered) AS ( SELECT DISTINCT ON(lo.depth, original_subject) lo.depth, factoid_id, subject, copula, predicate, author, modified_time, compose_macro, protected, original_subject, f.deleted, f.server, f.namespace, f.last_rendered FROM factoid f INNER JOIN factoid_lookup_order lo ON f.generated_server = lo.gen_server AND f.generated_namespace = lo.gen_namespace ORDER BY depth ASC, original_subject ASC, factoid_id DESC ) SELECT * FROM get_latest_factoid WHERE NOT deleted AND predicate IS NOT NULL AND predicate <> ' ' AND predicate <> '' ORDER BY original_subject ASC" , $namespace, $server)->hashes; return $data; } sub search_factoids($self, $search, $server, $namespace) { my $data = $self->pg->db->query(" WITH RECURSIVE factoid_lookup_order_inner (depth, namespace, server, alias_namespace, alias_server, parent_namespace, parent_server, recursive, gen_server, gen_namespace) AS ( SELECT 0 AS depth, namespace, server, alias_namespace, alias_server, parent_namespace, parent_server, recursive, generated_server, generated_namespace FROM factoid_config WHERE namespace = ? AND server = ? UNION ALL SELECT p.depth+1 AS depth, m.namespace, m.server, m.alias_namespace, m.alias_server, m.parent_namespace, m.parent_server, m.recursive, m.generated_server, m.generated_namespace FROM factoid_config m INNER JOIN factoid_lookup_order_inner p ON m.namespace = p.parent_namespace AND m.server = p.parent_server AND p.recursive ), factoid_lookup_order (depth, namespace, server, alias_namespace, alias_server, parent_namespace, parent_server, recursive, gen_server, gen_namespace) AS ( SELECT * FROM factoid_lookup_order_inner UNION ALL SELECT 0, '', '', NULL, NULL, NULL, NULL, false, '', '' WHERE NOT EXISTS (table factoid_lookup_order_inner) ), get_factoid_search (depth, factoid_id, subject, copula, predicate, author, modified_time, compose_macro, protected, original_subject, deleted, server, namespace, full_document_tsvector, last_rendered) AS ( SELECT DISTINCT ON (original_subject) lo.depth, factoid_id, subject, copula, predicate, author, modified_time, compose_macro, protected, original_subject, f.deleted, f.server, f.namespace, f.full_document_tsvector, f.last_rendered FROM factoid f INNER JOIN factoid_lookup_order lo ON f.generated_server = lo.gen_server AND f.generated_namespace = lo.gen_namespace WHERE NOT deleted ORDER BY original_subject ASC, depth ASC, factoid_id DESC ) SELECT ts_rank(full_document_tsvector, websearch_to_tsquery(?)) AS rank, * FROM get_factoid_search WHERE NOT deleted AND predicate IS NOT NULL AND predicate <> ' ' AND predicate <> '' AND ts_rank(full_document_tsvector, websearch_to_tsquery(?)) > 0.01 ORDER BY 1 DESC " , $namespace, $server, $search, $search)->hashes; return $data } sub autocomplete_factoids($self, $subject, $server, $namespace) { } sub get_namespaces($self) { my $data = $self->pg->db->query(" SELECT server, namespace, alias_server, alias_namespace, parent_server, parent_namespace, recursive, command_prefix, generated_server, generated_namespace FROM factoid_config ORDER BY server ASC, namespace ASC ")->hashes; return $data } # TODO make this use the historical version one. That ignores factoids that *would* have been hidden at the time sub get_revisions($self, $subject, $server, $namespace) { my $data = $self->pg->db->query(" WITH RECURSIVE factoid_lookup_order_inner (depth, namespace, server, alias_namespace, alias_server, parent_namespace, parent_server, recursive, gen_server, gen_namespace) AS ( SELECT 0 AS depth, namespace, server, alias_namespace, alias_server, parent_namespace, parent_server, recursive, generated_server, generated_namespace FROM factoid_config WHERE namespace = ? AND server = ? UNION ALL SELECT p.depth+1 AS depth, m.namespace, m.server, m.alias_namespace, m.alias_server, m.parent_namespace, m.parent_server, m.recursive, m.generated_server, m.generated_namespace FROM factoid_config m INNER JOIN factoid_lookup_order_inner p ON m.namespace = p.parent_namespace AND m.server = p.parent_server AND p.recursive ), factoid_lookup_order (depth, namespace, server, alias_namespace, alias_server, parent_namespace, parent_server, recursive, gen_server, gen_namespace) AS ( SELECT * FROM factoid_lookup_order_inner UNION ALL SELECT 0, '', '', NULL, NULL, NULL, NULL, false, '', '' WHERE NOT EXISTS (table factoid_lookup_order_inner) ), get_latest_factoid (depth, factoid_id, subject, copula, predicate, author, modified_time, compose_macro, protected, original_subject, deleted, server, namespace, last_rendered) AS ( SELECT lo.depth, factoid_id, subject, copula, predicate, author, modified_time, compose_macro, protected, original_subject, f.deleted, f.server, f.namespace, f.last_rendered FROM factoid f INNER JOIN factoid_lookup_order lo ON f.generated_server = lo.gen_server AND f.generated_namespace = lo.gen_namespace WHERE original_subject = ? ORDER BY depth ASC, factoid_id DESC ) SELECT * FROM get_latest_factoid ORDER BY factoid_id DESC; ", $namespace, $server, $subject)->hashes; return $data; } 1;