Github user dsmiley commented on a diff in the pull request: https://github.com/apache/lucene-solr/pull/395#discussion_r194768590 --- Diff: solr/core/src/java/org/apache/solr/handler/loader/JsonLoader.java --- @@ -556,82 +572,71 @@ private void parseFieldValue(SolrInputField sif) throws IOException { if (ev == JSONParser.OBJECT_START) { parseExtendedFieldValue(sif, ev); } else { - Object val = parseNormalFieldValue(ev, sif.getName()); + Object val = parseNormalFieldValue(ev, sif); sif.setValue(val); } } private void parseExtendedFieldValue(SolrInputField sif, int ev) throws IOException { assert ev == JSONParser.OBJECT_START; - Object normalFieldValue = null; - Map<String, Object> extendedInfo = null; + SolrInputDocument extendedSolrDocument = generateExtendedValueDoc(ev); - for (; ; ) { - ev = parser.nextEvent(); - switch (ev) { - case JSONParser.STRING: - String label = parser.getString(); - if ("boost".equals(label)) { - ev = parser.nextEvent(); - if (ev != JSONParser.NUMBER && - ev != JSONParser.LONG && - ev != JSONParser.BIGNUMBER) { - throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Boost should have number. " - + "Unexpected " + JSONParser.getEventString(ev) + " at [" + parser.getPosition() + "], field=" + sif.getName()); - } + if (isChildDoc(extendedSolrDocument)) { + SolrInputDocument cDoc = new SolrInputDocument(); + for (Map.Entry<String, SolrInputField> extendedEntry: extendedSolrDocument.entrySet()) { + cDoc.setField(extendedEntry.getKey(), extendedEntry.getValue().getValue()); + } + sif.addValue(cDoc); + return; + } - String message = "Ignoring field boost: " + parser.getDouble() + " as index-time boosts are not supported anymore"; - if (WARNED_ABOUT_INDEX_TIME_BOOSTS.compareAndSet(false, true)) { - log.warn(message); - } else { - log.debug(message); - } - } else if ("value".equals(label)) { - normalFieldValue = parseNormalFieldValue(parser.nextEvent(), sif.getName()); - } else { - // If we encounter other unknown map keys, then use a map - if (extendedInfo == null) { - extendedInfo = new HashMap<>(2); - } - // for now, the only extended info will be field values - // we could either store this as an Object or a SolrInputField - Object val = parseNormalFieldValue(parser.nextEvent(), sif.getName()); - extendedInfo.put(label, val); - } - break; + Object normalFieldValue = null; + Map<String, Object> extendedInfo = null; - case JSONParser.OBJECT_END: - if (extendedInfo != null) { - if (normalFieldValue != null) { - extendedInfo.put("value", normalFieldValue); - } - sif.setValue(extendedInfo); - } else { - sif.setValue(normalFieldValue); - } - return; + for (String label: extendedSolrDocument.keySet() ) { --- End diff -- Whenever I see looping over keys from a map-like thing, I often see a line of code that then fetches the value, as seen here. This internally results in a bunch of lookups that aren't necessary. Instead, note that SolrInputDocument is Iterable<SolrInputField> (which itself has the key and value), so just loop over that.
--- --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@lucene.apache.org For additional commands, e-mail: dev-h...@lucene.apache.org