/* * Hibernate Search, full-text search for your domain model * * License: GNU Lesser General Public License (LGPL), version 2.1 or later * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.search.elasticsearch.schema.impl.json; import java.util.HashMap; import java.util.Map; /** * Stores the knowledge of how to compare values for a given parameter * for a given analysis type (analyzer type, char filter type, etc.). * * @author Yoann Rodiere */ public class AnalysisParameterEquivalenceRegistry { private static final AnalysisJsonElementEquivalence DEFAULT_ELEMENT_EQUIVALENCE = new AnalysisJsonElementEquivalence(); // Nested arrays are not considered unordered. private static final AnalysisJsonElementEquivalence UNORDERED_ARRAY_EQUIVALENCE = new AnalysisJsonElementUnorderedArrayEquivalence( DEFAULT_ELEMENT_EQUIVALENCE ); private final Map<String, Map<String, AnalysisJsonElementEquivalence>> equivalences; private AnalysisParameterEquivalenceRegistry( Map<String, Map<String, AnalysisJsonElementEquivalence>> equivalences) { super(); this.equivalences = equivalences; } public AnalysisJsonElementEquivalence get(String type, String parameter) { Map<String, AnalysisJsonElementEquivalence> mapForType = equivalences.get( type ); AnalysisJsonElementEquivalence result = mapForType == null ? null : mapForType.get( parameter ); return result == null ? DEFAULT_ELEMENT_EQUIVALENCE : result; } public static class Builder { private final Map<String, Map<String, AnalysisJsonElementEquivalence>> equivalences = new HashMap<>(); public TypeBuilder type(String name) { Map<String, AnalysisJsonElementEquivalence> mapForType = equivalences.get( name ); if ( mapForType == null ) { mapForType = new HashMap<>(); equivalences.put( name, mapForType ); } return new TypeBuilder( this, mapForType ); } public AnalysisParameterEquivalenceRegistry build() { return new AnalysisParameterEquivalenceRegistry( equivalences ); } } public static class TypeBuilder { private final Builder parent; private Map<String, AnalysisJsonElementEquivalence> equivalences; private TypeBuilder(Builder parent, Map<String, AnalysisJsonElementEquivalence> equivalences) { super(); this.parent = parent; this.equivalences = equivalences; } public ParameterBuilder param(String name) { return new ParameterBuilder( this, name ); } private void add(String parameterName, AnalysisJsonElementEquivalence equivalence) { equivalences.put( parameterName, equivalence ); } public Builder end() { return parent; } } public static class ParameterBuilder { private final TypeBuilder parent; private final String parameterName; private ParameterBuilder(TypeBuilder parent, String parameterName) { super(); this.parent = parent; this.parameterName = parameterName; } public TypeBuilder unorderedArray() { parent.add( parameterName, UNORDERED_ARRAY_EQUIVALENCE ); return parent; } } }