/**
* SolrFederateSearchConnector.java
* Copyright 2015 by Burkhard Buelte
* First released 19.01.2015 at http://yacy.net
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library 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 program in the file lgpl21.txt If not, see
* <http://www.gnu.org/licenses/>.
*/
package net.yacy.cora.federate;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import net.yacy.cora.federate.solr.connector.RemoteSolrConnector;
import net.yacy.cora.federate.solr.connector.SolrConnector;
import net.yacy.cora.federate.solr.instance.RemoteInstance;
import net.yacy.cora.util.ConcurrentLog;
import net.yacy.kelondro.data.meta.URIMetadataNode;
import net.yacy.search.Switchboard;
import net.yacy.search.SwitchboardConstants;
import net.yacy.search.query.QueryParams;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.params.ModifiableSolrParams;
/**
* Search connecter to collect query results from remote Solr systems which
* provide results as Solr documents
*/
public class SolrFederateSearchConnector extends AbstractFederateSearchConnector {
private String corename;
@Override
public boolean init(String instance, String cfgFileName) {
boolean initResult = super.init(instance, cfgFileName); // init local schema cfg
if (initResult) {
if (this.localcfg.contains("_baseurl")) {
setBaseurl(this.localcfg.get("_baseurl").getValue());
} else {
ConcurrentLog.config(instance, "no _baseurl given in config file "+cfgFileName);
initResult = false;
}
if (this.localcfg.contains("_corename")) {
setCoreName(this.localcfg.get("_corename").getValue());
} else {
ConcurrentLog.config(instance, "no _corename given in config file "); // not mandatory
this.corename = "";
}
}
return initResult;
}
public void setBaseurl(String url) {
if (url.endsWith("/")) {
this.baseurl = url;
} else {
this.baseurl = url + "/";
}
}
public void setCoreName(String core) {
this.corename = core;
}
/**
* Core query implementation
* all query and search routines will use this routine to query the remote system
*
* @param query
* @return list of solr documents (metadata) accordng to local YaCy internal schema
*/
@Override
public List<URIMetadataNode> query(QueryParams query) {
List<URIMetadataNode> docs = new ArrayList<URIMetadataNode>();
Collection<String> remotecorename = new ArrayList<String>();
remotecorename.add(corename);
ModifiableSolrParams msp = new SolrQuery(query.getQueryGoal().getQueryString(false));
msp.add(CommonParams.QT, "/"); // important to override default append of /select
msp.add(CommonParams.ROWS, Integer.toString(query.itemsPerPage));
try {
RemoteInstance instance = new RemoteInstance(baseurl, remotecorename, corename, 20000);
try {
boolean useBinaryResponseWriter = SwitchboardConstants.REMOTE_SOLR_BINARY_RESPONSE_ENABLED_DEFAULT;
if (Switchboard.getSwitchboard() != null) {
useBinaryResponseWriter = Switchboard.getSwitchboard().getConfigBool(
SwitchboardConstants.REMOTE_SOLR_BINARY_RESPONSE_ENABLED,
SwitchboardConstants.REMOTE_SOLR_BINARY_RESPONSE_ENABLED_DEFAULT);
}
SolrConnector solrConnector = new RemoteSolrConnector(instance, useBinaryResponseWriter);
try {
this.lastaccesstime = System.currentTimeMillis();
SolrDocumentList docList = solrConnector.getDocumentListByParams(msp);
// convert to YaCy schema documentlist
for (SolrDocument doc : docList) {
try {
URIMetadataNode anew = toYaCySchema(doc);
docs.add(anew);
} catch (MalformedURLException ex) { }
}
} catch (IOException | SolrException e) {
} finally {
solrConnector.close();
}
} catch (Throwable ee) {
} finally {
instance.close();
}
} catch (IOException eee) {
}
return docs;
}
}