/** * Copyright (c) Codice Foundation * <p> * This 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 3 of the * License, or any later version. * <p> * 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 * Lesser General Public License for more details. A copy of the GNU Lesser General Public License * is distributed along with this program and can be found at * <http://www.gnu.org/licenses/lgpl.html>. **/ package org.codice.ddf.ui.searchui.query.solr; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.solr.common.SolrInputDocument; import ddf.catalog.data.AttributeType; import ddf.catalog.data.Metacard; import ddf.catalog.data.MetacardCreationException; import ddf.catalog.filter.FilterAdapter; import ddf.catalog.operation.QueryRequest; import ddf.catalog.source.UnsupportedQueryException; import ddf.catalog.source.solr.DynamicSchemaResolver; import ddf.catalog.source.solr.SchemaFields; import ddf.catalog.source.solr.SolrFilterDelegate; import ddf.catalog.source.solr.SolrFilterDelegateFactory; public class FilteringDynamicSchemaResolver extends DynamicSchemaResolver { public static final String SOURCE_ID = "source-id"; private final Set<String> usedFields = new HashSet<>(); public FilteringDynamicSchemaResolver(FilterAdapter filterAdapter, SolrFilterDelegateFactory filterDelegateFactory, QueryRequest request) { super(); usedFields.add(Metacard.ID + SchemaFields.TEXT_SUFFIX); usedFields.add(SchemaFields.METACARD_TYPE_FIELD_NAME); SolrFilterDelegate solrFilterDelegate = filterDelegateFactory.newInstance(this); solrFilterDelegate.setSortPolicy(request.getQuery() .getSortBy()); try { filterAdapter.adapt(request.getQuery(), solrFilterDelegate); } catch (UnsupportedQueryException e) { throw new IllegalArgumentException("Unable to parse query for index filtering", e); } } @Override public String getField(String propertyName, AttributeType.AttributeFormat format, boolean isSearchedAsExactValue) { String field = super.getField(propertyName, format, isSearchedAsExactValue); usedFields.add(field); return field; } @Override public String getCaseSensitiveField(String mappedPropertyName) { String field = super.getCaseSensitiveField(mappedPropertyName); usedFields.add(field); return field; } @Override public List<String> getAnonymousField(String field) { List<String> fields = super.getAnonymousField(field); usedFields.addAll(fields); return fields; } @Override public String getWhitespaceTokenizedField(String mappedPropertyName) { String field = super.getWhitespaceTokenizedField(mappedPropertyName); usedFields.add(field); return field; } @Override public void addFields(Metacard metacard, SolrInputDocument solrInputDocument) throws MetacardCreationException { super.addFields(metacard, solrInputDocument); List<String> fieldsToRemove = new ArrayList<>(); for (String field : solrInputDocument.getFieldNames()) { if (!solrFieldUsed(field)) { fieldsToRemove.add(field); } } for (String field : fieldsToRemove) { solrInputDocument.removeField(field); } solrInputDocument.addField(SOURCE_ID + SchemaFields.TEXT_SUFFIX, metacard.getSourceId()); } private boolean solrFieldUsed(String field) { for (String usedField : usedFields) { if (usedField.contains(field)) { return true; } } return false; } }