/** * Copyright 2010 Nube Technologies * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and limitations under the License. */ package co.nubetech.hiho.mapreduce.lib.db; import java.io.IOException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.io.LongWritable; import org.apache.log4j.Logger; import co.nubetech.hiho.mapreduce.lib.db.apache.DBConfiguration; import co.nubetech.hiho.mapreduce.lib.db.apache.DBInputFormat; import co.nubetech.hiho.mapreduce.lib.db.apache.DataDrivenDBRecordReader; public class DBQueryRecordReader extends DataDrivenDBRecordReader<GenericDBWritable> { final static Logger logger = Logger .getLogger(co.nubetech.hiho.mapreduce.lib.db.DBQueryRecordReader.class); protected ArrayList params; private LongWritable key = null; private GenericDBWritable value = null; private ArrayList<ColumnInfo> info; private ResultSet results; private long pos = 0; public ArrayList getParams() { return params; } public void setParams(ArrayList params) { this.params = params; } public DBQueryRecordReader(DBInputFormat.DBInputSplit split, Configuration conf, Connection conn, DBConfiguration dbConfig, String cond, String[] fields, String table, String dbProduct, ArrayList params) throws SQLException { super(split, GenericDBWritable.class, conf, conn, dbConfig, cond, fields, table, dbProduct); this.params = params; } protected ResultSet executeQuery(String query) throws SQLException { this.statement = getConnection().prepareStatement(query, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); if (params != null) { logger.debug("Params are to be set"); for (int i = 0; i < params.size(); ++i) { statement.setObject(i + 1, params.get(i)); logger.debug("set i " + i + " " + params.get(i)); } } return statement.executeQuery(); } /** {@inheritDoc} */ public LongWritable getCurrentKey() { return key; } /** {@inheritDoc} */ public GenericDBWritable getCurrentValue() { return value; } /** {@inheritDoc} */ public boolean nextKeyValue() throws IOException { try { if (key == null) { key = new LongWritable(); } if (value == null) { value = new GenericDBWritable(); } if (null == this.results) { // First time into this method, run the query. this.results = executeQuery(getSelectQuery()); info = GenericDBWritable.populateColumnInfo(results .getMetaData()); logger.debug("Info is " + info); } if (!results.next()) { logger.debug("No results found "); return false; } // Set the key field value as the output key value key.set(pos + getSplit().getStart()); value.setColumns(info); value.readFields(results); logger.debug("Set key, value"); pos++; } catch (SQLException e) { throw new IOException("SQLException in nextKeyValue", e); } return true; } }