diff --git a/src/main/java/edu/tamu/scholars/middleware/discovery/controller/IndividualController.java b/src/main/java/edu/tamu/scholars/middleware/discovery/controller/IndividualController.java index 52074268f..f2a425fb3 100644 --- a/src/main/java/edu/tamu/scholars/middleware/discovery/controller/IndividualController.java +++ b/src/main/java/edu/tamu/scholars/middleware/discovery/controller/IndividualController.java @@ -75,7 +75,7 @@ public ResponseEntity> get( } @GetMapping("/individual/{id}") - public ResponseEntity individual(@PathVariable String id) { + public ResponseEntity individual(@PathVariable(required = true) String id) { Optional individual = repo.findById(id); if (individual.isPresent()) { return ResponseEntity.ok(assembler.toModel(individual.get())); diff --git a/src/main/java/edu/tamu/scholars/middleware/discovery/service/IndexService.java b/src/main/java/edu/tamu/scholars/middleware/discovery/service/IndexService.java index e64d7b499..a725abeff 100644 --- a/src/main/java/edu/tamu/scholars/middleware/discovery/service/IndexService.java +++ b/src/main/java/edu/tamu/scholars/middleware/discovery/service/IndexService.java @@ -83,7 +83,9 @@ public Map> getScaffold() { return SCAFFOLD; } - public List> getSchema() { + // TODO: type out the response from Solr or not + public Map getSchema() { + Map schema = new HashMap<>(); Optional fieldsRes = Optional.empty(); Optional response = Optional.ofNullable(this.ping()); @@ -104,8 +106,15 @@ public List> getSchema() { } if (fieldsRes.isPresent()) { - return fieldsRes.map(fr -> fr.getFields()) - .get(); + fieldsRes.map(fr -> fr.getFields()) + .get() + .stream() + .forEach(field -> { + String name = (String) field.get("name"); + field.remove("name"); + schema.put(name, field); + }); + return schema; } throw new RuntimeException("fields request failed"); @@ -135,15 +144,11 @@ public void startup() { if (status == 0) { logger.info("Initializing index fields for {}", index.getName()); - Map details = new HashMap(); - - details.put("schema", getSchema()); - - // suspecting some issues without shallow clone of response from Solr + Map schema = getSchema(); indexers.stream().forEach(indexer -> { logger.info("Initializing fields for {}", indexer.name()); - indexer.init((List>) details.get("schema")); + indexer.init(schema); }); } else { logger.warn("Unable to connect to Solr collection {}", index.getName()); diff --git a/src/main/java/edu/tamu/scholars/middleware/discovery/service/component/Indexer.java b/src/main/java/edu/tamu/scholars/middleware/discovery/service/component/Indexer.java index 76873834f..6f6c50073 100644 --- a/src/main/java/edu/tamu/scholars/middleware/discovery/service/component/Indexer.java +++ b/src/main/java/edu/tamu/scholars/middleware/discovery/service/component/Indexer.java @@ -1,7 +1,6 @@ package edu.tamu.scholars.middleware.discovery.service.component; import java.util.Collection; -import java.util.List; import java.util.Map; import edu.tamu.scholars.middleware.discovery.model.AbstractIndexDocument; @@ -19,7 +18,7 @@ public interface Indexer { /** * Everything the application needs the solr collection to have specified. */ - public void init(List> schema); + public void init(Map schema); /** * Index a batch of abstract index documents. diff --git a/src/main/java/edu/tamu/scholars/middleware/discovery/service/component/NamedTypedField.java b/src/main/java/edu/tamu/scholars/middleware/discovery/service/component/NamedTypedField.java index c6eada30b..683fe2408 100644 --- a/src/main/java/edu/tamu/scholars/middleware/discovery/service/component/NamedTypedField.java +++ b/src/main/java/edu/tamu/scholars/middleware/discovery/service/component/NamedTypedField.java @@ -11,4 +11,9 @@ public class NamedTypedField { public String name; public FieldType fieldType; public Field field; + + @Override + public String toString() { + return name; + } } diff --git a/src/main/java/edu/tamu/scholars/middleware/discovery/service/component/solr/SolrIndexer.java b/src/main/java/edu/tamu/scholars/middleware/discovery/service/component/solr/SolrIndexer.java index 6bcb70121..a35b84145 100644 --- a/src/main/java/edu/tamu/scholars/middleware/discovery/service/component/solr/SolrIndexer.java +++ b/src/main/java/edu/tamu/scholars/middleware/discovery/service/component/solr/SolrIndexer.java @@ -9,6 +9,7 @@ import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Objects; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.request.schema.SchemaRequest; @@ -55,7 +56,7 @@ public void scaffold() { } @Override - public void init(List> schema) { + public void init(Map schema) { if (!index.isInitOnStartup()) { return; } @@ -65,24 +66,49 @@ public void init(List> schema) { .filter(ntf -> CREATED_FIELDS.add(ntf.name)) .forEach(ntf -> { - logger.info("Adding field {}.{}", this.name(), ntf.name); - - // check if field is an existing property in schema - SchemaRequest.AddField addFieldRequest = SolrSchemaUtility.addFieldRequest(ntf); + Map field = (Map) schema.get(ntf.name); + if (Objects.nonNull(field)) { + + logger.info("Field {}.{} already exists", this.name(), ntf.name); + + // TODO: type these maps or not + // TODO: match version and declared field type in case field type definition changes + if (!field.get("type").equals(ntf.fieldType.type())) { + logger.error("Scaffold to Index type mismatch!!"); + logger.debug("\tntf.name: " + ntf.name); + logger.debug("\tntf.fieldType.readonly: " + ntf.fieldType.readonly()); + logger.debug("\tntf.fieldType.stored: " + ntf.fieldType.stored()); + logger.debug("\tntf.fieldType.searchable: " + ntf.fieldType.searchable()); + logger.debug("\tntf.fieldType.type: " + ntf.fieldType.type()); + logger.debug("\tntf.fieldType.copyTo: " + ntf.fieldType.copyTo()); + logger.debug("\tntf.fieldType.defaultValue: " + ntf.fieldType.defaultValue()); + logger.debug("\tntf.fieldType.required: " + ntf.fieldType.required()); + logger.debug("\tntf.fieldType.name: " + ntf.fieldType.name()); + logger.debug("\tntf.fieldType.value: " + ntf.fieldType.value()); + + logger.debug("\tfield: " + field); + } + } else { + // create field and copy fields + logger.info("Adding new field {}.{}", this.name(), ntf.name); - try { - addFieldRequest.process(solrClient, COLLECTION); - } catch (Exception e) { - logger.debug("Failed to add field", e); - } + // check if field is an existing property in schema + SchemaRequest.AddField addFieldRequest = SolrSchemaUtility.addFieldRequest(ntf); - if (ntf.fieldType.copyTo().length > 0) { - logger.info("Adding copy field {}.{} => {}", this.name(), ntf.name, Arrays.asList(ntf.fieldType.copyTo())); - SchemaRequest.AddCopyField addCopyFieldRequest = SolrSchemaUtility.addCopyFieldRequest(ntf); try { - addCopyFieldRequest.process(solrClient, COLLECTION); + addFieldRequest.process(solrClient, COLLECTION); } catch (Exception e) { - logger.debug("Failed to add copy field", e); + logger.debug("Failed to add field", e); + } + + if (ntf.fieldType.copyTo().length > 0) { + logger.info("Adding copy field {}.{} => {}", this.name(), ntf.name, Arrays.asList(ntf.fieldType.copyTo())); + SchemaRequest.AddCopyField addCopyFieldRequest = SolrSchemaUtility.addCopyFieldRequest(ntf); + try { + addCopyFieldRequest.process(solrClient, COLLECTION); + } catch (Exception e) { + logger.debug("Failed to add copy field", e); + } } } });