/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.ambari.logsearch.dao;
import org.apache.ambari.logsearch.common.LogSearchContext;
import org.apache.ambari.logsearch.common.LogType;
import org.apache.ambari.logsearch.common.MessageEnums;
import org.apache.ambari.logsearch.conf.SolrKerberosConfig;
import org.apache.ambari.logsearch.conf.SolrPropsConfig;
import org.apache.ambari.logsearch.conf.global.SolrCollectionState;
import org.apache.ambari.logsearch.util.RESTErrorUtil;
import org.apache.ambari.logsearch.util.SolrUtil;
import org.apache.log4j.Logger;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrRequest.METHOD;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.SolrResponseBase;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.springframework.data.solr.core.DefaultQueryParser;
import org.springframework.data.solr.core.SolrCallback;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.data.solr.core.query.SolrDataQuery;
import javax.inject.Inject;
import java.io.IOException;
public abstract class SolrDaoBase {
private static final Logger LOG = Logger.getLogger(SolrDaoBase.class);
private static final Logger LOG_PERFORMANCE = Logger.getLogger("org.apache.ambari.logsearch.performance");
private LogType logType;
@Inject
private SolrKerberosConfig solrKerberosConfig;
protected SolrDaoBase(LogType logType) {
this.logType = logType;
}
public QueryResponse process(SolrQuery solrQuery, String event) {
SolrUtil.removeDoubleOrTripleEscapeFromFilters(solrQuery);
LOG.info("Solr query will be processed: " + solrQuery);
if (getSolrClient() != null) {
event = event == null ? solrQuery.get("event") : event;
solrQuery.remove("event");
try {
QueryResponse queryResponse = getSolrClient().query(solrQuery, METHOD.POST);
logSolrEvent(event, solrQuery, queryResponse);
return queryResponse;
} catch (Exception e){
LOG.error("Error during solrQuery=" + e);
throw RESTErrorUtil.createRESTException(MessageEnums.SOLR_ERROR.getMessage().getMessage(), MessageEnums.ERROR_SYSTEM);
}
} else {
throw RESTErrorUtil.createRESTException("Solr configuration improper for " + logType.getLabel() +" logs",
MessageEnums.ERROR_SYSTEM);
}
}
public UpdateResponse deleteByQuery(SolrQuery solrQuery, String event) {
SolrUtil.removeDoubleOrTripleEscapeFromFilters(solrQuery);
LOG.info("Solr delete query will be processed: " + solrQuery);
if (getSolrClient() != null) {
try {
UpdateResponse updateResponse = getSolrClient().deleteByQuery(solrQuery.getQuery());
logSolrEvent(event, solrQuery, updateResponse);
return updateResponse;
} catch (Exception e) {
LOG.error("Error during delete solrQuery=" + e);
throw RESTErrorUtil.createRESTException(MessageEnums.SOLR_ERROR.getMessage().getMessage(), MessageEnums.ERROR_SYSTEM);
}
} else {
throw RESTErrorUtil.createRESTException("Solr configuration improper for " + logType.getLabel() + " logs",
MessageEnums.ERROR_SYSTEM);
}
}
public UpdateResponse deleteByQuery(SolrDataQuery solrDataQuery, String event) {
return deleteByQuery(new DefaultQueryParser().doConstructSolrQuery(solrDataQuery), event);
}
public QueryResponse process(SolrQuery solrQuery) {
return process(solrQuery, null);
}
public QueryResponse process(SolrDataQuery solrDataQuery) {
return process(new DefaultQueryParser().doConstructSolrQuery(solrDataQuery));
}
public long count(final SolrDataQuery solrDataQuery) {
return getSolrTemplate().execute(new SolrCallback<Long>() {
@Override
public Long doInSolr(SolrClient solrClient) throws SolrServerException, IOException {
SolrQuery solrQuery = new DefaultQueryParser().doConstructSolrQuery(solrDataQuery);
solrQuery.setStart(0);
solrQuery.setRows(0);
QueryResponse queryResponse = solrClient.query(solrQuery);
long count = solrClient.query(solrQuery).getResults().getNumFound();
LOG_PERFORMANCE.info("\n Username :- " + LogSearchContext.getCurrentUsername() + " Count SolrQuery :- " +
solrQuery + "\nQuery Time Execution :- " + queryResponse.getQTime() + " Total Time Elapsed is :- " +
queryResponse.getElapsedTime() + " Count result :- " + count);
return count;
}
});
}
public QueryResponse process(SolrDataQuery solrDataQuery, String event) {
return process(new DefaultQueryParser().doConstructSolrQuery(solrDataQuery), event);
}
private void logSolrEvent(String event, SolrQuery solrQuery, SolrResponseBase solrResponseBase) {
if (event != null) {
LOG_PERFORMANCE.info("\n Username :- " + LogSearchContext.getCurrentUsername() + " Event :- " + event + " SolrQuery :- " +
solrQuery + "\nQuery Time Execution :- " + solrResponseBase.getQTime() + " Total Time Elapsed is :- " +
solrResponseBase.getElapsedTime());
}
}
public CloudSolrClient getSolrClient() {
return (CloudSolrClient) getSolrTemplate().getSolrClient();
}
public abstract SolrTemplate getSolrTemplate();
public abstract void setSolrTemplate(SolrTemplate solrTemplate);
public abstract SolrCollectionState getSolrCollectionState();
public abstract SolrPropsConfig getSolrPropsConfig();
public SolrKerberosConfig getSolrKerberosConfig() {
return this.solrKerberosConfig;
}
}