mirror of https://github.com/apache/lucene.git
SOLR-10537: Added SolrParams.toLocalParamsString() and moved QP.encodeLocalParamVal to ClientUtils
This commit is contained in:
parent
db92a9efc2
commit
f45017b2d4
|
@ -189,6 +189,8 @@ New Features
|
||||||
|
|
||||||
* SOLR-10505: Add multi-field support to TermsComponent when requesting terms' statistics. (Shai Erera)
|
* SOLR-10505: Add multi-field support to TermsComponent when requesting terms' statistics. (Shai Erera)
|
||||||
|
|
||||||
|
* SOLR-10537: SolrJ: Added SolrParams.toLocalParamsString() and ClientUtils.encodeLocalParamVal. (David Smiley)
|
||||||
|
|
||||||
Optimizations
|
Optimizations
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,7 @@ import org.apache.commons.lang.ArrayUtils;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.apache.lucene.util.BytesRef;
|
import org.apache.lucene.util.BytesRef;
|
||||||
import org.apache.lucene.util.FixedBitSet;
|
import org.apache.lucene.util.FixedBitSet;
|
||||||
|
import org.apache.solr.client.solrj.util.ClientUtils;
|
||||||
import org.apache.solr.common.SolrException;
|
import org.apache.solr.common.SolrException;
|
||||||
import org.apache.solr.common.SolrException.ErrorCode;
|
import org.apache.solr.common.SolrException.ErrorCode;
|
||||||
import org.apache.solr.common.params.CommonParams;
|
import org.apache.solr.common.params.CommonParams;
|
||||||
|
@ -374,7 +375,7 @@ public class FacetComponent extends SearchComponent {
|
||||||
// add terms into the original facet.field command
|
// add terms into the original facet.field command
|
||||||
// do it via parameter reference to avoid another layer of encoding.
|
// do it via parameter reference to avoid another layer of encoding.
|
||||||
|
|
||||||
String termsKeyEncoded = QueryParsing.encodeLocalParamVal(termsKey);
|
String termsKeyEncoded = ClientUtils.encodeLocalParamVal(termsKey);
|
||||||
if (dff.localParams != null) {
|
if (dff.localParams != null) {
|
||||||
facetCommand = commandPrefix + termsKeyEncoded + " "
|
facetCommand = commandPrefix + termsKeyEncoded + " "
|
||||||
+ dff.facetStr.substring(2);
|
+ dff.facetStr.substring(2);
|
||||||
|
|
|
@ -32,16 +32,13 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.apache.lucene.util.FixedBitSet;
|
|
||||||
import org.apache.solr.search.DocIterator;
|
|
||||||
import org.apache.solr.search.SolrIndexSearcher;
|
|
||||||
import org.locationtech.spatial4j.context.SpatialContext;
|
|
||||||
import org.locationtech.spatial4j.shape.Shape;
|
|
||||||
import org.apache.lucene.spatial.prefix.HeatmapFacetCounter;
|
import org.apache.lucene.spatial.prefix.HeatmapFacetCounter;
|
||||||
import org.apache.lucene.spatial.prefix.PrefixTreeStrategy;
|
import org.apache.lucene.spatial.prefix.PrefixTreeStrategy;
|
||||||
import org.apache.lucene.spatial.query.SpatialArgs;
|
import org.apache.lucene.spatial.query.SpatialArgs;
|
||||||
import org.apache.lucene.spatial.query.SpatialOperation;
|
import org.apache.lucene.spatial.query.SpatialOperation;
|
||||||
import org.apache.lucene.util.Bits;
|
import org.apache.lucene.util.Bits;
|
||||||
|
import org.apache.lucene.util.FixedBitSet;
|
||||||
|
import org.apache.solr.client.solrj.util.ClientUtils;
|
||||||
import org.apache.solr.common.SolrException;
|
import org.apache.solr.common.SolrException;
|
||||||
import org.apache.solr.common.params.CommonParams;
|
import org.apache.solr.common.params.CommonParams;
|
||||||
import org.apache.solr.common.params.FacetParams;
|
import org.apache.solr.common.params.FacetParams;
|
||||||
|
@ -54,10 +51,13 @@ import org.apache.solr.schema.RptWithGeometrySpatialField;
|
||||||
import org.apache.solr.schema.SchemaField;
|
import org.apache.solr.schema.SchemaField;
|
||||||
import org.apache.solr.schema.SpatialRecursivePrefixTreeFieldType;
|
import org.apache.solr.schema.SpatialRecursivePrefixTreeFieldType;
|
||||||
import org.apache.solr.search.BitDocSet;
|
import org.apache.solr.search.BitDocSet;
|
||||||
|
import org.apache.solr.search.DocIterator;
|
||||||
import org.apache.solr.search.DocSet;
|
import org.apache.solr.search.DocSet;
|
||||||
import org.apache.solr.search.QueryParsing;
|
import org.apache.solr.search.SolrIndexSearcher;
|
||||||
import org.apache.solr.util.DistanceUnits;
|
import org.apache.solr.util.DistanceUnits;
|
||||||
import org.apache.solr.util.SpatialUtils;
|
import org.apache.solr.util.SpatialUtils;
|
||||||
|
import org.locationtech.spatial4j.context.SpatialContext;
|
||||||
|
import org.locationtech.spatial4j.shape.Shape;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
@ -305,7 +305,7 @@ public class SpatialHeatmapFacets {
|
||||||
//add heatmap field param
|
//add heatmap field param
|
||||||
if (!key.equals(facet.facetOn)) {
|
if (!key.equals(facet.facetOn)) {
|
||||||
sreq.params.add(FacetParams.FACET_HEATMAP,
|
sreq.params.add(FacetParams.FACET_HEATMAP,
|
||||||
"{!" + CommonParams.OUTPUT_KEY + "=" + QueryParsing.encodeLocalParamVal(key) + "}" + facet.facetOn);
|
"{!" + CommonParams.OUTPUT_KEY + "=" + ClientUtils.encodeLocalParamVal(key) + "}" + facet.facetOn);
|
||||||
} else {
|
} else {
|
||||||
sreq.params.add(FacetParams.FACET_HEATMAP, facet.facetOn);
|
sreq.params.add(FacetParams.FACET_HEATMAP, facet.facetOn);
|
||||||
}
|
}
|
||||||
|
|
|
@ -171,33 +171,6 @@ public class QueryParsing {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static String encodeLocalParamVal(String val) {
|
|
||||||
int len = val.length();
|
|
||||||
int i = 0;
|
|
||||||
if (len > 0 && val.charAt(0) != '$') {
|
|
||||||
for (;i<len; i++) {
|
|
||||||
char ch = val.charAt(i);
|
|
||||||
if (Character.isWhitespace(ch) || ch=='}') break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i>=len) return val;
|
|
||||||
|
|
||||||
// We need to enclose in quotes... but now we need to escape
|
|
||||||
StringBuilder sb = new StringBuilder(val.length() + 4);
|
|
||||||
sb.append('\'');
|
|
||||||
for (i=0; i<len; i++) {
|
|
||||||
char ch = val.charAt(i);
|
|
||||||
if (ch=='\'') {
|
|
||||||
sb.append('\\');
|
|
||||||
}
|
|
||||||
sb.append(ch);
|
|
||||||
}
|
|
||||||
sb.append('\'');
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* "foo" returns null
|
* "foo" returns null
|
||||||
* "{!prefix f=myfield}yes" returns type="prefix",f="myfield",v="yes"
|
* "{!prefix f=myfield}yes" returns type="prefix",f="myfield",v="yes"
|
||||||
|
|
|
@ -159,6 +159,35 @@ public class ClientUtils
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the value encoded properly so it can be appended after a <pre>name=</pre> local-param.
|
||||||
|
*/
|
||||||
|
public static String encodeLocalParamVal(String val) {
|
||||||
|
int len = val.length();
|
||||||
|
int i = 0;
|
||||||
|
if (len > 0 && val.charAt(0) != '$') {
|
||||||
|
for (;i<len; i++) {
|
||||||
|
char ch = val.charAt(i);
|
||||||
|
if (Character.isWhitespace(ch) || ch=='}') break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i>=len) return val;
|
||||||
|
|
||||||
|
// We need to enclose in quotes... but now we need to escape
|
||||||
|
StringBuilder sb = new StringBuilder(val.length() + 4);
|
||||||
|
sb.append('\'');
|
||||||
|
for (i=0; i<len; i++) {
|
||||||
|
char ch = val.charAt(i);
|
||||||
|
if (ch=='\'') {
|
||||||
|
sb.append('\\');
|
||||||
|
}
|
||||||
|
sb.append(ch);
|
||||||
|
}
|
||||||
|
sb.append('\'');
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
/** Constructs a slices map from a collection of slices and handles disambiguation if multiple collections are being queried simultaneously */
|
/** Constructs a slices map from a collection of slices and handles disambiguation if multiple collections are being queried simultaneously */
|
||||||
public static void addSlices(Map<String,Slice> target, String collectionName, Collection<Slice> slices, boolean multiCollection) {
|
public static void addSlices(Map<String,Slice> target, String collectionName, Collection<Slice> slices, boolean multiCollection) {
|
||||||
for (Slice slice : slices) {
|
for (Slice slice : slices) {
|
||||||
|
|
|
@ -30,6 +30,7 @@ import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.solr.client.solrj.util.ClientUtils;
|
||||||
import org.apache.solr.common.MapSerializable;
|
import org.apache.solr.common.MapSerializable;
|
||||||
import org.apache.solr.common.SolrException;
|
import org.apache.solr.common.SolrException;
|
||||||
import org.apache.solr.common.util.NamedList;
|
import org.apache.solr.common.util.NamedList;
|
||||||
|
@ -497,7 +498,27 @@ public abstract class SolrParams implements Serializable, MapSerializable {
|
||||||
throw new AssertionError(e);
|
throw new AssertionError(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates a local-params string of the form <pre>{! name=value name2=value2}</pre>.
|
||||||
|
*/
|
||||||
|
public String toLocalParamsString() {
|
||||||
|
final StringBuilder sb = new StringBuilder(128);
|
||||||
|
sb.append("{!");
|
||||||
|
//TODO perhaps look for 'type' and add here? but it doesn't matter.
|
||||||
|
for (final Iterator<String> it = getParameterNamesIterator(); it.hasNext();) {
|
||||||
|
final String name = it.next();
|
||||||
|
for (String val : getParams(name)) {
|
||||||
|
sb.append(' '); // do so even the first time; why not.
|
||||||
|
sb.append(name); // no escaping for name; it must follow "Java Identifier" rules.
|
||||||
|
sb.append('=');
|
||||||
|
sb.append(ClientUtils.encodeLocalParamVal(val));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sb.append('}');
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
/** Like {@link #toQueryString()}, but only replacing enough chars so that
|
/** Like {@link #toQueryString()}, but only replacing enough chars so that
|
||||||
* the URL may be unambiguously pasted back into a browser.
|
* the URL may be unambiguously pasted back into a browser.
|
||||||
* This method can be used to properly log query parameters without
|
* This method can be used to properly log query parameters without
|
||||||
|
|
Loading…
Reference in New Issue