/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* JBoss, Home of Professional Open Source
* Copyright 2011 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @authors tag. All rights reserved.
* See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* 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, v. 2.1.
* This program is distributed in the hope that it will be useful, but WITHOUT A
* 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,
* v.2.1 along with this distribution; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package org.hibernate.search.backend.impl;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import org.hibernate.search.backend.IndexingMonitor;
import org.hibernate.search.backend.LuceneWork;
import org.hibernate.search.indexes.spi.IndexManager;
/**
* Used by {@link org.hibernate.search.backend.impl.ContextAwareSelectionDelegate} to split a list of operations
* according to the multiple IndexManagers it needs to be routed to.
*
* @author Sanne Grinovero <sanne@hibernate.org> (C) 2011 Red Hat Inc.
*/
public class WorkQueuePerIndexSplitter {
private final HashMap<String,WorkPlan> queues = new HashMap<String,WorkPlan>();
/**
* @param indexManager
*/
public List<LuceneWork> getIndexManagerQueue(final IndexManager indexManager) {
final String indexName = indexManager.getIndexName();
WorkPlan plan = queues.get( indexName );
if ( plan == null ) {
plan = new WorkPlan( indexManager );
queues.put( indexName, plan );
}
return plan.queue;
}
/**
* Send all operations stored so far to the backend to be performed, atomically and/or transactionally
* if supported/enabled by each specific backend.
*
* @param monitor a {@link org.hibernate.search.backend.IndexingMonitor} object.
*/
public void commitOperations(IndexingMonitor monitor) {
// FIXME move executor here to parallel work - optionally? See HSEARCH-826
for ( WorkPlan plan : queues.values() ) {
plan.indexManager.performOperations( plan.queue, monitor );
}
}
private static class WorkPlan {
private final IndexManager indexManager;
private final LinkedList<LuceneWork> queue = new LinkedList<LuceneWork>();
WorkPlan(IndexManager indexManager) {
this.indexManager = indexManager;
}
}
}