// 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.Collections;
import java.util.List;
import org.openstreetmap.osmosis.core.database.DbOrderedFeature;
import org.openstreetmap.osmosis.core.domain.v0_6.Way;
import org.openstreetmap.osmosis.core.domain.v0_6.WayNode;
import org.openstreetmap.osmosis.core.store.PeekableIterator;
import org.openstreetmap.osmosis.pgsimple.common.DatabaseContext;
/**
* Reads all ways from a database ordered by their identifier. It combines the
* output of the way table readers to produce fully configured way objects.
*
* @author Brett Henderson
*/
public class WayReader extends EntityReader<Way> {
private PeekableIterator<DbOrderedFeature<WayNode>> wayNodeReader;
/**
* Creates a new instance.
*
* @param dbCtx
* The database context to use for accessing the database.
*/
public WayReader(DatabaseContext dbCtx) {
super(dbCtx, new WayMapper());
wayNodeReader = new PeekableIterator<DbOrderedFeature<WayNode>>(
new EntityFeatureTableReader<WayNode, DbOrderedFeature<WayNode>>(dbCtx, new WayNodeMapper())
);
}
/**
* 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 WayReader(DatabaseContext dbCtx, String constraintTable) {
super(dbCtx, new WayMapper(), constraintTable);
wayNodeReader = new PeekableIterator<DbOrderedFeature<WayNode>>(
new EntityFeatureTableReader<WayNode, DbOrderedFeature<WayNode>>(
dbCtx, new WayNodeMapper(), constraintTable)
);
}
/**
* {@inheritDoc}
*/
@Override
protected void populateEntityFeatures(Way entity) {
long wayId;
List<DbOrderedFeature<WayNode>> wayNodes;
super.populateEntityFeatures(entity);
wayId = entity.getId();
// Skip all way nodes that are from a lower way.
while (wayNodeReader.hasNext()) {
DbOrderedFeature<WayNode> wayNode;
wayNode = wayNodeReader.peekNext();
if (wayNode.getEntityId() < wayId) {
wayNodeReader.next();
} else {
break;
}
}
// Load all nodes matching this version of the way.
wayNodes = new ArrayList<DbOrderedFeature<WayNode>>();
while (wayNodeReader.hasNext() && wayNodeReader.peekNext().getEntityId() == wayId) {
wayNodes.add(wayNodeReader.next());
}
// The underlying query sorts node references by way id but not
// by their sequence number.
Collections.sort(wayNodes, new DbOrderedFeatureComparator<WayNode>());
for (DbOrderedFeature<WayNode> dbWayNode : wayNodes) {
entity.getWayNodes().add(dbWayNode.getFeature());
}
}
/**
* {@inheritDoc}
*/
@Override
public void close() {
super.close();
wayNodeReader.close();
}
}