137 lines
6.7 KiB
Perl
137 lines
6.7 KiB
Perl
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('factoid', ?)) 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('factoid', ?)) > 0.01 ORDER BY 1 DESC, factoid_id 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, notes
|
|
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;
|