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: [email protected]
For additional commands, e-mail: [email protected]