Skip to content

v0.2.47..v0.2.48 changeset Relation.java

Garret Voltz edited this page Sep 27, 2019 · 1 revision
diff --git a/hoot-services/src/main/java/hoot/services/models/osm/Relation.java b/hoot-services/src/main/java/hoot/services/models/osm/Relation.java
index 1ec2e06..3bcf6de 100644
--- a/hoot-services/src/main/java/hoot/services/models/osm/Relation.java
+++ b/hoot-services/src/main/java/hoot/services/models/osm/Relation.java
@@ -22,7 +22,7 @@
  * This will properly maintain the copyright information. DigitalGlobe
  * copyrights will be updated automatically.
  *
- * @copyright Copyright (C) 2015, 2016, 2017 DigitalGlobe (http://www.digitalglobe.com/)
+ * @copyright Copyright (C) 2015, 2016, 2017, 2019 DigitalGlobe (http://www.digitalglobe.com/)
  */
 package hoot.services.models.osm;
 
@@ -34,6 +34,7 @@ import static hoot.services.utils.DbUtils.createQuery;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -50,6 +51,7 @@ import org.w3c.dom.Document;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.NodeList;
 
+import com.querydsl.core.Tuple;
 import com.querydsl.core.types.Projections;
 import com.querydsl.core.types.dsl.BooleanPath;
 import com.querydsl.core.types.dsl.NumberPath;
@@ -175,23 +177,48 @@ public class Relation extends Element {
                 multiLayerUniqueElementIds, addChildren);
         Document doc = parentXml.getOwnerDocument();
 
+        List<CurrentRelationMembers> members = getMembers();
+
+        Map<ElementType, Set<Long>> elementIds = new HashMap<>();
+
+        // output in sequence order; query returns list in the proper order
+        for (CurrentRelationMembers member : members) {
+            org.w3c.dom.Element memberElement = doc.createElement("member");
+            memberElement.setAttribute("type", member.getMemberType().toString().toLowerCase());
+
+            String role = member.getMemberRole();
+            if (StringUtils.isEmpty(member.getMemberRole())) {
+                memberElement.setAttribute("role", member.getMemberRole());
+                role = "";
+            }
+
+            memberElement.setAttribute("role", role);
+            memberElement.setAttribute("ref", String.valueOf(member.getMemberId()));
+            element.appendChild(memberElement);
+
+            ElementType type = Element.elementTypeForElementEnum(member.getMemberType());
+            //populate map of element types and ids
+            if (elementIds.get(type) == null) {
+                elementIds.put(type, new HashSet<Long>());
+            }
+            elementIds.get(type).add(member.getMemberId());
+        }
+
         if (addChildren) {
-            List<CurrentRelationMembers> members = getMembers();
-            // output in sequence order; query returns list in the proper order
-            for (CurrentRelationMembers member : members) {
-                org.w3c.dom.Element memberElement = doc.createElement("member");
-                memberElement.setAttribute("type", member.getMemberType().toString().toLowerCase());
-
-                String role = member.getMemberRole();
-                if (StringUtils.isEmpty(member.getMemberRole())) {
-                    memberElement.setAttribute("role", member.getMemberRole());
-                    role = "";
-                }
 
-                memberElement.setAttribute("role", role);
-                memberElement.setAttribute("ref", String.valueOf(member.getMemberId()));
-                element.appendChild(memberElement);
+            for (ElementType type : Element.elementTypesOrdered(elementIds.keySet())) {
+
+                List<Tuple> elementRecords = (List<Tuple>) Element.getElementRecordsWithUserInfo(getMapId(),
+                        type, elementIds.get(type));
+
+                for (Tuple elementRecord : elementRecords) {
+                    Element nodeFullElement = ElementFactory.create(type, elementRecord, getMapId());
+                    org.w3c.dom.Element nodeXml = nodeFullElement.toXml(parentXml, modifyingUserId,
+                            modifyingUserDisplayName, false, true);
+                    parentXml.appendChild(nodeXml);
+                }
             }
+
         }
 
         org.w3c.dom.Element elementWithTags = addTagsXml(element);
@@ -427,18 +454,6 @@ public class Relation extends Element {
 
         Map<Long, Element> parsedElements = parsedElementIdsToElementsByType.get(elementType);
 
-        // if this is an element created within the same request that is
-        // referencing this relation, it won't exist in the database, but it will be in the element cache
-        // created when parsing the element from the request
-        if (parsedMemberId < 0) {
-            if (elementType == ElementType.Relation) {
-                if (!parsedElements.containsKey(parsedMemberId)) {
-                    throw new IllegalStateException("Relation with ID: " + parsedMemberId + " does not exist for "
-                            + "relation with ID: " + getId());
-                }
-            }
-        }
-
         Element memberElement;
 
         // TODO: these comments need updating
Clone this wiki locally