From 2ff64c3c12856ec053f28fd5a91fed3bfc3ee713 Mon Sep 17 00:00:00 2001 From: Viktor Lofgren Date: Mon, 27 Nov 2023 18:06:19 +0100 Subject: [PATCH] (search) New toggle for reducing tracking --- .../search/SearchQueryParamFactory.java | 1 + .../search/command/SearchAdtechParameter.java | 29 ++++++++++++++++++ .../search/command/SearchParameters.java | 19 ++++++++---- .../search/model/SearchFilters.java | 30 +++++++++++++++++++ .../search/svc/SearchQueryService.java | 4 ++- .../templates/search/parts/search-filters.hdb | 3 ++ 6 files changed, 80 insertions(+), 6 deletions(-) create mode 100644 code/services-application/search-service/src/main/java/nu/marginalia/search/command/SearchAdtechParameter.java diff --git a/code/services-application/search-service/src/main/java/nu/marginalia/search/SearchQueryParamFactory.java b/code/services-application/search-service/src/main/java/nu/marginalia/search/SearchQueryParamFactory.java index 4a4721a7..fc35ae79 100644 --- a/code/services-application/search-service/src/main/java/nu/marginalia/search/SearchQueryParamFactory.java +++ b/code/services-application/search-service/src/main/java/nu/marginalia/search/SearchQueryParamFactory.java @@ -16,6 +16,7 @@ public class SearchQueryParamFactory { var profile = userParams.profile(); profile.addTacitTerms(prototype); userParams.js().addTacitTerms(prototype); + userParams.adtech().addTacitTerms(prototype); return new QueryParams( userParams.query(), diff --git a/code/services-application/search-service/src/main/java/nu/marginalia/search/command/SearchAdtechParameter.java b/code/services-application/search-service/src/main/java/nu/marginalia/search/command/SearchAdtechParameter.java new file mode 100644 index 00000000..0551533e --- /dev/null +++ b/code/services-application/search-service/src/main/java/nu/marginalia/search/command/SearchAdtechParameter.java @@ -0,0 +1,29 @@ +package nu.marginalia.search.command; + +import nu.marginalia.index.client.model.query.SearchSubquery; + +import javax.annotation.Nullable; +import java.util.Arrays; + +public enum SearchAdtechParameter { + DEFAULT("default"), + REDUCE("reduce", "special:ads", "special:affiliate"); + + public final String value; + public final String[] implictExcludeSearchTerms; + + SearchAdtechParameter(String value, String... implictExcludeSearchTerms) { + this.value = value; + this.implictExcludeSearchTerms = implictExcludeSearchTerms; + } + + public static SearchAdtechParameter parse(@Nullable String value) { + if (REDUCE.value.equals(value)) return REDUCE; + + return DEFAULT; + } + + public void addTacitTerms(SearchSubquery subquery) { + subquery.searchTermsExclude.addAll(Arrays.asList(implictExcludeSearchTerms)); + } +} diff --git a/code/services-application/search-service/src/main/java/nu/marginalia/search/command/SearchParameters.java b/code/services-application/search-service/src/main/java/nu/marginalia/search/command/SearchParameters.java index dfb02291..3f45f1b1 100644 --- a/code/services-application/search-service/src/main/java/nu/marginalia/search/command/SearchParameters.java +++ b/code/services-application/search-service/src/main/java/nu/marginalia/search/command/SearchParameters.java @@ -6,24 +6,33 @@ import nu.marginalia.search.model.SearchProfile; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; -public record SearchParameters(String query, SearchProfile profile, SearchJsParameter js) { +public record SearchParameters(String query, + SearchProfile profile, + SearchJsParameter js, + SearchAdtechParameter adtech + ) { public String profileStr() { return profile.filterId; } public SearchParameters withProfile(SearchProfile profile) { - return new SearchParameters(query, profile, js); + return new SearchParameters(query, profile, js, adtech); } public SearchParameters withJs(SearchJsParameter js) { - return new SearchParameters(query, profile, js); + return new SearchParameters(query, profile, js, adtech); + } + public SearchParameters withAdtech(SearchAdtechParameter adtech) { + return new SearchParameters(query, profile, js, adtech); } public String renderUrl(WebsiteUrl baseUrl) { - String path = String.format("/search?query=%s&profile=%s&js=%s", + String path = String.format("/search?query=%s&profile=%s&js=%s&adtech=%s", URLEncoder.encode(query, StandardCharsets.UTF_8), URLEncoder.encode(profile.filterId, StandardCharsets.UTF_8), - URLEncoder.encode(js.value, StandardCharsets.UTF_8)); + URLEncoder.encode(js.value, StandardCharsets.UTF_8), + URLEncoder.encode(adtech.value, StandardCharsets.UTF_8) + ); return baseUrl.withPath(path); } diff --git a/code/services-application/search-service/src/main/java/nu/marginalia/search/model/SearchFilters.java b/code/services-application/search-service/src/main/java/nu/marginalia/search/model/SearchFilters.java index b9b73261..0ce79b31 100644 --- a/code/services-application/search-service/src/main/java/nu/marginalia/search/model/SearchFilters.java +++ b/code/services-application/search-service/src/main/java/nu/marginalia/search/model/SearchFilters.java @@ -2,8 +2,10 @@ package nu.marginalia.search.model; import lombok.Getter; import nu.marginalia.WebsiteUrl; +import nu.marginalia.search.command.SearchAdtechParameter; import nu.marginalia.search.command.SearchJsParameter; import nu.marginalia.search.command.SearchParameters; +import org.apache.regexp.RE; import java.util.List; @@ -18,6 +20,8 @@ public class SearchFilters { @Getter public final RemoveJsOption removeJsOption; @Getter + public final ReduceAdtechOption reduceAdtechOption; + @Getter public final List> filterGroups; @@ -26,6 +30,7 @@ public class SearchFilters { this.url = url; removeJsOption = new RemoveJsOption(parameters); + reduceAdtechOption = new ReduceAdtechOption(parameters); currentFilter = parameters.profile().filterId; @@ -78,6 +83,31 @@ public class SearchFilters { this.url = parameters.withJs(toggledValue).renderUrl(SearchFilters.this.url); } } + public class ReduceAdtechOption { + private final SearchAdtechParameter value; + + @Getter + public final String url; + + public boolean isSet() { + return value.equals(SearchAdtechParameter.REDUCE); + } + + public String name() { + return "Reduce Adtech"; + } + + public ReduceAdtechOption(SearchParameters parameters) { + this.value = parameters.adtech(); + + var toggledValue = switch (parameters.adtech()) { + case REDUCE -> SearchAdtechParameter.DEFAULT; + default -> SearchAdtechParameter.REDUCE; + }; + + this.url = parameters.withAdtech(toggledValue).renderUrl(SearchFilters.this.url); + } + } public class Filter { @Getter diff --git a/code/services-application/search-service/src/main/java/nu/marginalia/search/svc/SearchQueryService.java b/code/services-application/search-service/src/main/java/nu/marginalia/search/svc/SearchQueryService.java index 241b91be..c23d5ae9 100644 --- a/code/services-application/search-service/src/main/java/nu/marginalia/search/svc/SearchQueryService.java +++ b/code/services-application/search-service/src/main/java/nu/marginalia/search/svc/SearchQueryService.java @@ -3,6 +3,7 @@ package nu.marginalia.search.svc; import com.google.inject.Inject; import lombok.SneakyThrows; import nu.marginalia.WebsiteUrl; +import nu.marginalia.search.command.SearchAdtechParameter; import nu.marginalia.search.model.SearchProfile; import nu.marginalia.client.Context; import nu.marginalia.search.command.CommandEvaluator; @@ -59,6 +60,7 @@ public class SearchQueryService { return new SearchParameters(queryParam.trim(), SearchProfile.getSearchProfile(request.queryParams("profile")), - SearchJsParameter.parse(request.queryParams("js"))); + SearchJsParameter.parse(request.queryParams("js")), + SearchAdtechParameter.parse(request.queryParams("adtech"))); } } diff --git a/code/services-application/search-service/src/main/resources/templates/search/parts/search-filters.hdb b/code/services-application/search-service/src/main/resources/templates/search/parts/search-filters.hdb index f8d21b93..06c7d5f2 100644 --- a/code/services-application/search-service/src/main/resources/templates/search/parts/search-filters.hdb +++ b/code/services-application/search-service/src/main/resources/templates/search/parts/search-filters.hdb @@ -3,6 +3,9 @@ {{#with removeJsOption}}
  • {{name}}
  • {{/with}} + {{#with reduceAdtechOption}} +
  • {{name}}
  • + {{/with}}

    Domains