/*
* RapidMiner
*
* Copyright (C) 2001-2014 by RapidMiner and the contributors
*
* Complete list of developers available at our web site:
*
* http://rapidminer.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*/
package com.rapidminer.gui.new_plotter.configuration;
import com.rapidminer.datatable.DataTable;
import com.rapidminer.tools.Ontology;
/**
* This class describes a column of a {@link DataTable} characterized by a name, a column index
* and a {@link ValueType}.
*
* @author Nils Woehler, Marius Helf
*
*/
public class DataTableColumn implements Cloneable {
public enum ValueType{
INVALID,
UNKNOWN,
NOMINAL,
NUMERICAL,
DATE_TIME;
public static int convertToRapidMinerOntology(ValueType valueType) {
switch(valueType) {
case DATE_TIME:
return Ontology.DATE_TIME;
case INVALID:
return Ontology.ATTRIBUTE_VALUE;
case NUMERICAL:
return Ontology.NUMERICAL;
case UNKNOWN:
case NOMINAL:
default:
return Ontology.NOMINAL;
}
}
public static ValueType convertFromRapidMinerOntology(int rmValueType) {
if (Ontology.ATTRIBUTE_VALUE_TYPE.isA(rmValueType, Ontology.NUMERICAL)) {
return NUMERICAL;
} else if (Ontology.ATTRIBUTE_VALUE_TYPE.isA(rmValueType, Ontology.NOMINAL)) {
return NOMINAL;
} else if (Ontology.ATTRIBUTE_VALUE_TYPE.isA(rmValueType, Ontology.DATE_TIME)) {
return DATE_TIME;
} else {
return INVALID;
}
}
}
private final String columnName;
private final ValueType valueType;
public DataTableColumn(String name, ValueType valueType) {
super();
this.columnName = name;
this.valueType = valueType;
}
/**
* @brief Creates a new {@link DataTableColumn}.
*
* name and value type are automatically initialized from the specified column in dataTable.
* The DataTableColumn does not keep a reference to dataTable.
*/
public DataTableColumn(DataTable dataTable, int columnIdx) {
if (columnIdx >= 0 && columnIdx < dataTable.getColumnNumber()) {
this.columnName = dataTable.getColumnName(columnIdx);
if(dataTable.isDateTime(columnIdx)) {
this.valueType = ValueType.DATE_TIME;
} else if(dataTable.isNominal(columnIdx)) {
this.valueType = ValueType.NOMINAL;
} else if (dataTable.isNumerical(columnIdx)) {
this.valueType = ValueType.NUMERICAL;
} else {
this.valueType = ValueType.INVALID;
}
} else {
this.columnName = null;
this.valueType = ValueType.INVALID;
}
}
/**
* @return the {@link ValueType}
*/
public ValueType getValueType() {
return valueType;
}
public boolean isNominal() {
if(valueType == ValueType.NOMINAL) {
return true;
}
return false;
}
public boolean isNumerical() {
if(valueType == ValueType.NUMERICAL) {
return true;
}
return false;
}
public boolean isDate() {
if(valueType == ValueType.DATE_TIME) {
return true;
}
return false;
}
/**
* @return the name
*/
public String getName() {
return columnName;
}
@Override
public String toString() {
return getName();
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (!(obj instanceof DataTableColumn)) {
return false;
}
DataTableColumn other = (DataTableColumn)obj;
if (valueType != other.valueType) {
return false;
}
if ( !(columnName == null ? other.columnName == null : columnName.equals(other.columnName)) ) {
return false;
}
return true;
}
@Override
public DataTableColumn clone() {
return new DataTableColumn(getName(),getValueType());
}
/**
* Finds the column index for the column named columnName in dataTable,
* checks if that column in the data table is compatible with to settings
* valueType, and updates this.columnIdx.
*
* If the column does not exist or is not compatible, the columnIdx is set to -1.
*/
public static int getColumnIndex(DataTable dataTable, String columnName, ValueType valueType) {
int columnIdx = dataTable.getColumnIndex(columnName);
if (columnIdx >= 0) {
// check value type
switch(valueType) {
case NOMINAL:
if (!dataTable.isNominal(columnIdx)) {
columnIdx = -1;
}
break;
case NUMERICAL:
if (!dataTable.isNumerical(columnIdx)) {
columnIdx = -1;
}
break;
case DATE_TIME:
if (!dataTable.isDateTime(columnIdx)) {
columnIdx = -1;
}
break;
case INVALID:
// do nothing
break;
}
}
return columnIdx;
}
public boolean isValidForDataTable(DataTable dataTable) {
int columnIdx = getColumnIndex(dataTable, columnName, valueType);
return columnIdx >= 0 && valueType != ValueType.INVALID && columnName != null;
}
/**
* Finds the column index for the column named like dataTableColumn.getName in dataTable,
* checks if that column in the data table is compatible with to settings
* of dataTableColumn (value type etc.), and updates this.columnIdx.
*
* If the column does not exist or is not compatible, the columnIdx is set to -1.
*/
public static int getColumnIndex(DataTable dataTable, DataTableColumn dataTableColumn) {
return getColumnIndex(dataTable, dataTableColumn.getName(), dataTableColumn.getValueType());
}
}