From 7580099c792558290753180f050e6a13762eef9e Mon Sep 17 00:00:00 2001 From: David Schlosnagle Date: Sat, 1 Jul 2023 15:31:09 -0400 Subject: [PATCH] Optimize ObjectNode findValue(s) and findParent(s) fast paths --- .../jackson/databind/node/ObjectNode.java | 82 +++++++++++-------- 1 file changed, 46 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/databind/node/ObjectNode.java b/src/main/java/com/fasterxml/jackson/databind/node/ObjectNode.java index 80a8fd60fc..35db7d578c 100644 --- a/src/main/java/com/fasterxml/jackson/databind/node/ObjectNode.java +++ b/src/main/java/com/fasterxml/jackson/databind/node/ObjectNode.java @@ -327,11 +327,13 @@ public boolean equals(Comparator comparator, JsonNode o) @Override public JsonNode findValue(String propertyName) { - for (Map.Entry entry : _children.entrySet()) { - if (propertyName.equals(entry.getKey())) { - return entry.getValue(); - } - JsonNode value = entry.getValue().findValue(propertyName); + JsonNode jsonNode = _children.get(propertyName); + if (jsonNode != null) { + return jsonNode; + } + + for (JsonNode child : _children.values()) { + JsonNode value = child.findValue(propertyName); if (value != null) { return value; } @@ -342,15 +344,18 @@ public JsonNode findValue(String propertyName) @Override public List findValues(String propertyName, List foundSoFar) { - for (Map.Entry entry : _children.entrySet()) { - if (propertyName.equals(entry.getKey())) { - if (foundSoFar == null) { - foundSoFar = new ArrayList(); - } - foundSoFar.add(entry.getValue()); - } else { // only add children if parent not added - foundSoFar = entry.getValue().findValues(propertyName, foundSoFar); + JsonNode jsonNode = _children.get(propertyName); + if (jsonNode != null) { + if (foundSoFar == null) { + foundSoFar = new ArrayList<>(); } + foundSoFar.add(jsonNode); + return foundSoFar; + } + + // only add children if parent not added + for (JsonNode child : _children.values()) { + foundSoFar = child.findValues(propertyName, foundSoFar); } return foundSoFar; } @@ -358,16 +363,18 @@ public List findValues(String propertyName, List foundSoFar) @Override public List findValuesAsText(String propertyName, List foundSoFar) { - for (Map.Entry entry : _children.entrySet()) { - if (propertyName.equals(entry.getKey())) { - if (foundSoFar == null) { - foundSoFar = new ArrayList(); - } - foundSoFar.add(entry.getValue().asText()); - } else { // only add children if parent not added - foundSoFar = entry.getValue().findValuesAsText(propertyName, - foundSoFar); + JsonNode jsonNode = _children.get(propertyName); + if (jsonNode != null) { + if (foundSoFar == null) { + foundSoFar = new ArrayList<>(); } + foundSoFar.add(jsonNode.asText()); + return foundSoFar; + } + + // only add children if parent not added + for (JsonNode child : _children.values()) { + foundSoFar = child.findValuesAsText(propertyName, foundSoFar); } return foundSoFar; } @@ -375,11 +382,12 @@ public List findValuesAsText(String propertyName, List foundSoFa @Override public ObjectNode findParent(String propertyName) { - for (Map.Entry entry : _children.entrySet()) { - if (propertyName.equals(entry.getKey())) { - return this; - } - JsonNode value = entry.getValue().findParent(propertyName); + JsonNode jsonNode = _children.get(propertyName); + if (jsonNode != null) { + return this; + } + for (JsonNode child : _children.values()) { + JsonNode value = child.findParent(propertyName); if (value != null) { return (ObjectNode) value; } @@ -390,16 +398,18 @@ public ObjectNode findParent(String propertyName) @Override public List findParents(String propertyName, List foundSoFar) { - for (Map.Entry entry : _children.entrySet()) { - if (propertyName.equals(entry.getKey())) { - if (foundSoFar == null) { - foundSoFar = new ArrayList(); - } - foundSoFar.add(this); - } else { // only add children if parent not added - foundSoFar = entry.getValue() - .findParents(propertyName, foundSoFar); + JsonNode jsonNode = _children.get(propertyName); + if (jsonNode != null) { + if (foundSoFar == null) { + foundSoFar = new ArrayList<>(); } + foundSoFar.add(this); + return foundSoFar; + } + + // only add children if parent not added + for (JsonNode child : _children.values()) { + foundSoFar = child.findParents(propertyName, foundSoFar); } return foundSoFar; }