Java tutorial
/* * Copyright 2012 - 2013 the original author or authors. * * Licensed 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 com.frank.search.solr.core.query; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.Predicate; import org.apache.solr.common.params.HighlightParams; import org.springframework.util.Assert; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; /** * Empty Options indicate to set {@code hl=true}. As long as there are no fields * defined {@code *} will be used. Some options like * {@see HighlightOptions#setFormatter(String)} can be set directly. Any option * can be set via * {@see HighlightOptions#addHighlightParameter(HighlightParameter)}. * * @author Christoph Strobl */ public class HighlightOptions { public static final Field ALL_FIELDS = new Field() { @Override public String getName() { return Criteria.WILDCARD; } }; private final ParameterHolder<HighlightParameter> parameterHolder = new ParameterHolder<HighlightParameter>(); private FilterQuery query; private final List<Field> fields = new ArrayList<Field>(1); /** * Add field to highlight * * @param field * @return */ public HighlightOptions addField(Field field) { Assert.notNull(field); this.fields.add(field); return this; } /** * Add name of field to highlight on * * @param fieldname * @return */ public HighlightOptions addField(String fieldname) { Assert.hasText(fieldname); return addField(new SimpleField(fieldname)); } /** * Add names of fields to highlight on * * @param fieldnames * @return */ public HighlightOptions addField(String... fieldnames) { Assert.notNull(fieldnames); for (String fieldname : fieldnames) { addField(fieldname); } return this; } /** * Add names of fields to highlight on * * @param fieldnames * @return */ public HighlightOptions addFields(Collection<String> fieldnames) { Assert.notNull(fieldnames); for (String fieldname : fieldnames) { addField(fieldname); } return this; } /** * @return null if not set */ public FilterQuery getQuery() { return this.query; } /** * Set {@see FilterQuery} to be used for {@code hl.q} * * @param query */ public HighlightOptions setQuery(FilterQuery query) { this.query = query; return this; } /** * @return null if not set */ public Integer getFragsize() { return this.parameterHolder.getParameterValue(HighlightParams.FRAGSIZE); } /** * set fragsize {@code hl.fragsize}. * * @param fragsize */ public HighlightOptions setFragsize(Integer fragsize) { addHighlightParameter(HighlightParams.FRAGSIZE, fragsize); return this; } /** * @return null if not set */ public String getFormatter() { return this.parameterHolder.getParameterValue(HighlightParams.FORMATTER); } /** * set formatter {@code hl.formatter} * * @param formatter */ public HighlightOptions setFormatter(String formatter) { addHighlightParameter(HighlightParams.FORMATTER, formatter); return this; } /** * @return null if not set */ public Integer getNrSnipplets() { return this.parameterHolder.getParameterValue(HighlightParams.SNIPPETS); } /** * set {@code hl.snippets} * * @param nrSnipplets */ public HighlightOptions setNrSnipplets(Integer nrSnipplets) { addHighlightParameter(HighlightParams.SNIPPETS, nrSnipplets); return this; } /** * set {@code hl.simple.pre} * * @param prefix */ public HighlightOptions setSimplePrefix(String prefix) { addHighlightParameter(HighlightParams.SIMPLE_PRE, prefix); return this; } /** * @return */ public String getSimplePrefix() { return this.parameterHolder.getParameterValue(HighlightParams.SIMPLE_PRE); } /** * set {@code hl.simple.post} * * @param postfix */ public HighlightOptions setSimplePostfix(String postfix) { addHighlightParameter(HighlightParams.SIMPLE_POST, postfix); return this; } /** * @return */ public String getSimplePostfix() { return this.parameterHolder.getParameterValue(HighlightParams.SIMPLE_POST); } /** * @return unmodifiable list of fields */ public List<Field> getFields() { return Collections.unmodifiableList(fields); } /** * @return collection of all parameters */ public Collection<HighlightParameter> getHighlightParameters() { return this.parameterHolder.getParameters(); } /** * Add parameter by name * * @param parameterName * must not be null * @param value * @return */ public HighlightOptions addHighlightParameter(String parameterName, Object value) { return addHighlightParameter(new HighlightParameter(parameterName, value)); } /** * Add parameter * * @param parameter * must not be null * @return */ public HighlightOptions addHighlightParameter(HighlightParameter parameter) { Assert.notNull(parameter); this.parameterHolder.add(parameter); return this; } /** * Get value of parameter with given type * * @param parameterName * @return null if not present */ public <S> S getHighlightParameterValue(String parameterName) { return this.parameterHolder.getParameterValue(parameterName); } /** * Get Collection of fields that have field specific highlight options. * * @return */ @SuppressWarnings("unchecked") public Collection<FieldWithHighlightParameters> getFieldsWithHighlightParameters() { return (Collection<FieldWithHighlightParameters>) CollectionUtils.select(this.fields, new IsFieldWithHighlightParametersInstancePredicate()); } /** * @return true if query is not null */ public boolean hasQuery() { return this.query != null; } /** * @return true if at least one field available */ public boolean hasFields() { return !this.fields.isEmpty(); } private static class IsFieldWithHighlightParametersInstancePredicate implements Predicate { @Override public boolean evaluate(Object object) { return object instanceof FieldWithHighlightParameters; } } /** * Query Parameter to be used for highlighting * * @author Christoph Strobl * */ public static class HighlightParameter extends QueryParameterImpl { public HighlightParameter(String parameter, Object value) { super(parameter, value); } } /** * Field with hightlight query parameters * * @author Christoph Strobl * */ public static class FieldWithHighlightParameters extends FieldWithQueryParameters<HighlightParameter> { /** * @param fieldname * must not be null/blank */ public FieldWithHighlightParameters(String fieldname) { super(fieldname); } /** * @return null if not set */ public Integer getNrSnipplets() { return getQueryParameterValue(HighlightParams.SNIPPETS); } /** * set fragsize {@code hl.fragsize}. * * @param fragsize */ public FieldWithHighlightParameters setNrSnipplets(Integer nrSnipplets) { addHighlightParameter(HighlightParams.SNIPPETS, nrSnipplets); return this; } /** * @return null if not set */ public Integer getFragsize() { return getQueryParameterValue(HighlightParams.FRAGSIZE); } /** * set fragsize {@code f.<fieldname>.hl.fragsize}. * * @param fragsize */ public FieldWithHighlightParameters setFragsize(Integer fragsize) { addHighlightParameter(HighlightParams.FRAGSIZE, fragsize); return this; } /** * @return null if not set */ public Boolean isMergeContigous() { return getQueryParameterValue(HighlightParams.MERGE_CONTIGUOUS_FRAGMENTS); } /** * set fragsize {@code f.<fieldname>.hl.fragsize}. * * @param fragsize */ public FieldWithHighlightParameters setMergeContigous(Boolean mergeContigous) { addHighlightParameter(HighlightParams.MERGE_CONTIGUOUS_FRAGMENTS, mergeContigous); return this; } /** * @return null if not set */ public String getFormatter() { return getQueryParameterValue(HighlightParams.FORMATTER); } /** * set fragsize {@code f.<formatter>.hl.fragsize}. * * @param fragsize */ public FieldWithHighlightParameters setFormatter(String formatter) { addHighlightParameter(HighlightParams.FORMATTER, formatter); return this; } /** * Add field specific parameter by name * * @param parameterName * @param value */ public FieldWithHighlightParameters addHighlightParameter(String parameterName, Object value) { return this.addHighlightParameter(new HighlightParameter(parameterName, value)); } /** * Add field specific highlight parameter * * @param parameter * @return */ public FieldWithHighlightParameters addHighlightParameter(HighlightParameter parameter) { this.addQueryParameter(parameter); return this; } } }