// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.pgsimple.v0_6.impl;
import java.util.ArrayList;
import java.util.List;
import org.openstreetmap.osmosis.core.database.DbFeature;
import org.openstreetmap.osmosis.core.database.DbOrderedFeature;
import org.openstreetmap.osmosis.core.domain.v0_6.Relation;
import org.openstreetmap.osmosis.core.domain.v0_6.RelationMember;
import org.openstreetmap.osmosis.core.store.PeekableIterator;
import org.openstreetmap.osmosis.pgsimple.common.DatabaseContext;
/**
* Reads all relations from a database ordered by their identifier. It combines the
* output of the relation table readers to produce fully configured relation objects.
*
* @author Brett Henderson
*/
public class RelationReader extends EntityReader<Relation> {
private PeekableIterator<DbOrderedFeature<RelationMember>> relationMemberReader;
/**
* Creates a new instance.
*
* @param dbCtx
* The database context to use for accessing the database.
*/
public RelationReader(DatabaseContext dbCtx) {
super(dbCtx, new RelationMapper());
relationMemberReader = new PeekableIterator<DbOrderedFeature<RelationMember>>(
new EntityFeatureTableReader<RelationMember, DbOrderedFeature<RelationMember>>(
dbCtx, new RelationMemberMapper())
);
}
/**
* Creates a new instance.
*
* @param dbCtx
* The database context to use for accessing the database.
* @param constraintTable
* The table containing a column named id defining the list of
* entities to be returned.
*/
public RelationReader(DatabaseContext dbCtx, String constraintTable) {
super(dbCtx, new RelationMapper(), constraintTable);
relationMemberReader = new PeekableIterator<DbOrderedFeature<RelationMember>>(
new EntityFeatureTableReader<RelationMember, DbOrderedFeature<RelationMember>>(
dbCtx, new RelationMemberMapper(), constraintTable)
);
}
/**
* {@inheritDoc}
*/
@Override
protected void populateEntityFeatures(Relation entity) {
long relationId;
List<DbFeature<RelationMember>> relationMembers;
super.populateEntityFeatures(entity);
relationId = entity.getId();
// Skip all relation members that are from a lower relation.
while (relationMemberReader.hasNext()) {
DbFeature<RelationMember> wayNode;
wayNode = relationMemberReader.peekNext();
if (wayNode.getEntityId() < relationId) {
relationMemberReader.next();
} else {
break;
}
}
// Load all members matching this version of the relation.
relationMembers = new ArrayList<DbFeature<RelationMember>>();
while (relationMemberReader.hasNext() && relationMemberReader.peekNext().getEntityId() == relationId) {
relationMembers.add(relationMemberReader.next());
}
for (DbFeature<RelationMember> dbRelationMember : relationMembers) {
entity.getMembers().add(dbRelationMember.getFeature());
}
}
/**
* {@inheritDoc}
*/
@Override
public void close() {
super.close();
relationMemberReader.close();
}
}