// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package net.sourceforge.sqlexplorer.dataset.mapdb;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import net.sourceforge.sqlexplorer.Messages;
import net.sourceforge.sqlexplorer.dataset.DataSet;
import net.sourceforge.sqlexplorer.dataset.DataSetRow;
import net.sourceforge.sqlexplorer.service.MapDBUtils;
import org.talend.cwm.indicator.ColumnFilter;
/**
* created by talend on Aug 27, 2014 Detailled comment
*
*/
public class MapDBDataSet extends TalendDataSet {
protected Map<Object, List<Object>> dataMap = null;
protected int currentIndex = 0;
protected Iterator<Object> iterator = null;
protected ColumnFilter columnFilter = null;
/**
* DOC talend MapDBDataSet constructor comment.
*
* @param columnLabels
* @param data
*/
public MapDBDataSet(String[] columnLabels, Comparable[][] data, int pageSize) {
super(columnLabels, data, pageSize);
}
public MapDBDataSet(String[] columnLabels, Map<Object, List<Object>> imputDBMap, int pageSize, ColumnFilter cfilter,
Long rowSize) {
super(columnLabels, new Comparable[0][0], pageSize);
this.dataMap = imputDBMap;
iterator = dataMap.keySet().iterator();
this.columnFilter = cfilter;
this.rowSize = rowSize;
}
/*
* (non-Javadoc)
*
* @see net.sourceforge.sqlexplorer.dataset.DataSet#getRowCount()
*/
@Override
public int getRowCount() {
if (rowSize != -1) {
return ((Long) rowSize).intValue();
} else if (dataMap != null) {
return dataMap.size();
} else {
return super.getRowCount();
}
}
/*
* (non-Javadoc)
*
* @see net.sourceforge.sqlexplorer.dataset.DataSet#getRow(int)
*/
@Override
public DataSetRow getRow(int index) {
DataSetRow returnDataSetRow = null;
if (iterator == null) {
return super.getRow(index);
} else {
if (index < 0 || index >= dataMap.size()) {
throw new IndexOutOfBoundsException(Messages.getString("DataSet.errorIndexOutOfRange") + index); //$NON-NLS-1$
}
if (currentIndex > index) {
iterator = dataMap.keySet().iterator();
currentIndex = 0;
}
while (currentIndex < index && iterator.hasNext()) {
iterator.next();
currentIndex++;
}
Object currentData = iterator.next();
currentIndex++;
List<Object> valueList = dataMap.get(currentData);
if (columnFilter != null) {
valueList = columnFilter.filter(valueList);
}
Comparable[] comparable = valueList.toArray(new Comparable[valueList.size()]);
if (comparable.length == 0) {
comparable = new Comparable[1];
comparable[0] = null;
}
returnDataSetRow = new DataSetRow(this, comparable);
return returnDataSetRow;
}
}
/*
* (non-Javadoc)
*
* @see net.sourceforge.sqlexplorer.dataset.mapdb.TalendDataSet#getCurrentPageDataSet()
*/
@Override
public DataSet getCurrentPageDataSet() {
long pageSize = endIndex - startIndex;
List<Object[]> subList = MapDBUtils.getDefault().getDataSetDBMapSubList(this.dataMap, startIndex, endIndex, null);
if (columnFilter != null) {
subList = columnFilter.filterArray(subList);
}
// the dataset count, we use the smallest one
int count = (int) (pageSize > subList.size() ? subList.size() : pageSize);
Comparable[][] compareArray = new Comparable[(count)][this.getColumns().length];
// use the smallest count to avoid the array out of size error
for (int i = 0; i < count; i++) {
Object[] objArray = subList.get(i);
for (int j = 0; j < objArray.length; j++) {
compareArray[i][j] = (Comparable) objArray[j];
}
}
return new DataSet(this.columnHeads, compareArray);
}
}