Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added search results sort fallback #456

Merged
merged 10 commits into from
May 30, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -465,27 +466,39 @@ private void addSortRules(VitroRequest vreq, SearchQuery query, Map<String, Sort
if (sortOptions.isEmpty()) {
return;
}
Set<String> appliedSortOptions = new HashSet<String>();
if (!StringUtils.isBlank(sortType) && sortOptions.containsKey(sortType)) {
SortConfiguration conf = sortOptions.get(sortType);
String field = conf.getField(vreq.getLocale());
if (!StringUtils.isBlank(field)) {
query.addSortField(field, conf.getSortOrder());
}
addSortField(vreq, query, conf, sortOptions, appliedSortOptions);
conf.setSelected(true);
return;
}
boolean textQueryIsEmpty = StringUtils.isBlank(getQueryText(vreq));
// If text field is empty, apply the first sort option
if (textQueryIsEmpty) {
SortConfiguration conf = sortOptions.entrySet().iterator().next().getValue();
String field = conf.getField(vreq.getLocale());
if (!StringUtils.isBlank(field)) {
query.addSortField(field, conf.getSortOrder());
}
addSortField(vreq, query, conf, sortOptions, appliedSortOptions);
}
// If text field is not empty, sort by relevance (no need to add sort field)
}

private void addSortField(VitroRequest vreq, SearchQuery query, SortConfiguration conf,
Map<String, SortConfiguration> sortOptions, Set<String> appliedSortOptions) {
if (conf == null || appliedSortOptions.contains(conf.getId())) {
return;
}
appliedSortOptions.add(conf.getId());
String field = conf.getField(vreq.getLocale());
if (StringUtils.isBlank(field)) {
log.error(String.format("Sort field is not set for '%s'", conf.getId()));
return;
}
query.addSortField(field, conf.getSortOrder());
if (sortOptions.containsKey(conf.getFallback())) {
addSortField(vreq, query, sortOptions.get(conf.getFallback()), sortOptions, appliedSortOptions);
}
}

private String getSortType(VitroRequest vreq) {
return vreq.getParameter(PARAM_QUERY_SORT_BY);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,8 @@ public class SearchFiltering {
+ "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
+ "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n"
+ "PREFIX search: <https://vivoweb.org/ontology/vitro-search#> \n"
+ "SELECT ( STR(?sort_label) as ?label ) ?id ?searchField ?multilingual ?isAsc ?sort_order \n"
+ "SELECT ( STR(?sort_label) as ?label ) ?id ?searchField " +
"?multilingual ?isAsc ?sort_order ?fallback ?display\n"
+ "WHERE {\n"
+ " ?sort rdf:type search:Sort . \n"
+ " ?sort rdfs:label ?sort_label .\n"
Expand All @@ -142,10 +143,14 @@ public class SearchFiltering {
+ " ?sort search:isAscending ?f_ord .\n"
+ " BIND(?f_ord as ?f_order) .\n"
+ " }\n"
+ " OPTIONAL {\n"
+ " ?sort search:hasFallback/search:id ?fallback .\n"
+ " }\n"
+ " OPTIONAL{ "
+ " ?sort search:order ?s_order .\n"
+ " BIND(?s_order as ?sort_order_found).\n"
+ " }\n"
+ " OPTIONAL {?sort search:display ?display }\n"
+ " BIND(coalesce(?sort_order_found, 0) as ?sort_order)\n"
+ " BIND(COALESCE(?f_order, false) as ?isAsc)\n"
+ " BIND(COALESCE(?bind_multilingual, false) as ?multilingual)\n"
Expand Down Expand Up @@ -361,11 +366,8 @@ public static Map<String, SortConfiguration> getSortConfigurations(VitroRequest
String id = idNode == null ? "" : idNode.toString();
String label = solution.get("label").toString();

SortConfiguration config = null;
if (sortConfigurations.containsKey(id)) {
config = sortConfigurations.get(id);
} else {
config = new SortConfiguration(id, label, field);
if (!sortConfigurations.containsKey(id)) {
SortConfiguration config = new SortConfiguration(id, label, field);

RDFNode multilingual = solution.get("multilingual");
if (multilingual != null) {
Expand All @@ -375,11 +377,18 @@ public static Map<String, SortConfiguration> getSortConfigurations(VitroRequest
if (isAsc != null) {
config.setAscOrder(isAsc.asLiteral().getBoolean());
}

RDFNode fallback = solution.get("fallback");
if (fallback != null && fallback.isLiteral()) {
config.setFallback(fallback.asLiteral().toString());
}
RDFNode order = solution.get("sort_order");
if (order != null) {
config.setOrder(order.asLiteral().getInt());
}
RDFNode display = solution.get("display");
if (display != null) {
config.setDisplay(display.asLiteral().getBoolean());
}
sortConfigurations.put(id, config);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ public class SortConfiguration {
private boolean selected = false;
private String label = "";
private int order = 0;
private String fallback;
private boolean display = false;

public SortConfiguration(String id, String label, String field) {
this.id = id;
Expand Down Expand Up @@ -87,4 +89,19 @@ public void setOrder(int order) {
this.order = order;
}

public String getFallback() {
return fallback;
}

public void setFallback(String id) {
this.fallback = id;
}

public void setDisplay(boolean display) {
this.display = display;
}

public boolean isDisplay() {
return display;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,25 +33,51 @@
vitro-search:public true .

:sort_title_desc a vitro-search:Sort ;
vitro-search:isAscending false ;
vitro-search:hasFallback :sort_name_raw_desc ;
vitro-search:order 20 ;
vitro-search:sortField :field_label_sort ;
vitro-search:isAscending false ;
vitro-search:display true ;
vitro-search:id "titledesc" .

:sort_title_asc a vitro-search:Sort ;
vitro-search:sortField :field_label_sort ;
:sort_title_asc a vitro-search:Sort ;
vitro-search:isAscending true ;
vitro-search:hasFallback :sort_name_raw_asc ;
vitro-search:order 30 ;
vitro-search:sortField :field_label_sort ;
vitro-search:display true ;
vitro-search:id "titleasc" .

:sort_name_raw_desc a vitro-search:Sort ;
vitro-search:isAscending false ;
vitro-search:order 40 ;
vitro-search:sortField :field_name_raw ;
vitro-search:id "name_raw_desc" .

:sort_name_raw_asc a vitro-search:Sort ;
vitro-search:isAscending true ;
vitro-search:order 50 ;
vitro-search:sortField :field_name_raw ;
vitro-search:id "name_raw_asc" .

:sort_by_relevance a vitro-search:Sort ;
vitro-search:sortField :field_score ;
vitro-search:display true ;
vitro-search:id "relevance" .

:field_score
a vitro-search:SearchField ;
vitro-search:indexField "score" .

:field_label_sort
a vitro-search:SearchField ;
vitro-search:isLanguageSpecific true ;
vitro-search:indexField "_label_sort" .

:field_name_raw
a vitro-search:SearchField ;
vitro-search:indexField "nameRaw" .

:field_category
a vitro-search:SearchField ;
vitro-search:indexField "classgroup" .
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,7 @@
:field_type rdfs:label "Typ"@de-DE .
:filter_querytext rdfs:label "Text"@de-DE .
:field_querytext rdfs:label "Standardfeld"@de-DE .
:sort_name_raw_desc rdfs:label "Roher Titel Z-A"@de-DE .
litvinovg marked this conversation as resolved.
Show resolved Hide resolved
:sort_name_raw_asc rdfs:label "Roher Titel A-Z"@de-DE .
chenejac marked this conversation as resolved.
Show resolved Hide resolved
litvinovg marked this conversation as resolved.
Show resolved Hide resolved
:field_score rdfs:label "Relevanzfeld"@de-DE .
:field_name_raw rdfs:label "Rohes Titelfeld"@de-DE .
chenejac marked this conversation as resolved.
Show resolved Hide resolved
litvinovg marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,7 @@
:field_type rdfs:label "Type"@en-CA .
:filter_querytext rdfs:label "Text"@en-CA .
:field_querytext rdfs:label "Default field"@en-CA .
:sort_name_raw_desc rdfs:label "Raw title Z-A"@en-CA .
:sort_name_raw_asc rdfs:label "Raw title A-Z"@en-CA .
:field_score rdfs:label "Score"@en-CA .
:field_name_raw rdfs:label "Raw name field"@en-CA .
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,8 @@
:field_type rdfs:label "Type"@en-US .
:filter_querytext rdfs:label "Text"@en-US .
:field_querytext rdfs:label "Default field"@en-US .
:sort_name_raw_desc rdfs:label "Raw title Z-A"@en-US .
:sort_name_raw_asc rdfs:label "Raw title A-Z"@en-US .
:field_score rdfs:label "Score"@en-US .
:field_name_raw rdfs:label "Raw name field"@en-US .

Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,4 @@ search:hasKnownValue rdfs:label "hasKnownValue"@en-US .
search:public rdfs:label "public"@en-US .
search:isDefaultForRole rdfs:label "Is default for role"@en-US .
search:moreLimit rdfs:label "initial facet limit"@en-US .
search:hasFallback rdfs:label "has fallback"@en-US .
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,7 @@
:field_type rdfs:label "Tipo"@es .
:filter_querytext rdfs:label "Texto"@es .
:field_querytext rdfs:label "Campo predeterminado"@es .
:sort_name_raw_desc rdfs:label "Título bruto Z-A"@es .
:sort_name_raw_asc rdfs:label "Título bruto A-Z"@es .
:field_score rdfs:label "Campo de relevancia"@es .
:field_name_raw rdfs:label "Campo de título sin formato"@es .
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,7 @@
:field_type rdfs:label "Taper"@fr-CA .
:filter_querytext rdfs:label "Texte"@fr-CA .
:field_querytext rdfs:label "Champ par défaut"@fr-CA .
:sort_name_raw_desc rdfs:label "Titre brut Z-A"@fr-CA .
:sort_name_raw_asc rdfs:label "Titre brut A-Z"@fr-CA .
:field_score rdfs:label "Champ de pertinence"@fr-CA .
:field_name_raw rdfs:label "Champ de nom brut"@fr-CA .
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,7 @@
:field_type rdfs:label "Tipo"@pt-BR .
:filter_querytext rdfs:label "Texto"@pt-BR .
:field_querytext rdfs:label "Campo padrão"@pt-BR .
:sort_name_raw_desc rdfs:label "Título bruto Z-A"@pt-BR .
:sort_name_raw_asc rdfs:label "Título bruto A-Z"@pt-BR .
:field_score rdfs:label "Campo de relevância"@pt-BR .
:field_name_raw rdfs:label "Campo de título bruto"@pt-BR .
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,7 @@
:field_type rdfs:label "Поле тип"@ru-RU .
:filter_querytext rdfs:label "Текст"@ru-RU .
:field_querytext rdfs:label "Поле фильтра по умолчанию"@ru-RU .
:sort_name_raw_desc rdfs:label "сырому названию Я-А"@ru-RU .
:sort_name_raw_asc rdfs:label "сырому названию А-Я"@ru-RU .
:field_score rdfs:label "Релевантность"@ru-RU .
:field_name_raw rdfs:label "Поле сортировки по сырому названию"@ru-RU .
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,7 @@
:field_type rdfs:label "Tip"@sr-Latn-RS .
:filter_querytext rdfs:label "Tekst"@sr-Latn-RS .
:field_querytext rdfs:label "Podrazumevano polje"@sr-Latn-RS .
:sort_name_raw_desc rdfs:label "neobrađen Naslov Z-A"@sr-Latn-RS .
:sort_name_raw_asc rdfs:label "neobrađen Naslov A-Z"@sr-Latn-RS .
:field_score rdfs:label "Polje za relevantnost"@sr-Latn-RS .
:field_name_raw rdfs:label "Neobrađeno polje imena"@sr-Latn-RS .
8 changes: 8 additions & 0 deletions home/src/main/resources/rdf/tbox/filegraph/search_ontology.n3
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,10 @@ search:sortField a owl:FunctionalProperty , owl:ObjectPropert
rdfs:domain search:Sort ;
rdfs:range search:SearchField .

search:hasFallback a owl:FunctionalProperty , owl:ObjectProperty ;
rdfs:domain search:Sort ;
rdfs:range search:Sort .

search:id a owl:DatatypeProperty , owl:FunctionalProperty ;
rdfs:domain search:PublicParameter ;
rdfs:range xsd:string .
Expand All @@ -130,6 +134,10 @@ search:public a owl:DatatypeProperty , owl:FunctionalPrope
rdfs:domain search:PublicParameter ;
rdfs:range xsd:boolean .

search:display a owl:DatatypeProperty , owl:FunctionalProperty ;
rdfs:domain search:Sort ;
rdfs:range xsd:boolean .

search:isDefaultForRole
a <http://www.w3.org/2002/07/owl#ObjectProperty> ;
rdfs:domain <https://vivoweb.org/ontology/vitro-search#FilterValue> ;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -269,11 +269,13 @@ ${headScripts.add('<script type="text/javascript" src="${urls.base}/js/bootstrap
<select form="search-form" name="sort" id="search-form-sort" onchange="this.form.submit()" >
<#assign addDefaultOption = true>
<#list sorting as option>
<#if option.selected>
<option value="${option.id}" selected="selected">${i18n().search_results_sort_by(option.label)}</option>
<#assign addDefaultOption = false>
<#else>
<option value="${option.id}" >${i18n().search_results_sort_by(option.label)}</option>
<#if option.display>
<#if option.selected>
<option value="${option.id}" selected="selected">${i18n().search_results_sort_by(option.label)}</option>
<#assign addDefaultOption = false>
<#else>
<option value="${option.id}" >${i18n().search_results_sort_by(option.label)}</option>
</#if>
</#if>
</#list>
<#if addDefaultOption>
Expand Down