diff --git a/conf/solr/4.6.0/schema.xml b/conf/solr/4.6.0/schema.xml index c83ef3db81a..f9ce15085ad 100644 --- a/conf/solr/4.6.0/schema.xml +++ b/conf/solr/4.6.0/schema.xml @@ -324,7 +324,7 @@ - + @@ -593,7 +593,7 @@ - + diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Config.java b/src/main/java/edu/harvard/iq/dataverse/api/Config.java deleted file mode 100644 index f6c9b8f13e8..00000000000 --- a/src/main/java/edu/harvard/iq/dataverse/api/Config.java +++ /dev/null @@ -1,113 +0,0 @@ -package edu.harvard.iq.dataverse.api; - -import edu.harvard.iq.dataverse.search.SearchFields; -import edu.harvard.iq.dataverse.DatasetFieldType; -import edu.harvard.iq.dataverse.DatasetFieldServiceBean; -import edu.harvard.iq.dataverse.SolrField; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Logger; -import javax.ejb.EJB; -import javax.ws.rs.GET; -import javax.ws.rs.Path; - -@Path("config") -public class Config extends AbstractApiBean { - - private static final Logger logger = Logger.getLogger(Config.class.getCanonicalName()); - - @EJB - DatasetFieldServiceBean datasetFieldService; - - /** - * We use the output of this method to generate our Solr schema.xml - * - * @todo Someday we do want to have this return a Response rather than a - * String per https://github.com/IQSS/dataverse/issues/298 but not yet while - * we are trying to ship Dataverse 4.0 - */ - @GET - @Path("solr/schema") - public String getSolrSchema() { - - StringBuilder sb = new StringBuilder(); - - for (DatasetFieldType datasetField : datasetFieldService.findAllOrderedByName()) { - String nameSearchable = datasetField.getSolrField().getNameSearchable(); - SolrField.SolrType solrType = datasetField.getSolrField().getSolrType(); - String type = solrType.getType(); - if (solrType.equals(SolrField.SolrType.EMAIL)) { - /** - * @todo should we also remove all "email" field types (e.g. - * datasetContact) from schema.xml? We are explicitly not - * indexing them for - * https://github.com/IQSS/dataverse/issues/759 - * - * "The list of potential collaborators should be searchable" - * according to https://github.com/IQSS/dataverse/issues/747 but - * it's not clear yet if this means a Solr or database search. - * For now we'll keep schema.xml as it is to avoid people having - * to update it. If anything, we can remove the email field type - * when we do a big schema.xml update for - * https://github.com/IQSS/dataverse/issues/754 - */ - logger.info("email type detected (" + nameSearchable + ") See also https://github.com/IQSS/dataverse/issues/759"); - } - String multivalued = datasetField.getSolrField().isAllowedToBeMultivalued().toString(); - // - sb.append(" \n"); - } - - List listOfStaticFields = new ArrayList(); - Object searchFieldsObject = new SearchFields(); - Field[] staticSearchFields = searchFieldsObject.getClass().getDeclaredFields(); - for (Field fieldObject : staticSearchFields) { - String name = fieldObject.getName(); - String staticSearchField = null; - try { - staticSearchField = (String) fieldObject.get(searchFieldsObject); - } catch (IllegalArgumentException ex) { - } catch (IllegalAccessException ex) { - } - - /** - * @todo: if you search for "pdf" should you get all pdfs? do we - * need a copyField source="filetypemime_s" to the catchall? - */ - if (listOfStaticFields.contains(staticSearchField)) { - return error("static search field defined twice: " + staticSearchField); - } - listOfStaticFields.add(staticSearchField); - } - - sb.append("---\n"); - - for (DatasetFieldType datasetField : datasetFieldService.findAllOrderedByName()) { - String nameSearchable = datasetField.getSolrField().getNameSearchable(); - String nameFacetable = datasetField.getSolrField().getNameFacetable(); - - if (listOfStaticFields.contains(nameSearchable)) { - if (nameSearchable.equals(SearchFields.DATASET_DESCRIPTION)) { - // Skip, expected conflct. - } else { - return error("searchable dataset metadata field conflict detected with static field: " + nameSearchable); - } - } - - if (listOfStaticFields.contains(nameFacetable)) { - if (nameFacetable.equals(SearchFields.SUBJECT)) { - // Skip, expected conflct. - } else { - return error("facetable dataset metadata field conflict detected with static field: " + nameFacetable); - } - } - - // - sb.append(" \n"); - } - - return sb.toString(); - } - -} diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Index.java b/src/main/java/edu/harvard/iq/dataverse/api/Index.java index 2c4d62c55f3..dab6d594fa2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Index.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Index.java @@ -3,6 +3,8 @@ import edu.harvard.iq.dataverse.DataFile; import edu.harvard.iq.dataverse.DataFileServiceBean; import edu.harvard.iq.dataverse.Dataset; +import edu.harvard.iq.dataverse.DatasetFieldServiceBean; +import edu.harvard.iq.dataverse.DatasetFieldType; import edu.harvard.iq.dataverse.DatasetServiceBean; import edu.harvard.iq.dataverse.Dataverse; import edu.harvard.iq.dataverse.DataverseServiceBean; @@ -11,6 +13,7 @@ import edu.harvard.iq.dataverse.IndexServiceBean; import edu.harvard.iq.dataverse.RoleAssignment; import edu.harvard.iq.dataverse.SearchServiceBean; +import edu.harvard.iq.dataverse.SolrField; import edu.harvard.iq.dataverse.SolrQueryResponse; import edu.harvard.iq.dataverse.SolrSearchResult; import edu.harvard.iq.dataverse.authorization.users.User; @@ -22,10 +25,12 @@ import edu.harvard.iq.dataverse.search.SearchFields; import edu.harvard.iq.dataverse.search.SolrIndexServiceBean; import edu.harvard.iq.dataverse.search.SortBy; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.concurrent.Future; +import java.util.logging.Logger; import javax.ejb.EJB; import javax.ejb.EJBException; import javax.json.Json; @@ -44,6 +49,8 @@ @Path("admin/index") public class Index extends AbstractApiBean { + private static final Logger logger = Logger.getLogger(Index.class.getCanonicalName()); + @EJB IndexServiceBean indexService; @EJB @@ -62,6 +69,8 @@ public class Index extends AbstractApiBean { SolrIndexServiceBean SolrIndexService; @EJB SearchServiceBean searchService; + @EJB + DatasetFieldServiceBean datasetFieldService; @GET public Response indexAllOrSubset(@QueryParam("numPartitions") Long numPartitionsSelected, @QueryParam("partitionIdToProcess") Long partitionIdToProcess, @QueryParam("previewOnly") boolean previewOnly) { @@ -367,6 +376,96 @@ private JsonObjectBuilder getPermissionsInSolrButNotDatabase() { .add("dvobjects", stalePermissionList.build().size()); } + /** + * We use the output of this method to generate our Solr schema.xml + * + * @todo Someday we do want to have this return a Response rather than a + * String per https://github.com/IQSS/dataverse/issues/298 but not yet while + * we are trying to ship Dataverse 4.0. + */ + @GET + @Path("solr/schema") + public String getSolrSchema() { + + StringBuilder sb = new StringBuilder(); + + for (DatasetFieldType datasetField : datasetFieldService.findAllOrderedByName()) { + String nameSearchable = datasetField.getSolrField().getNameSearchable(); + SolrField.SolrType solrType = datasetField.getSolrField().getSolrType(); + String type = solrType.getType(); + if (solrType.equals(SolrField.SolrType.EMAIL)) { + /** + * @todo should we also remove all "email" field types (e.g. + * datasetContact) from schema.xml? We are explicitly not + * indexing them for + * https://github.com/IQSS/dataverse/issues/759 + * + * "The list of potential collaborators should be searchable" + * according to https://github.com/IQSS/dataverse/issues/747 but + * it's not clear yet if this means a Solr or database search. + * For now we'll keep schema.xml as it is to avoid people having + * to update it. If anything, we can remove the email field type + * when we do a big schema.xml update for + * https://github.com/IQSS/dataverse/issues/754 + */ + logger.info("email type detected (" + nameSearchable + ") See also https://github.com/IQSS/dataverse/issues/759"); + } + String multivalued = datasetField.getSolrField().isAllowedToBeMultivalued().toString(); + // + sb.append(" \n"); + } + + List listOfStaticFields = new ArrayList(); + Object searchFieldsObject = new SearchFields(); + Field[] staticSearchFields = searchFieldsObject.getClass().getDeclaredFields(); + for (Field fieldObject : staticSearchFields) { + String name = fieldObject.getName(); + String staticSearchField = null; + try { + staticSearchField = (String) fieldObject.get(searchFieldsObject); + } catch (IllegalArgumentException ex) { + } catch (IllegalAccessException ex) { + } + + /** + * @todo: if you search for "pdf" should you get all pdfs? do we + * need a copyField source="filetypemime_s" to the catchall? + */ + if (listOfStaticFields.contains(staticSearchField)) { + return error("static search field defined twice: " + staticSearchField); + } + listOfStaticFields.add(staticSearchField); + } + + sb.append("---\n"); + + for (DatasetFieldType datasetField : datasetFieldService.findAllOrderedByName()) { + String nameSearchable = datasetField.getSolrField().getNameSearchable(); + String nameFacetable = datasetField.getSolrField().getNameFacetable(); + + if (listOfStaticFields.contains(nameSearchable)) { + if (nameSearchable.equals(SearchFields.DATASET_DESCRIPTION)) { + // Skip, expected conflct. + } else { + return error("searchable dataset metadata field conflict detected with static field: " + nameSearchable); + } + } + + if (listOfStaticFields.contains(nameFacetable)) { + if (nameFacetable.equals(SearchFields.SUBJECT)) { + // Skip, expected conflct. + } else { + return error("facetable dataset metadata field conflict detected with static field: " + nameFacetable); + } + } + + // + sb.append(" \n"); + } + + return sb.toString(); + } + /** * This method is for integration tests of search. */ diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SearchFields.java b/src/main/java/edu/harvard/iq/dataverse/search/SearchFields.java index d8dbf58b499..af62702fdde 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SearchFields.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SearchFields.java @@ -7,8 +7,8 @@ * Note that there are many fields in Solr that are *not* here because their * values come from the database. For example "authorName" comes from the * database. We update the Solr schema.xml file by merging the output of `curl - * http://localhost:8080/api/config/solr/schema` into the file in the source - * tree when a metadata block update warrants it. + * http://localhost:8080/api/admin/index/solr/schema` into the file in the + * source tree when a metadata block update warrants it. * * Generally speaking, we want the search fields to be readable. This is a * challenge for long field names but a power user should be able to type