/*
 * 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.cfg.spi;

import org.hibernate.search.engine.service.spi.Service;
import org.hibernate.search.spi.IndexedTypeIdentifier;

/**
 * Contract checking that two given classes cannot share the same identifier and be two different
 * instances in the underlying datastore (or event provider).
 *
 * In the case of Hibernate ORM, the two classes would enforce id uniqueness
 * when they share the same mapped class hierarchy as ORM enforces one id definition per class hierarchy
 * amongst mapped classes.
 *
 * This {@link org.hibernate.search.engine.service.spi.Service} can be provided by the
 * {@link org.hibernate.search.cfg.spi.SearchConfiguration} implementor when it has such knowledge.
 * If no {@code IdUniquenessResolver} is enlisted as provided service, then it is assumed
 * that uniqueness cannot be guaranteed.
 *
 * This contract is used by Hibernate Search to decide whether it can optimize delete operations
 * on a given index or not.
 *
 * @author Emmanuel Bernard &lt;emmanuel@hibernate.org&gt;
 */
public interface IdUniquenessResolver extends Service {
	/**
	 * Returns {@code true} if the same identifier value cannot be shared between
	 * two class instances of {@code entityInIndex} and {@code otherEntityInIndex}.
	 * @param firstEntity one entity type
	 * @param secondEntity the other entity type
	 * @return {@code true} if the same identifier value cannot be share between
	 * two class instances of {@code entityInIndex} and {@code otherEntityInIndex}
	 */
	boolean areIdsUniqueForClasses(IndexedTypeIdentifier firstEntity, IndexedTypeIdentifier secondEntity);
}
