diff --git a/plugins/factoids.pm b/plugins/factoids.pm index 6e02e1e..ec29a85 100644 --- a/plugins/factoids.pm +++ b/plugins/factoids.pm @@ -429,7 +429,7 @@ sub get_fact_revisions ($self, $subject, $name, $said) { # TODO this query needs to be rewritten my $revisions = $dbh->selectall_arrayref( - "SELECT factoid_id, subject, copula, predicate, author, compose_macro, protected + "SELECT factoid_id, subject, copula, predicate, author, compose_macro, protected, server, namespace FROM factoid WHERE original_subject = ? ORDER BY modified_time DESC @@ -672,12 +672,34 @@ sub _db_get_protect ($self, $subj, $server, $namespace) { my $dbh = $self->dbh; my $prot = ( $dbh->selectrow_array(" - SELECT protected - FROM factoid - WHERE original_subject = ? - ORDER BY factoid_id DESC LIMIT 1 +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) AS ( + SELECT DISTINCT ON(lo.depth) lo.depth, factoid_id, subject, copula, predicate, author, modified_time, compose_macro, protected, original_subject, f.deleted, f.server, f.namespace + 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 protected FROM get_latest_factoid WHERE NOT deleted ORDER BY depth ASC, factoid_id DESC LIMIT 1; ", undef, + $namespace, $server, $subj, ) )[0]; @@ -685,18 +707,40 @@ sub _db_get_protect ($self, $subj, $server, $namespace) { return $prot; } -sub _db_get_fact ($self, $subj, $func, $namespace, $server) { +sub _db_get_fact ($self, $subj, $func, $server, $namespace) { # TODO write the recursive CTE for this my $dbh = $self->dbh; my $fact = $dbh->selectrow_hashref(" - SELECT factoid_id, subject, copula, predicate, author, modified_time, compose_macro, protected, original_subject - FROM factoid - WHERE original_subject = ? - ORDER BY factoid_id DESC - ", +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) AS ( + SELECT DISTINCT ON(lo.depth) lo.depth, factoid_id, subject, copula, predicate, author, modified_time, compose_macro, protected, original_subject, f.deleted, f.server, f.namespace + 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 WHERE NOT deleted ORDER BY depth ASC, factoid_id DESC LIMIT 1; + ", undef, + $namespace, $server, $subj, );