/*******************************************************************************
* 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.filters;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.linuxtools.internal.systemtap.graphing.core.GraphingCorePlugin;
import org.eclipse.linuxtools.internal.systemtap.graphing.core.Localization;
import org.eclipse.linuxtools.systemtap.graphing.core.aggregates.AverageAggregate;
import org.eclipse.linuxtools.systemtap.graphing.core.aggregates.CountAggregate;
import org.eclipse.linuxtools.systemtap.graphing.core.aggregates.IDataAggregate;
import org.eclipse.linuxtools.systemtap.graphing.core.aggregates.MaxAggregate;
import org.eclipse.linuxtools.systemtap.graphing.core.aggregates.MinAggregate;
import org.eclipse.linuxtools.systemtap.graphing.core.aggregates.SumAggregate;
import org.eclipse.linuxtools.systemtap.graphing.core.structures.NumberType;
import org.eclipse.linuxtools.systemtap.structures.Copier;
public class UniqueFilter implements IDataSetFilter {
public UniqueFilter(int column, IDataAggregate aggregate) {
this.column = column;
this.aggregate = aggregate;
}
/**
* Verify that the number passed is in the bounds of the created filter.
*
* @param data The data to verify.
*
* @return True if the number is within bounds.
*/
@Override
public List<Object>[] filter(List<Object>[] data) {
if(column < 0 || column >= data.length) {
return null;
}
List<Object>[] newData = Copier.copy(data);
ArrayList<Object>[] aggregates = GraphingCorePlugin.createArrayList(newData.length);
for(int i=0; i<aggregates.length;i++) {
aggregates[i] = new ArrayList<>();
}
for(int k,j,i=newData[0].size()-1; i>=0; i--) {
for(j=i-1; j>=0; j--) {
if(newData[column].get(i).toString().equals(newData[column].get(j).toString())) { //TODO: Find better equivilance method
i--;
for(k=0; k<newData.length; k++) {
aggregates[k].add(newData[k].get(j));
newData[k].remove(j);
}
}
}
for(k=0; k<newData.length; k++) {
aggregates[k].add(newData[k].get(i));
if(k!=column) {
newData[k].remove(i);
try {
newData[k].add(i, aggregate.aggregate(NumberType.cleanObj2Num(aggregates[k].toArray())));
} catch(NumberFormatException nfe) {
newData[k].add(i, columnMerge(aggregates[k].toArray()));
}
}
aggregates[k].clear();
}
}
return newData;
}
/**
* Merges two passed columns into a StringBuilder object.
*
* @param col The columns to merge.
*
* @return The StringBuilder object made as a result of the merge.
*/
private String columnMerge(Object[] col) {
StringBuilder sb = new StringBuilder(col[0].toString());
for(int i=1; i<col.length; i++) {
if(sb.indexOf(col[i].toString()) < 0) {
sb.append("/" + col[i].toString()); //$NON-NLS-1$
}
}
return sb.toString();
}
@Override
public String getID() {
return ID;
}
/**
* @since 2.0
*/
@Override
public String getInfo() {
// Return the aggregate name without referencing outside projects.
if (aggregate.getID().equals(AverageAggregate.ID)) {
return Localization.getString("UniqueFilter.Average"); //$NON-NLS-1$
} else if (aggregate.getID().equals(CountAggregate.ID)) {
return Localization.getString("UniqueFilter.Count"); //$NON-NLS-1$
} else if (aggregate.getID().equals(MaxAggregate.ID)) {
return Localization.getString("UniqueFilter.Max"); //$NON-NLS-1$
} else if (aggregate.getID().equals(MinAggregate.ID)) {
return Localization.getString("UniqueFilter.Min"); //$NON-NLS-1$
} else if (aggregate.getID().equals(SumAggregate.ID)) {
return Localization.getString("UniqueFilter.Sum"); //$NON-NLS-1$
}
return Localization.getString("UniqueFilter.Other"); //$NON-NLS-1$
}
/**
* @since 2.0
*/
@Override
public int getColumn() {
return column;
}
private int column;
private IDataAggregate aggregate;
public static final String ID = "org.eclipse.linuxtools.systemtap.graphing.core.filters.UniqueFilter"; //$NON-NLS-1$
}