diff --git a/code/common/db/java/nu/marginalia/db/DbDomainQueries.java b/code/common/db/java/nu/marginalia/db/DbDomainQueries.java index 4533de5f..a3dfaf1f 100644 --- a/code/common/db/java/nu/marginalia/db/DbDomainQueries.java +++ b/code/common/db/java/nu/marginalia/db/DbDomainQueries.java @@ -8,17 +8,18 @@ import com.google.inject.Inject; import com.google.inject.Singleton; import com.zaxxer.hikari.HikariDataSource; import nu.marginalia.model.EdgeDomain; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.sql.SQLException; -import java.util.NoSuchElementException; -import java.util.Optional; -import java.util.OptionalInt; +import java.util.*; import java.util.concurrent.ExecutionException; @Singleton public class DbDomainQueries { private final HikariDataSource dataSource; + private static final Logger logger = LoggerFactory.getLogger(DbDomainQueries.class); private final Cache domainIdCache = CacheBuilder.newBuilder().maximumSize(10_000).build(); @Inject @@ -101,4 +102,28 @@ public class DbDomainQueries { throw new RuntimeException(ex); } } + + public List otherSubdomains(EdgeDomain domain, int cnt) { + List ret = new ArrayList<>(); + + try (var conn = dataSource.getConnection(); + var stmt = conn.prepareStatement("SELECT DOMAIN_NAME FROM EC_DOMAIN WHERE DOMAIN_TOP = ? LIMIT ?")) { + stmt.setString(1, domain.topDomain); + stmt.setInt(2, cnt); + + var rs = stmt.executeQuery(); + while (rs.next()) { + var sibling = new EdgeDomain(rs.getString(1)); + + if (sibling.equals(domain)) + continue; + + ret.add(sibling); + } + } catch (SQLException e) { + logger.error("Failed to get domain neighbors"); + } + + return ret; + } } diff --git a/code/services-application/search-service/java/nu/marginalia/search/svc/SearchSiteInfoService.java b/code/services-application/search-service/java/nu/marginalia/search/svc/SearchSiteInfoService.java index 8831aaaa..9db006cf 100644 --- a/code/services-application/search-service/java/nu/marginalia/search/svc/SearchSiteInfoService.java +++ b/code/services-application/search-service/java/nu/marginalia/search/svc/SearchSiteInfoService.java @@ -197,7 +197,6 @@ public class SearchSiteInfoService { var domain = new EdgeDomain(domainName); final int domainId = domainQueries.tryGetDomainId(domain).orElse(-1); - boolean viableAliasDomain = domain.aliasDomain().map(alias -> domainQueries.tryGetDomainId(alias).isPresent()).orElse(false); final Future domainInfoFuture; final Future> similarSetFuture; @@ -232,9 +231,10 @@ public class SearchSiteInfoService { url = sampleResults.getFirst().url.withPathAndParam("/", null).toString(); } + var result = new SiteInfoWithContext(domainName, isSubscribed, - viableAliasDomain ? domain.aliasDomain().map(EdgeDomain::toString) : Optional.empty(), + domainQueries.otherSubdomains(domain, 5), domainId, url, hasScreenshot, @@ -352,7 +352,7 @@ public class SearchSiteInfoService { public record SiteInfoWithContext(String domain, boolean isSubscribed, - Optional aliasDomain, + List siblingDomains, int domainId, String siteUrl, boolean hasScreenshot, diff --git a/code/services-application/search-service/resources/jte/siteinfo/view/overview.jte b/code/services-application/search-service/resources/jte/siteinfo/view/overview.jte index f8dd60d2..dfcb0266 100644 --- a/code/services-application/search-service/resources/jte/siteinfo/view/overview.jte +++ b/code/services-application/search-service/resources/jte/siteinfo/view/overview.jte @@ -1,3 +1,4 @@ +@import nu.marginalia.model.EdgeDomain @import nu.marginalia.search.svc.SearchSiteInfoService @import nu.marginalia.search.svc.SearchSiteInfoService.* @import nu.marginalia.search.model.UrlDetails @@ -20,11 +21,6 @@ Screenshot of ${siteInfo.domain()} - @elseif (siteInfo.aliasDomain().isPresent()) -
- The search engine is also aware of links to ${siteInfo.aliasDomain().get()}, - this may be the canonical address. -
@endif @if (siteInfo.hasFeed()) @@ -80,6 +76,30 @@ @endif + @if (!siteInfo.siblingDomains().isEmpty()) +
+ + Related Subdomains +
+ + + + + + + + + @for (EdgeDomain sibling : siteInfo.siblingDomains()) + + + + @endfor + +
Domain Name
+ ${sibling.toString()} +
+ @endif + @if (siteInfo.domainInformation().isUnknownDomain())
diff --git a/code/services-application/search-service/test/nu/marginalia/search/rendering/MockedSearchResults.java b/code/services-application/search-service/test/nu/marginalia/search/rendering/MockedSearchResults.java index d94b9766..9c65799f 100644 --- a/code/services-application/search-service/test/nu/marginalia/search/rendering/MockedSearchResults.java +++ b/code/services-application/search-service/test/nu/marginalia/search/rendering/MockedSearchResults.java @@ -18,7 +18,6 @@ import nu.marginalia.search.svc.SearchSiteInfoService; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; -import java.util.Optional; import java.util.concurrent.ThreadLocalRandom; public class MockedSearchResults { @@ -133,7 +132,9 @@ public class MockedSearchResults { return new SearchSiteInfoService.SiteInfoWithContext( "www.example.com", false, - Optional.of("other.example.com"), + List.of(new EdgeDomain("example.com"), + new EdgeDomain("about.example.com") + ), 14, "https://www.example.com", true,