/*
* Copyright 2014-2017 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 org.springframework.data.solr.core.query;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import org.springframework.util.Assert;
/**
* Set of options available to get field statistics.
*
* @author Francisco Spaeth
* @since 1.4
*/
public class StatsOptions {
private StatsOptionsState state;
public StatsOptions() {
this(new StatsOptionsState());
}
private StatsOptions(StatsOptionsState state) {
this.state = state;
}
/**
* Adds a field to the statistics to be requested.
*
* @param field
* @return
*/
public FieldStatsOptions addField(Field field) {
Assert.notNull(field, "Field for statistics must not be 'null'.");
state.fields.add(field);
return new FieldStatsOptions(field, state);
}
/**
* Adds a field via its name to the statistics to be requested.
*
* @param fieldName
* @return
*/
public FieldStatsOptions addField(String fieldName) {
Assert.hasText(fieldName, "Fieldname for statistics must not be blank.");
return addField(new SimpleField(fieldName));
}
/**
* @return fields to request statistics of
*/
public Collection<Field> getFields() {
return Collections.unmodifiableCollection(state.fields);
}
/**
* Adds a facet on field to the statistics to be requested.
*
* @return
*/
public StatsOptions addFacet(Field field) {
Assert.notNull(field, "Facet field for statistics must not be 'null'.");
state.facets.add(field);
return this;
}
/**
* Adds a facet on field to the statistics to be requested.
*
* @param fieldName
* @return
*/
public StatsOptions addFacet(String fieldName) {
Assert.hasText(fieldName, "Fieldname for facet statistics must not be blank.");
return addFacet(new SimpleField(fieldName));
}
/**
* @return the fields to facet on.
*/
public Collection<Field> getFacets() {
return Collections.unmodifiableCollection(state.facets);
}
/**
* @return the selective facets to be requested.
*/
public Map<Field, Collection<Field>> getSelectiveFacets() {
return Collections.unmodifiableMap(state.selectiveFacets);
}
/**
* Sets the distinct calculation for a given stats request.
*
* @param calcDistinct
* @return
*/
public StatsOptions setCalcDistinct(boolean calcDistinct) {
state.calcDistinct = calcDistinct;
return this;
}
/**
* @return true if distinct shall be calculated for the stats request.
*/
public boolean isCalcDistinct() {
return state.calcDistinct;
}
/**
* @return the selective distinct calculation to be requested.
*/
public Map<Field, Boolean> getSelectiveCalcDistincts() {
return Collections.unmodifiableMap(state.selectiveCalcDistinct);
}
/**
* @param field
* @return true if a distinct calculation shall be done selectively to the given field.
*/
public Boolean isSelectiveCalcDistincts(Field field) {
return state.selectiveCalcDistinct.get(field);
}
/**
* Set of options available to get field's statistics having a field as context.
*
* @author Francisco Spaeth
* @sice 1.4
*/
public class FieldStatsOptions extends StatsOptions {
private Field fieldContext;
private FieldStatsOptions(Field fieldContext, StatsOptionsState state) {
super(state);
this.fieldContext = fieldContext;
}
/**
* Adds a selective facet over stats result of the field being configured.
*
* @param field
* @return
*/
public FieldStatsOptions addSelectiveFacet(Field field) {
if (!state.selectiveFacets.containsKey(fieldContext)) {
state.selectiveFacets.put(fieldContext, new ArrayList<>());
}
state.selectiveFacets.get(fieldContext).add(field);
return this;
}
public FieldStatsOptions addSelectiveFacet(String fieldName) {
return addSelectiveFacet(new SimpleField(fieldName));
}
public FieldStatsOptions setSelectiveCalcDistinct(boolean calcDistinct) {
state.selectiveCalcDistinct.put(fieldContext, calcDistinct);
return this;
}
}
/**
* @author Francisco Spaeth
* @since 1.4
*/
private static class StatsOptionsState {
private Set<Field> fields = new LinkedHashSet<>(1);
private Set<Field> facets = new LinkedHashSet<>(0);
private boolean calcDistinct = false;
private Map<Field, Collection<Field>> selectiveFacets = new LinkedHashMap<>();
private Map<Field, Boolean> selectiveCalcDistinct = new LinkedHashMap<>();
}
}