// This software is released into the Public Domain. See copying.txt for details. package org.openstreetmap.osmosis.pgsimple.v0_6.impl; import java.sql.PreparedStatement; import java.sql.SQLException; import org.openstreetmap.osmosis.core.OsmosisRuntimeException; import org.openstreetmap.osmosis.core.domain.v0_6.Node; import org.openstreetmap.osmosis.core.lifecycle.ReleasableIterator; import org.openstreetmap.osmosis.pgsimple.common.DatabaseContext; /** * Performs all node-specific db operations. * * @author Brett Henderson */ public class NodeDao extends EntityDao<Node> { private static final String SQL_UPDATE_WAY_BBOX = "UPDATE ways w SET bbox = (" + " SELECT ST_Envelope(ST_Collect(n.geom))" + " FROM nodes n INNER JOIN way_nodes wn ON wn.node_id = n.id" + " WHERE wn.way_id = w.id" + " )" + " WHERE w.id IN (" + " SELECT w.id FROM ways w INNER JOIN way_nodes wn ON w.id = wn.way_id WHERE wn.node_id = ? GROUP BY w.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 IN (" + " SELECT w.id FROM ways w INNER JOIN way_nodes wn ON w.id = wn.way_id WHERE wn.node_id = ? GROUP BY w.id" + " )"; private DatabaseCapabilityChecker capabilityChecker; private PreparedStatement updateWayBboxStatement; private PreparedStatement updateWayLinestringStatement; /** * 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 NodeDao(DatabaseContext dbCtx, ActionDao actionDao) { super(dbCtx, new NodeMapper(), actionDao); capabilityChecker = new DatabaseCapabilityChecker(dbCtx); } /** * {@inheritDoc} */ @Override protected void loadFeatures(long entityId, Node entity) { // Nodes have no additional features. } /** * {@inheritDoc} */ @Override public void modifyEntity(Node entity) { super.modifyEntity(entity); if (capabilityChecker.isWayBboxSupported()) { if (updateWayBboxStatement == null) { updateWayBboxStatement = prepareStatement(SQL_UPDATE_WAY_BBOX); } try { int prmIndex; prmIndex = 1; updateWayBboxStatement.setLong(prmIndex++, entity.getId()); updateWayBboxStatement.executeUpdate(); } catch (SQLException e) { throw new OsmosisRuntimeException("Update bbox failed for node " + entity.getId() + "."); } } if (capabilityChecker.isWayLinestringSupported()) { if (updateWayLinestringStatement == null) { updateWayLinestringStatement = prepareStatement(SQL_UPDATE_WAY_LINESTRING); } try { int prmIndex; prmIndex = 1; updateWayLinestringStatement.setLong(prmIndex++, entity.getId()); updateWayLinestringStatement.executeUpdate(); } catch (SQLException e) { throw new OsmosisRuntimeException("Update linestring failed for node " + entity.getId() + "."); } } } /** * {@inheritDoc} */ @Override public ReleasableIterator<Node> iterate() { return new NodeReader(getDatabaseContext()); } }