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 @@ -359,13 +364,10 @@ public static Map<String, SortConfiguration> getSortConfigurations(VitroRequest
}
String field = searchFieldNode == null ? "" : searchFieldNode.toString();
String id = idNode == null ? "" : idNode.toString();
String label = solution.get("label").toString();
String label = solution.get("label").asLiteral().getLexicalForm();

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,52 @@
vitro-search:public true .

:sort_title_desc a vitro-search:Sort ;
vitro-search:order 20 ;
vitro-search:sortField :field_label_sort ;
vitro-search:isAscending false ;
vitro-search:hasFallback :sort_name_raw_desc ;
vitro-search:order 30 ;
vitro-search:sortField :field_label_sort ;
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:order 30 ;
vitro-search:hasFallback :sort_name_raw_asc ;
vitro-search:order 20 ;
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 50 ;
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 40 ;
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:order 60 ;
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,4 @@
:field_type rdfs:label "Typ"@de-DE .
:filter_querytext rdfs:label "Text"@de-DE .
:field_querytext rdfs:label "Standardfeld"@de-DE .
:field_score rdfs:label "Relevanzfeld"@de-DE .
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@
:field_type rdfs:label "Type"@en-CA .
:filter_querytext rdfs:label "Text"@en-CA .
:field_querytext rdfs:label "Default field"@en-CA .
:field_score rdfs:label "Score"@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 "Label without language tag in descending order"@en-US .
:sort_name_raw_asc rdfs:label "Label without language tag in ascending order"@en-US .
:field_score rdfs:label "Score"@en-US .
:field_name_raw rdfs:label "Label without language tag"@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 "Etiqueta sin etiqueta de idioma en orden descendente"@es .
:sort_name_raw_asc rdfs:label "Etiqueta sin etiqueta de idioma en orden ascendente"@es .
:field_score rdfs:label "Campo de relevancia"@es .
:field_name_raw rdfs:label "Etiqueta sin etiqueta de idioma"@es .
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@
:field_type rdfs:label "Taper"@fr-CA .
:filter_querytext rdfs:label "Texte"@fr-CA .
:field_querytext rdfs:label "Champ par défaut"@fr-CA .
:field_score rdfs:label "Champ de pertinence"@fr-CA .
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@
:field_type rdfs:label "Tipo"@pt-BR .
:filter_querytext rdfs:label "Texto"@pt-BR .
:field_querytext rdfs:label "Campo padrão"@pt-BR .
:field_score rdfs:label "Campo de relevância"@pt-BR .
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@
:field_type rdfs:label "Поле тип"@ru-RU .
:filter_querytext rdfs:label "Текст"@ru-RU .
:field_querytext rdfs:label "Поле фильтра по умолчанию"@ru-RU .
:field_score rdfs:label "Релевантность"@ru-RU .
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@
: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 .
:field_score rdfs:label "Polje za relevantnost"@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