package annis.sqlgen;
import java.sql.Array;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import static java.util.Arrays.asList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* TODO Document semantics of of multiple ID columns TODO Code supporting
* multiple ID columns complicates things unnecessarily
*
* @param <BaseType>
*/
public class PostgreSqlArraySolutionKey<BaseType> extends AbstractSolutionKey<BaseType>
implements SolutionKey<List<BaseType>>
{
// logging with log4j
private static final Logger log = LoggerFactory.getLogger(PostgreSqlArraySolutionKey.class);
// the name of the ID array in the outer query
private String keyColumnName;
@Override
public List<String> generateOuterQueryColumns(
TableAccessStrategy tableAccessStrategy, int size)
{
List<String> columns = new ArrayList<>();
String nameAlias = tableAccessStrategy.aliasedColumn("solutions",
getIdColumnName());
columns.add(createKeyArray(nameAlias, keyColumnName, size));
return columns;
}
protected String createKeyArray(String column, String alias, int size)
{
StringBuilder sb = new StringBuilder();
sb.append("ARRAY[");
sb.append(column);
sb.append(1);
for (int i = 2; i <= size; ++i)
{
sb.append(", ");
sb.append(column);
sb.append(i);
}
sb.append("]");
sb.append(" AS ");
sb.append(alias);
String s = sb.toString();
return s;
}
@Override
public List<BaseType> retrieveKey(ResultSet resultSet)
{
try
{
Array sqlArray = resultSet.getArray(keyColumnName);
if (resultSet.wasNull())
{
throw new IllegalStateException(
"Match group identifier must not be null");
}
@SuppressWarnings("unchecked")
BaseType[] keyArray = (BaseType[]) sqlArray.getArray();
setLastKey(getCurrentKey());
setCurrentKey(asList(keyArray));
return getCurrentKey();
}
catch (SQLException e)
{
log.error("Exception thrown while retrieving key array", e);
throw new IllegalStateException(
"Could not retrieve key from JDBC results set", e);
}
}
@Override
public List<String> getKeyColumns(int size)
{
return asList(keyColumnName);
}
public String getKeyColumnName()
{
return keyColumnName;
}
public void setKeyColumnName(String keyColumnName)
{
this.keyColumnName = keyColumnName;
}
}