/* * Hibernate, Relational Persistence for Idiomatic Java * * Copyright (c) 2010, Red Hat, Inc. and/or its affiliates or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat, Inc. * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package org.hibernate.search.reader.impl; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.MultiReader; import org.hibernate.search.indexes.spi.ReaderProvider; /** * MultiReader ensuring equals returns true if the underlying readers are the same (and in the same order) * Especially useful when using {@link org.apache.lucene.search.CachingWrapperFilter} * * @author Emmanuel Bernard * @author Sanne Grinovero <sanne@hibernate.org> (C) 2011 Red Hat Inc. */ public class CacheableMultiReader extends MultiReader { // This is package private as the intention of the Lucene team seems to be to not // expose this publically (it's a protected member in Lucene 2.3) final IndexReader[] subReaders; final ReaderProvider[] managers; public CacheableMultiReader(IndexReader[] subReaders, ReaderProvider[] managers) { // If this flag isn't set to true, the MultiReader will increase the usage counter! super( subReaders, true ); this.subReaders = subReaders; this.managers = managers; } @Override public boolean equals(Object obj) { // Equality only checks for subReaders as an equal sub-IndexReader is certainly coming from the same ReaderProvider. if ( this == obj ) return true; if ( !( obj instanceof CacheableMultiReader ) ) return false; CacheableMultiReader that = (CacheableMultiReader) obj; int length = this.subReaders.length; if ( length != that.subReaders.length ) return false; for (int index = 0; index < length; index++) { if ( !this.subReaders[index].equals( that.subReaders[index] ) ) return false; } return true; } @Override public int hashCode() { int result = 0; for (Object reader : this.subReaders) { result = 31 * result + reader.hashCode(); } return result; } }