package com.mongodb.hadoop.hive; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import static java.lang.String.format; public class Results implements Iterable<List<String>> { public class Field { private final String name; private final String type; public Field(final String name, final String type) { this.name = name; this.type = type; } public String getName() { return name; } public String getType() { return type; } //CHECKSTYLE:OFF public boolean equals(final Object other) { if (!(other instanceof Field)) { return false; } Field otherField = (Field) other; return otherField.getName().equals(name) && otherField.getType().equals(type); } //CHECKSTYLE:ON } private List<Field> fields; private List<List<String>> data = new ArrayList<List<String>>(); private Exception error; public Results() { } public void process(final ResultSet resultSet) throws SQLException { final ResultSetMetaData metaData = resultSet.getMetaData(); final int numCols = metaData.getColumnCount(); fields = new ArrayList<Field>(numCols); // Column numbering starts at 1. for (int i = 1; i <= numCols; i++) { String colName = metaData.getColumnName(i); // Column names are in the format <table name>.<column title>, // unless they've been aliased with AS. String[] nameParts = colName.split("\\.", 2); String fieldName = nameParts.length > 1 ? nameParts[1] : nameParts[0]; fields.add(new Field(fieldName, metaData.getColumnTypeName(i))); } while (resultSet.next()) { List<String> rowData = new ArrayList<String>(numCols); for (int i = 1; i <= numCols; i++) { rowData.add(resultSet.getString(i)); } data.add(rowData); } } public int size() { return data.size(); } public List<String> get(final int i) { return data.get(i); } public List<Field> getFields() { return fields; } @Override public String toString() { final StringBuilder sb = new StringBuilder(); if (fields != null) { for (Field field : fields) { sb.append(format(" %15s |", field.getName())); } sb.append("\n"); for (List<String> row : data) { for (String s1 : row) { sb.append(format(" %-15s |", s1.trim())); } sb.append("\n"); } } return sb.toString(); } @Override public boolean equals(final Object o) { if (this == o) { return true; } if (!(o instanceof Results)) { return false; } final Results results = (Results) o; if (data != null ? !data.equals(results.data) : results.data != null) { return false; } if (fields != null ? !fields.equals(results.fields) : results.fields != null) { return false; } return true; } @Override public int hashCode() { int result = fields != null ? fields.hashCode() : 0; result = 31 * result + (data != null ? data.hashCode() : 0); return result; } @Override public Iterator<List<String>> iterator() { return data.iterator(); } public Map<String, String> getRow(final int row) { Map<String, String> map = new LinkedHashMap<String, String>(); List<String> strings = get(row); for (int i = 0; i < fields.size(); i++) { final Field field = fields.get(i); map.put(field.getName(), strings.get(i)); } return map; } }