/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.solr.client.solrj.request; import org.apache.solr.client.solrj.SolrRequest; import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.response.FieldAnalysisResponse; import org.apache.solr.common.params.AnalysisParams; import org.apache.solr.common.params.ModifiableSolrParams; import org.apache.solr.common.params.SolrParams; import org.apache.solr.common.util.ContentStream; import java.io.IOException; import java.util.Collection; import java.util.LinkedList; import java.util.List; /** * A request for the org.apache.solr.handler.DocumentAnalysisRequestHandler. * * @version $Id: FieldAnalysisRequest.java 767412 2009-04-22 08:53:28Z shalin $ * @since solr.14 */ public class FieldAnalysisRequest extends SolrRequest { private String fieldValue; private String query; private boolean showMatch; private List<String> fieldNames; private List<String> fieldTypes; /** * Constructs a new FieldAnalysisRequest with a default uri of "/fieldanalysis". */ public FieldAnalysisRequest() { super(METHOD.GET, "/analysis/field"); } /** * Constructs a new FieldAnalysisRequest with a given uri. * * @param uri the uri of the request handler. */ public FieldAnalysisRequest(String uri) { super(METHOD.GET, uri); } /** * {@inheritDoc} */ @Override public Collection<ContentStream> getContentStreams() throws IOException { return null; } /** * {@inheritDoc} */ @Override public SolrParams getParams() { ModifiableSolrParams params = new ModifiableSolrParams(); params.set(AnalysisParams.FIELD_VALUE, fieldValue); if (query != null) { params.add(AnalysisParams.QUERY, query); params.add(AnalysisParams.SHOW_MATCH, String.valueOf(showMatch)); } if (fieldNames != null) { String fieldNameValue = listToCommaDelimitedString(fieldNames); params.add(AnalysisParams.FIELD_NAME, fieldNameValue); } if (fieldTypes != null) { String fieldTypeValue = listToCommaDelimitedString(fieldTypes); params.add(AnalysisParams.FIELD_TYPE, fieldTypeValue); } return params; } /** * {@inheritDoc} */ @Override public FieldAnalysisResponse process(SolrServer server) throws SolrServerException, IOException { if (fieldTypes == null || fieldNames == null) { throw new IllegalStateException("A list one field type or field name need to be specified"); } if (fieldValue == null) { throw new IllegalStateException("The field value must be set"); } long startTime = System.currentTimeMillis(); FieldAnalysisResponse res = new FieldAnalysisResponse(); res.setResponse(server.request(this)); res.setElapsedTime(System.currentTimeMillis() - startTime); return res; } //================================================ Helper Methods ================================================== /** * Convers the given list of string to a comma-separated string. * * @param list The list of string. * * @return The comma-separated string. */ static String listToCommaDelimitedString(List<String> list) { StringBuilder result = new StringBuilder(); for (String str : list) { if (result.length() > 0) { result.append(","); } result.append(str); } return result.toString(); } //============================================ Setter/Getter Methods =============================================== /** * Sets the field value to be analyzed. * * @param fieldValue The field value to be analyzed. * * @return This FieldAnalysisRequest (fluent interface support). */ public FieldAnalysisRequest setFieldValue(String fieldValue) { this.fieldValue = fieldValue; return this; } /** * Returns the field value that will be analyzed when this request is processed. * * @return The field value that will be analyzed when this request is processed. */ public String getFieldValue() { return fieldValue; } /** * Sets the query to be analyzed. May be {@code null} indicated that no query analysis should take place. * * @param query The query to be analyzed. * * @return This FieldAnalysisRequest (fluent interface support). */ public FieldAnalysisRequest setQuery(String query) { this.query = query; return this; } /** * Returns the query that will be analyzed. May return {@code null} indicating that no query analysis will be * performed. * * @return The query that will be analyzed. May return {@code null} indicating that no query analysis will be * performed. */ public String getQuery() { return query; } /** * Sets whether index time tokens that match query time tokens should be marked as a "match". By default this is set * to {@code false}. Obviously, this flag is ignored if when the query is set to {@code null}. * * @param showMatch Sets whether index time tokens that match query time tokens should be marked as a "match". * * @return This FieldAnalysisRequest (fluent interface support). */ public FieldAnalysisRequest setShowMatch(boolean showMatch) { this.showMatch = showMatch; return this; } /** * Returns whether index time tokens that match query time tokens should be marked as a "match". * * @return Whether index time tokens that match query time tokens should be marked as a "match". * * @see #setShowMatch(boolean) */ public boolean isShowMatch() { return showMatch; } /** * Adds the given field name for analysis. * * @param fieldName A field name on which the analysis should be performed. * * @return this FieldAnalysisRequest (fluent interface support). */ public FieldAnalysisRequest addFieldName(String fieldName) { if (fieldNames == null) { fieldNames = new LinkedList<String>(); } fieldNames.add(fieldName); return this; } /** * Sets the field names on which the analysis should be performed. * * @param fieldNames The field names on which the analysis should be performed. * * @return this FieldAnalysisRequest (fluent interface support). */ public FieldAnalysisRequest setFieldNames(List<String> fieldNames) { this.fieldNames = fieldNames; return this; } /** * Returns a list of field names the analysis should be performed on. May return {@code null} indicating that no * analysis will be performed on field names. * * @return The field names the analysis should be performed on. */ public List<String> getFieldNames() { return fieldNames; } /** * Adds the given field type for analysis. * * @param fieldTypeName A field type name on which analysis should be performed. * * @return This FieldAnalysisRequest (fluent interface support). */ public FieldAnalysisRequest addFieldType(String fieldTypeName) { if (fieldTypes == null) { fieldTypes = new LinkedList<String>(); } fieldTypes.add(fieldTypeName); return this; } /** * Sets the field types on which analysis should be performed. * * @param fieldTypes The field type names on which analysis should be performed. * * @return This FieldAnalysisRequest (fluent interface support). */ public FieldAnalysisRequest setFieldTypes(List<String> fieldTypes) { this.fieldTypes = fieldTypes; return this; } /** * Returns a list of field types the analysis should be performed on. May return {@code null} indicating that no * analysis will be peformed on field types. * * @return The field types the analysis should be performed on. */ public List<String> getFieldTypes() { return fieldTypes; } }