package org.plista.kornakapi.core.storage;
import javax.sql.DataSource;
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.impl.common.jdbc.AbstractJDBCComponent;
import org.apache.mahout.cf.taste.impl.model.jdbc.AbstractJDBCDataModel;
public class LabeledMySQLJDBCDataModel extends AbstractJDBCDataModel{
/**
* <p>
* Creates a using the default {@link DataSource} (named
* {@link #DEFAULT_DATASOURCE_NAME} and default table/column names.
* </p>
*
* @throws TasteException
* if {@link DataSource} can't be found
*/
public LabeledMySQLJDBCDataModel() throws TasteException {
this(DEFAULT_DATASOURCE_NAME);
}
/**
* <p>
* Creates a using the default {@link DataSource} found under the given name, and
* using default table/column names.
* </p>
*
* @param dataSourceName
* name of {@link DataSource} to look up
* @throws TasteException
* if {@link DataSource} can't be found
*/
public LabeledMySQLJDBCDataModel(String dataSourceName) throws TasteException {
this(AbstractJDBCComponent.lookupDataSource(dataSourceName),
DEFAULT_PREFERENCE_TABLE,
DEFAULT_USER_ID_COLUMN,
DEFAULT_ITEM_ID_COLUMN,
DEFAULT_PREFERENCE_COLUMN,
DEFAULT_PREFERENCE_TIME_COLUMN);
}
/**
* <p>
* Creates a using the given {@link DataSource} and default table/column names.
* </p>
*
* @param dataSource
* {@link DataSource} to use
*/
public LabeledMySQLJDBCDataModel(DataSource dataSource) {
this(dataSource,
DEFAULT_PREFERENCE_TABLE,
DEFAULT_USER_ID_COLUMN,
DEFAULT_ITEM_ID_COLUMN,
DEFAULT_PREFERENCE_COLUMN,
DEFAULT_PREFERENCE_TIME_COLUMN);
}
/**
* <p>
* Creates a using the given {@link DataSource} and default table/column names.
* </p>
*
* @param dataSource
* {@link DataSource} to use
* @param preferenceTable
* name of table containing preference data
* @param userIDColumn
* user ID column name
* @param itemIDColumn
* item ID column name
* @param preferenceColumn
* preference column name
* @param timestampColumn timestamp column name (may be null)
*/
public LabeledMySQLJDBCDataModel(DataSource dataSource,
String preferenceTable,
String userIDColumn,
String itemIDColumn,
String preferenceColumn,
String timestampColumn) {
super(dataSource, preferenceTable, userIDColumn, itemIDColumn, preferenceColumn,
// getPreferenceSQL
"SELECT " + preferenceColumn + " FROM " + preferenceTable + " WHERE " + userIDColumn + "=? AND "
+ itemIDColumn + "=?",
// getPreferenceTimeSQL
"SELECT " + timestampColumn + " FROM " + preferenceTable + " WHERE " + userIDColumn + "=? AND "
+ itemIDColumn + "=?",
// getUserSQL
"SELECT DISTINCT " + userIDColumn + ", " + itemIDColumn + ", " + preferenceColumn + " FROM " + preferenceTable
+ " WHERE " + userIDColumn + "=? ORDER BY " + itemIDColumn,
// getAllUsersSQL
"SELECT DISTINCT " + userIDColumn + ", " + itemIDColumn + ", " + preferenceColumn + " FROM " + preferenceTable
+ " ORDER BY " + userIDColumn + ", " + itemIDColumn,
// getNumItemsSQL
"SELECT COUNT(DISTINCT " + itemIDColumn + ") FROM " + preferenceTable,
// getNumUsersSQL
"SELECT COUNT(DISTINCT " + userIDColumn + ") FROM " + preferenceTable,
// setPreferenceSQL
"INSERT INTO " + preferenceTable + '(' + userIDColumn + ',' + itemIDColumn + ',' + preferenceColumn
+ ") VALUES (?,?,?) ON DUPLICATE KEY UPDATE " + preferenceColumn + "=?",
// removePreference SQL
"DELETE FROM " + preferenceTable + " WHERE " + userIDColumn + "=? AND " + itemIDColumn + "=?",
// getUsersSQL
"SELECT DISTINCT " + userIDColumn + " FROM " + preferenceTable + " ORDER BY " + userIDColumn,
// getItemsSQL
"SELECT DISTINCT " + itemIDColumn + " FROM " + preferenceTable + " ORDER BY " + itemIDColumn,
// getPrefsForItemSQL
"SELECT DISTINCT " + userIDColumn + ", " + itemIDColumn + ", " + preferenceColumn + " FROM " + preferenceTable
+ " WHERE " + itemIDColumn + "=? ORDER BY " + userIDColumn,
// getNumPreferenceForItemSQL
"SELECT COUNT(1) FROM " + preferenceTable + " WHERE " + itemIDColumn + "=?",
// getNumPreferenceForItemsSQL
"SELECT COUNT(1) FROM " + preferenceTable + " tp1 JOIN " + preferenceTable + " tp2 " + "USING ("
+ userIDColumn + ") WHERE tp1." + itemIDColumn + "=? and tp2." + itemIDColumn + "=?",
"SELECT MAX(" + preferenceColumn + ") FROM " + preferenceTable,
"SELECT MIN(" + preferenceColumn + ") FROM " + preferenceTable);
}
/**
* <p>
* Creates a using the given {@link DataSource} and default table/column names.
* </p>
*
* @param dataSource
* {@link DataSource} to use
* @param preferenceTable
* name of table containing preference data
* @param userIDColumn
* user ID column name
* @param itemIDColumn
* item ID column name
* @param preferenceColumn
* preference column name
* @param timestampColumn timestamp column name (may be null)
*/
public LabeledMySQLJDBCDataModel(DataSource dataSource,
String preferenceTable,
String userIDColumn,
String itemIDColumn,
String preferenceColumn,
String timestampColumn,
String candidatesTable,
String labelColumn,
String label) {
super(dataSource, preferenceTable, userIDColumn, itemIDColumn, preferenceColumn,
// getPreferenceSQL
"SELECT " + preferenceColumn + " FROM " + preferenceTable + " WHERE " + userIDColumn + "=? AND "
+ itemIDColumn + "=?" + " INNER JOIN " + candidatesTable + " c USING ("+ itemIDColumn + ") WHERE c." +labelColumn +"="+ label,
// getPreferenceTimeSQL
"SELECT " + timestampColumn + " FROM " + preferenceTable + " WHERE " + userIDColumn + "=? AND "
+ itemIDColumn + "=?",
// getUserSQL
"SELECT DISTINCT " + userIDColumn + ", " + itemIDColumn + ", " + preferenceColumn + " FROM " + preferenceTable
+ " INNER JOIN " + candidatesTable + " c USING ("+ itemIDColumn + ") WHERE c." +labelColumn +"="+ label + " && " + userIDColumn + "=? " + " ORDER BY " + itemIDColumn,
// getAllUsersSQL
"SELECT DISTINCT " + userIDColumn + ", " + itemIDColumn + ", " + preferenceColumn + " FROM " + preferenceTable
+ " INNER JOIN " + candidatesTable + " c USING ("+ itemIDColumn + ") WHERE c." +labelColumn +"="+ label + " ORDER BY " + userIDColumn + ", " + itemIDColumn,
// getNumItemsSQL
"SELECT COUNT(DISTINCT " + itemIDColumn + ") FROM " + preferenceTable + " INNER JOIN " + candidatesTable + " c USING ("+ itemIDColumn + ") WHERE c." +labelColumn +"="+ label,
// getNumUsersSQL
"SELECT COUNT(DISTINCT " + userIDColumn + ") FROM " + preferenceTable + " INNER JOIN " + candidatesTable + " c USING ("+ itemIDColumn + ") WHERE c." +labelColumn +"="+ label,
// setPreferenceSQL
"INSERT INTO " + preferenceTable + '(' + userIDColumn + ',' + itemIDColumn + ',' + preferenceColumn
+ ") VALUES (?,?,?) ON DUPLICATE KEY UPDATE " + preferenceColumn + "=?",
// removePreference SQL
"DELETE FROM " + preferenceTable + " WHERE " + userIDColumn + "=? AND " + itemIDColumn + "=?",
// getUsersSQL
"SELECT DISTINCT " + userIDColumn + " FROM (SELECT " + userIDColumn +", " + itemIDColumn +" FROM " + preferenceTable + " INNER JOIN " + candidatesTable +" c USING ("+ itemIDColumn + ") WHERE c." +labelColumn +"="+ label + " ORDER BY " + userIDColumn + ") as t",
// getItemsSQL
"SELECT DISTINCT " + itemIDColumn + " FROM " + preferenceTable + " INNER JOIN " + candidatesTable + " c USING ("+ itemIDColumn + ") WHERE c." +labelColumn +"="+ label + " ORDER BY " + itemIDColumn,
// getPrefsForItemSQL
"SELECT DISTINCT " + userIDColumn + ", " + itemIDColumn + ", " + preferenceColumn + " FROM " + preferenceTable
+ " WHERE " + itemIDColumn + "=? ORDER BY " + userIDColumn,
// getNumPreferenceForItemSQL
"SELECT COUNT(1) FROM " + preferenceTable + " WHERE " + itemIDColumn + "=?",
// getNumPreferenceForItemsSQL
"SELECT COUNT(1) FROM " + preferenceTable + " tp1 JOIN " + preferenceTable + " tp2 " + "USING ("
+ userIDColumn + ") WHERE tp1." + itemIDColumn + "=? and tp2." + itemIDColumn + "=?",
"SELECT MAX(" + preferenceColumn + ") FROM " + preferenceTable,
"SELECT MIN(" + preferenceColumn + ") FROM " + preferenceTable);
}
@Override
protected int getFetchSize() {
// Need to return this for MySQL Connector/J to make it use streaming mode
return Integer.MIN_VALUE;
}
}