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