rseitz commented on code in PR #1154:
URL: https://github.com/apache/solr/pull/1154#discussion_r1014304329
##########
solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java:
##########
@@ -553,6 +560,82 @@ private void setQuery(ResponseBuilder rb, Elevation
elevation) {
}
}
+ /**
+ * Updates any filters that have been tagged for exclusion. Filters can be
tagged for exclusion
+ * via the syntax fq={!tag=t1}field1:value1&elevate.excludeTags=t1 This
method modifies each
+ * "excluded" filter so that it becomes a boolean OR of the original filter
with an "include
+ * query" that matches the elevated documents by their IDs. To be clear, the
"excluded" filters
+ * are not ignored entirely, but rather broadened so that the elevated
documents are allowed
+ * through.
+ */
+ private void setFilters(ResponseBuilder rb, Elevation elevation) {
+ SolrParams params = rb.req.getParams();
+
+ String tagStr = params.get(QueryElevationParams.ELEVATE_EXCLUDE_TAGS);
+ if (StringUtils.isEmpty(tagStr)) {
+ // the parameter that specifies tags for exclusion was not provided or
had no value
+ return;
+ }
+
+ List<String> excludeTags = StrUtils.splitSmart(tagStr, ',');
+ excludeTags.removeIf(s -> StringUtils.isBlank(s));
+ if (excludeTags.isEmpty()) {
+ // the parameter that specifies tags for exclusion was provided but the
tag names were blank
+ return;
+ }
+
+ List<Query> filters = rb.getFilters();
+ if (filters == null || filters.isEmpty()) {
+ // no filters were provided
+ return;
+ }
+
+ Map<?, ?> tagMap = (Map<?, ?>) rb.req.getContext().get("tags");
+ if (tagMap == null) {
+ // no filters were tagged
+ return;
+ }
+
+ // TODO: this code is copied from FacetProcessor#handleFilterExclusions()
+ // duplication could be avoided by placing this code in a common utility
method, perhaps in
+ // QueryUtils
+ IdentityHashMap<Query, Boolean> excludeSet = new IdentityHashMap<>();
+ for (String excludeTag : excludeTags) {
+ Object olst = tagMap.get(excludeTag);
+ // tagMap has entries of List<String,List<QParser>>, but subject to
change in the future
+ if (!(olst instanceof Collection)) continue;
+ for (Object o : (Collection<?>) olst) {
+ if (!(o instanceof QParser)) continue;
+ QParser qp = (QParser) o;
+ try {
+ excludeSet.put(qp.getQuery(), Boolean.TRUE);
+ } catch (SyntaxError syntaxError) {
+ // This should not happen since we should only be retrieving a
previously parsed query
+ throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
syntaxError);
+ }
+ }
+ }
+
+ List<Query> updatedFilters = new ArrayList<Query>();
+
+ for (Query q : filters) {
+ if (!excludeSet.containsKey(q) || q instanceof
CollapsingQParserPlugin.CollapsingPostFilter) {
Review Comment:
Agree. I changed this to ignore any PostFilter, not just
CollapsingPostFilter.
##########
solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java:
##########
@@ -553,6 +560,82 @@ private void setQuery(ResponseBuilder rb, Elevation
elevation) {
}
}
+ /**
+ * Updates any filters that have been tagged for exclusion. Filters can be
tagged for exclusion
+ * via the syntax fq={!tag=t1}field1:value1&elevate.excludeTags=t1 This
method modifies each
+ * "excluded" filter so that it becomes a boolean OR of the original filter
with an "include
+ * query" that matches the elevated documents by their IDs. To be clear, the
"excluded" filters
+ * are not ignored entirely, but rather broadened so that the elevated
documents are allowed
+ * through.
+ */
+ private void setFilters(ResponseBuilder rb, Elevation elevation) {
+ SolrParams params = rb.req.getParams();
+
+ String tagStr = params.get(QueryElevationParams.ELEVATE_EXCLUDE_TAGS);
+ if (StringUtils.isEmpty(tagStr)) {
+ // the parameter that specifies tags for exclusion was not provided or
had no value
+ return;
+ }
+
+ List<String> excludeTags = StrUtils.splitSmart(tagStr, ',');
+ excludeTags.removeIf(s -> StringUtils.isBlank(s));
+ if (excludeTags.isEmpty()) {
+ // the parameter that specifies tags for exclusion was provided but the
tag names were blank
+ return;
+ }
+
+ List<Query> filters = rb.getFilters();
+ if (filters == null || filters.isEmpty()) {
+ // no filters were provided
+ return;
+ }
+
+ Map<?, ?> tagMap = (Map<?, ?>) rb.req.getContext().get("tags");
+ if (tagMap == null) {
+ // no filters were tagged
+ return;
+ }
+
+ // TODO: this code is copied from FacetProcessor#handleFilterExclusions()
+ // duplication could be avoided by placing this code in a common utility
method, perhaps in
+ // QueryUtils
+ IdentityHashMap<Query, Boolean> excludeSet = new IdentityHashMap<>();
+ for (String excludeTag : excludeTags) {
+ Object olst = tagMap.get(excludeTag);
+ // tagMap has entries of List<String,List<QParser>>, but subject to
change in the future
+ if (!(olst instanceof Collection)) continue;
+ for (Object o : (Collection<?>) olst) {
+ if (!(o instanceof QParser)) continue;
+ QParser qp = (QParser) o;
+ try {
+ excludeSet.put(qp.getQuery(), Boolean.TRUE);
+ } catch (SyntaxError syntaxError) {
+ // This should not happen since we should only be retrieving a
previously parsed query
+ throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
syntaxError);
+ }
+ }
+ }
+
+ List<Query> updatedFilters = new ArrayList<Query>();
+
+ for (Query q : filters) {
Review Comment:
Done.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]