org.phenotips.variantstore.db.solr.SolrUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.phenotips.variantstore.db.solr.SolrUtils.java

Source

/*
 * See the NOTICE file distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see http://www.gnu.org/licenses/
 */
package org.phenotips.variantstore.db.solr;

import java.io.IOException;
import java.util.Collection;
import java.util.function.Function;

import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.params.CursorMarkParams;

/**
 * A general utils class to help working with Solr.
 *
 * @version $Id: 7d82db02434c75af0b878cc05045878bd58af606 $
 */
public final class SolrUtils {
    private SolrUtils() {
        throw new AssertionError();
    }

    /**
     * Loop over all the documents returned by the query. This method queries the DB multiple times. Every time we get
     * data back, we pass it onto a processor, and stop processing data if the processor tells us it's had enough.
     *
     * @param server    the solr db
     * @param q         the query
     * @param uniqueKey the solr uniqueKey field to sort on. Required for solr's Cursor functionality.
     *@param processor the processor to handle the data. If the function returns true, we stop fetching more data.
     *  @throws IOException
     * @throws SolrServerException
     */
    static void processAllDocs(SolrClient server, SolrQuery q, String uniqueKey,
            Function<Collection<SolrDocument>, Boolean> processor) throws IOException, SolrServerException {
        boolean done = false;
        String oldCursorMark;
        String cursorMark = CursorMarkParams.CURSOR_MARK_START;
        QueryResponse resp;

        // Cursor functionality requires a sort containing a uniqueKey field tie breaker
        q.addSort(uniqueKey, SolrQuery.ORDER.desc);

        while (!done) {
            oldCursorMark = cursorMark;
            q.set(CursorMarkParams.CURSOR_MARK_PARAM, cursorMark);
            resp = server.query(q);
            done = processor.apply(resp.getResults());
            cursorMark = resp.getNextCursorMark();
            done = done || oldCursorMark.equals(cursorMark);
        }
    }
}