/*******************************************************************************
* Copyright (c) 2006 IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - Jeff Briggs, Henry Hughes, Ryan Morse
*******************************************************************************/
package org.eclipse.linuxtools.systemtap.graphing.core.datasets.table;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.linuxtools.internal.systemtap.graphing.core.GraphingCorePlugin;
import org.eclipse.linuxtools.systemtap.graphing.core.datasets.IDataEntry;
import org.eclipse.linuxtools.systemtap.graphing.core.datasets.IFilteredDataSet;
import org.eclipse.linuxtools.systemtap.graphing.core.filters.IDataSetFilter;
public class FilteredTableDataSet extends TableDataSet implements IFilteredDataSet {
public FilteredTableDataSet(TableDataSet data) {
super(data.getTitles());
original = data;
this.data = data.data;
filters = new ArrayList<>();
filtersChanged = false;
historical = false;
topData = null;
dataCount = data.getRowCount();
}
public FilteredTableDataSet(String[] titles) {
this(new TableDataSet(titles));
}
//Overwrite methods to insure data is removed from the original DataSet
@Override
public void append(IDataEntry entry) {
original.append(entry);
}
@Override
public boolean remove(IDataEntry entry) {
return original.remove(entry);
}
@Override
public boolean remove(int entry) {
return original.remove(entry);
}
//End overwrite methods to insure data is removed from the original DataSet
//Overwrite to ensure the data returned has all the filters applied
@Override
public Object[] getColumn(int col, int start, int end) {
rebuildDataSet();
return super.getColumn(col, start, end);
}
@Override
public Object[] getRow(int row) {
rebuildDataSet();
return super.getRow(row);
}
@Override
public int getRowCount() {
rebuildDataSet();
return super.getRowCount();
}
@Override
public Object[] getHistoricalData(String key, int col, int start, int end) {
return original.getHistoricalData(key, col, start, end);
}
@Override
public int getEntryCount() {
return original.getEntryCount();
}
@Override
public IDataEntry getEntry(int entry) {
return original.getEntry(entry);
}
@Override
public Object[][] getData() {
rebuildDataSet();
return super.getData();
}
//End overwrite to ensure the data returned has all the filters applied
//IFilteredDataSet Methods
@Override
public void addFilter(IDataSetFilter filter) {
filters.add(filter);
filtersChanged = true;
}
@Override
public boolean removeFilter(IDataSetFilter filter) {
filtersChanged = filters.remove(filter);
return filtersChanged;
}
@Override
public void clearFilters() {
filters.clear();
filtersChanged = true;
}
@Override
public IDataSetFilter[] getFilters() {
IDataSetFilter[] f = new IDataSetFilter[filters.size()];
filters.toArray(f);
return f;
}
//End IFilteredDataSet Methods
private void rebuildDataSet() {
IDataEntry top = original.getEntry(original.getEntryCount()-1);
if(filtersChanged || dataCount != original.getRowCount() || topData != top || historical) {
dataCount = original.getRowCount();
topData = top;
historical = false;
List<Object>[] filterData = getFilterData();
for(int i=0; i<filters.size(); i++) {
filterData = filters.get(i).filter(filterData);
}
setFilteredData(filterData);
}
}
private ArrayList<Object>[] getFilterData() {
ArrayList<Object>[] data = GraphingCorePlugin.createArrayList(original.getColCount());
for(int i=0; i<data.length; i++) {
data[i] = new ArrayList<>();
}
Object[][] table = original.getData();
for(int j,i=0; i<original.getRowCount(); i++) {
for(j=0; j<data.length; j++) {
data[j].add(table[i][j]);
}
}
return data;
}
private void setFilteredData(List<Object>[] data) {
this.data = new ArrayList<>();
TableEntry entry = new TableEntry();
Object[] row;
for(int j,i=0; i<data[0].size(); i++) {
row = new Object[data.length];
for(j=0; j<data.length; j++) {
row[j] = data[j].get(i);
}
entry.add(row);
}
this.data.add(entry);
}
private TableDataSet original;
private List<IDataSetFilter> filters;
private boolean filtersChanged;
private int dataCount;
private Object topData;
private boolean historical;
}