// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.pgsnapshot.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.database.FeaturePopulator;
import org.openstreetmap.osmosis.core.domain.v0_6.Way;
import org.openstreetmap.osmosis.core.domain.v0_6.WayNode;
import org.openstreetmap.osmosis.pgsnapshot.common.DatabaseContext;
import org.springframework.jdbc.core.JdbcTemplate;
/**
* Performs all way-specific db operations.
*
* @author Brett Henderson
*/
public class WayDao extends EntityDao<Way> {
private static final String SQL_UPDATE_WAY_BBOX =
"UPDATE ways SET bbox = ("
+ " SELECT ST_Envelope(ST_Collect(geom))"
+ " FROM nodes JOIN way_nodes ON way_nodes.node_id = nodes.id"
+ " WHERE way_nodes.way_id = ways.id"
+ " )"
+ " WHERE ways.id = ?";
private static final String SQL_UPDATE_WAY_LINESTRING =
"UPDATE ways w SET linestring = ("
+ " SELECT ST_MakeLine(c.geom) AS way_line FROM ("
+ " SELECT n.geom AS geom FROM nodes n INNER JOIN way_nodes wn ON n.id = wn.node_id"
+ " WHERE (wn.way_id = w.id) ORDER BY wn.sequence_id"
+ " ) c"
+ " )"
+ " WHERE w.id = ?";
private JdbcTemplate jdbcTemplate;
private DatabaseCapabilityChecker capabilityChecker;
private EntityFeatureDao<WayNode, DbOrderedFeature<WayNode>> wayNodeDao;
private WayNodeMapper wayNodeMapper;
/**
* Creates a new instance.
*
* @param dbCtx
* The database context to use for accessing the database.
* @param actionDao
* The dao to use for adding action records to the database.
*/
public WayDao(DatabaseContext dbCtx, ActionDao actionDao) {
super(dbCtx.getJdbcTemplate(), new WayMapper(), actionDao);
jdbcTemplate = dbCtx.getJdbcTemplate();
capabilityChecker = new DatabaseCapabilityChecker(dbCtx);
wayNodeMapper = new WayNodeMapper();
wayNodeDao = new EntityFeatureDao<WayNode, DbOrderedFeature<WayNode>>(jdbcTemplate, wayNodeMapper);
}
/**
* Adds the specified way node list to the database.
*
* @param entityId
* The identifier of the entity to add these features to.
* @param wayNodeList
* The list of features to add.
*/
private void addWayNodeList(long entityId, List<WayNode> wayNodeList) {
List<DbOrderedFeature<WayNode>> dbList;
dbList = new ArrayList<DbOrderedFeature<WayNode>>(wayNodeList.size());
for (int i = 0; i < wayNodeList.size(); i++) {
dbList.add(new DbOrderedFeature<WayNode>(entityId, wayNodeList.get(i), i));
}
wayNodeDao.addAll(dbList);
}
/**
* Updates the bounding box column for the specified way.
*
* @param wayId
* The way bounding box.
*/
private void updateWayGeometries(long wayId) {
if (capabilityChecker.isWayBboxSupported()) {
jdbcTemplate.update(SQL_UPDATE_WAY_BBOX, wayId);
}
if (capabilityChecker.isWayLinestringSupported()) {
jdbcTemplate.update(SQL_UPDATE_WAY_LINESTRING, wayId);
}
}
/**
* {@inheritDoc}
*/
@Override
public void addEntity(Way entity) {
super.addEntity(entity);
addWayNodeList(entity.getId(), entity.getWayNodes());
updateWayGeometries(entity.getId());
}
/**
* {@inheritDoc}
*/
@Override
public void modifyEntity(Way entity) {
long wayId;
super.modifyEntity(entity);
wayId = entity.getId();
wayNodeDao.removeList(wayId);
addWayNodeList(entity.getId(), entity.getWayNodes());
updateWayGeometries(entity.getId());
}
/**
* {@inheritDoc}
*/
@Override
public void removeEntity(long entityId) {
wayNodeDao.removeList(entityId);
super.removeEntity(entityId);
}
/**
* {@inheritDoc}
*/
@Override
protected List<FeaturePopulator<Way>> getFeaturePopulators(String tablePrefix) {
return Collections.emptyList();
}
}