// 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.DbOrderedFeature;
import org.openstreetmap.osmosis.core.domain.v0_6.RelationMember;
/**
* Reads and writes relation members to jdbc classes.
*
* @author Brett Henderson
*/
public class RelationMemberMapper extends EntityFeatureMapper<DbOrderedFeature<RelationMember>> {
private MemberTypeValueMapper memberTypeValueMapper;
/**
* Creates a new instance.
*/
public RelationMemberMapper() {
memberTypeValueMapper = new MemberTypeValueMapper();
}
/**
* {@inheritDoc}
*/
@Override
public String getParentEntityName() {
return "relation";
}
/**
* {@inheritDoc}
*/
@Override
public String getEntityName() {
return "relation_members";
}
/**
* {@inheritDoc}
*/
@Override
public String getSqlSelect(boolean filterByEntityId, boolean orderBy) {
StringBuilder resultSql;
resultSql = new StringBuilder();
resultSql.append("SELECT relation_id AS entity_id, member_id, member_type, member_role, sequence_id FROM ");
resultSql.append("relation_members f");
if (filterByEntityId) {
resultSql.append(" WHERE entity_id = ?");
}
if (orderBy) {
resultSql.append(getSqlDefaultOrderBy());
}
return resultSql.toString();
}
/**
* {@inheritDoc}
*/
@Override
public String getSqlDefaultOrderBy() {
return super.getSqlDefaultOrderBy() + ", sequence_id";
}
/**
* {@inheritDoc}
*/
@Override
public String getSqlInsert(int rowCount) {
StringBuilder resultSql;
resultSql = new StringBuilder();
resultSql.append("INSERT INTO relation_members (");
resultSql.append("relation_id, member_id, member_type, member_role, sequence_id) 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 relation_members");
if (filterByEntityId) {
resultSql.append(" WHERE ").append("relation_id = ?");
}
return resultSql.toString();
}
/**
* {@inheritDoc}
*/
@Override
public DbOrderedFeature<RelationMember> buildEntity(ResultSet resultSet) {
try {
return new DbOrderedFeature<RelationMember>(
resultSet.getLong("entity_id"),
new RelationMember(
resultSet.getLong("member_id"),
memberTypeValueMapper.getEntityType(resultSet.getString("member_type")),
resultSet.getString("member_role")
),
resultSet.getInt("sequence_id")
);
} catch (SQLException e) {
throw new OsmosisRuntimeException("Unable to build a relation member from the current recordset row.", e);
}
}
/**
* {@inheritDoc}
*/
@Override
public int populateEntityParameters(
PreparedStatement statement, int initialIndex, DbOrderedFeature<RelationMember> entityFeature) {
try {
int prmIndex;
RelationMember relationMember;
relationMember = entityFeature.getFeature();
prmIndex = initialIndex;
statement.setLong(prmIndex++, entityFeature.getEntityId());
statement.setLong(prmIndex++, relationMember.getMemberId());
statement.setString(prmIndex++, memberTypeValueMapper.getMemberType(relationMember.getMemberType()));
statement.setString(prmIndex++, relationMember.getMemberRole());
statement.setInt(prmIndex++, entityFeature.getSequenceId());
return prmIndex;
} catch (SQLException e) {
throw new OsmosisRuntimeException(
"Unable to populate relation member parameters for relation "
+ entityFeature.getEntityId() + ".",
e
);
}
}
}