/* * 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.test.query.sorting; import java.util.HashMap; import java.util.Map; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToOne; import org.apache.lucene.document.Document; import org.hibernate.search.annotations.ClassBridge; import org.hibernate.search.annotations.Field; import org.hibernate.search.annotations.FieldBridge; import org.hibernate.search.annotations.Indexed; import org.hibernate.search.annotations.IndexedEmbedded; import org.hibernate.search.annotations.SortableField; import org.hibernate.search.bridge.LuceneOptions; import org.hibernate.search.bridge.MetadataProvidingFieldBridge; import org.hibernate.search.bridge.spi.FieldMetadataBuilder; import org.hibernate.search.bridge.spi.FieldType; @Entity @Indexed @ClassBridge( name = "fn", impl = Explorer.FirstAndMiddleNamesFieldBridge.class ) public class Explorer { @Id private int id; @Field @SortableField private int exploredCountries; @Field(bridge = @FieldBridge(impl = Explorer.LastNameFieldBridge.class)) @ElementCollection private final Map<String, String> nameParts = new HashMap<>(); @ManyToOne @IndexedEmbedded /* * Don't store the id in "favoriteTerritory" directly as this could conflict * with the @IndexedEmbedded with the Elasticsearch backend */ @Field(name = "favoriteTerritory.idFromBridge", bridge = @FieldBridge(impl = Territory.IdFieldBridge.class)) private Territory favoriteTerritory; public Explorer() { } public Explorer(int id) { this.id = id; } public Explorer(int id, int exploredCountries, Territory favoriteTerritory, String firstName, String middleName, String lastName) { this.id = id; this.exploredCountries = exploredCountries; this.favoriteTerritory = favoriteTerritory; nameParts.put( "firstName", firstName ); nameParts.put( "middleName", middleName ); nameParts.put( "lastName", lastName ); } public int getId() { return id; } public int getExploredCountries() { return exploredCountries; } public Map<String, String> getNameParts() { return nameParts; } public Territory getFavoriteTerritory() { return favoriteTerritory; } /** * Used as class-level bridge for creating the "firstName" and "middleName" document and doc value fields. */ public static class FirstAndMiddleNamesFieldBridge implements MetadataProvidingFieldBridge { @Override public void set(String name, Object value, Document document, LuceneOptions luceneOptions) { Explorer explorer = (Explorer) value; String firstName = explorer.getNameParts().get( "firstName" ); luceneOptions.addFieldToDocument( name + "_firstName", firstName, document ); luceneOptions.addSortedDocValuesFieldToDocument( name + "_firstName", firstName, document ); String middleName = explorer.getNameParts().get( "middleName" ); luceneOptions.addFieldToDocument( name + "_middleName", middleName, document ); luceneOptions.addSortedDocValuesFieldToDocument( name + "_middleName", middleName, document ); } @Override public void configureFieldMetadata(String name, FieldMetadataBuilder builder) { builder .field( name + "_firstName", FieldType.STRING ) .sortable( true ) .field( name + "_middleName", FieldType.STRING ) .sortable( true ); } } /** * Used as field-level bridge for creating the "lastName" document and doc value fields. */ public static class LastNameFieldBridge implements MetadataProvidingFieldBridge { @Override public void set(String name, Object value, Document document, LuceneOptions luceneOptions) { @SuppressWarnings("unchecked") Map<String, String> nameParts = (Map<String, String>) value; String lastName = nameParts.get( "lastName" ); luceneOptions.addFieldToDocument( name + "_lastName", lastName, document ); luceneOptions.addSortedDocValuesFieldToDocument( name + "_lastName", lastName, document ); } @Override public void configureFieldMetadata(String name, FieldMetadataBuilder builder) { builder .field( name + "_lastName", FieldType.STRING ) .sortable( true ); } } }