content: package de.mpg.mpi_inf.ambiversenlu.nlu.entitylinking.datapreparation.genericschema;
  
  import de.mpg.mpi_inf.ambiversenlu.nlu.entitylinking.EntityLinkingManager;
  import de.mpg.mpi_inf.ambiversenlu.nlu.tools.basics3.Fact;
  import edu.stanford.nlp.util.StringUtils;
  import org.apache.commons.lang.StringEscapeUtils;
  
  import java.io.IOException;
  import java.sql.Connection;
  import java.sql.ResultSet;
  import java.sql.SQLException;
  import java.sql.Statement;
  import java.util.Iterator;
  import java.util.LinkedList;
  import java.util.List;
  
  public class GenericDBReader implements GenericReader {
  
  	private String tableName;
  
  	public GenericDBReader(String tableName) {
  		this.tableName = tableName;
  	}
  
  	@Override
  	public List<Fact> getFacts(String relation) throws IOException {
  		List<Fact> triples = new LinkedList<>();
  		Statement stmt;
  		ResultSet rs;
  
  		try {
  			Connection con = EntityLinkingManager.getConnectionForDatabase(EntityLinkingManager.DB_YAGO);
  			con.setAutoCommit(false);
  
  			stmt = con.createStatement();
  			stmt.setFetchSize(10000000);
  			String sql = "SELECT id, subject, object " + "FROM " + tableName + " WHERE predicate='" + relation + "'";
  			rs = stmt.executeQuery(sql);
  
  			while (rs.next()) {
  				String id = rs.getString("id");
  				String subject = rs.getString("subject");
  				String object = rs.getString("object");
  				triples.add(new Fact(id, subject, relation, object));
  			}
  			rs.close();
  			con.setAutoCommit(true);
  
  			EntityLinkingManager.releaseConnection(con);
  		} catch (SQLException e) {
  			throw new IOException(e);
  		}
  
  		return triples;
  	}
  
  	@Override public Iterator<Fact> iterator(String relation) throws IOException {
  		return getFacts(relation).iterator();
  	}
  
  	public List<Fact> getFacts(String subject, String relation, String object) throws SQLException {
  		List<Fact> triples = new LinkedList<>();
  		Statement stmt;
  		ResultSet rs;
  
  		Connection con = EntityLinkingManager.getConnectionForDatabase(EntityLinkingManager.DB_YAGO);
  
  		List<String> queryCondition = new LinkedList<>();
  		if (subject != null) {
  			queryCondition.add("subject = '" + StringEscapeUtils.escapeSql(subject) + "'");
  		}
  		if (relation != null) {
  			queryCondition.add("predicate = '" + StringEscapeUtils.escapeSql(relation) + "'");
  		}
  
  		if (object != null) {
  			queryCondition.add("object = '" + StringEscapeUtils.escapeSql(object) + "'");
  		}
  
  		String conditionString = StringUtils.join(queryCondition, " AND ");
  		stmt = con.createStatement();
  		String sql = "SELECT id, subject, object, predicate  FROM " + tableName + " WHERE " + conditionString;
  		rs = stmt.executeQuery(sql);
  
  		while (rs.next()) {
  			triples.add(new Fact(rs.getString("id"), rs.getString("subject"), rs.getString("predicate"),
  					rs.getString("object")));
  		}
  		rs.close();
  
  		EntityLinkingManager.releaseConnection(con);
  
  		return triples;
  	}
  
  }
  