protected RelationMemberList getOldMembers() { return this.relation.members(); }
@Override public Iterator<RelationMember> iterator() { return members().iterator(); }
private Stream<AtlasItem> leafMembers() { final Stream<AtlasItem> nonRelationMembers = members().stream() .map(RelationMember::getEntity).filter(entity -> !(entity instanceof Relation)) .map(entity -> (AtlasItem) entity); final Stream<AtlasItem> relationMembers = members().stream().map(RelationMember::getEntity) .filter(entity -> entity instanceof Relation).map(entity -> (Relation) entity) .flatMap(Relation::leafMembers); return Stream.concat(nonRelationMembers, relationMembers); } }
private boolean isSameRoadViaAndTo(final Relation relation) { final Set<Long> fromIdentifiers = new TreeSet<>(); final Set<Long> toIdentifiers = new TreeSet<>(); relation.members().stream().filter(member -> "to".equals(member.getRole())) .forEach(member -> toIdentifiers.add(member.getEntity().getIdentifier())); relation.members().stream().filter(member -> "from".equals(member.getRole())) .forEach(member -> fromIdentifiers.add(member.getEntity().getIdentifier())); return fromIdentifiers.equals(toIdentifiers); }
private boolean differentRelations(final Relation baseRelation, final Relation alterRelation) { try { final RelationMemberList baseMembers = baseRelation.members(); final RelationMemberList alterMembers = alterRelation.members(); return !baseMembers.equals(alterMembers) && !differentRelationMemberListsWithMatch(baseMembers, alterMembers); } catch (final Exception e) { throw new CoreException("Unable to compare relations {} and {}", baseRelation, alterRelation, e); } }
@Override public RelationMemberList members() { return getRelationMembersAsDynamicEntities(subRelation().members()); }
@Override public RelationMemberList allKnownOsmMembers() { final List<RelationMember> members = new ArrayList<>(); for (final Relation candidate : multiAtlas() .relationAllRelationsWithSameOsmIdentifier(this.identifier)) { candidate.members().forEach(relationMember -> members.add(relationMember)); } return new RelationMemberList(members); }
private boolean hasChildAreaAsBuilding(final Relation relation) { for (final RelationMember member : relation.members()) { final AtlasEntity entity = member.getEntity(); final String role = member.getRole(); if (entity instanceof Area && RelationTypeTag.MULTIPOLYGON_ROLE_OUTER.equals(role) && isBuilding((Area) entity)) { return true; } } return false; }
public static CompleteRelation from(final Relation relation) { return new CompleteRelation(relation.getIdentifier(), relation.getTags(), relation.bounds(), relation.members().asBean(), relation.allRelationsWithSameOsmIdentifier().stream().map(Relation::getIdentifier) .collect(Collectors.toList()), relation.allKnownOsmMembers().asBean(), relation.osmRelationIdentifier(), relation.relations().stream().map(Relation::getIdentifier) .collect(Collectors.toSet())); }
@Test public void testWaterWayAsRelationOfWaterWays() { final Atlas canalAsRelationOfCanalEntities = this.rule .getCanalAsRelationOfCanalEntitiesAtlas(); final Iterable<ComplexWaterEntity> waterEntities = new ComplexWaterEntityFinder() .find(canalAsRelationOfCanalEntities, Finder::ignore); Assert.assertEquals( "The number of water entities should be equal to the number of relation members", canalAsRelationOfCanalEntities.relation(6006326000000L).members().size(), Iterables.size(waterEntities)); }
private void addRelation(final PackedAtlasBuilder builder, final Relation relation) { final RelationBean bean = new RelationBean(); relation.members().forEach(member -> bean.addItem(member.getEntity().getIdentifier(), member.getRole(), member.getEntity().getType())); builder.addRelation(relation.getIdentifier(), relation.osmRelationIdentifier(), bean, relation.getTags()); } }
private String convertRelationBean(final Relation relation) { final StringList bean = new StringList(); for (final RelationMember member : relation.members()) { final StringList list = new StringList(); list.add(member.getEntity().getIdentifier()); list.add(member.getRole()); final ItemType type = ItemType.forEntity(member.getEntity()); list.add(type.toShortString()); bean.add(list.join(TERTIARY_SEPARATOR)); } return bean.join(SECONDARY_SEPARATOR); }
@Test public void testLoadRelationWithOverlappingMembersByIdentifier() { // Already loaded: 12-1350-1870 Assert.assertEquals(4, this.dynamicAtlas.numberOfEdges()); Assert.assertEquals(1, this.dynamicAtlas.relation(3).members().size()); // Prompts load of 12-1349-1870 this.dynamicAtlas.edge(8000000); Assert.assertEquals(6, this.dynamicAtlas.numberOfEdges()); // Prompts load of 12-1349-1869 final Relation relation3 = this.dynamicAtlas.relation(3); Assert.assertEquals(3, relation3.members().size()); Assert.assertEquals(8, this.dynamicAtlas.numberOfEdges()); }
@Test public void addTurnRestrictions() { resetAndChange("addTurnRestrictions", new AtlasChangeGeneratorAddTurnRestrictions()); final Node via = this.changeAtlas.node(3985226613000000L); final Relation restriction = via.relations().iterator().next(); Assert.assertNotNull(restriction); final RelationBean members = new RelationBean(); members.addItem(221434099000002L, "from", ItemType.EDGE); members.addItem(via.getIdentifier(), "via", ItemType.NODE); members.addItem(634444999000000L, "to", ItemType.EDGE); members.addItem(-634444999000000L, "to", ItemType.EDGE); Assert.assertEquals(members, restriction.members().asBean()); }
@Test public void testSameRelationMemberWithDifferentRole() { final Atlas atlas = this.rule.getAtlas(); final RelationMemberList relationMembers = atlas .relation(PackedRelationTestCaseRule.RELATION_IDENTIFIER).members(); Assert.assertEquals(3, relationMembers.size()); Assert.assertTrue(listContains(relationMembers, RelationTypeTag.RESTRICTION_ROLE_FROM)); Assert.assertTrue(listContains(relationMembers, RelationTypeTag.RESTRICTION_ROLE_VIA)); Assert.assertTrue(listContains(relationMembers, RelationTypeTag.RESTRICTION_ROLE_TO)); }
private AtlasPrimitiveRelation convert(final Relation relation) { final RelationBean bean = new RelationBean(); for (final RelationMember member : relation.members()) { bean.addItem(member.getEntity().getIdentifier(), member.getRole(), member.getEntity().getType()); } return new AtlasPrimitiveRelation(relation.getIdentifier(), relation.getIdentifier(), bean, relation.getTags(), relation.bounds()); }
@Test public void testMovePoint() { final Atlas atlas = this.rule.getAtlas(); final ChangeBuilder changeBuilder = new ChangeBuilder(); final Point source = atlas.point(41822000000L); final Location newLocation = source.getLocation().shiftAlongGreatCircle(Heading.NORTH, Distance.ONE_METER); changeBuilder.add(new FeatureChange(ChangeType.ADD, CompletePoint.shallowFrom(source).withLocation(newLocation))); final Change change = changeBuilder.get(); final Atlas changeAtlas = new ChangeAtlas(atlas, change); Assert.assertEquals(newLocation, changeAtlas.point(41822000000L).getLocation()); final Relation disconnectedFeatures = changeAtlas.relation(41834000000L); final Point fromRelation = (Point) Iterables.stream(disconnectedFeatures.members()) .firstMatching(member -> "tree".equals(member.getRole())).get().getEntity(); Assert.assertEquals(newLocation, fromRelation.getLocation()); }
@Test public void testMergeRelationMembers() { final RelationBean members = new RelationBean(); members.addItem(new RelationBeanItem(456L, "myRole", ItemType.AREA)); final FeatureChange featureChange1 = new FeatureChange(ChangeType.ADD, new CompleteRelation( 123L, null, Rectangle.TEST_RECTANGLE, members, null, null, null, null)); final FeatureChange featureChange2 = new FeatureChange(ChangeType.ADD, new CompleteRelation( 123L, null, Rectangle.TEST_RECTANGLE, members, null, null, null, null)); Assert.assertEquals(members, ((Relation) featureChange1.merge(featureChange2).getReference()).members() .asBean()); }
@Test public void testRelationMembersWithSameIdentifiersButDifferentTypes() { final PackedAtlasBuilder builder = new PackedAtlasBuilder(); builder.addArea(0, Polygon.SILICON_VALLEY, Maps.hashMap()); builder.addLine(0, PolyLine.TEST_POLYLINE, Maps.hashMap()); final RelationBean bean = new RelationBean(); bean.addItem(0L, "Role of the Area", ItemType.AREA); bean.addItem(0L, "Role of the Line", ItemType.LINE); builder.addRelation(0, 0, bean, Maps.hashMap()); final Atlas result = builder.get(); Assert.assertEquals(2, result.relation(0).members().size()); }
@Test public void testMergeRelationMembersPartial() { final RelationBean members1 = new RelationBean(); members1.addItem(new RelationBeanItem(456L, "myRole1", ItemType.AREA)); final RelationBean members2 = new RelationBean(); final FeatureChange featureChange1 = new FeatureChange(ChangeType.ADD, new CompleteRelation( 123L, null, Rectangle.TEST_RECTANGLE, members1, null, null, null, null)); final FeatureChange featureChange2 = new FeatureChange(ChangeType.ADD, new CompleteRelation( 123L, null, Rectangle.TEST_RECTANGLE, members2, null, null, null, null)); Assert.assertEquals(members1, ((Relation) featureChange1.merge(featureChange2).getReference()).members() .asBean()); }