package com.temenos.interaction.commands.solr;
/*
* #%L
* interaction-commands-solr
* %%
* Copyright (C) 2012 - 2013 Temenos Holdings N.V.
* %%
* 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 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/>.
* #L%
*/
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.solr.client.solrj.response.TermsResponse.Term;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import com.temenos.interaction.core.entity.Entity;
import com.temenos.interaction.core.entity.EntityProperties;
import com.temenos.interaction.core.entity.EntityProperty;
import com.temenos.interaction.core.resource.CollectionResource;
import com.temenos.interaction.core.resource.EntityResource;
import com.temenos.interaction.odataext.odataparser.data.RowFilter;
public abstract class AbstractSolrCommand {
// Root of the Solr URL
protected String solrRootURL;
static final int MAX_ENTITIES_RETURNED = 50;
public CollectionResource<Entity> buildCollectionResource(String entityName, SolrDocumentList docs) {
List<EntityResource<Entity>> results = new ArrayList<EntityResource<Entity>>();
long numFound = docs.getNumFound();
for (int i = 0; i < MAX_ENTITIES_RETURNED && i < numFound; i++) {
EntityProperties properties = new EntityProperties();
SolrDocument doc = docs.get(i);
Collection<String> fields = doc.getFieldNames();
for (String propName : fields) {
properties.setProperty(new EntityProperty(propName, doc.getFirstValue(propName)));
}
// Give some control to user if they have something in mind
customizeEntityProperties(doc, properties);
// Build the entity as is
Entity entity = new Entity(entityName, properties);
results.add(new EntityResource<Entity>(entityName, entity));
}
return new CollectionResource<Entity>(results) {};
}
/**
* TODO : Remove this method as I am not sure why we have this?
* @param entityName
* @param termName
* @param termMap
* @return
*/
public CollectionResource<Entity> buildCollectionResource(String entityName, String termName, Map<String, List<Term>> termMap) {
List<EntityResource<Entity>> results = new ArrayList<EntityResource<Entity>>();
List<Term> terms = termMap.get(termName);
for (Term t : terms) {
EntityProperties properties = new EntityProperties();
properties.setProperty(new EntityProperty(termName, t.getTerm()));
Entity entity = new Entity(entityName, properties);
results.add(new EntityResource<Entity>(entityName, entity));
}
return new CollectionResource<Entity>(results) {};
}
/**
* This method will update all filter fieldName to 'text'
* @param rowFilters
* @return
*/
protected List<RowFilter> toSolrTextFieldFilter(List<RowFilter> rowFilters) {
return toSolrFieldFilters(rowFilters, "text");
}
/*
* Sometime we would like to search everything agains one field, so convert here, simply pass the
* taregt field name as text
*/
protected List<RowFilter> toSolrFieldFilters(List<RowFilter> rowFilters, String solrFieldName) {
if (rowFilters != null && solrFieldName != null && !solrFieldName.isEmpty()) {
List<RowFilter> solrFieldFilters = new ArrayList<RowFilter>();
for (RowFilter filter : rowFilters) {
if (filter != null) // Filter all null objects if there is any
solrFieldFilters.add(toSolrFieldFilter(filter, solrFieldName));
}
return solrFieldFilters;
}
return new ArrayList<RowFilter>();
}
protected RowFilter toSolrFieldFilter(RowFilter filter, String solrFieldName) {
if (filter != null && solrFieldName != null && !solrFieldName.isEmpty()) {
return new RowFilter(solrFieldName, filter.getRelation(), filter.getValue());
}
return null;
}
/**
* This method will be called before constructing a final entity so that
* caller can customize the results if required, for example apply select
* or filter on result set which was not possible at query time
* @param doc
* @param properties
*/
protected abstract void customizeEntityProperties(SolrDocument doc, EntityProperties properties);
}