// 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.ResultSet; import java.sql.SQLException; import org.openstreetmap.osmosis.core.OsmosisRuntimeException; import org.openstreetmap.osmosis.core.database.DbFeature; import org.openstreetmap.osmosis.core.domain.v0_6.Tag; /** * Reads and writes tags to jdbc classes. * * @author Brett Henderson */ public class TagMapper extends EntityFeatureMapper<DbFeature<Tag>> { private String parentEntityName; /** * Creates a new instance. * * @param parentEntityName * The name of the parent entity. This is used to generate SQL * statements for the correct tag table name. */ public TagMapper(String parentEntityName) { this.parentEntityName = parentEntityName; } /** * {@inheritDoc} */ @Override public String getParentEntityName() { return parentEntityName; } /** * {@inheritDoc} */ @Override public String getEntityName() { return parentEntityName + "_tags"; } /** * {@inheritDoc} */ @Override public String getSqlSelect(boolean filterByEntityId, boolean orderBy) { StringBuilder resultSql; resultSql = new StringBuilder(); resultSql.append("SELECT ").append(parentEntityName).append("_id AS entity_id, k, v FROM "); resultSql.append(parentEntityName).append("_tags f"); if (filterByEntityId) { resultSql.append(" WHERE ").append(parentEntityName).append("_id = ?"); } if (orderBy) { resultSql.append(getSqlDefaultOrderBy()); } return resultSql.toString(); } /** * {@inheritDoc} */ @Override public String getSqlInsert(int rowCount) { StringBuilder resultSql; resultSql = new StringBuilder(); resultSql.append("INSERT INTO ").append(parentEntityName).append("_tags ("); resultSql.append(parentEntityName).append("_id, k, v) VALUES "); for (int row = 0; row < rowCount; row++) { if (row > 0) { resultSql.append(", "); } resultSql.append("(?, ?, ?)"); } return resultSql.toString(); } /** * {@inheritDoc} */ @Override public String getSqlDelete(boolean filterByEntityId) { StringBuilder resultSql; resultSql = new StringBuilder(); resultSql.append("DELETE FROM ").append(parentEntityName).append("_tags"); if (filterByEntityId) { resultSql.append(" WHERE ").append(parentEntityName).append("_id = ?"); } return resultSql.toString(); } /** * {@inheritDoc} */ @Override public DbFeature<Tag> buildEntity(ResultSet resultSet) { try { return new DbFeature<Tag>( resultSet.getLong("entity_id"), new Tag( resultSet.getString("k"), resultSet.getString("v") ) ); } catch (SQLException e) { throw new OsmosisRuntimeException("Unable to build a tag from the current recordset row.", e); } } /** * {@inheritDoc} */ @Override public int populateEntityParameters(PreparedStatement statement, int initialIndex, DbFeature<Tag> entityFeature) { try { int prmIndex; Tag tag; tag = entityFeature.getFeature(); prmIndex = initialIndex; statement.setLong(prmIndex++, entityFeature.getEntityId()); statement.setString(prmIndex++, tag.getKey()); statement.setString(prmIndex++, tag.getValue()); return prmIndex; } catch (SQLException e) { throw new OsmosisRuntimeException( "Unable to populate tag parameters for entity " + parentEntityName + " " + entityFeature.getEntityId() + "." ); } } }