From d21b144a17890d8d98c2e9f1f1c0e29d70c03b7c Mon Sep 17 00:00:00 2001 From: labkey-matthewb Date: Fri, 7 Nov 2025 11:18:53 -0800 Subject: [PATCH 1/4] Why do we support multiple search string? --- .../org/labkey/search/SearchController.java | 48 +++++++++++-------- search/src/org/labkey/search/view/search.jsp | 6 +-- 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/search/src/org/labkey/search/SearchController.java b/search/src/org/labkey/search/SearchController.java index d5ad92ba94d..20036ac9877 100644 --- a/search/src/org/labkey/search/SearchController.java +++ b/search/src/org/labkey/search/SearchController.java @@ -29,6 +29,7 @@ import org.labkey.api.action.ExportAction; import org.labkey.api.action.FormHandlerAction; import org.labkey.api.action.FormViewAction; +import org.labkey.api.action.HasBindParameters; import org.labkey.api.action.ReadOnlyApiAction; import org.labkey.api.action.ReturnUrlForm; import org.labkey.api.action.SimpleRedirectAction; @@ -52,7 +53,6 @@ import org.labkey.api.security.permissions.ApplicationAdminPermission; import org.labkey.api.security.permissions.ReadPermission; import org.labkey.api.settings.LookAndFeelProperties; -import org.labkey.api.util.ConfigurationException; import org.labkey.api.util.ExceptionUtil; import org.labkey.api.util.HtmlString; import org.labkey.api.util.HtmlStringBuilder; @@ -77,6 +77,8 @@ import org.labkey.search.model.IndexInspector; import org.labkey.search.model.LuceneDirectoryType; import org.labkey.search.model.SearchPropertyManager; +import org.springframework.beans.MutablePropertyValues; +import org.springframework.beans.PropertyValues; import org.springframework.validation.BindException; import org.springframework.validation.Errors; import org.springframework.web.servlet.ModelAndView; @@ -91,6 +93,8 @@ import java.util.Objects; import java.util.concurrent.TimeUnit; +import static org.labkey.api.action.BaseViewAction.springBindParameters; + public class SearchController extends SpringActionController { private static final DefaultActionResolver _actionResolver = new DefaultActionResolver(SearchController.class); @@ -384,7 +388,7 @@ public void addNavTrail(NavTree root) @AdminConsoleAction - public class IndexContentsAction extends SimpleViewAction + public static class IndexContentsAction extends SimpleViewAction { @Override public ModelAndView getView(Object o, BindException errors) @@ -430,7 +434,7 @@ public void export(ExportForm form, HttpServletResponse response, BindException /** for selenium testing */ @RequiresSiteAdmin - public class WaitForIdleAction extends SimpleRedirectAction + public static class WaitForIdleAction extends SimpleRedirectAction { @Override public URLHelper getRedirectURL(Object o) throws Exception @@ -569,7 +573,7 @@ public ApiResponse execute(SearchForm form, BindException errors) final Path contextPath = Path.parse(getViewContext().getContextPath()); - final String query = form.getQueryString() + final String query = form.getQ() .replaceAll("(? fields) { _fields = fields; } + + @Override + public @NotNull BindException bindParameters(PropertyValues m) + { + MutablePropertyValues mpvs = new MutablePropertyValues(m); + var q = mpvs.getPropertyValue("q"); + if (null != q && q.getValue() instanceof String[] arr) + { + mpvs.removePropertyValue("q"); + mpvs.addPropertyValue("q", StringUtils.join(arr," ")); + } + return springBindParameters(this, "form", mpvs); + } } @@ -1099,7 +1109,7 @@ protected void audit(SearchForm form) ViewContext ctx = getViewContext(); String comment = form.getComment(); - audit(ctx.getUser(), ctx.getContainer(), form.getQueryString(), comment); + audit(ctx.getUser(), ctx.getContainer(), form.getQ(), comment); } diff --git a/search/src/org/labkey/search/view/search.jsp b/search/src/org/labkey/search/view/search.jsp index 3fd522f86e3..b17c876ad09 100644 --- a/search/src/org/labkey/search/view/search.jsp +++ b/search/src/org/labkey/search/view/search.jsp @@ -224,13 +224,11 @@ Path contextPath = Path.parse(ctx.getContextPath()); SearchService ss = SearchService.get(); - List q = new ArrayList<>(Arrays.asList(form.getQ())); - String value = StringUtils.trim(StringUtils.join(q, " ")); SearchResultTemplate template = form.getSearchResultTemplate(); SearchScope scope = (null == template.getSearchScope() ? form.getSearchScope() : template.getSearchScope()); String categories = (null == template.getCategories() ? form.getCategory() : template.getCategories()); Set selectedCategories = categories == null ? Collections.emptySet() : new CaseInsensitiveHashSet(categories.split("\\+")); - String queryString = form.getQueryString(); + String queryString = form.getQ(); String sortField = form.getSortField(); boolean invertSort = form.isInvertSort(); @@ -293,7 +291,7 @@ >
- " formGroup="false" value="<%=value%>"/> + " formGroup="false" value="<%=queryString%>"/> <% if (showAdvancedUI) { %> From fe60dabec1ea67592f17f0fd75577f706802a4ef Mon Sep 17 00:00:00 2001 From: labkey-matthewb Date: Fri, 7 Nov 2025 13:33:44 -0800 Subject: [PATCH 2/4] fix for renderSelectFormInputFromFk() --- api/src/org/labkey/api/data/DataColumn.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/api/src/org/labkey/api/data/DataColumn.java b/api/src/org/labkey/api/data/DataColumn.java index 9bca27b3d70..642777aee85 100644 --- a/api/src/org/labkey/api/data/DataColumn.java +++ b/api/src/org/labkey/api/data/DataColumn.java @@ -712,10 +712,7 @@ else if (_inputType.equalsIgnoreCase("checkbox")) { IPropertyValidator textChoiceValidator = PropertyService.get().getValidatorForColumn(_boundColumn, PropertyValidatorType.TextChoice); if (textChoiceValidator != null) - { - List strVals = StringUtils.isEmpty(strVal) ? List.of() : List.of(strVal); - renderTextChoiceFormInput(out, formFieldName, value, strVals, disabledInput, textChoiceValidator); - } + renderTextChoiceFormInput(out, formFieldName, value, toListForRender(strVal), disabledInput, textChoiceValidator); else renderTextFormInput(out, formFieldName, value, strVal, disabledInput); } @@ -812,10 +809,21 @@ protected void renderSelectFormInputFromFk(RenderContext ctx, HtmlWriter out, St } else { - renderSelectFormInput(out, formFieldName, value, List.of(Objects.toString(value)), disabledInput, entryList); + renderSelectFormInput(out, formFieldName, value, toListForRender(value), disabledInput, entryList); } } + List toListForRender(Object value) + { + if (null == value || value instanceof String) + return StringUtils.isEmpty((String) value) ? List.of() : List.of((String)value); + if (value instanceof MultiChoice.Array arr) + return arr; + if (value instanceof List l) + return l.stream().map(o -> Objects.toString(o, null)).toList(); + return List.of(Objects.toString(value)); + } + protected void renderFileFormInput(HtmlWriter out, String formFieldName, Object value, String strVal, boolean disabledInput) { var input = InputBuilder.file() From 9c2a5538653e1fa8637f70450dd10d050c4c57dd Mon Sep 17 00:00:00 2001 From: labkey-matthewb Date: Sat, 8 Nov 2025 11:55:58 -0800 Subject: [PATCH 3/4] remove unrelated change --- .../org/labkey/search/SearchController.java | 48 ++++++++----------- 1 file changed, 19 insertions(+), 29 deletions(-) diff --git a/search/src/org/labkey/search/SearchController.java b/search/src/org/labkey/search/SearchController.java index 20036ac9877..d5ad92ba94d 100644 --- a/search/src/org/labkey/search/SearchController.java +++ b/search/src/org/labkey/search/SearchController.java @@ -29,7 +29,6 @@ import org.labkey.api.action.ExportAction; import org.labkey.api.action.FormHandlerAction; import org.labkey.api.action.FormViewAction; -import org.labkey.api.action.HasBindParameters; import org.labkey.api.action.ReadOnlyApiAction; import org.labkey.api.action.ReturnUrlForm; import org.labkey.api.action.SimpleRedirectAction; @@ -53,6 +52,7 @@ import org.labkey.api.security.permissions.ApplicationAdminPermission; import org.labkey.api.security.permissions.ReadPermission; import org.labkey.api.settings.LookAndFeelProperties; +import org.labkey.api.util.ConfigurationException; import org.labkey.api.util.ExceptionUtil; import org.labkey.api.util.HtmlString; import org.labkey.api.util.HtmlStringBuilder; @@ -77,8 +77,6 @@ import org.labkey.search.model.IndexInspector; import org.labkey.search.model.LuceneDirectoryType; import org.labkey.search.model.SearchPropertyManager; -import org.springframework.beans.MutablePropertyValues; -import org.springframework.beans.PropertyValues; import org.springframework.validation.BindException; import org.springframework.validation.Errors; import org.springframework.web.servlet.ModelAndView; @@ -93,8 +91,6 @@ import java.util.Objects; import java.util.concurrent.TimeUnit; -import static org.labkey.api.action.BaseViewAction.springBindParameters; - public class SearchController extends SpringActionController { private static final DefaultActionResolver _actionResolver = new DefaultActionResolver(SearchController.class); @@ -388,7 +384,7 @@ public void addNavTrail(NavTree root) @AdminConsoleAction - public static class IndexContentsAction extends SimpleViewAction + public class IndexContentsAction extends SimpleViewAction { @Override public ModelAndView getView(Object o, BindException errors) @@ -434,7 +430,7 @@ public void export(ExportForm form, HttpServletResponse response, BindException /** for selenium testing */ @RequiresSiteAdmin - public static class WaitForIdleAction extends SimpleRedirectAction + public class WaitForIdleAction extends SimpleRedirectAction { @Override public URLHelper getRedirectURL(Object o) throws Exception @@ -573,7 +569,7 @@ public ApiResponse execute(SearchForm form, BindException errors) final Path contextPath = Path.parse(getViewContext().getContextPath()); - final String query = form.getQ() + final String query = form.getQueryString() .replaceAll("(? fields) { _fields = fields; } - - @Override - public @NotNull BindException bindParameters(PropertyValues m) - { - MutablePropertyValues mpvs = new MutablePropertyValues(m); - var q = mpvs.getPropertyValue("q"); - if (null != q && q.getValue() instanceof String[] arr) - { - mpvs.removePropertyValue("q"); - mpvs.addPropertyValue("q", StringUtils.join(arr," ")); - } - return springBindParameters(this, "form", mpvs); - } } @@ -1109,7 +1099,7 @@ protected void audit(SearchForm form) ViewContext ctx = getViewContext(); String comment = form.getComment(); - audit(ctx.getUser(), ctx.getContainer(), form.getQ(), comment); + audit(ctx.getUser(), ctx.getContainer(), form.getQueryString(), comment); } From 6846450065cc33ecf68f2df7cde2417e3ef1b56d Mon Sep 17 00:00:00 2001 From: labkey-matthewb Date: Sat, 8 Nov 2025 13:36:30 -0800 Subject: [PATCH 4/4] remove unrelated change --- search/src/org/labkey/search/view/search.jsp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/search/src/org/labkey/search/view/search.jsp b/search/src/org/labkey/search/view/search.jsp index b17c876ad09..3fd522f86e3 100644 --- a/search/src/org/labkey/search/view/search.jsp +++ b/search/src/org/labkey/search/view/search.jsp @@ -224,11 +224,13 @@ Path contextPath = Path.parse(ctx.getContextPath()); SearchService ss = SearchService.get(); + List q = new ArrayList<>(Arrays.asList(form.getQ())); + String value = StringUtils.trim(StringUtils.join(q, " ")); SearchResultTemplate template = form.getSearchResultTemplate(); SearchScope scope = (null == template.getSearchScope() ? form.getSearchScope() : template.getSearchScope()); String categories = (null == template.getCategories() ? form.getCategory() : template.getCategories()); Set selectedCategories = categories == null ? Collections.emptySet() : new CaseInsensitiveHashSet(categories.split("\\+")); - String queryString = form.getQ(); + String queryString = form.getQueryString(); String sortField = form.getSortField(); boolean invertSort = form.isInvertSort(); @@ -291,7 +293,7 @@ >
- " formGroup="false" value="<%=queryString%>"/> + " formGroup="false" value="<%=value%>"/> <% if (showAdvancedUI) { %>