This is an automated email from the ASF dual-hosted git repository.
epugh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/main by this push:
new 0006fe3c14c SOLR-18109: move SolrPluginUtils debug methods to
DebugComponent (#4779)
0006fe3c14c is described below
commit 0006fe3c14cf3c926e5c607de5d219979a026f05
Author: Serhiy Bzhezytskyy <[email protected]>
AuthorDate: Mon Aug 24 20:25:39 2026 +0300
SOLR-18109: move SolrPluginUtils debug methods to DebugComponent (#4779)
---
.../apache/solr/handler/MoreLikeThisHandler.java | 5 +-
.../solr/handler/component/DebugComponent.java | 132 ++++++++++++++++++++-
.../java/org/apache/solr/util/SolrPluginUtils.java | 120 +------------------
3 files changed, 133 insertions(+), 124 deletions(-)
diff --git
a/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java
b/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java
index 28874ada8a7..d7ac47c14b5 100644
--- a/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java
@@ -52,6 +52,7 @@ import org.apache.solr.common.util.ContentStream;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.common.util.StrUtils;
import org.apache.solr.handler.admin.api.MoreLikeThisAPI;
+import org.apache.solr.handler.component.DebugComponent;
import org.apache.solr.handler.component.FacetComponent;
import org.apache.solr.handler.component.ResponseBuilder;
import org.apache.solr.request.SimpleFacets;
@@ -246,12 +247,10 @@ public class MoreLikeThisHandler extends
RequestHandlerBase {
dbgQuery = true;
dbgResults = true;
}
- // TODO resolve duplicated code with DebugComponent. Perhaps it should
be added to
- // doStandardDebug?
if (dbg == true) {
try {
NamedList<Object> dbgInfo =
- SolrPluginUtils.doStandardDebug(
+ DebugComponent.doStandardDebug(
req, q, mlt.getRawMLTQuery(), mltDocs.docList, dbgQuery,
dbgResults);
if (null != filters) {
dbgInfo.add("filter_queries",
req.getParams().getParams(CommonParams.FQ));
diff --git
a/solr/core/src/java/org/apache/solr/handler/component/DebugComponent.java
b/solr/core/src/java/org/apache/solr/handler/component/DebugComponent.java
index ff599f52d7d..6c3637a349b 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/DebugComponent.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/DebugComponent.java
@@ -32,15 +32,24 @@ import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.TreeMap;
+import org.apache.lucene.search.Explanation;
import org.apache.lucene.search.Query;
+import org.apache.lucene.search.Sort;
import org.apache.solr.common.SolrDocumentList;
+import org.apache.solr.common.SolrException;
import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.common.util.SimpleOrderedMap;
+import org.apache.solr.common.util.StrUtils;
import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.schema.IndexSchema;
import org.apache.solr.search.DocList;
+import org.apache.solr.search.QParser;
+import org.apache.solr.search.QueryCommand;
import org.apache.solr.search.QueryParsing;
import org.apache.solr.search.SolrIndexSearcher;
+import org.apache.solr.search.SortSpecParsing;
+import org.apache.solr.search.SyntaxError;
import org.apache.solr.search.facet.FacetDebugInfo;
import org.apache.solr.search.stats.StatsCache;
import org.apache.solr.util.SolrPluginUtils;
@@ -91,7 +100,7 @@ public class DebugComponent extends SearchComponent {
}
NamedList<Object> stdinfo =
- SolrPluginUtils.doStandardDebug(
+ doStandardDebug(
rb.req,
rb.getQueryString(),
rb.wrap(rb.getQuery()),
@@ -252,7 +261,7 @@ public class DebugComponent extends SearchComponent {
info = new SimpleOrderedMap<>();
}
// No responses were received from shards. Show local query info.
- SolrPluginUtils.doStandardQueryDebug(
+ doStandardQueryDebug(
rb.req, rb.getQueryString(), rb.wrap(rb.getQuery()),
rb.isDebugQuery(), info);
if (rb.isDebugQuery() && rb.getQparser() != null) {
rb.getQparser().addDebugInfo(info);
@@ -377,6 +386,125 @@ public class DebugComponent extends SearchComponent {
return t;
}
+ /**
+ * Returns a NamedList containing many "standard" pieces of debugging
information.
+ *
+ * <ul>
+ * <li>rawquerystring - the 'q' param exactly as specified by the client
+ * <li>querystring - the 'q' param after any preprocessing done by the
plugin
+ * <li>parsedquery - the main query executed formated by the Solr
QueryParsing utils class
+ * (which knows about field types)
+ * <li>parsedquery_toString - the main query executed formatted by its own
toString method (in
+ * case it has internal state Solr doesn't know about)
+ * <li>explain - the list of score explanations for each document in
results against query.
+ * <li>otherQuery - the query string specified in 'explainOther' query
param.
+ * <li>explainOther - the list of score explanations for each document in
results against
+ * 'otherQuery'
+ * </ul>
+ *
+ * @param req the request we are dealing with
+ * @param userQuery the users query as a string, after any basic
preprocessing has been done
+ * @param query the query built from the userQuery (and perhaps other
clauses) that identifies the
+ * main result set of the response.
+ * @param results the main result set of the response
+ * @return The debug info
+ * @throws java.io.IOException if there was an IO error
+ */
+ public static NamedList<Object> doStandardDebug(
+ SolrQueryRequest req,
+ String userQuery,
+ Query query,
+ DocList results,
+ boolean dbgQuery,
+ boolean dbgResults)
+ throws IOException {
+ NamedList<Object> dbg = new SimpleOrderedMap<>();
+ doStandardQueryDebug(req, userQuery, query, dbgQuery, dbg);
+ doStandardResultsDebug(req, query, results, dbgResults, dbg);
+ return dbg;
+ }
+
+ public static void doStandardQueryDebug(
+ SolrQueryRequest req,
+ String userQuery,
+ Query query,
+ boolean dbgQuery,
+ NamedList<Object> dbg) {
+ if (dbgQuery) {
+ /* userQuery may have been pre-processed .. expose that */
+ dbg.add("rawquerystring", req.getParams().get(CommonParams.Q));
+ dbg.add("querystring", userQuery);
+
+ /* QueryParsing.toString isn't perfect, use it to see converted
+ * values, use regular toString to see any attributes of the
+ * underlying Query it may have missed.
+ */
+ dbg.add("parsedquery", QueryParsing.toString(query, req.getSchema()));
+ dbg.add("parsedquery_toString", query.toString());
+ }
+ }
+
+ public static void doStandardResultsDebug(
+ SolrQueryRequest req, Query query, DocList results, boolean dbgResults,
NamedList<Object> dbg)
+ throws IOException {
+ if (dbgResults) {
+ SolrIndexSearcher searcher = req.getSearcher();
+ IndexSchema schema = searcher.getSchema();
+ boolean explainStruct =
req.getParams().getBool(CommonParams.EXPLAIN_STRUCT, false);
+
+ if (results != null) {
+ NamedList<Explanation> explain =
+ SolrPluginUtils.getExplanations(query, results, searcher, schema);
+ dbg.add(
+ "explain",
+ explainStruct
+ ? SolrPluginUtils.explanationsToNamedLists(explain)
+ : SolrPluginUtils.explanationsToStrings(explain));
+ }
+
+ String otherQueryS = req.getParams().get(CommonParams.EXPLAIN_OTHER);
+ if (otherQueryS != null && otherQueryS.length() > 0) {
+ DocList otherResults = doSimpleQuery(otherQueryS, req, 0, 10);
+ dbg.add("otherQuery", otherQueryS);
+ NamedList<Explanation> explainO =
+ SolrPluginUtils.getExplanations(query, otherResults, searcher,
schema);
+ dbg.add(
+ "explainOther",
+ explainStruct
+ ? SolrPluginUtils.explanationsToNamedLists(explainO)
+ : SolrPluginUtils.explanationsToStrings(explainO));
+ }
+ }
+ }
+
+ /** Executes a basic query */
+ public static DocList doSimpleQuery(String sreq, SolrQueryRequest req, int
start, int limit)
+ throws IOException {
+ List<String> commands = StrUtils.splitSmart(sreq, ';');
+
+ String qs = commands.size() >= 1 ? commands.get(0) : "";
+ try {
+ Query query = QParser.getParser(qs, req).getQuery();
+
+ // If the first non-query, non-filter command is a simple sort on an
indexed field, then
+ // we can use the Lucene sort ability.
+ Sort sort = null;
+ if (commands.size() >= 2) {
+ sort = SortSpecParsing.parseSortSpec(commands.get(1), req).getSort();
+ }
+
+ return new QueryCommand()
+ .setQuery(query)
+ .setSort(sort)
+ .setOffset(start)
+ .setLen(limit)
+ .search(req.getSearcher())
+ .getDocList();
+ } catch (SyntaxError e) {
+ throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Error
parsing query: " + qs);
+ }
+ }
+
/////////////////////////////////////////////
/// SolrInfoBean
////////////////////////////////////////////
diff --git a/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java
b/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java
index 43bf2ee3b11..d6cfe78e32d 100644
--- a/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java
+++ b/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java
@@ -75,7 +75,6 @@ import org.apache.solr.search.DocIterator;
import org.apache.solr.search.DocList;
import org.apache.solr.search.FieldParams;
import org.apache.solr.search.QParser;
-import org.apache.solr.search.QueryCommand;
import org.apache.solr.search.QueryParsing;
import org.apache.solr.search.ReturnFields;
import org.apache.solr.search.SolrDocumentFetcher;
@@ -280,94 +279,6 @@ public class SolrPluginUtils {
return debugInterests;
}
- /**
- * Returns a NamedList containing many "standard" pieces of debugging
information.
- *
- * <ul>
- * <li>rawquerystring - the 'q' param exactly as specified by the client
- * <li>querystring - the 'q' param after any preprocessing done by the
plugin
- * <li>parsedquery - the main query executed formated by the Solr
QueryParsing utils class
- * (which knows about field types)
- * <li>parsedquery_toString - the main query executed formatted by its own
toString method (in
- * case it has internal state Solr doesn't know about)
- * <li>explain - the list of score explanations for each document in
results against query.
- * <li>otherQuery - the query string specified in 'explainOther' query
param.
- * <li>explainOther - the list of score explanations for each document in
results against
- * 'otherQuery'
- * </ul>
- *
- * @param req the request we are dealing with
- * @param userQuery the users query as a string, after any basic
preprocessing has been done
- * @param query the query built from the userQuery (and perhaps other
clauses) that identifies the
- * main result set of the response.
- * @param results the main result set of the response
- * @return The debug info
- * @throws java.io.IOException if there was an IO error
- */
- @Deprecated // move to DebugComponent
- public static NamedList<Object> doStandardDebug(
- SolrQueryRequest req,
- String userQuery,
- Query query,
- DocList results,
- boolean dbgQuery,
- boolean dbgResults)
- throws IOException {
- NamedList<Object> dbg = new SimpleOrderedMap<>();
- doStandardQueryDebug(req, userQuery, query, dbgQuery, dbg);
- doStandardResultsDebug(req, query, results, dbgResults, dbg);
- return dbg;
- }
-
- @Deprecated // move to DebugComponent
- public static void doStandardQueryDebug(
- SolrQueryRequest req,
- String userQuery,
- Query query,
- boolean dbgQuery,
- NamedList<Object> dbg) {
- if (dbgQuery) {
- /* userQuery may have been pre-processed .. expose that */
- dbg.add("rawquerystring", req.getParams().get(CommonParams.Q));
- dbg.add("querystring", userQuery);
-
- /* QueryParsing.toString isn't perfect, use it to see converted
- * values, use regular toString to see any attributes of the
- * underlying Query it may have missed.
- */
- dbg.add("parsedquery", QueryParsing.toString(query, req.getSchema()));
- dbg.add("parsedquery_toString", query.toString());
- }
- }
-
- @Deprecated
- public static void doStandardResultsDebug(
- SolrQueryRequest req, Query query, DocList results, boolean dbgResults,
NamedList<Object> dbg)
- throws IOException {
- if (dbgResults) {
- SolrIndexSearcher searcher = req.getSearcher();
- IndexSchema schema = searcher.getSchema();
- boolean explainStruct =
req.getParams().getBool(CommonParams.EXPLAIN_STRUCT, false);
-
- if (results != null) {
- NamedList<Explanation> explain = getExplanations(query, results,
searcher, schema);
- dbg.add(
- "explain",
- explainStruct ? explanationsToNamedLists(explain) :
explanationsToStrings(explain));
- }
-
- String otherQueryS = req.getParams().get(CommonParams.EXPLAIN_OTHER);
- if (otherQueryS != null && otherQueryS.length() > 0) {
- DocList otherResults = doSimpleQuery(otherQueryS, req, 0, 10);
- dbg.add("otherQuery", otherQueryS);
- NamedList<Explanation> explainO = getExplanations(query, otherResults,
searcher, schema);
- dbg.add(
- "explainOther",
- explainStruct ? explanationsToNamedLists(explainO) :
explanationsToStrings(explainO));
- }
- }
- }
-
public static NamedList<Object> explanationToNamedList(Explanation e) {
NamedList<Object> out = new SimpleOrderedMap<>();
@@ -423,7 +334,7 @@ public class SolrPluginUtils {
return explainList;
}
- private static NamedList<String>
explanationsToStrings(NamedList<Explanation> explanations) {
+ public static NamedList<String> explanationsToStrings(NamedList<Explanation>
explanations) {
NamedList<String> out = new SimpleOrderedMap<>();
for (Map.Entry<String, Explanation> entry : explanations) {
@@ -432,35 +343,6 @@ public class SolrPluginUtils {
return out;
}
- /** Executes a basic query */
- @Deprecated
- public static DocList doSimpleQuery(String sreq, SolrQueryRequest req, int
start, int limit)
- throws IOException {
- List<String> commands = StrUtils.splitSmart(sreq, ';');
-
- String qs = commands.size() >= 1 ? commands.get(0) : "";
- try {
- Query query = QParser.getParser(qs, req).getQuery();
-
- // If the first non-query, non-filter command is a simple sort on an
indexed field, then
- // we can use the Lucene sort ability.
- Sort sort = null;
- if (commands.size() >= 2) {
- sort = SortSpecParsing.parseSortSpec(commands.get(1), req).getSort();
- }
-
- return new QueryCommand()
- .setQuery(query)
- .setSort(sort)
- .setOffset(start)
- .setLen(limit)
- .search(req.getSearcher())
- .getDocList();
- } catch (SyntaxError e) {
- throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Error
parsing query: " + qs);
- }
- }
-
private static final Pattern whitespacePattern = Pattern.compile("\\s+");
private static final Pattern caratPattern = Pattern.compile("\\^");
private static final Pattern tildePattern = Pattern.compile("[~]");